Beginning Python - From Novice to Professional
Beginning Python - From Novice to Professional Beginning Python - From Novice to Professional
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))
- Page 450 and 451: CHAPTER 21 ■ PROJECT 2: PAINTING
- Page 452 and 453: CHAPTER 22 ■ ■ ■ Project 3: X
- Page 454 and 455: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 456 and 457: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 458 and 459: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 460 and 461: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 462 and 463: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 464 and 465: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 466 and 467: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 468: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 471 and 472: 440 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 473 and 474: 442 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 475 and 476: 444 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 477 and 478: 446 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 479 and 480: 448 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 481 and 482: 450 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 483 and 484: 452 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 486 and 487: CHAPTER 24 ■ ■ ■ Project 5: A
- Page 488 and 489: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 490 and 491: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 492 and 493: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 494 and 495: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 496 and 497: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 498 and 499: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 502 and 503: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 504 and 505: CHAPTER 25 ■ ■ ■ Project 6: R
- Page 506 and 507: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 508 and 509: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 510 and 511: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 512: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 515 and 516: 484 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 517 and 518: 486 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 519 and 520: 488 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 521 and 522: 490 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 523 and 524: 492 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 525 and 526: 494 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 527 and 528: 496 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 529 and 530: 498 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 531 and 532: 500 CHAPTER 27 ■ PROJECT 8: FILE
- Page 533 and 534: 502 CHAPTER 27 ■ PROJECT 8: FILE
- Page 535 and 536: 504 CHAPTER 27 ■ PROJECT 8: FILE
- Page 537 and 538: 506 CHAPTER 27 ■ PROJECT 8: FILE
- Page 539 and 540: 508 CHAPTER 27 ■ PROJECT 8: FILE
- Page 541 and 542: 510 CHAPTER 27 ■ PROJECT 8: FILE
- Page 543 and 544: 512 CHAPTER 27 ■ PROJECT 8: FILE
- Page 545 and 546: 514 CHAPTER 27 ■ PROJECT 8: FILE
- Page 547 and 548: 516 CHAPTER 27 ■ PROJECT 8: FILE
- Page 549 and 550: 518 CHAPTER 28 ■ PROJECT 9: FILE
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))