aboutsummaryrefslogtreecommitdiff
path: root/modules/labeled_responses.py
blob: eee53c58db20bda25232171d1ff19fa2edb4e49d (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
import uuid
from src import ModuleManager, utils

CAP = utils.irc.Capability(None, "draft/labeled-response-0.2")
TAG = utils.irc.MessageTag(None, "draft/label")

CAP_TO_TAG = {
    "draft/labeled-response-0.2": "draft/label"
}

class Module(ModuleManager.BaseModule):
    @utils.hook("new.server")
    def new_server(self, event):
        event["server"]._label_cache = {}

    @utils.hook("received.cap.ls")
    @utils.hook("received.cap.new")
    def on_cap(self, event):
        if CAP.available(event["capabilities"]):
            return CAP.copy()

    @utils.hook("preprocess.send")
    def raw_send(self, event):
        available_cap = event["server"].available_capability(CAP)

        if available_cap:
            label = TAG.get_value(event["line"].tags)
            if label == None:
                tag_key = CAP_TO_TAG[available_cap]
                label = str(uuid.uuid4())
                event["line"].tags[tag_key] = label

            event["server"]._label_cache[label] = event["line"]

    @utils.hook("raw.received")
    def raw_recv(self, event):
        if not event["line"].command == "BATCH":
            label = TAG.get_value(event["line"].tags)
            if not label == None:
                self._recv(event["server"], label, event["line"])

    @utils.hook("received.batch.end")
    def batch_end(self, event):
        if TAG.match(event["batch"].type):
            self._recv(event["server"], event["batch"].identifier, None)

    def _recv(self, server, label, line):
        cached_line = server._label_cache.pop(label)
        # do something with the line!