aboutsummaryrefslogtreecommitdiff
path: root/modules/line_handler/ircv3.py
diff options
context:
space:
mode:
authorGravatar jesopo2019-06-16 15:33:20 +0100
committerGravatar jesopo2019-06-16 15:33:20 +0100
commit5fa3d66a39dc22bff9a1d0345ebb70448b060e82 (patch)
tree73748ded1f2aa662130f6fcf3c6a00f0d9877e27 /modules/line_handler/ircv3.py
parentParse inbound bitbot.dev/multi-line batches (diff)
signature
Return all caps through received.cap.ls|new and check if valid in line_handler,
remove server.cap_started
Diffstat (limited to 'modules/line_handler/ircv3.py')
-rw-r--r--modules/line_handler/ircv3.py71
1 files changed, 26 insertions, 45 deletions
diff --git a/modules/line_handler/ircv3.py b/modules/line_handler/ircv3.py
index 9111a537..3c389c85 100644
--- a/modules/line_handler/ircv3.py
+++ b/modules/line_handler/ircv3.py
@@ -17,70 +17,53 @@ CAPABILITIES = [
utils.irc.Capability(None, "draft/setname")
]
-def _match_caps(our_capabilities, offered_capabilities):
- matched = {}
- for capability in our_capabilities:
- available = capability.available(offered_capabilities)
- if available:
- matched[available] = capability
- return matched
-
-def _caps_offered(server, caps):
+def _cap_match(server, caps):
+ matched_caps = {}
blacklist = server.get_setting("blacklisted-caps", [])
- for cap_name, cap in caps.items():
- if not cap_name in blacklist:
- server.capability_queue[cap_name] = cap
+ for cap in caps:
+ available = cap.available(server.server_capabilities)
+ if (available and not server.has_capability(cap) and
+ not available in blacklist):
+ matched_caps[available] = cap
+ return matched_caps
def cap(events, event):
capabilities = utils.parse.keyvalue(event["args"][-1])
subcommand = event["args"][1].upper()
is_multiline = len(event["args"]) > 3 and event["args"][2] == "*"
- if subcommand == "LS":
- event["server"].cap_started = True
+ if subcommand == "DEL":
+ for capability in capabilities.keys():
+ event["server"].agreed_capabilities.discard(capability)
+ del event["server"].server_capabilities[capability]
+
+ events.on("received.cap.del").call(server=event["server"],
+ capabilities=capabilities)
+ elif subcommand == "ACK":
+ event["server"].agreed_capabilities.update(capabilities)
+ events.on("received.cap.ack").call(capabilities=capabilities,
+ server=event["server"])
+
+ if subcommand == "LS" or subcommand == "NEW":
event["server"].server_capabilities.update(capabilities)
if not is_multiline:
server_caps = list(event["server"].server_capabilities.keys())
- matched_caps = _match_caps(CAPABILITIES, server_caps)
+ all_caps = CAPABILITIES[:]
module_caps = events.on("received.cap.ls").call(
capabilities=event["server"].server_capabilities,
server=event["server"])
module_caps = list(filter(None, module_caps))
- matched_caps.update(_match_caps(module_caps, server_caps))
+ all_caps.extend(module_caps)
- _caps_offered(event["server"], matched_caps)
+ matched_caps = _cap_match(event["server"], all_caps)
+ event["server"].capability_queue.update(matched_caps)
if event["server"].capability_queue:
event["server"].send_capability_queue()
else:
event["server"].send_capability_end()
- elif subcommand == "NEW":
- capabilities_keys = capabilities.keys()
- event["server"].server_capabilities.update(capabilities)
- matched_caps = _match_caps(CAPABILITIES, list(capabilities_keys))
-
- module_caps = events.on("received.cap.new").call(
- server=event["server"], capabilities=capabilities)
- module_caps = list(filter(None, module_caps))
- matched_caps.update(_match_caps(module_caps, capabilities_keys))
-
- _caps_offered(event["server"], matched_caps)
-
- if event["server"].capability_queue:
- event["server"].send_capability_queue()
- elif subcommand == "DEL":
- for capability in capabilities.keys():
- event["server"].agreed_capabilities.discard(capability)
- del event["server"].server_capabilities[capability]
-
- events.on("received.cap.del").call(server=event["server"],
- capabilities=capabilities)
- elif subcommand == "ACK":
- event["server"].agreed_capabilities.update(capabilities)
- events.on("received.cap.ack").call(capabilities=capabilities,
- server=event["server"])
if subcommand == "ACK" or subcommand == "NAK":
ack = subcommand == "ACK"
@@ -92,10 +75,8 @@ def cap(events, event):
else:
cap_obj.nak()
- if (event["server"].cap_started and
- not event["server"].capabilities_requested and
+ if (not event["server"].capabilities_requested and
not event["server"].waiting_for_capabilities()):
- event["server"].cap_started = False
event["server"].send_capability_end()
def authenticate(events, event):