#################################################################### import threading, socket, traceback, time def random_string(N): import random, string return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N)) class Irc(threading.Thread): def __init__(self, processor, host, nick): self.processor = processor threading.Thread.__init__(self) self.daemon = True self.peers = {} self.host = host self.nick = nick def get_peers(self): return self.peers.values() def run(self): NICK = 'E_'+random_string(10) while not self.processor.shared.stopped(): try: s = socket.socket() s.connect(('irc.freenode.net', 6667)) s.send('USER electrum 0 * :'+self.host+' '+self.nick+'\n') s.send('NICK '+NICK+'\n') s.send('JOIN #electrum\n') sf = s.makefile('r', 0) t = 0 while not self.processor.shared.stopped(): line = sf.readline() line = line.rstrip('\r\n') line = line.split() if line[0]=='PING': s.send('PONG '+line[1]+'\n') elif '353' in line: # answer to /names k = line.index('353') for item in line[k+1:]: if item[0:2] == 'E_': s.send('WHO %s\n'%item) elif '352' in line: # answer to /who # warning: this is a horrible hack which apparently works k = line.index('352') ip = line[k+4] ip = socket.gethostbyname(ip) name = line[k+6] host = line[k+9] self.peers[name] = (ip,host) if time.time() - t > 5*60: self.processor.push_response({'method':'server.peers', 'result':[self.get_peers()]}) s.send('NAMES #electrum\n') t = time.time() self.peers = {} except: traceback.print_exc(file=sys.stdout) finally: sf.close() s.close()