1 ####################################################################
3 import threading, socket, traceback, time
7 return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))
10 class Irc(threading.Thread):
12 def __init__(self, processor, host, nick):
13 self.processor = processor
14 threading.Thread.__init__(self)
21 return self.peers.values()
24 NICK = 'E_'+random_string(10)
25 while not self.processor.shared.stopped():
28 s.connect(('irc.freenode.net', 6667))
29 s.send('USER electrum 0 * :'+self.host+' '+self.nick+'\n')
30 s.send('NICK '+NICK+'\n')
31 s.send('JOIN #electrum\n')
32 sf = s.makefile('r', 0)
34 while not self.processor.shared.stopped():
36 line = line.rstrip('\r\n')
39 s.send('PONG '+line[1]+'\n')
40 elif '353' in line: # answer to /names
42 for item in line[k+1:]:
44 s.send('WHO %s\n'%item)
45 elif '352' in line: # answer to /who
46 # warning: this is a horrible hack which apparently works
49 ip = socket.gethostbyname(ip)
52 self.peers[name] = (ip,host)
53 if time.time() - t > 5*60:
54 self.processor.push_response({'method':'server.peers', 'result':[self.get_peers()]})
55 s.send('NAMES #electrum\n')
59 traceback.print_exc(file=sys.stdout)
67 def __init__(self, config, processor):
68 self.banner = config.get('server','banner')
69 self.irc = Irc(processor, config.get('server','host'), config.get('server','ircname'))
70 self.irc.processor = processor
71 if (config.get('server','irc') == 'yes' ):
74 def process(self, request, queue):
75 method = request['method']
78 if method == 'server.banner':
79 result = self.banner.replace('\\n','\n')
80 elif method == 'server.peers.subscribe':
81 result = self.irc.get_peers()
83 print "unknown method", request
86 response = { 'id':request['id'], 'method':method, 'params':request['params'], 'result':result }