diff options
| author | 2017-07-12 10:00:27 +0100 | |
|---|---|---|
| committer | 2017-07-12 10:00:45 +0100 | |
| commit | e232ad5daec113b0e72ca36465589908fb9a4e3c (patch) | |
| tree | 5ea223327058b402e6e16c2082129ecd5a295a36 /modules | |
| parent | Sun Tzu*2, optimism (ha) (diff) | |
| signature | ||
Add IRCv3→SASL support for nickserv auth, added optional module whitelist, added server option for recording channel keys, increased flexibility for event raising in linehandler, probably other things too
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/channel_save.py | 37 | ||||
| -rw-r--r-- | modules/nickserv.py | 38 |
2 files changed, 60 insertions, 15 deletions
diff --git a/modules/channel_save.py b/modules/channel_save.py index cb950ed2..713a7cb5 100644 --- a/modules/channel_save.py +++ b/modules/channel_save.py @@ -1,18 +1,29 @@ class Module(object): - def __init__(self, bot): - bot.events.on("self").on("join").hook(self.on_join) - bot.events.on("received").on("numeric").on("366").hook( - self.on_connect) + def __init__(self, bot): + bot.events.on("self").on("part").hook(self.on_self_part) + bot.events.on("self").on("join").hook(self.on_join) + bot.events.on("received").on("numeric").on("366").hook( + self.on_identify_trigger) + bot.events.on("received").on("numeric").on("001").hook( + self.on_identify_trigger) - def on_join(self, event): - channels = set(event["server"].get_setting("autojoin", [])) - channels.add(event["channel"].name) - event["server"].set_setting("autojoin", list(channels)) + def on_self_part(self, event): + pass - def on_connect(self, event): - if event["line_split"][3].lower() == "#bitbot": - channels = event["server"].get_setting("autojoin", []) - for channel in channels: - event["server"].send_join(channel) + def on_join(self, event): + channels = set(event["server"].get_setting("autojoin", [])) + channels.add(event["channel"].name) + event["server"].set_setting("autojoin", list(channels)) + + def on_identify_trigger(self, event): + if event["number"]=="001" and not event["server"].sasl_success: return + if event["line_split"][3].lower() == "#bitbot" or event["number"]=="001": + channels = event["server"].get_setting("autojoin", []) + chan_keys = event["server"].get_setting("channel_keys", {}) + for channel in channels: + if channel in chan_keys: + event["server"].send_join(channel, key=chan_keys[channel]) + else: + event["server"].send_join(channel) diff --git a/modules/nickserv.py b/modules/nickserv.py index 6f1b87b3..149dc961 100644 --- a/modules/nickserv.py +++ b/modules/nickserv.py @@ -1,18 +1,28 @@ - +import base64 class Module(object): def __init__(self, bot): + bot.events.on("new").on("server").hook(self.on_new_server) bot.events.on("received").on("numeric").on("001" ).hook(self.on_connect) bot.events.on("received").on("command").on("setnickserv" ).hook(self.set_nickserv, min_args=1, permission="setnickserv", help="Set bot's nickserv password", usage="<password>", private_only=True) + bot.events.on("received").on("cap").hook(self.on_cap) + bot.events.on("received").on("authenticate").hook(self.on_authenticate) + for code in ["902", "903", "904", "905", "906", "907", "908"]: + bot.events.on("received").on("numeric").on(code).hook(self.on_90x) + + def on_new_server(self, event): + event["server"].attempted_auth = False + event["server"].sasl_success = False def on_connect(self, event): nickserv_password = event["server"].get_setting( "nickserv-password") - if nickserv_password: + if nickserv_password and not event["server"].sasl_success: + event["server"].attempted_auth = True event["server"].send_message("nickserv", "identify %s" % nickserv_password) @@ -20,3 +30,27 @@ class Module(object): nickserv_password = event["args"] event["server"].set_setting("nickserv-password", nickserv_password) event["stdout"].write("Nickserv password saved") + + def on_cap(self, event): + if event["subcommand"] == "NAK": + event["server"].send_capability_end() + elif event["subcommand"] == "ACK": + event["server"].send_authenticate("PLAIN") + else: + pass + + def on_authenticate(self, event): + if event["message"] != "+": + event["server"].send_authenticate("*") + else: + nick = event["server"].original_nickname + password = event["server"].get_setting("nickserv-password") + event["server"].attempted_auth = True + event["server"].send_authenticate( + base64.b64encode(("%s\0%s\0%s" % (nick, nick, password)).encode("utf8")).decode("utf8") + ) + + def on_90x(self, event): + if event["number"]=="903": + event["server"].sasl_success = True + event["server"].send_capability_end() |
