#!/usr/bin/env python
from Pyro.EventService.Clients import Publisher
from Pyro.errors import NamingError
import Pyro.core
import sys
CHAT_SERVER_GROUP = ":ChatBox-ES"
CHAT_SERVER_NAME = CHAT_SERVER_GROUP+".Server"
# Chat box administration server.
# Handles logins, logouts, channels and nicknames.
# The actual chat is fully performed by the Event Server!
# (Yes, this also means that if this Chatbox server dies, the people
# currently chatting can continue to do so without problems!)
class ChatBox(Pyro.core.ObjBase, Publisher):
def __init__(self):
Pyro.core.ObjBase.__init__(self)
Publisher.__init__(self)
self.channels={} # registered channels { eventTopic->nick list }
self.nicks=[] # all registered nicks on this server
def getChannels(self):
return self.channels.keys()
def getNicks(self):
return self.nicks
def join(self, channel, nick):
if nick in self.nicks:
raise ValueError,'this nick is already in use'
if not self.channels.has_key(channel):
print 'CREATING NEW CHANNEL',channel
self.channels[channel]=('ChatBox.Channel.'+channel,[])
self.channels[channel][1].append(nick)
self.nicks.append(nick)
print nick,'JOINED',channel
self.publish(self.channels[channel][0],('SERVER','** '+nick+' joined **'))
return self.channels[channel] # return the eventTopic for this channel
def leave(self, channel, nick):
if not self.channels.has_key(channel):
print 'IGNORED UNKNOWN CHANNEL',channel
return
self.channels[channel][1].remove(nick)
self.publish(self.channels[channel][0],('SERVER','** '+nick+' left **'))
if len(self.channels[channel][1])<1:
del self.channels[channel]
print 'REMOVED CHANNEL',channel
self.nicks.remove(nick)
print nick,'LEFT',channel
def main():
Pyro.core.initServer()
daemon = Pyro.core.Daemon()
ns = Pyro.naming.NameServerLocator().getNS()
daemon.useNameServer(ns)
# make sure our namespace group exists, and that our object name doesn't
try:
ns.createGroup(CHAT_SERVER_GROUP)
except NamingError:
pass
try:
ns.unregister(CHAT_SERVER_NAME)
except NamingError:
pass
uri=daemon.connect(ChatBox(),CHAT_SERVER_NAME)
# enter the service loop.
print 'Chatbox open.'
daemon.requestLoop()
if __name__=='__main__':
main()
|