1 ####################################################################
3 import threading, socket, traceback, time
7 return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))
9 from processor import Processor
11 class ServerProcessor(Processor):
13 def __init__(self, config):
14 Processor.__init__(self)
17 self.banner = config.get('server','banner')
18 self.host = config.get('server','host')
19 self.nick = config.get('server','ircname')
20 self.irc = config.get('server','irc') == 'yes'
23 return self.peers.values()
28 NICK = 'E_'+random_string(10)
29 while not self.shared.stopped():
32 s.connect(('irc.freenode.net', 6667))
33 s.send('USER electrum 0 * :'+self.host+' '+self.nick+'\n')
34 s.send('NICK '+NICK+'\n')
35 s.send('JOIN #electrum\n')
36 sf = s.makefile('r', 0)
38 while not self.shared.stopped():
40 line = line.rstrip('\r\n')
43 s.send('PONG '+line[1]+'\n')
44 elif '353' in line: # answer to /names
46 for item in line[k+1:]:
48 s.send('WHO %s\n'%item)
49 elif '352' in line: # answer to /who
50 # warning: this is a horrible hack which apparently works
53 ip = socket.gethostbyname(ip)
56 self.peers[name] = (ip,host)
57 if time.time() - t > 5*60:
58 self.push_response({'method':'server.peers', 'result':[self.get_peers()]})
59 s.send('NAMES #electrum\n')
63 traceback.print_exc(file=sys.stdout)
70 def process(self, request):
71 method = request['method']
74 if method == 'server.banner':
75 result = self.banner.replace('\\n','\n')
76 elif method == 'server.peers.subscribe':
77 result = self.get_peers()
79 print "unknown method", request
82 response = { 'id':request['id'], 'method':method, 'params':request['params'], 'result':result }
83 self.push_response(response)