#!/usr/bin/env python """ alternativ_nick.py - Use an alternativ nick, if your choosen nick is already taken Copyright 2016, Alexander Sulfrian Licensed under the Eiffel Forum License 2. http://inamidst.com/phenny/ """ import sys import threading # Duration to wait before trying to get the nick again (in seconds) NICKLOOP_DELAY = 60 def _start_nickloop(phenny): def nickloop(): print >> sys.stderr, ('Trying to get: %s' % phenny.config.nick) phenny.write(('NICK', phenny.config.nick)) threading.Timer(NICKLOOP_DELAY, nickloop).start() def _set_nick(wrapper, nick): # The phenny argument of the event handler is only a wrapper to enable the # reply and say methods. If we try to change the 'nick' attribute directly, # the modification is lost. So we need to get the real phenny instance # before. phenny = wrapper.__getattribute__('bot') phenny.nick = nick def _build_nick(phenny): # We have different ways to generate an alternativ_nick: # * First we try to use the config option. # * If it is not set or it does not work, we append an underscore after the # default nick. # * If even this did not work, we append a number and count upwards until a # valid nick is found. alternativ_nick = getattr(phenny.config, 'alternativ_nick', None) if alternativ_nick is not None and phenny.nick != alternativ_nick: return alternativ_nick else: if phenny.data.get('alternativ_nick.count') is not None: count = phenny.data['alternativ_nick.count'] count += 1 phenny.data['alternativ_nick.count'] = count return ('%s_%d' % (phenny.config.nick, count)) else: phenny.data['alternativ_nick.count'] = 0 return ('%s_' % phenny.config.nick) def nickname_in_use(phenny, input): # The nickname in use event can occur during connection phase if the # supplied nick is already taken, or if we try to get the default nick and # it is still taken. We remember the connection state, to decide what to # do. if phenny.data.get('alternativ_nick.connected'): _start_nickloop(phenny) else: new_nick = _build_nick(phenny) _set_nick(phenny, new_nick) phenny.data['alternativ_nick.active'] = True phenny.write(('NICK', new_nick)) nickname_in_use.rule = r'(.*)' nickname_in_use.event = '433' nickname_in_use.thread = False def connected(phenny, input): # The '001' event is the first message after establishing the connection # and providing a valid NICK and USER. If we used an alternativ nick, we # could start trying to get back the default nick. phenny.data['alternativ_nick.connected'] = True if phenny.data.get('alternativ_nick.active'): _start_nickloop(phenny) connected.rule = r'(.*)' connected.event = '001'