#! /bin/bash ## The IM Server. #### ## Taken from some guy. Will modify in the future. import SocketServer _port = 8881 _clients = {} # a connected client class Client: # queue of messages sent to this client queue = [] def __init__(self, _sock, _src, _dest): print "Creating IM client" self.socket = _sock print "Incoming socket: %s" % self.socket self.user = _src print "Username: " + self.user # buddies should be a list self.buddy = _dest print "Buddy: " + self.buddy print "Created IM client" # the server handling requests class Broker(SocketServer.BaseRequestHandler): def handle(self): print "Connected from", self.client_address while True: receivedData = self.request.recv(8192) if not receivedData: break # if handshake packet, extract client details if receivedData.startswith('@@@',0,3): print "Received handshake packet" # strip handshake code receivedData = receivedData.replace('@@@', '', 1).lstrip() l = receivedData.split('##',1) socket = self.request src = l[0] dest = l[1] c = Client(socket, src, dest) # use username as key on hashmap _clients[src] = c # send success message socket.sendall('AUTH_OK') print "Client " + src + " authenticated" # if polling packet, extract sender details and send messages if receivedData.startswith('$$$',0,3): # strip polling message print "Received polling packet" src = receivedData.replace('$$$', '', 1).lstrip() # only poll if more than 1 user if len(_clients) > 1: # use username as key on hashmap _clients[src] = c if len(c.queue) < 1: c.socket.sendall(" ") else: msgs = "" for q in c.queue: msgs += q + '\n' # send queued messages c.socket.sendall(msgs) c.queue = [] print "Sent all pending messages for " + c.user else: socket.sendall(" ") # if message packet, extract data and append to target queue if receivedData.startswith('###',0,3): print "Received message packet" receivedData = receivedData.replace('###', '', 1).lstrip() l = receivedData.split('##',1) src = l[0] text = l[1] if text.strip != "": print "Message not empty" # extract client clientSrc = _clients[src] # ...and its buddy clientDest = _clients[clientSrc.buddy] msg = src+": "+text print "Appended message to queue of " + clientSrc.buddy clientDest.queue.append(msg) print "Queue of: " + clientDest.user + " = %s" % clientDest.queue clientDest.socket.sendall(" ") else: if len(_clients) < 2: self.request.sendall(receivedData) for c in _clients.values(): if self.request == c.socket: c.socket.close() # remove from hashmap del _clients[c.user] print "Removed " + c.user + " from hashmap" print "Disconnected from", self.client_address srv = SocketServer.ThreadingTCPServer(('',_port),Broker) print "Started IIM server on port %d" % _port srv.serve_forever()