8143593c3d0357b674ded34c42295ea9e0dfbd8e
[electrum-server.git] / irc.py
1 ####################################################################
2
3 import threading, socket, traceback, time
4
5 def random_string(N):
6     import random, string
7     return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))
8
9
10 class Irc(threading.Thread):
11
12     def __init__(self, processor, host, nick):
13         self.processor = processor
14         threading.Thread.__init__(self)
15         self.daemon = True
16         self.peers = {}
17         self.host = host
18         self.nick = nick
19
20     def get_peers(self):
21         return self.peers.values()
22
23     def run(self):
24         NICK = 'E_'+random_string(10)
25         while not self.processor.shared.stopped():
26             try:
27                 s = socket.socket()
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)
33                 t = 0
34                 while not self.processor.shared.stopped():
35                     line = sf.readline()
36                     line = line.rstrip('\r\n')
37                     line = line.split()
38                     if line[0]=='PING': 
39                         s.send('PONG '+line[1]+'\n')
40                     elif '353' in line: # answer to /names
41                         k = line.index('353')
42                         for item in line[k+1:]:
43                             if item[0:2] == 'E_':
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
47                         k = line.index('352')
48                         ip = line[k+4]
49                         ip = socket.gethostbyname(ip)
50                         name = line[k+6]
51                         host = line[k+9]
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')
56                         t = time.time()
57                         self.peers = {}
58             except:
59                 traceback.print_exc(file=sys.stdout)
60             finally:
61                 sf.close()
62                 s.close()