aboutsummaryrefslogtreecommitdiff
path: root/modules/ircv3_resume.py
diff options
context:
space:
mode:
authorGravatar jesopo2019-06-03 12:44:04 +0100
committerGravatar jesopo2019-06-03 12:44:04 +0100
commit9a8b345c53e852d7092197cee084d0d3c02bc0ff (patch)
tree408c6833c2f4de7198c354043c8ca265c0616901 /modules/ircv3_resume.py
parentCheck from_self, not if target==is_own_nickname, use from_self when adding to (diff)
signature
Prefix names for all IRCv3 modules with "ircv3_"
Diffstat (limited to 'modules/ircv3_resume.py')
-rw-r--r--modules/ircv3_resume.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/modules/ircv3_resume.py b/modules/ircv3_resume.py
new file mode 100644
index 00000000..f73c9e5b
--- /dev/null
+++ b/modules/ircv3_resume.py
@@ -0,0 +1,84 @@
+#--depends-on server_time
+
+from src import ModuleManager, utils
+
+CAP = utils.irc.Capability(None, "draft/resume-0.5")
+
+class Module(ModuleManager.BaseModule):
+ def _setting(self, new):
+ return "resume-token%s" % ("-new" if new else "")
+ def _get_token(self, server, new=False):
+ return server.get_setting(self._setting(new), None)
+ def _set_token(self, server, token, new=False):
+ server.set_setting(self._setting(new), token)
+ def _del_token(self, server, new=False):
+ server.del_setting(self._setting(new))
+
+
+ @utils.hook("new.server")
+ def new_server(self, event):
+ # we need to pull this before any data has been exchanged - to make sure
+ # it's not overwritten from the last connection
+ event["server"]._resume_timestamp = event["server"].get_setting(
+ "last-server-time", None)
+
+ @utils.hook("received.cap.ls")
+ def on_cap_ls(self, event):
+ if CAP.available(event["capabilities"]):
+ cap = CAP.copy()
+ cap.on_ack(lambda: self._cap_ack(event["server"]))
+ return cap
+
+ def _cap_ack(self, server):
+ server.wait_for_capability("resume")
+
+ @utils.hook("received.resume")
+ def on_resume(self, event):
+ cap_done = True
+
+ if event["args"][0] == "SUCCESS":
+ resume_channels = event["server"].get_setting("resume-channels", [])
+ self.log.info("Successfully resumed session", [])
+ event["server"].cap_started = False
+
+ elif event["args"][0] == "TOKEN":
+ token = self._get_token(event["server"])
+ self._set_token(event["server"], event["args"][1], new=True)
+
+ if token:
+ timestamp = event["server"]._resume_timestamp
+
+ event["server"].send_raw("RESUME %s%s" %
+ (token, " %s" % timestamp if timestamp else ""))
+ cap_done = False
+
+ if cap_done:
+ event["server"].capability_done("resume")
+
+
+ @utils.hook("received.001")
+ def on_connect(self, event):
+ event["server"].del_setting("resume-channels")
+
+ new_token = self._get_token(event["server"], new=True)
+ if new_token:
+ self._set_token(event["server"], new_token)
+ self._del_token(event["server"], new=True)
+
+ @utils.hook("self.join")
+ def on_join(self, event):
+ resume_channels = event["server"].get_setting("resume-channels", [])
+ channel_name = event["server"].irc_lower(event["channel"].name)
+ if not channel_name in resume_channels:
+ resume_channels.append(channel_name)
+ event["server"].set_setting("resume-channels", resume_channels)
+
+ @utils.hook("preprocess.send.quit")
+ def preprocess_send(self, event):
+ if event["line"].command == "QUIT" and event["server"].has_capability(
+ CAP):
+ event["line"].command = "BRB"
+
+ @utils.hook("received.fail.resume")
+ def fail_resume(self, event):
+ event["server"].capability_done("resume")