mirror of git://git.psyced.org/git/pypsyc
144 lines
3.4 KiB
Python
Executable File
144 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
## base.py
|
|
|
|
|
|
# Licensed under the MIT license
|
|
# http://opensource.org/licenses/mit-license.php
|
|
|
|
# <C> Copyright 2007, Manuel Jacob
|
|
|
|
|
|
from lib.parse import MMPParser, PSYCParser
|
|
from lib.render import MMPRenderer, PSYCRenderer
|
|
from lib.packets import MMPPacket, PSYCPacket
|
|
|
|
|
|
debug = False
|
|
|
|
|
|
class Module:
|
|
methods = []
|
|
|
|
def register_center(self, center):
|
|
self.center = center
|
|
|
|
def received(self, packet, physsource):
|
|
func = getattr(self, 'handle_%s' % packet.mc[1:], None)
|
|
|
|
if func:
|
|
func(packet, physsource)
|
|
|
|
else:
|
|
self.handle(packet, physsource)
|
|
|
|
|
|
class MMPCircuit:
|
|
def __init__(self, center):
|
|
self.center = center
|
|
self.mmp_parser = MMPParser()
|
|
self.mmp_parser.recv_packet = self.recv_packet
|
|
self.mmp_renderer = MMPRenderer()
|
|
|
|
def init(self):
|
|
self.send_mmp_packet(MMPPacket())
|
|
|
|
def recv_packet(self, packet):
|
|
self.center.recv_mmp_packet(packet, self)
|
|
|
|
def send_mmp_packet(self, packet):
|
|
self._send(self.mmp_renderer.render(packet))
|
|
|
|
|
|
class PSYCCircuit(MMPCircuit):
|
|
def __init__(self, center):
|
|
MMPCircuit.__init__(self, center)
|
|
self.psyc_parser = PSYCParser()
|
|
self.psyc_renderer = PSYCRenderer()
|
|
|
|
def send_psyc_packet(self, packet):
|
|
self.send_mmp_packet(self.psyc_renderer.render(packet))
|
|
|
|
|
|
class Plugin:
|
|
def __init__(self, name):
|
|
self.name = name
|
|
self.p = __import__('plugins.' + self.name, (), (), [self.name])
|
|
self.needs = self.p.needs
|
|
|
|
def load(self):
|
|
self.instance = self.p.Module()
|
|
|
|
|
|
class Config:
|
|
def __init__(self, app):
|
|
self.app = app
|
|
|
|
self.settings_folder = self.get_settings_folder()
|
|
self.configfile = self.open_configfile()
|
|
|
|
|
|
class BaseCenter:
|
|
type = 'base'
|
|
registered_modules = []
|
|
handlers = {}
|
|
plugins = {}
|
|
connections = {}
|
|
|
|
def load_plugin(self, name):
|
|
p = Plugin(name)
|
|
|
|
for load in p.needs:
|
|
self.load_plugin(load)
|
|
|
|
p.load()
|
|
self.register_module(p.instance)
|
|
self.plugins[name] = p
|
|
|
|
def register_module(self, module):
|
|
for i in module.methods:
|
|
if i in self.handlers:
|
|
self.handlers[i].append(module)
|
|
|
|
else:
|
|
self.handlers[i] = [module]
|
|
|
|
module.register_center(self)
|
|
self.registered_modules.append(module)
|
|
|
|
def connected(self, connection, host):
|
|
self.connections[host] = connection
|
|
self._connected(connection, host)
|
|
|
|
def _connected(self, connection, host):
|
|
pass
|
|
|
|
def recv_mmp_packet(self, packet, physsource): # called by circuit
|
|
raise NotImplementedError
|
|
|
|
def recv_psyc_packet(self, packet, physsource): # called by subclass
|
|
handlers = []
|
|
|
|
for key, value in self.handlers.items():
|
|
if key == packet.mc or \
|
|
(key[-1] == '*' and packet.mc.startswith(key[:-1])):
|
|
handlers.extend(value)
|
|
|
|
for i in handlers:
|
|
i.received(packet, physsource)
|
|
|
|
def send_mmp_packet(self, packet, physdest):
|
|
raise NotImplemented
|
|
|
|
def _send_psyc_packet(self, packet, physdest):
|
|
if debug: # WARNING: Do not show all packets
|
|
print """packet to %s::
|
|
mmpvars: %s
|
|
psycvars: %s
|
|
mc: %s
|
|
text: %s
|
|
""" % (physdest, packet.mmpvars, packet.psycvars, packet.mc, packet.data)
|
|
|
|
physdest.send_psyc_packet(packet)
|