2019-05-30 14:34:39 +00:00
|
|
|
import uuid
|
|
|
|
from src import ModuleManager, utils
|
|
|
|
|
|
|
|
CAP = utils.irc.Capability(None, "draft/labeled-response-0.2")
|
|
|
|
TAG = utils.irc.MessageTag(None, "draft/label")
|
2019-06-04 16:51:55 +00:00
|
|
|
BATCH = utils.irc.BatchType(None, "draft/labeled-response")
|
2019-05-30 14:34:39 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
|
2019-06-04 16:53:40 +00:00
|
|
|
event["server"]._label_cache[label] = [event["line"],
|
|
|
|
event["events"]]
|
2019-05-30 14:34:39 +00:00
|
|
|
|
|
|
|
@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:
|
2019-06-04 16:53:40 +00:00
|
|
|
self._recv(event["server"], label, [event["line"]])
|
2019-05-30 14:34:39 +00:00
|
|
|
|
|
|
|
@utils.hook("received.batch.end")
|
|
|
|
def batch_end(self, event):
|
2019-06-04 16:53:40 +00:00
|
|
|
if BATCH.match(event["batch"].type):
|
|
|
|
label = TAG.get_value(event["batch"].tags)
|
|
|
|
self._recv(event["server"], label, event["batch"].get_lines())
|
2019-05-30 14:34:39 +00:00
|
|
|
|
2019-06-04 16:53:40 +00:00
|
|
|
def _recv(self, server, label, lines):
|
|
|
|
cached_line, cached_events = server._label_cache.pop(label)
|
|
|
|
cached_events.on("labeled-response").call(lines=lines)
|