All pastes #1595570 Raw Edit

Anonymous

public text v1 · immutable
#1595570 ·published 2009-10-05 20:19 UTC
rendered paste body
#!/usr/bin/python

import Pyro.core
import Pyro.naming
import Pyro.util
import sys
import logging
from Pyro.errors import NamingError
from threading import Thread

GROUP_NAME = ':CHAT'
OBJ_NAME = GROUP_NAME + '.SERVER-411'

class ChatServer(Pyro.core.SynchronizedObjBase):
    def __init__(self):
        Pyro.core.SynchronizedObjBase.__init__(self)
        self.uid_cb_pairs = {}

    def join(self, uid, callback):
        if uid in self.uid_cb_pairs:
            raise ValueError('User ID \'' + uid + '\' has already been taken')

        # add user
        callback._setOneway(['user_new', 'user_exit', 'new_msg'])
        self.uid_cb_pairs[uid] = callback
        print('User %s has joined the chat' % uid)

        # notify others of new user and new user of others
        for u, cb in self.uid_cb_pairs.iteritems():
            if u != uid:
                cb.user_new(uid)
                callback.user_new(u)

    def quit(self, uid):
        if uid not in self.uid_cb_pairs:
            raise ValueError('User ID %s not in the list of users' % uid)

        del self.uid_cb_pairs[uid]

        for cb in self.uid_cb_pairs.itervalues():
            cb.user_exit(uid)

    def send_msg(self, uid, msg):
        print('%s said %s' % (uid, msg))

        for u, cb in self.uid_cb_pairs.iteritems():
            if u != uid:
                cb.new_msg(uid, msg)

def main():
    Pyro.core.initServer()
    daemon = Pyro.core.Daemon()
    ns = Pyro.naming.NameServerLocator().getNS()
    print ('Connected to Name Server at: ' + ns.URI.address + ':' + str(ns.URI.port))
    daemon.useNameServer(ns)

    # ensure that no same obj name already registered in NS
    try:
        ns.createGroup(GROUP_NAME)
    except NamingError:
        pass
    try:
        ns.unregister(OBJ_NAME)
    except NamingError:
        pass

    uri = daemon.connect(ChatServer(), OBJ_NAME)
    print ('Hosting ChatServer at: ' + uri.address + ':' + str(uri.port))
    daemon.requestLoop()


if __name__=='__main__':
    main()