#! /usr/bin/env python from server import CHAT_SERVER_NAME from threading import Thread import Pyro.core from Pyro.errors import NamingError, ConnectionClosedError # Chat client. # Uses main thread for printing incoming event server messages (the chat messages!) # and another to read user input and publish this on the chat channel. class Chatter(Pyro.core.ObjBase): def __init__(self): Pyro.core.ObjBase.__init__(self) self.chatbox = Pyro.core.getProxyForURI('PYRONAME://'+CHAT_SERVER_NAME) self.abort=0 def message(self, nick, msg): if nick!=self.nick: print '['+nick+'] '+msg def chooseChannel(self): nicks=self.chatbox.getNicks() if nicks: print 'The following people are on the server: ',', '.join(nicks) channels=self.chatbox.getChannels() channels.sort() if channels: print 'The following channels already exist: ',', '.join(channels) print self.channel=raw_input('Choose a channel or create a new one: ') else: print 'The server has no active channels.' self.channel=raw_input('Name for new channel: ') self.nick=raw_input('Choose a nickname: ') people=self.chatbox.join(self.channel,self.nick,self.getProxy()) print 'Joined channel',self.channel,'as',self.nick print 'People on this channel:',', '.join(people) self.inputThread=Thread(target=self.handleInput) self.inputThread.start() def handleInput(self): print 'Ready for input! Type /quit to quit' try: try: while not self.abort: line=raw_input('> ') if line=='/quit': break if line: self.chatbox.publish(self.channel,self.nick,line) except EOFError: pass finally: self.chatbox.leave(self.channel, self.nick) self.abort=1 print 'Bye! (from input thread)' def main(): Pyro.core.initServer() Pyro.core.initClient() daemon = Pyro.core.Daemon() ns = Pyro.naming.NameServerLocator().getNS() daemon.useNameServer(ns) chatter=Chatter() daemon.connect(chatter) chatter.chooseChannel() try: daemon.requestLoop(lambda: not chatter.abort) except KeyboardInterrupt: print 'Shutting down chatter... (press enter)' chatter.abort=1 chatter.inputThread.join() print 'Exiting.' if __name__=="__main__": main()