def recieve_cap_ls_reply(bot, trigger): if bot.server_capabilities: # We've already seen the results, so someone sent CAP LS from a module. # We're too late to do SASL, and we don't want to send CAP END before # the module has done what it needs to, so just return return for cap in trigger.split(): c = cap.split('=') if len(c) == 2: batched_caps[c[0]] = c[1] else: batched_caps[c[0]] = None # Not the last in a multi-line reply. First two args are * and LS. if trigger.args[2] == '*': return bot.server_capabilities = batched_caps # If some other module requests it, we don't need to add another request. # If some other module prohibits it, we shouldn't request it. core_caps = ['multi-prefix', 'away-notify', 'cap-notify', 'server-time'] for cap in core_caps: if cap not in bot._cap_reqs: bot._cap_reqs[cap] = [_CapReq('', 'coretasks')] def acct_warn(bot, cap): LOGGER.info( 'Server does not support %s, or it conflicts with a custom ' 'module. User account validation unavailable or limited.', cap[1:]) if bot.config.core.owner_account or bot.config.core.admin_accounts: LOGGER.warning( 'Owner or admin accounts are configured, but %s is not ' 'supported by the server. This may cause unexpected behavior.', cap[1:]) auth_caps = ['account-notify', 'extended-join', 'account-tag'] for cap in auth_caps: if cap not in bot._cap_reqs: bot._cap_reqs[cap] = [_CapReq('=', 'coretasks', acct_warn)] for cap, reqs in iteritems(bot._cap_reqs): # At this point, we know mandatory and prohibited don't co-exist, but # we need to call back for optionals if they're also prohibited prefix = '' for entry in reqs: if prefix == '-' and entry.prefix != '-': entry.failure(bot, entry.prefix + cap) continue if entry.prefix: prefix = entry.prefix # It's not required, or it's supported, so we can request it if prefix != '=' or cap in bot.server_capabilities: # REQs fail as a whole, so we send them one capability at a time bot.write(('CAP', 'REQ', entry.prefix + cap)) # If it's required but not in server caps, we need to call all the # callbacks else: for entry in reqs: if entry.failure and entry.prefix == '=': entry.failure(bot, entry.prefix + cap) # If we want to do SASL, we have to wait before we can send CAP END. So if # we are, wait on 903 (SASL successful) to send it. if bot.config.core.auth_method == 'sasl': bot.write(('CAP', 'REQ', 'sasl')) else: bot.write(('CAP', 'END'))
def receive_cap_ls_reply(bot, trigger): if bot.server_capabilities: # We've already seen the results, so someone sent CAP LS from a module. # We're too late to do SASL, and we don't want to send CAP END before # the module has done what it needs to, so just return return for cap in trigger.split(): c = cap.split('=') if len(c) == 2: batched_caps[c[0]] = c[1] else: batched_caps[c[0]] = None # Not the last in a multi-line reply. First two args are * and LS. if trigger.args[2] == '*': return bot.server_capabilities = batched_caps # If some other module requests it, we don't need to add another request. # If some other module prohibits it, we shouldn't request it. core_caps = [ 'echo-message', 'multi-prefix', 'away-notify', 'cap-notify', 'server-time', ] for cap in core_caps: if cap not in bot._cap_reqs: bot._cap_reqs[cap] = [_CapReq('', 'coretasks')] def acct_warn(bot, cap): LOGGER.info('Server does not support %s, or it conflicts with a custom ' 'module. User account validation unavailable or limited.', cap[1:]) if bot.config.core.owner_account or bot.config.core.admin_accounts: LOGGER.warning( 'Owner or admin accounts are configured, but %s is not ' 'supported by the server. This may cause unexpected behavior.', cap[1:]) auth_caps = ['account-notify', 'extended-join', 'account-tag'] for cap in auth_caps: if cap not in bot._cap_reqs: bot._cap_reqs[cap] = [_CapReq('', 'coretasks', acct_warn)] for cap, reqs in iteritems(bot._cap_reqs): # At this point, we know mandatory and prohibited don't co-exist, but # we need to call back for optionals if they're also prohibited prefix = '' for entry in reqs: if prefix == '-' and entry.prefix != '-': entry.failure(bot, entry.prefix + cap) continue if entry.prefix: prefix = entry.prefix # It's not required, or it's supported, so we can request it if prefix != '=' or cap in bot.server_capabilities: # REQs fail as a whole, so we send them one capability at a time bot.write(('CAP', 'REQ', entry.prefix + cap)) # If it's required but not in server caps, we need to call all the # callbacks else: for entry in reqs: if entry.failure and entry.prefix == '=': entry.failure(bot, entry.prefix + cap) # If we want to do SASL, we have to wait before we can send CAP END. So if # we are, wait on 903 (SASL successful) to send it. if bot.config.core.auth_method == 'sasl': bot.write(('CAP', 'REQ', 'sasl')) else: bot.write(('CAP', 'END'))