aboutsummaryrefslogtreecommitdiff
path: root/modules/sed.py
blob: af053ec3526af6a47e758c66f199429e8a927467 (about) (plain) (blame)
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
#--depends-on commands
#--depends-on config

import re, traceback
from src import ModuleManager, utils

REGEX_SED = re.compile("^(?:(\\S+)[:,] )?s/")

@utils.export("channelset",
    utils.BoolSetting("sed","Disable/Enable sed in a channel"))
@utils.export("channelset", utils.BoolSetting("sed-sender-only",
    "Disable/Enable sed only looking at the messages sent by the user"))
class Module(ModuleManager.BaseModule):
    def _closest_setting(self, event, setting, default):
        return event["target"].get_setting(setting,
            event["server"].get_setting(setting, default))

    @utils.hook("command.regex")
    @utils.kwarg("command", "sed")
    @utils.kwarg("pattern", REGEX_SED)
    def channel_message(self, event):
        for_user = event["match"].group(1)
        sed_s = event["message"]
        if for_user:
            sed_s = sed_s.split(" ", 1)[1]
        if not self._closest_setting(event, "sed", False):
            return

        try:
            sed = utils.parse.sed.parse(event["message"])
        except:
            traceback.print_exc()
            event["stderr"].write("Invalid regex in pattern")
            return
        sed.replace = utils.irc.bold(sed.replace)

        if self._closest_setting(event, "sed-sender-only", False):
            for_user = event["user"].nickname

        match_line = None
        match_message = None
        with utils.deadline():
            for line in event["target"].buffer.get_all(for_user):
                if not line.from_self:
                    match = sed.match(line.message)
                    if not match == line.message:
                        match_line = line
                        match_message = match
                        break

        if match_line:
            if match_line.action:
                format = "* %s %s"
            else:
                format = "<%s> %s"
            event["stdout"].write(format % (match_line.sender, match_message))