fixbot/api.py
changeset 58 31a17b0b5159
parent 44 779d7cd38f1a
equal deleted inserted replaced
57:31e7421e98af 58:31a17b0b5159
    12     """
    12     """
    13 
    13 
    14     # module's name
    14     # module's name
    15     name = None
    15     name = None
    16 
    16 
    17     # list of valid event types (strings)
       
    18     event_types = None
       
    19 
       
    20     def __str__ (self) :
    17     def __str__ (self) :
    21         return "Module %s:" % (self.name)
    18         return "Module %s:" % (self.name)
    22     
    19     
    23     def __repr__ (self) :
    20     def __repr__ (self) :
    24         return "<module %s with events: %s>" % (self.name, ", ".join(self.event_types))
    21         return "<module %s>" % (self.name, )
    25 
    22 
    26 class Event (object) :
    23 class Event (object) :
    27     # the ModuleInfo object
    24     # the ModuleInfo object
    28     module = None
    25     module = None
    29 
    26 
    30     # the event type as a string
    27     # the event type as a string
    31     type = None
    28     type = None
    32 
    29 
    33     # event message as a string (under 255 bytes in length!)
    30     # event message as a string (up to 64k, although that won't fit onto IRC..)
    34     msg = None
    31     msg = None
    35 
    32 
    36     # timestamp as a datetime.datetime
    33     # timestamp as a datetime.datetime
    37     when = None
    34     when = None
    38 
    35 
    39     def __init__ (self, module, type, msg) :
    36     def __init__ (self, module, type, msg) :
    40         assert type in module.event_types, "Invalid event-type %s for %r" % (type, self.module)
       
    41         
       
    42         self.module = module
    37         self.module = module
    43         self.type = type
    38         self.type = type
    44         self.msg = msg
    39         self.msg = msg
    45 
    40 
    46         self.when = datetime.now()
    41         self.when = datetime.now()
    97         self._assert(peer_secret == self.factory.secret, "Mismatching API secrets!")
    92         self._assert(peer_secret == self.factory.secret, "Mismatching API secrets!")
    98 
    93 
    99         m = ModuleInfo()
    94         m = ModuleInfo()
   100         
    95         
   101         m.name = i.readVarLen('B')
    96         m.name = i.readVarLen('B')
   102         m.event_types = list(buffer.readStringStream(i, 'B'))
       
   103         m.addr = self.transport.getPeer()
    97         m.addr = self.transport.getPeer()
   104 
    98 
   105         log.msg("Got mod_init for %r" % m)
    99         log.msg("Got mod_init for %r" % m)
   106         
   100         
   107         self.factory.nexus.registerModule(m, self)
   101         self.factory.nexus.registerModule(m, self)
   113         self.send(o)
   107         self.send(o)
   114 
   108 
   115     def on_module_event (self, i) :
   109     def on_module_event (self, i) :
   116         self._assert(self.module, "module_event with None self.module!")
   110         self._assert(self.module, "module_event with None self.module!")
   117 
   111 
   118         event_type = i.readEnum(self.module.event_types)
   112         event_type = i.readVarLen('B')
   119         event_msg = i.readVarLen('H')
   113         event_msg = i.readVarLen('H')
   120         
   114         
   121         e = Event(self.module, event_type, event_msg)
   115         e = Event(self.module, event_type, event_msg)
   122 
   116 
   123         self.factory.nexus.handleEvent(e)
   117         self.factory.nexus.handleEvent(e)
   136         log.msg("Connected to API server, sending module init message")
   130         log.msg("Connected to API server, sending module init message")
   137 
   131 
   138         o = self.startCommand('module_init')
   132         o = self.startCommand('module_init')
   139         o.writeVarLen('B', self.factory.secret)
   133         o.writeVarLen('B', self.factory.secret)
   140         o.writeVarLen('B', self.factory.name)
   134         o.writeVarLen('B', self.factory.name)
   141         buffer.writeStringStream(o, 'B', self.factory.event_types)
       
   142 
   135 
   143         self.send(o)
   136         self.send(o)
   144 
   137 
   145     def sendEvent (self, event) :
   138     def sendEvent (self, event) :
   146         o = self.startCommand('module_event')
   139         o = self.startCommand('module_event')
   147         o.writeEnum(self.factory.event_types, event.type)
   140         o.writeVarLen('B', event.type)
   148         o.writeVarLen('H', event.msg[:2**16])
   141         o.writeVarLen('H', event.msg[:2**16])
   149 
   142 
   150         self.send(o)
   143         self.send(o)
   151 
   144 
   152     def on_module_ok (self, i) :
   145     def on_module_ok (self, i) :