summaryrefslogtreecommitdiff
path: root/plugins/quote.py
blob: 8a4fd95ccf1f2523bc27569a0b8a4e0c76d55d16 (plain)
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]], '')