aboutsummaryrefslogtreecommitdiff
path: root/src/core_modules/nick_regain.py
blob: eb666715771e1646b9ce14a5ebd317d9e866baf3 (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from src import ModuleManager, utils

class Module(ModuleManager.BaseModule):
    def _done_connecting(self, server):
        target_nick = self._target(server)
        if not self._regained(server, target_nick):
            if "MONITOR" in server.isupport:
                server.send_raw("MONITOR + %s" % target_nick)
            elif "WATCH" in server.isupport:
                server.send_raw("WATCH +%s" % target_nick)
            else:
                self.timers.add("ison-check", self._ison_check, 30,
                    server=server)

    @utils.hook("received.376")
    def end_of_motd(self, event):
        self._done_connecting(event["server"])
    @utils.hook("received.422")
    def no_motd(self, event):
        self._done_connecting(event["server"])

    def _regained(self, server, target_nickname):
        return server.irc_equals(target_nickname, server.nickname)
    def _target(self, server):
        return server.connection_params.nickname

    @utils.hook("self.nick")
    def self_nick(self, event):
        target_nick = self._target(event["server"])
        if self._regained(event["server"], target_nick):
            if "MONITOR" in event["server"].isupport:
                event["server"].send_raw("MONITOR - %s" % target_nick)
            elif "WATCH" in event["server"].isupport:
                event["server"].send_raw("WATCH -%s" % target_nick)

    @utils.hook("received.nick")
    def nick(self, event):
        self._check(event["server"], event["old_nickname"])
    @utils.hook("received.quit")
    def quit(self, event):
        self._check(event["server"], event["user"].nickname)

    def _check(self, server, nickname):
        target_nick = self._target(server)
        if (not self._regained(server, target_nick)
                and server.irc_equals(nickname, target_nick)):
            server.send_nick(target_nick)

    @utils.hook("received.731")
    def monitor_offline(self, event):
        self._offline(event["server"], event["line"].args[1].split(","))

    @utils.hook("received.601")
    def watch_offline(self, event):
        self._offline(event["server"], [event["line"].args[1]])

    def _offline(self, server, nicks):
        target_nick = self._target(server)
        nicks = [server.irc_lower(n) for n in nicks]
        if server.irc_lower(target_nick) in nicks:
            server.send_nick(target_nick)

    def _ison_check(self, timer):
        server = timer.kwargs["server"]
        target_nick = self._target(server)
        if not self._regained(server, target_nick):
            server.send_raw("ISON %s" % target_nick)
            timer.redo()

    @utils.hook("received.303")
    def ison_response(self, event):
        target_nick = self._target(event["server"])
        if (not event["line"].args[1] and
                not self._regained(event["server"], target_nick)):
            event["server"].send_nick(target_nick)