diff options
| author | 2019-06-03 12:44:04 +0100 | |
|---|---|---|
| committer | 2019-06-03 12:44:04 +0100 | |
| commit | 9a8b345c53e852d7092197cee084d0d3c02bc0ff (patch) | |
| tree | 408c6833c2f4de7198c354043c8ca265c0616901 /modules/ircv3_resume.py | |
| parent | Check 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.py | 84 |
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") |
