stop the server if abe fails
[electrum-server.git] / backends / irc / __init__.py
index 9a53402..5d92ac1 100644 (file)
@@ -6,33 +6,26 @@ def random_string(N):
 
 from processor import Processor
 
-class ServerProcessor(Processor):
 
-    def __init__(self, config):
-        Processor.__init__(self)
-        self.daemon = True
-        self.peers = {}
-        self.banner = config.get('server','banner')
-        self.host = config.get('server','host')
-        self.password = config.get('server','password')
+class IrcThread(threading.Thread):
 
-        self.native_port = config.get('server','native_port')
+    def __init__(self, processor, config):
+        threading.Thread.__init__(self)
+        self.processor = processor
+        self.daemon = True
         self.stratum_tcp_port = config.get('server','stratum_tcp_port')
         self.stratum_http_port = config.get('server','stratum_http_port')
-
-        self.irc = config.get('server', 'irc') == 'yes'
-        self.nick = config.get('server', 'irc_nick') 
+        self.peers = {}
+        self.host = config.get('server','host')
+        self.nick = config.get('server', 'irc_nick')
         if not self.nick: self.nick = random_string(10)
 
-
     def get_peers(self):
         return self.peers.values()
 
 
     def getname(self):
         s = ''
-        if self.native_port:
-            s+= 'n' + self.native_port + ' '
         if self.stratum_tcp_port:
             s += 't' + self.stratum_tcp_port + ' ' 
         if self.stratum_http_port:
@@ -41,12 +34,9 @@ class ServerProcessor(Processor):
 
 
     def run(self):
-        if not self.irc: 
-            return
-
         ircname = self.getname()
 
-        while not self.shared.stopped():
+        while not self.processor.shared.stopped():
             try:
                 s = socket.socket()
                 s.connect(('irc.freenode.net', 6667))
@@ -55,10 +45,11 @@ class ServerProcessor(Processor):
                 s.send('JOIN #electrum\n')
                 sf = s.makefile('r', 0)
                 t = 0
-                while not self.shared.stopped():
+                while not self.processor.shared.stopped():
                     line = sf.readline()
                     line = line.rstrip('\r\n')
                     line = line.split()
+                    if not line: continue
                     if line[0]=='PING': 
                         s.send('PONG '+line[1]+'\n')
                     elif '353' in line: # answer to /names
@@ -76,7 +67,7 @@ class ServerProcessor(Processor):
                         ports  = line[k+10:]
                         self.peers[name] = (ip, host, ports)
                     if time.time() - t > 5*60:
-                        self.push_response({'method':'server.peers', 'params':[self.get_peers()]})
+                        self.processor.push_response({'method':'server.peers', 'params':[self.get_peers()]})
                         s.send('NAMES #electrum\n')
                         t = time.time()
                         self.peers = {}
@@ -86,8 +77,36 @@ class ServerProcessor(Processor):
                 sf.close()
                 s.close()
 
+        print "quitting IRC"
+
 
 
+class ServerProcessor(Processor):
+
+    def __init__(self, config):
+        Processor.__init__(self)
+        self.daemon = True
+        self.banner = config.get('server','banner')
+        self.password = config.get('server','password')
+
+        if config.get('server', 'irc') == 'yes':
+            self.irc = IrcThread(self, config)
+        else: 
+            self.irc = None
+
+
+    def get_peers(self):
+        if self.irc:
+            return self.irc.get_peers()
+        else:
+            return []
+
+
+    def run(self):
+        if self.irc:
+            self.irc.start()
+        Processor.run(self)
+
     def process(self, request):
         method = request['method']
         params = request['params']
@@ -119,10 +138,19 @@ class ServerProcessor(Processor):
 
         elif method == 'server.info':
             result = map(lambda s: { "time":s.time, 
+                                     "name":s.name,
                                      "address":s.address, 
                                      "version":s.version, 
                                      "subscriptions":len(s.subscriptions)}, 
-                         self.dispatcher.request_dispatcher.sessions)
+                         self.dispatcher.request_dispatcher.get_sessions())
+
+        elif method == 'server.cache':
+            p = self.dispatcher.request_dispatcher.processors['blockchain']
+            result = len(repr(p.store.tx_cache))
+
+        elif method == 'server.load':
+            p = self.dispatcher.request_dispatcher.processors['blockchain']
+            result = p.queue.qsize()
 
         else:
             print "unknown method", request