1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
"""
This plugin allows you to quote messages easily.
Usage
-----
.. glossary::
/quote
**Usage:** ``/quote <timestamp>``
Timestamp is in ``HH:MM:SS`` format, and can be completed with [tab].
Example:
.. code-block:: none
/quote 21:12:23
If there is a message at 21:12:23, it will be put in the input. If there
isn’t, you will get a warning.
Options
-------
.. glossary::
:sorted:
before_quote
**Default value:** ``[empty]``
Text to insert before the quote. ``%(nick)s`` and ``%(time)s`` can
be used to insert the nick of the user who sent the message or the
time of the message.
after_quote
**Default value:** ``[empty]``
Text to insert after the quote. ``%(nick)s`` and ``%(time)s`` can
be used to insert the nick of the user who sent the message or the
time of the message.
"""
from plugin import BasePlugin
from xhtml import clean_text
import common
import tabs
import re
timestamp_re = re.compile(r'^(\d\d\d\d-\d\d-\d\d )?\d\d:\d\d:\d\d$')
seconds_re = re.compile(r'^:\d\d$')
import logging
log = logging.getLogger(__name__)
class Plugin(BasePlugin):
def init(self):
for _class in (tabs.MucTab, tabs.ConversationTab, tabs.PrivateTab):
self.api.add_tab_command(_class, 'quote', self.command_quote,
usage='<timestamp>',
help='Takes the message received at <timestamp> and insert it in the input, to quote it.',
short='Quote a message from a timestamp',
completion=self.completion_quote)
def command_quote(self, args):
args = common.shell_split(args)
if len(args) in (1, 2):
timestamp = args[-1]
else:
return self.api.run_command('/help quote')
if re.match(timestamp_re, timestamp) is None:
return self.api.information('Timestamp has a wrong format.', 'Warning')
message = self.find_message_with_timestamp(timestamp)
if message:
before = self.config.get('before_quote', '') % {'nick': message.nickname or '',
'time': message.str_time}
after = self.config.get('after_quote', '') % {'nick': message.nickname or '',
'time': message.str_time}
self.core.insert_input_text('%(before)s%(quote)s%(after)s' % {'before': before.replace('\\n', '\n').replace('[SP]', ' '),
'quote': clean_text(message.txt),
'after': after.replace('\\n', '\n').replace('[SP]', ' ')})
else:
self.api.information('No message found for timestamp %s.' % timestamp, 'Warning')
def find_message_with_timestamp(self, timestamp):
# TODO: handle messages with the same
# timestamp but not the same day
messages = self.api.get_conversation_messages()
if not messages:
return None
for message in messages[::-1]:
if message.str_time == timestamp:
return message
return None
def completion_quote(self, the_input):
def nick_match(msg):
if not msg.nickname:
return nick == ''
return msg.nickname.lower().startswith(nick.lower())
def time_match(msg):
return msg.str_time.endswith(time)
messages = self.api.get_conversation_messages()
if not messages:
return
text = the_input.get_text()
args = common.shell_split(text)
n = len(args)
if text.endswith(' '):
n += 1
time = args[-1]
if re.match(seconds_re, time) is not None:
messages = list(filter(time_match, messages))
for i in range(3):
the_input.key_backspace(False)
elif n == 2:
try:
if args[1][0] not in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0'):
return False
except:
pass
nick = ''
if n == 3:
nick = args[1]
messages = list(filter(nick_match, messages))
return the_input.auto_completion([msg.str_time for msg in messages[::-1]], '')
|