bitbot-3.11-fork/modules/ircv3_labeled_responses.py

49 lines
1.6 KiB
Python

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!