move files in modules dir
[electrum-server.git] / modules / irc / __init__.py
diff --git a/modules/irc/__init__.py b/modules/irc/__init__.py
new file mode 100644 (file)
index 0000000..908089a
--- /dev/null
@@ -0,0 +1,86 @@
+####################################################################
+
+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))
+
+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.nick = config.get('server','ircname')
+        self.irc = config.get('server','irc') == 'yes'
+
+    def get_peers(self):
+        return self.peers.values()
+
+    def run(self):
+        if not self.irc: 
+            return
+        NICK = 'E_'+random_string(10)
+        while not self.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.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.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()
+
+
+
+    def process(self, request):
+        method = request['method']
+
+        result = ''
+        if method == 'server.banner':
+            result = self.banner.replace('\\n','\n')
+        elif method == 'server.peers.subscribe':
+            result = self.get_peers()
+        else:
+            print "unknown method", request
+
+        if result!='':
+            response = { 'id':request['id'], 'method':method, 'params':request['params'], 'result':result }
+            self.push_response(response)
+
+
+