1from twisted.python.util import sibpath 2from nevow.loaders import xmlfile 3from nevow.athena import LiveElement, expose 4 5class ChatRoom(object): 6 7 def __init__(self): 8 self.chatters = [] 9 10 def wall(self, message): 11 for chatter in self.chatters: 12 chatter.wall(message) 13 14 def tellEverybody(self, who, what): 15 for chatter in self.chatters: 16 chatter.hear(who.username, what) 17 18 def makeChatter(self): 19 elem = ChatterElement(self) 20 self.chatters.append(elem) 21 return elem 22 23# element to be run with twistd 24chat = ChatRoom().makeChatter 25 26class ChatterElement(LiveElement): 27 28 docFactory = xmlfile(sibpath(__file__, 'template.html')) 29 jsClass = u'ChatThing.ChatterWidget' 30 31 def __init__(self, room): 32 self.room = room 33 34 def setUsername(self, username): 35 self.username = username 36 message = ' * user '+username+' has joined the room' 37 self.room.wall(message) 38 setUsername = expose(setUsername) 39 40 def say(self, message): 41 self.room.tellEverybody(self, message) 42 say = expose(say) 43 44 def wall(self, message): 45 self.callRemote('displayMessage', message) 46 47 def hear(self, username, what): 48 self.callRemote('displayUserMessage', username, what) 49