def manage(message, settings, state): """ Takes a message and determines if it requires some administrative connection management, such as responding to a PING, or changing nicks, or joining channels or whatever. Returns a message to be sent to the server with the action taken. If None is returned, no action needs to be taken by the server. """ if message.command == 'PING': return Message.pong(*message.arguments) elif message.command == '403': # Channel doesn't exist, stop trying to join settings.channel = None elif message.command == '433': def generate_nick(nick): truncated = nick[:min(len(nick), 6)] alphabet = string.ascii_lowercase + string.digits random_chars = ''.join(random.choice(alphabet) for _ in range(2)) return '{}_{}'.format(truncated, random_chars) logger.warning('Nick %s is already in use', state.nick) state.nick = generate_nick(settings.nick) return Message.nick(state.nick) elif message.command == '001': state.nick = message.arguments[0] elif message.command == 'JOIN': if getattr(message, 'origin', None) == state.nick: state.joined = message.arguments[0]