pre: ~ via 🐍 v3.11.0b4 ❯ mkdir deeznuts && cd deeznuts && virtualenv -p python3 env && source env/bin/activate && pip install irc3 && pip install aiocron /activate && pip install irc3 && pip install aiocron created virtual environment CPython3.9.13.final.0-64 in 1084ms creator CPython3Posix(dest=/home/dr1p/deeznuts/env, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/dr1p/.local/share/virtualenv) added seed packages: pip==22.1.2, setuptools==62.6.0, wheel==0.37.1 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator Collecting irc3 Using cached irc3-1.1.8-py3-none-any.whl (166 kB) Collecting docopt Using cached docopt-0.6.2-py2.py3-none-any.whl Collecting venusian>=3.0 Using cached venusian-3.0.0-py3-none-any.whl (13 kB) Installing collected packages: docopt, venusian, irc3 Successfully installed docopt-0.6.2 irc3-1.1.8 venusian-3.0.0 [notice] A new release of pip available: 22.1.2 -> 22.2 [notice] To update, run: pip install --upgrade pip Collecting aiocron Using cached aiocron-1.8-py3-none-any.whl (4.8 kB) Collecting tzlocal Using cached tzlocal-4.2-py3-none-any.whl (19 kB) Collecting croniter Using cached croniter-1.3.5-py2.py3-none-any.whl (17 kB) Collecting python-dateutil Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB) Collecting pytz-deprecation-shim Using cached pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl (15 kB) Collecting six>=1.5 Using cached six-1.16.0-py2.py3-none-any.whl (11 kB) Collecting tzdata Using cached tzdata-2022.1-py2.py3-none-any.whl (339 kB) Installing collected packages: tzdata, six, pytz-deprecation-shim, python-dateutil, tzlocal, croniter, aiocron Successfully installed aiocron-1.8 croniter-1.3.5 python-dateutil-2.8.2 pytz-deprecation-shim-0.1.0.post0 six-1.16.0 tzdata-2022.1 tzlocal-4.2 [notice] A new release of pip available: 22.1.2 -> 22.2 [notice] To update, run: pip install --upgrade pip testcode: # -*- coding: utf-8 -*- ########################################################## SOF from irc3.plugins.command import command import irc3 import base64 ###################################################################################### @irc3.plugin class SASLTEST: """SASLTEST """ requires = [ 'irc3.plugins.core', 'irc3.plugins.userlist', 'irc3.plugins.command', ] ################################################################################## def __init__(self, bot): print('[ sasltest loaded ]') self.bot = bot self.log = self.bot.log self.events = [ irc3.event(r'^:\S+ CAP \S+ LS :(?P.*)', self.cap_ls), irc3.event(r'^:\S+ CAP \S+ ACK sasl', self.cap_ack), irc3.event(r'AUTHENTICATE +', self.authenticate), irc3.event(r'^:\S+ 903 \S+ :SASL authentication successful',self.cap_end), ] ################################################################################## def connection_ready(self, *args, **kwargs): print('\t- event: [ connection ready ]\n\t+ initiating sasl') self.bot.send('CAP LS\r\n') self.bot.attach_events(*self.events) ################################################################################## def cap_ls(self, data=None, **kwargs): print(f'\t- event: [ sasl cap_ls ] - ^:\S+ CAP \S+ LS :(?P.*)') print(f'\t- [ data ]\n\t{data}') if 'sasl' in data.lower(): print(f'\t- info: discovered server sasl mode - sending sasl CAP REQ') self.bot.send_line('CAP REQ :sasl') else: print(f'\t- info: did not discover server sasl mode - ending sasl authentication') self.cap_end() ################################################################################## def cap_ack(self, **kwargs): print('sasl - irc3 event: cap_ack - ^:\S+ CAP \S+ ACK :.*sasl.*') self.bot.send_line('AUTHENTICATE PLAIN') ################################################################################## def authenticate(self, **kwargs): print('sasl - irc3 event: authenticate - AUTHENTICATE') sasl_username='dr1p' sasl_password='suckmydick' auth = ('{sasl_username}\0' '{sasl_username}\0' '{sasl_password}').format(**self.bot.config) auth = base64.encodebytes(auth.encode('utf8')) auth = auth.decode('utf8').rstrip('\n') self.bot.send_line('AUTHENTICATE ' + auth) ################################################################################## def cap_end(self, **kwargs): print('sasl - irc3 event: cap_end - ^:\S+ 903 \S+ :SASL authentication successful') self.bot.send_line('CAP END') self.bot.detach_events(*self.events) ###################################################################################### def main(): config = dict( nick='sasltest', autojoins=['#tcpdirect'], host='ircd.chat', port=6697, ssl=True, ssl_verify='CERT_NONE', includes=[ 'irc3.plugins.core', 'irc3.plugins.command', __name__, ] ) bot = irc3.IrcBot.from_config(config) bot.run(forever=True) ###################################################################################### if __name__ == '__main__': main() ################################################################################## EOF`` runtest: (env) dr1p@burner:~/boot$ python bot_sasltest.py [ sasltest loaded ] - event: [ connection ready ] + initiating sasl - event: [ sasl cap_ls ] - ^:\S+ CAP \S+ LS :(?P.*) - [ data ] account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - info: discovered server sasl mode - sending sasl CAP REQ CRITICAL irc3.sasltest connection lost (139970820452800): None # <- error over and over again CRITICAL irc3.sasltest closing old transport (139970820452800) # <- error over and over again notes: digging further because i want to see the raw data and see if i am even getting a resposne from the server, we sent request, never got an ack pre: ~ via 🐍 v3.11.0b4 ❯ mkdir mkdir plugins testcode file 1/2: ❯ nano plugins/sasltest_plugin.py # -*- coding: utf-8 -*- ########################################################## SOF import irc3 import base64 ###################################################################################### @irc3.plugin class Sasl: ################################################################################## def __init__(self, bot): print('[ sasltest initiated ]') self.bot = bot self.events = [ irc3.event(r'^:\S+ CAP \S+ LS :(?P.*)', self.cap_ls), irc3.event(r'^:\S+ CAP \S+ ACK :.*sasl.*', self.cap_ack), irc3.event(r'AUTHENTICATE +', self.authenticate), irc3.event(r'^:\S+ 903 \S+ :SASL authentication successful', self.cap_end), ] ################################################################################## def connection_ready(self, *args, **kwargs): print('\t- event: [ connection ready ]\n\t+ initiating sasl') self.bot.send('CAP LS\r\n') self.bot.attach_events(*self.events) ################################################################################## def cap_ls(self, data=None, **kwargs): print(f'\t- event: [ sasl cap_ls ] - ^:\S+ CAP \S+ LS :(?P.*)') print(f'\t- [ data ]\n\t{data}') if 'sasl' in data.lower(): print(f'\t- info: discovered server sasl mode - sending sasl CAP REQ') self.bot.send_line('CAP REQ :sasl') else: print(f'\t- info: did not discover server sasl mode - ending sasl authentication') self.cap_end() ################################################################################## def cap_ack(self, **kwargs): print('sasl - irc3 event: cap_ack - ^:\S+ CAP \S+ ACK :.*sasl.*') self.bot.send_line('AUTHENTICATE PLAIN') ################################################################################## def authenticate(self, **kwargs): print('sasl - irc3 event: authenticate - AUTHENTICATE') auth = ('{sasl_username}\0' '{sasl_username}\0' '{sasl_password}').format(**self.bot.config) auth = base64.encodebytes(auth.encode('utf8')) auth = auth.decode('utf8').rstrip('\n') self.bot.send_line('AUTHENTICATE ' + auth) ################################################################################## def cap_end(self, **kwargs): print('sasl - irc3 event: cap_end - ^:\S+ 903 \S+ :SASL authentication successful') self.bot.send_line('CAP END') self.bot.detach_events(*self.events) ################################################################################## testcode file 2/2: ❯ nano sasltest.ini [bot] nick = sasltest username = dr1p realname = "[ sasltest ]" host = ircd.chat port = 6697 version = 1 url = ircd.chat ssl = true ssl_verify = CERT_NONE sasl_username = dr1p sasl_password = suckmydick includes = irc3.plugins.command irc3.plugins.asynchronious irc3.plugins.uptime irc3.plugins.ctcp irc3.plugins.cron irc3.plugins.log irc3.plugins.logger irc3.plugins.userlist plugins.sasltest_plugin autojoins = ${#}tcpdirect flood_burst = 0 flood_rate = 1 flood_rate_delay = 1 [irc3.plugins.command] cmd = ? [irc3.plugins.command.masks] d!*@1.3.3.7 = all_permissions * = view runtest: (env) dr1p@burner:~/boot$ irc3 -v -d -r sasltest.ini DEBUG irc3.sasltest Register plugin 'irc3.plugins.command.Commands' DEBUG irc3.sasltest Register plugin 'irc3.plugins.core.Core' DEBUG irc3.plugins.command Config: {'hash': '#', '#': '#', 'cmd': '?'} DEBUG irc3.plugins.command Guard: free_policy DEBUG irc3.sasltest Register command 'help' DEBUG irc3.sasltest Register command 'ping' DEBUG irc3.sasltest Register command 'quote' DEBUG irc3.sasltest Register command 'reconnect' DEBUG irc3.sasltest Register plugin 'irc3.plugins.asynchronious.Async' DEBUG irc3.sasltest Register plugin 'irc3.plugins.uptime.Uptime' DEBUG irc3.sasltest Register command 'uptime' DEBUG irc3.sasltest Register plugin 'irc3.plugins.ctcp.CTCP' DEBUG irc3.sasltest Register plugin 'irc3.plugins.cron.Crons' DEBUG irc3.sasltest Register plugin 'irc3.plugins.log.RawLog' DEBUG irc3.sasltest Register plugin 'irc3.plugins.logger.Logger' DEBUG irc3.plugins.logger Handler: file_handler DEBUG irc3.sasltest Register plugin 'irc3.plugins.userlist.Userlist' DEBUG irc3.sasltest Register plugin 'plugins.sasltest_plugin.Sasl' [ sasltest initiated ] DEBUG irc3.sasltest Register plugin 'irc3.plugins.sasl.Sasl' DEBUG irc3.sasltest Register plugin 'irc3.plugins.autojoins.AutoJoins' WARNING irc3.sasltest irc3.plugins.log included twice DEBUG irc3.sasltest Starting sasltest... DEBUG irc3.sasltest Connected - event: [ connection ready ] + initiating sasl DEBUG irc3.sasltest CONNECT ping-pong () DEBUG raw.sasltest >> CAP LS DEBUG raw.sasltest >> CAP LS DEBUG raw.sasltest >> USER dr1p 0 * :"[ sasltest ]" DEBUG raw.sasltest << :ircd.chat CAP * LS :account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - event: [ sasl cap_ls ] - ^:\S+ CAP \S+ LS :(?P.*) - [ data ] account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - info: discovered server sasl mode - sending sasl CAP REQ DEBUG raw.sasltest << :ircd.chat NOTICE * :*** Looking up your hostname... DEBUG raw.sasltest << :ircd.chat NOTICE * :*** Found your hostname DEBUG raw.sasltest << :ircd.chat CAP * LS :account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - event: [ sasl cap_ls ] - ^:\S+ CAP \S+ LS :(?P.*) - [ data ] account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - info: discovered server sasl mode - sending sasl CAP REQ DEBUG raw.sasltest >> CAP REQ :sasl DEBUG raw.sasltest >> CAP REQ :sasl DEBUG raw.sasltest >> CAP REQ :sasl DEBUG raw.sasltest >> CAP REQ :sasl DEBUG raw.sasltest << :ircd.chat CAP * ACK sasl DEBUG raw.sasltest << :ircd.chat CAP * ACK sasl DEBUG raw.sasltest << :ircd.chat CAP * ACK sasl DEBUG raw.sasltest << :ircd.chat CAP * ACK sasl notes: we see that we are indeed getting a reply from server, "irc3.event(r'^:\S+ CAP \S+ ACK *sasl*', self.cap_ack)," but that it's not acknowledged in the event chain. the regex filter in their protocol event never matches so it never happens. specfically this regex affects the event chain. testcode file 1/2: ❯ nano plugins/sasltest_plugin.py irc3.event(r'^:\S+ CAP \S+ ACK :.*sasl.*', self.cap_ack), so i changed it to the regex to this below and reran to see if its now acknowledged irc3.event(r'^:\S+ CAP \S+ ACK *sasl*', self.cap_ack), reran: m4pl1mp on  master [!?] via 🐍 v3.9.13 (env) ❯ irc3 -v -d -r sasltest.ini DEBUG irc3.sasltest Register plugin 'irc3.plugins.command.Commands' DEBUG irc3.sasltest Register plugin 'irc3.plugins.core.Core' DEBUG irc3.plugins.command Config: {'hash': '#', '#': '#', 'cmd': '?'} DEBUG irc3.plugins.command Guard: free_policy DEBUG irc3.sasltest Register command 'help' DEBUG irc3.sasltest Register command 'ping' DEBUG irc3.sasltest Register command 'quote' DEBUG irc3.sasltest Register command 'reconnect' DEBUG irc3.sasltest Register plugin 'irc3.plugins.asynchronious.Async' DEBUG irc3.sasltest Register plugin 'irc3.plugins.uptime.Uptime' DEBUG irc3.sasltest Register command 'uptime' DEBUG irc3.sasltest Register plugin 'irc3.plugins.ctcp.CTCP' DEBUG irc3.sasltest Register plugin 'irc3.plugins.cron.Crons' DEBUG irc3.sasltest Register plugin 'irc3.plugins.log.RawLog' DEBUG irc3.sasltest Register plugin 'irc3.plugins.logger.Logger' DEBUG irc3.plugins.logger Handler: file_handler DEBUG irc3.sasltest Register plugin 'irc3.plugins.userlist.Userlist' DEBUG irc3.sasltest Register plugin 'plugins.sasltest_plugin.Sasl' [ sasltest initiated ] DEBUG irc3.sasltest Register plugin 'irc3.plugins.sasl.Sasl' DEBUG irc3.sasltest Register plugin 'irc3.plugins.autojoins.AutoJoins' WARNING irc3.sasltest irc3.plugins.log included twice DEBUG irc3.sasltest Starting sasltest... DEBUG irc3.sasltest Connected - event: [ connection ready ] + initiating sasl DEBUG irc3.sasltest CONNECT ping-pong () DEBUG raw.sasltest >> CAP LS DEBUG raw.sasltest >> CAP LS DEBUG raw.sasltest >> USER dr1p 0 * :"[ sasltest ]" DEBUG raw.sasltest << :ircd.chat CAP * LS :account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - event: [ sasl cap_ls ] - ^:\S+ CAP \S+ LS :(?P.*) - [ data ] account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - info: discovered server sasl mode - sending sasl CAP REQ DEBUG raw.sasltest << :ircd.chat NOTICE * :*** Looking up your hostname... DEBUG raw.sasltest >> CAP REQ :sasl DEBUG raw.sasltest >> CAP REQ :sasl DEBUG raw.sasltest << :ircd.chat NOTICE * :*** Couldn't look up your hostname DEBUG raw.sasltest << :ircd.chat CAP * LS :account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - event: [ sasl cap_ls ] - ^:\S+ CAP \S+ LS :(?P.*) - [ data ] account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - info: discovered server sasl mode - sending sasl CAP REQ DEBUG raw.sasltest << :ircd.chat CAP * ACK sasl sasl - irc3 event: cap_ack - ^:\S+ CAP \S+ ACK :.*sasl.* DEBUG raw.sasltest << :ircd.chat CAP * ACK sasl sasl - irc3 event: cap_ack - ^:\S+ CAP \S+ ACK :.*sasl.* DEBUG raw.sasltest >> CAP REQ :sasl DEBUG raw.sasltest >> CAP REQ :sasl DEBUG raw.sasltest >> AUTHENTICATE PLAIN DEBUG raw.sasltest >> AUTHENTICATE PLAIN DEBUG raw.sasltest << :ircd.chat CAP * ACK sasl sasl - irc3 event: cap_ack - ^:\S+ CAP \S+ ACK :.*sasl.* DEBUG raw.sasltest >> AUTHENTICATE PLAIN DEBUG raw.sasltest << :ircd.chat CAP * ACK sasl sasl - irc3 event: cap_ack - ^:\S+ CAP \S+ ACK :.*sasl.* DEBUG raw.sasltest << AUTHENTICATE + sasl - irc3 event: authenticate - AUTHENTICATE DEBUG raw.sasltest << :ircd.chat 904 * :SASL authentication failed: Invalid b64 encoding DEBUG raw.sasltest >> AUTHENTICATE PLAIN DEBUG raw.sasltest >> AUTHENTICATE c3Vja215ZGljawo= DEBUG raw.sasltest >> AUTHENTICATE c3Vja215ZGljawo= DEBUG raw.sasltest << AUTHENTICATE + sasl - irc3 event: authenticate - AUTHENTICATE DEBUG raw.sasltest >> AUTHENTICATE c3Vja215ZGljawo= DEBUG raw.sasltest >> AUTHENTICATE c3Vja215ZGljawo= DEBUG raw.sasltest << :ircd.chat 904 * :SASL authentication failed: Invalid b64 encoding DEBUG raw.sasltest << :ircd.chat 904 * :SASL authentication failed DEBUG raw.sasltest << :ircd.chat 904 * :SASL authentication failed DEBUG raw.sasltest << :ircd.chat 904 * :Please wait at least 59.727717516s and try again DEBUG raw.sasltest << :ircd.chat 904 * :Please wait at least 59.727595657s and try again notes: i wasn't too for sure what was going on here cuz i did it right, so i cheated and dumped weechat server as raw to look and see what a correct exchange looks like. 22:57:01 <-- tcp | CAP LS 302 22:57:01 <-- tcp | NICK dr1p 22:57:01 <-- tcp | USER dr1p 0 * :dr1p 22:57:01 --> tcp | :ircd.chat CAP * LS :account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename | draft/extended-monitor draft/languages=1,en draft/multiline=max-bytes=8192,max-lines=250 echo-message extended-join invite-notify labeled-response | message-tags multi-prefix sasl=PLAIN,EXTERNAL server-time setname userhost-in-names 22:57:01 <-- tcp | CAP REQ :sasl 22:57:01 --> tcp | :ircd.chat NOTICE * :*** Looking up your hostname... 22:57:01 --> tcp | :ircd.chat NOTICE * :*** Couldn't look up your hostname 22:57:01 --> tcp | :ircd.chat CAP * ACK sasl 22:57:01 <-- tcp | AUTHENTICATE PLAIN 22:57:01 --> tcp | AUTHENTICATE + 22:57:01 <-- tcp | AUTHENTICATE c3Vja215ZGljawo= 22:57:01 --> tcp | :ircd.chat 900 * * dr1p :You are now logged in as dr1p 22:57:01 --> tcp | :ircd.chat 903 * :Authentication successful 22:57:01 <-- tcp | CAP END reran: m4pl1mp on  master [!?] via 🐍 v3.9.13 (env)took 1m41s ❯ irc3 -v -r -d sasltest.ini DEBUG irc3.sasltest Register plugin 'irc3.plugins.command.Commands' DEBUG irc3.sasltest Register plugin 'irc3.plugins.core.Core' DEBUG irc3.plugins.command Config: {'hash': '#', '#': '#', 'cmd': '?'} DEBUG irc3.plugins.command Guard: free_policy DEBUG irc3.sasltest Register command 'help' DEBUG irc3.sasltest Register command 'ping' DEBUG irc3.sasltest Register command 'quote' DEBUG irc3.sasltest Register command 'reconnect' DEBUG irc3.sasltest Register plugin 'irc3.plugins.asynchronious.Async' DEBUG irc3.sasltest Register plugin 'irc3.plugins.uptime.Uptime' DEBUG irc3.sasltest Register command 'uptime' DEBUG irc3.sasltest Register plugin 'irc3.plugins.ctcp.CTCP' DEBUG irc3.sasltest Register plugin 'irc3.plugins.cron.Crons' DEBUG irc3.sasltest Register plugin 'irc3.plugins.log.RawLog' DEBUG irc3.sasltest Register plugin 'irc3.plugins.logger.Logger' DEBUG irc3.plugins.logger Handler: file_handler DEBUG irc3.sasltest Register plugin 'irc3.plugins.userlist.Userlist' DEBUG irc3.sasltest Register plugin 'plugins.sasltest_plugin.Sasl' [ sasltest initiated ] DEBUG irc3.sasltest Register plugin 'irc3.plugins.autojoins.AutoJoins' WARNING irc3.sasltest irc3.plugins.log included twice DEBUG irc3.sasltest Starting sasltest... DEBUG irc3.sasltest Connected - event: [ connection ready ] + initiating sasl DEBUG irc3.sasltest CONNECT ping-pong () DEBUG raw.sasltest >> CAP LS DEBUG raw.sasltest >> USER dr1p 0 * :"[ sasltest ]" DEBUG raw.sasltest << :ircd.chat CAP * LS :account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - event: [ sasl cap_ls ] - ^:\S+ CAP \S+ LS :(?P.*) - [ data ] account-notify account-tag away-notify batch cap-notify chghost draft/account-registration draft/channel-rename draft/extended-monitor draft/languages draft/multiline echo-message extended-join invite-notify labeled-response message-tags multi-prefix sasl server-time setname userhost-in-names - info: discovered server sasl mode - sending sasl CAP REQ DEBUG raw.sasltest << :ircd.chat NOTICE * :*** Looking up your hostname... DEBUG raw.sasltest << :ircd.chat NOTICE * :*** Couldn't look up your hostname DEBUG raw.sasltest >> CAP REQ :sasl DEBUG raw.sasltest << :ircd.chat CAP * ACK sasl sasl - irc3 event: cap_ack - ^:\S+ CAP \S+ ACK :.*sasl.* DEBUG raw.sasltest >> AUTHENTICATE PLAIN DEBUG raw.sasltest << AUTHENTICATE + sasl - irc3 event: authenticate - AUTHENTICATE DEBUG raw.sasltest >> AUTHENTICATE c3Vja215ZGljawo= DEBUG raw.sasltest << :ircd.chat 900 * * dr1p :You are now logged in as dr1p DEBUG raw.sasltest << :ircd.chat 903 * :Authentication successful notes: the reason my code wasn't working even before. is due to using sasl credentials in the ini, e.g. maple.ini example below [bot] nick = dr1p username = d realname = "dr1p" host = ircd.chat port = 6697 version = 1 url = ircd.chat ssl = true ssl_verify = CERT_NONE sasl_username = dr1p <- sasl here sasl_password = suckmydick <- sasl here the irc3 engine will load it's own version of sasl, as well as mine and fight over automation. end of story, disable irc3's version of sasl, dont put your credentials in the ini, store them anyway else and modify this event code "irc3.event(r'^:\S+ CAP \S+ ACK sasl', self.cap_ack),"