All pastes #618066 Raw Edit

Someone

public text v1 · immutable
·published 2007-07-13 18:44 UTC
rendered paste body
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)