aboutsummaryrefslogtreecommitdiff
path: root/modules/labeled_responses.py
diff options
context:
space:
mode:
Diffstat (limited to 'modules/labeled_responses.py')
-rw-r--r--modules/labeled_responses.py49
1 files changed, 49 insertions, 0 deletions
diff --git a/modules/labeled_responses.py b/modules/labeled_responses.py
new file mode 100644
index 00000000..eee53c58
--- /dev/null
+++ b/modules/labeled_responses.py
@@ -0,0 +1,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!