# standard python libs from logging import getLogger, CRITICAL, ERROR, WARNING, INFO, DEBUG # pyogp from pyogp.lib.base.utilities.events import Event from pyogp.lib.base.settings import Settings # initialize logging logger = getLogger('...message.message_handler') log = logger.log class MessageHandler(object): """ general class handling individual messages """ def __init__(self, settings = None): """ i do nothing """ # allow the settings to be passed in # otherwise, grab the defaults if settings != None: self.settings = settings else: from pyogp.lib.base.settings import Settings self.settings = Settings() self.handlers = {} def register(self, message_name): if self.settings.LOG_VERBOSE: log(DEBUG, 'Creating a monitor for %s' % (message_name)) return self.handlers.setdefault(message_name, MessageHandledNotifier(message_name, self.settings)) def is_message_handled(self, message_name): """ if the message is being monitored, return True, otherwise, return False this can allow us to skip parsing inbound messages if no one is watching a particular one """ try: handler = self.handlers[message_name] return True except KeyError: return False def _handle(self, message): """ essentially a case statement to pass messages to event notifiers in the form of self attributes """ try: handler = self.handlers[message.name] # Handle the message if we have subscribers # Conveniently, this will also enable verbose message logging if len(handler) > 0: if self.settings.LOG_VERBOSE and not (self.settings.UDP_SPAMMERS and self.settings.DISABLE_SPAMMERS): log(DEBUG, 'Handling message : %s' % (message.name)) handler(message) except KeyError: #log(INFO, "Received an unhandled message: %s" % (message.name)) pass class MessageHandledNotifier(object): """ pseudo subclassing the Event class to treat the message like an event """ def __init__(self, message_name, settings): self.event = Event() self.message_name = message_name self.settings = settings def subscribe(self, *args, **kwdargs): self.event.subscribe(*args, **kwdargs) def received(self, message): self.event(message) def unsubscribe(self, *args, **kwdargs): self.event.unsubscribe(*args, **kwdargs) if self.settings.LOG_VERBOSE: log(DEBUG, "Removed the monitor for %s by %s" % (args, kwdargs)) def __len__(self): return len(self.event) __call__ = received """ Contributors can be viewed at: http://svn.secondlife.com/svn/linden/projects/2008/pyogp/CONTRIBUTORS.txt $LicenseInfo:firstyear=2008&license=apachev2$ Copyright 2009, Linden Research, Inc. Licensed under the Apache License, Version 2.0 (the "License"). You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0 or in http://svn.secondlife.com/svn/linden/projects/2008/pyogp/LICENSE.txt $/LicenseInfo$ """