All pastes #811608 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-12-11 02:12 UTC
rendered paste body
#! usr/bin/env python


#import modules...
from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
from elementtree.ElementTree import *
import ConfigParser
import time


#load the host and port from a ini file
config = ConfigParser.ConfigParser()
config.read("settings.ini")
port = int(config.get("server", "port"))


#The umm, server script.
class ChatServer(LineReceiver):
    userlist = []

    #Yay! found a new connection. Add the new user to the userlist
    def connectionMade(self):
        self.transport.userid = len(self.userlist)
        self.transport.room = "Lobby"
        self.transport.username = ""
        self.userlist.append(self.transport)
        print "New connection! ID = %s IP = %s" % (self.transport.userid, self.transport.getHost())

    #receive the messages and send them
    def lineReceived(self, line):
        print "------"
        print line
        #convert the xml code to an element
        element = fromstring(line)

        #get some variables from the element
        thetime = element.findtext("time")
        nick = element.findtext("nick")
        msg = element.findtext("msg")
        type = element.findtext("type")
        room = element.findtext("room")
        newnick = element.findtext("newnick")
        oldnick = element.findtext("oldnick")

        #convert the element to a string 
        string = tostring(element)


        # send the message in various formats ###

        #normal type of sending
        if type is "normal" or type is "notice":
            self.send(string, 'room')

        #new user! add his nickname to the userlist
        elif type == "newuser":
            self.userlist[len(self.userlist)-1].username = nick
            self.userlist[len(self.userlist)-1].room = room
            self.send_list_of_usernames()
            self.send(string, "room")

        #user changed his nick. update the userlist.
        elif type == "newnick":
            for user in self.userlist:
                if user.username == oldnick:
                    user.username = newnick
            self.send_list_of_usernames()
            self.send(string, "room")

    #sends the list of usernames to the clients
    def send_list_of_usernames(self):
        #convert to xml format
        element = Element("list")
        SubElement(element, "type").text = "users"
        for user in self.userlist:
            if user.room == self.transport.room:
                SubElement(element, "user").text = user.username

        #convert element to string
        string = tostring(element)

        #send the string of xml code
        self.send(string, "room")

    #script for sending messages to rooms
    def send(self, message, where):
        #all the users connected to the server
        def all():
            for user in self.userlist:
                user.write(message + "\r\n\r\n")

        #only the room it came from
        def room():
            for user in self.userlist:
                if user.room == self.transport.room:
                    user.write(message + "\r\n\r\n")

        #only to the user it came from
        def myself():
            self.transport.write(message + "\r\n\r\n")
        
        {'all': all,
        'room': room,
        'myself': myself}[where]()

    #lose a connection, remove the user from the userlist            
    def connectionLost(self, reason):
        self.userlist.remove(self.transport)
        self.send_list_of_usernames()
        print "Lost connection, %s" % (reason)


#lets run
factory = Factory()
factory.protocol = ChatServer

#listen on the port provided
reactor.listenTCP(port, factory)
reactor.run()