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