import socket import select import string import os import sys def disconnect(s): rlist.remove(s) wlist.remove(s) nicktbl.pop(s) buftbl.pop(s) def handle_new_connection(): s,addr = ssock.accept() s.setblocking(0) rlist.append(s) wlist.append(s) nicktbl[s] = None buftbl[s] = "" s.send("Welcome to Crazy-Chat.\n") s.send("Please, type a nick: ") def get_nick(s): test = nicktbl.values() nick = s.recv(64) nick = string.strip(nick) if nick == '': disconnect(s) return '' elif nick in test: s.send("Nick allready, try other nick ;)\nPlease type a nick -> ") return None else: s.send("Welcome, %s. ;)\n" % nick) return nick def get_msg(nick, s): msg = s.recv(512) if msg == '': disconnect(s) return msg = "<%s> %s\n" % (nick, string.strip(msg)) for x in buftbl: if x != s: buftbl[x] += msg def send_buf(s): try: if buftbl[s] != '': n = s.send(buftbl[s]) if n < 0: disconnect(s) return buftbl[s] = buftbl[s][n:] except: pass ssock = socket.socket() ssock.bind(("0.0.0.0", 7000)) ssock.listen(5) ssock.setblocking(0) rlist = [ ssock ] wlist = [ ] nicktbl = { } buftbl = { } while True: r,w,e = select.select(rlist, wlist, []) for x in r: if x == ssock: handle_new_connection() else: if nicktbl[x] == None: nicktbl[x] = get_nick(x) else: get_msg(nicktbl[x], x) for x in w: send_buf(x)