aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorGravatar jesopo2019-06-21 18:05:11 +0100
committerGravatar jesopo2019-06-21 18:05:11 +0100
commit90c90e5bbda387d82c22c72f918f1de288fc6101 (patch)
tree081afc3ee869b52e20d27ef2fa419a03d4dd6595 /modules
parentAdda system of aliases for CAPs, mostly for changeable draft specs and creating (diff)
signature
Implement dependency system for CAPs
Diffstat (limited to 'modules')
-rw-r--r--modules/line_handler/ircv3.py49
1 files changed, 47 insertions, 2 deletions
diff --git a/modules/line_handler/ircv3.py b/modules/line_handler/ircv3.py
index ceda7e4b..5b3962f7 100644
--- a/modules/line_handler/ircv3.py
+++ b/modules/line_handler/ircv3.py
@@ -16,13 +16,58 @@ CAPABILITIES = [
utils.irc.Capability(None, "draft/setname", alias="setname")
]
+def _cap_depend_sort(caps, server_caps):
+ sorted_caps = []
+
+ caps_copy = {alias: cap.copy() for alias, cap in caps.items()}
+
+ for cap in caps.values():
+ if not cap.available(server_caps):
+ del caps_copy[cap.alias]
+
+ while True:
+ remove = []
+ for alias, cap in caps_copy.items():
+ for depend_alias in cap.depends_on:
+ if not depend_alias in caps_copy:
+ remove.append(alias)
+ if remove:
+ for alias in remove:
+ del caps_copy[alias]
+ else:
+ break
+
+ while caps_copy:
+ fulfilled = []
+ for cap in caps_copy.values():
+ remove = []
+ for depend_alias in cap.depends_on:
+ if depend_alias in sorted_caps:
+ remove.append(depend_alias)
+ for remove_cap in remove:
+ cap.depends_on.remove(remove_cap)
+
+ if not cap.depends_on:
+ fulfilled.append(cap.alias)
+ for fulfilled_cap in fulfilled:
+ del caps_copy[fulfilled_cap]
+ sorted_caps.append(fulfilled_cap)
+ return [caps[alias] for alias in sorted_caps]
+
def _cap_match(server, caps):
matched_caps = {}
blacklist = server.get_setting("blacklisted-caps", [])
+
+ cap_aliases = {}
for cap in caps:
+ if not cap.alias in blacklist:
+ cap_aliases[cap.alias] = cap
+
+ sorted_caps = _cap_depend_sort(cap_aliases, server.server_capabilities)
+
+ for cap in sorted_caps:
available = cap.available(server.server_capabilities)
- if (available and not server.has_capability(cap) and
- not available in blacklist):
+ if available and not server.has_capability(cap):
matched_caps[available] = cap
return matched_caps