diff options
| author | 2019-05-11 18:22:40 +0100 | |
|---|---|---|
| committer | 2019-05-11 18:22:40 +0100 | |
| commit | d291cd506373046d703450bc9d97082b89cbe8be (patch) | |
| tree | 41a80e2c54f041d0bc550e9201c5119a6aab14f6 /modules/line_handler | |
| parent | Change ducks-min-message default to 100 (diff) | |
| signature | ||
Revamp how CAPs are tracked through REQ and ACK/NAK etc
Diffstat (limited to 'modules/line_handler')
| -rw-r--r-- | modules/line_handler/ircv3.py | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/modules/line_handler/ircv3.py b/modules/line_handler/ircv3.py index ea68c67b..64a349b4 100644 --- a/modules/line_handler/ircv3.py +++ b/modules/line_handler/ircv3.py @@ -19,14 +19,20 @@ CAPABILITIES = [ utils.irc.Capability(None, "draft/setname") ] -def _match_caps(capabilities): - matched = [] - for capability in CAPABILITIES: - available = capability.available(capabilities) +def _match_caps(our_capabilities, offered_capabilities): + matched = {} + for capability in our_capabilities: + available = capability.available(offered_capabilities) if available: - matched.append(available) + matched[available] = capability return matched +def _caps_offered(server, 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 + def cap(events, event): capabilities = utils.parse.keyvalue(event["args"][-1]) subcommand = event["args"][1].lower() @@ -36,20 +42,18 @@ def cap(events, event): event["server"].cap_started = True event["server"].server_capabilities.update(capabilities) if not is_multiline: - matched_caps = _match_caps( - list(event["server"].server_capabilities.keys())) - blacklisted_caps = event["server"].get_setting( - "blacklisted-caps", []) - matched_caps = list( - set(matched_caps)-set(blacklisted_caps)) - - event["server"].queue_capabilities(matched_caps) + server_caps = list(event["server"].server_capabilities.keys()) + matched_caps = _match_caps(CAPABILITIES, server_caps) - events.on("received.cap.ls").call( + 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)) + + _caps_offered(event["server"], matched_caps) - if event["server"].has_capability_queue(): + if event["server"].capability_queue: event["server"].send_capability_queue() else: event["server"].send_capability_end() @@ -58,12 +62,15 @@ def cap(events, event): event["server"].server_capabilities.update(capabilities) matched_caps = _match_caps(list(capabilities_keys)) - event["server"].queue_capabilities(matched_caps) - events.on("received.cap.new").call(server=event["server"], - capabilities=capabilities) + 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"].has_capability_queue(): + if event["server"].capability_queue: event["server"].send_capability_queue() elif subcommand == "del": for capability in capabilities.keys(): @@ -78,11 +85,17 @@ def cap(events, event): server=event["server"]) if subcommand == "ack" or subcommand == "nak": + ack = subcommand == "ack" for capability in capabilities: - event["server"].requested_capabilities.remove(capability) + cap_obj = event["server"].capability_queue[capability] + del event["server"].capability_queue[capability] + if ack: + cap_obj.ack() + else: + cap_obj.nak() if (event["server"].cap_started and - not event["server"].requested_capabilities and + not event["server"].capability_queue and not event["server"].waiting_for_capabilities()): event["server"].cap_started = False event["server"].send_capability_end() |
