Beginning Python - From Novice to Professional

Beginning Python - From Novice to Professional Beginning Python - From Novice to Professional

16.01.2014 Views

CHAPTER 24 ■ PROJECT 5: A VIRTUAL TEA PARTY 469 def do_logout(self, session, line): 'Respond to the logout command' raise EndSession class LoginRoom(Room): """ A room meant for a single person who has just connected. """ def add(self, session): Room.add(self, session) # When a user enters, greet him/her: self.broadcast('Welcome to %s\r\n' % self.server.name) def unknown(self, session, cmd): # All unknown commands (anything except login or logout) # results in a prodding: session.push('Please log in\nUse "login "\r\n') def do_login(self, session, line): name = line.strip() # Make sure the user has entered a name: if not name: session.push('Please enter a name\r\n') # Make sure that the name isn't in use: elif name in self.server.users: session.push('The name "%s" is taken.\r\n' % name) session.push('Please try again.\r\n') else: # The name is OK, so it is stored in the session, and # the user is moved into the main room. session.name = name session.enter(self.server.main_room) class ChatRoom(Room): """ A room meant for multiple users who can chat with the others in the room. """ def add(self, session): # Notify everyone that a new user has entered: self.broadcast(session.name + ' has entered the room.\r\n') self.server.users[session.name] = session Room.add(self, session)

470 CHAPTER 24 ■ PROJECT 5: A VIRTUAL TEA PARTY def remove(self, session): Room.remove(self, session) # Notify everyone that a user has left: self.broadcast(session.name + ' has left the room.\r\n') def do_say(self, session, line): self.broadcast(session.name+': '+line+'\r\n') def do_look(self, session, line): 'Handles the look command, used to see who is in a room' session.push('The following are in this room:\r\n') for other in self.sessions: session.push(other.name + '\r\n') def do_who(self, session, line): 'Handles the who command, used to see who is logged in' session.push('The following are logged in:\r\n') for name in self.server.users: session.push(name + '\r\n') class LogoutRoom(Room): """ A simple room for a single user. Its sole purpose is to remove the user's name from the server. """ def add(self, session): # When a session (user) enters the LogoutRoom it is deleted try: del self.server.users[session.name] except KeyError: pass class ChatSession(async_chat): """ A single session, which takes care of the communication with a single user. """ def __init__(self, server, sock): async_chat.__init__(self, sock) self.server = server self.set_terminator("\r\n") self.data = [] self.name = None # All sessions begin in a separate LoginRoom: self.enter(LoginRoom(server))

470 CHAPTER 24 ■ PROJECT 5: A VIRTUAL TEA PARTY<br />

def remove(self, session):<br />

Room.remove(self, session)<br />

# Notify everyone that a user has left:<br />

self.broadcast(session.name + ' has left the room.\r\n')<br />

def do_say(self, session, line):<br />

self.broadcast(session.name+': '+line+'\r\n')<br />

def do_look(self, session, line):<br />

'Handles the look command, used <strong>to</strong> see who is in a room'<br />

session.push('The following are in this room:\r\n')<br />

for other in self.sessions:<br />

session.push(other.name + '\r\n')<br />

def do_who(self, session, line):<br />

'Handles the who command, used <strong>to</strong> see who is logged in'<br />

session.push('The following are logged in:\r\n')<br />

for name in self.server.users:<br />

session.push(name + '\r\n')<br />

class LogoutRoom(Room):<br />

"""<br />

A simple room for a single user. Its sole purpose is <strong>to</strong> remove<br />

the user's name from the server.<br />

"""<br />

def add(self, session):<br />

# When a session (user) enters the LogoutRoom it is deleted<br />

try: del self.server.users[session.name]<br />

except KeyError: pass<br />

class ChatSession(async_chat):<br />

"""<br />

A single session, which takes care of the communication with a<br />

single user.<br />

"""<br />

def __init__(self, server, sock):<br />

async_chat.__init__(self, sock)<br />

self.server = server<br />

self.set_termina<strong>to</strong>r("\r\n")<br />

self.data = []<br />

self.name = None<br />

# All sessions begin in a separate LoginRoom:<br />

self.enter(LoginRoom(server))

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!