initial, modified code
authorTero Marttila <terom@paivola.fi>
Thu, 20 Mar 2008 17:25:15 +0200
changeset 1 16d7aadc6f31
parent 0 b610bb7f8823
child 2 cc76980b8652
initial, modified code

committer: Tero Marttila <terom@paivola.fi>
api.py
irc.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/api.py	Thu Mar 20 17:25:15 2008 +0200
@@ -0,0 +1,121 @@
+from twisted.internet import protocol
+from datetime import datetime
+
+import buffer
+
+API_PORT        = 34888
+SERVER_HOST     = "10.0.0.5"
+
+class ModuleInfo (object) :
+    """
+        Some info about a module
+    """
+
+    # module's name
+    name = None
+
+    # module's version, as a 16-bit integer
+    version = None
+
+    # list of valid event types (strings)
+    event_types = None
+
+    def __str__ (self) :
+        return "Module %s:%d" % (self.name, self.version)
+    
+    def __repr__ (self) :
+        return "<module %s:%d with events: %s>" % (self.name, self.version, ", ".join(self.event_types))
+
+class Event (object) :
+    # the ModuleInfo object
+    module = None
+
+    # the event type as a string
+    type = None
+
+    # event message as a string (under 255 bytes in length!)
+    msg = None
+
+    # timestamp as a datetime.datetime
+    when = None
+
+    def __init__ (self, module, type, msg) :
+        assert type in module.event_types, "Invalid event-type %s for %r" % (type, self.module)
+        
+        self.module = module
+        self.type = type
+        self.msg = msg
+
+        self.when = datetime.now()
+    
+    def __str__ (self) :
+        return "[%s] %s" % (self.type, self.msg)
+    
+    def __repr__ (self) :
+        return "%s @ %s" % (self.type, self.when)
+        
+class ServerProtocol (buffer.StreamProtocol, protocol.Protocol) :
+    RECV_COMMANDS = [
+        "module_init",
+        "module_event"
+    ]
+
+    SEND_COMMANDS = [
+
+    ]
+
+    VALID_STATES = [
+        "wait_init",
+        "wait_event"
+    ]
+    
+    # proto state
+    state = None
+
+    # module info
+    module = None
+    
+    def _assert (self, condition, msg) :
+        if not condition :
+            self.transport.loseConnection()
+            log.err("assert failed in APIProtocol for %s: %s" % (self.module, msg))
+    
+    def connectionMade (self) :
+        log.msg("Client connected")
+
+    def on_module_init (self, i) :
+        self._assert(not self.module, "module_init with non-None self.module")
+
+        m = self.module = api.ModuleInfo()
+        
+        m.name = i.readVarLen('B')
+        m.version = i.readItem('H')
+
+        m.event_types = buffer.readStringStream(i, 'B')
+        m.addr = self.transport.getPeer()
+
+        self.module_name = module_name
+
+        log.msg("Got mod_init for %r" % m
+
+        self.factory.nexus.registerModule(m, self)
+
+    def on_module_event (self, i) :
+        self._assert(self.module, "module_event with None self.module!")
+
+        event_type = i.readEnum(self.module.event_types)
+        event_msg = i.readVarLen('B')
+        
+        e = api.Event(self.module, event_type, event_msg)
+
+        log.msg("Got mod_event of %r" % (e)
+
+        self.factory.nexus.handleEvent(e)
+
+    def logPrefix (self) :
+        if self.module :
+            return str(self.module)
+        else :
+            return super(APIProtocol, self).logPrefix()
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/irc.py	Thu Mar 20 17:25:15 2008 +0200
@@ -0,0 +1,46 @@
+from twisted.words.protocols import irc
+from twisted.internet import protocol
+
+import buffer
+
+HOSTNAME        = "irc.fixme.fi"
+PORT            = 6667
+NICKNAME        = "FixBot"
+USERNAME        = "fixme"
+CHANNEL         = "#fixme"
+
+class BotProtocol (irc.IRCClient) :
+    """
+        Fixme IRC bot
+    """
+
+    # housekeeping
+    def connectionMade (self) :
+        log.msg("Connected")
+        super(FixBot, self).connectionMade()
+
+    def connectionLost (self, reason) :
+        log.msg("Connection lost: %s" % reason)
+        super(FixBot, self).connectionLost(reason)
+
+    def signedOn (self) :
+        log.msg("Signed on, joining channel %s" % channel)
+        self.join(CHANNEL)
+
+    def joined (self, channel) :
+        log.msg("Joined channel %s" % channel)
+    
+    # our actual functionality
+    def send (self, msg) :
+        self.msg(CHANNEL, str(msg))
+
+    def sendEvent (self, event) :
+        self.msg(CHANNEL, "[%s.%s] %s" % (event.module.name, event.type, event.msg))
+
+    def moduleConnected (self, module, addr) :
+        self.msg(CHANNEL, "{modules} Module %s connected from %s:%d, version %s" % (module.name, addr.host, addr.port, module.version))
+
+    def moduleDisconnected (self, module) :
+        self.msg(CHANNEL, "{modules} Module %s disconnected" % (module.name, ))
+
+