[Pymoul-svn] SF.net SVN: pymoul: [298] pymoul/trunk/src
Status: Alpha
Brought to you by:
tiran
|
From: <ti...@us...> - 2007-06-01 01:49:58
|
Revision: 298
http://pymoul.svn.sourceforge.net/pymoul/?rev=298&view=rev
Author: tiran
Date: 2007-05-31 18:49:57 -0700 (Thu, 31 May 2007)
Log Message:
-----------
Added plugin
More work on the infrastructure
Modified Paths:
--------------
pymoul/trunk/src/moul/chatrelay/chatrelay.ini
pymoul/trunk/src/moul/chatrelay/config.py
pymoul/trunk/src/moul/chatrelay/interfaces.py
pymoul/trunk/src/moul/chatrelay/ircrelay.py
pymoul/trunk/src/moul/chatrelay/service.py
Added Paths:
-----------
pymoul/trunk/src/twisted/
pymoul/trunk/src/twisted/plugins/
pymoul/trunk/src/twisted/plugins/chatrelay.py
Removed Paths:
-------------
pymoul/trunk/src/moul/chatrelay/app.py
Deleted: pymoul/trunk/src/moul/chatrelay/app.py
===================================================================
--- pymoul/trunk/src/moul/chatrelay/app.py 2007-05-30 14:49:24 UTC (rev 297)
+++ pymoul/trunk/src/moul/chatrelay/app.py 2007-06-01 01:49:57 UTC (rev 298)
@@ -1,19 +0,0 @@
-from twisted.application import internet, service
-from twisted.internet import reactor
-
-from moul.chatrelay.service import PollingFileAppendWatchService
-from moul.chatrelay.config import config
-from moul.chatrelay.ircrelay import IRCChatRelayFactory
-
-application = service.Application("MOUL Chat Relay")
-
-appendWatchService = PollingFileAppendWatchService(config.watch_interval)
-appendWatchService.setName("AppendWatch")
-appendWatchService.setServiceParent(application)
-
-ircFactory = IRCChatRelayFactory()
-ircFactory.config = config
-ircRelayService = internet.TCPClient(config.network, config.port,
- ircFactory)
-ircRelayService.setName("IRC Relay")
-ircRelayService.setServiceParent(application)
Modified: pymoul/trunk/src/moul/chatrelay/chatrelay.ini
===================================================================
--- pymoul/trunk/src/moul/chatrelay/chatrelay.ini 2007-05-30 14:49:24 UTC (rev 297)
+++ pymoul/trunk/src/moul/chatrelay/chatrelay.ini 2007-06-01 01:49:57 UTC (rev 298)
@@ -1,6 +1,6 @@
[ircrelay]
nickname=Tiran
-channel=#urubot
+channel=#urutestbot
network=tsunami.justirc.net
port=6667
adminpasswd=moul
Modified: pymoul/trunk/src/moul/chatrelay/config.py
===================================================================
--- pymoul/trunk/src/moul/chatrelay/config.py 2007-05-30 14:49:24 UTC (rev 297)
+++ pymoul/trunk/src/moul/chatrelay/config.py 2007-06-01 01:49:57 UTC (rev 298)
@@ -1,7 +1,10 @@
import os
from ConfigParser import SafeConfigParser
from ConfigParser import NoOptionError
+from zope.interface import implements
+from moul.chatrelay.interfaces import IConfiguration
+
_marker = object()
required = object()
@@ -25,6 +28,7 @@
class Configuration(object):
"""Config object
"""
+ implements(IConfiguration)
options = ['nickname', 'channel', 'network', 'port', 'adminpasswd',
'serverpasswd', 'nickpasswd', 'defaultprofile']
@@ -66,5 +70,3 @@
self.port = int(self.port)
self.nickname = self.nickname + self.nicksuffix
-
-config = FileConfiguration(defaultcfg)
Modified: pymoul/trunk/src/moul/chatrelay/interfaces.py
===================================================================
--- pymoul/trunk/src/moul/chatrelay/interfaces.py 2007-05-30 14:49:24 UTC (rev 297)
+++ pymoul/trunk/src/moul/chatrelay/interfaces.py 2007-06-01 01:49:57 UTC (rev 298)
@@ -170,3 +170,7 @@
def listFilters():
"""Return a list of filters
"""
+
+class IConfiguration(Interface):
+ """Configuration object
+ """
Modified: pymoul/trunk/src/moul/chatrelay/ircrelay.py
===================================================================
--- pymoul/trunk/src/moul/chatrelay/ircrelay.py 2007-05-30 14:49:24 UTC (rev 297)
+++ pymoul/trunk/src/moul/chatrelay/ircrelay.py 2007-06-01 01:49:57 UTC (rev 298)
@@ -30,10 +30,13 @@
from twisted.internet import reactor, protocol
from twisted.internet.task import LoopingCall
from twisted.python import log, failure
+from twisted.application import internet
from moul.chatrelay.io import MessageWriter
from moul.chatrelay.io import LogFileReader
from moul.chatrelay.io import MOULLogFormatter
+from moul.chatrelay.interfaces import IConfiguration
+from moul.chatrelay.service import getAppendWatchService
from moul.osdependent import getMoulUserDataDir
datadir = getMoulUserDataDir()
@@ -64,6 +67,9 @@
class IRCChatRelay(irc.IRCClient):
"""A chat relay bot"""
+ def __init__(self, *args, **kwargs):
+ #irc.IRCClient.__init__()
+ self.chan2user = {}
@property
def config(self):
@@ -91,20 +97,77 @@
# callbacks for events
def signedOn(self):
+ log.msg("I signed on")
if self.config.nickpasswd:
self.msg("Nickserv", "IDENTIFY %s" % self.config.nickpasswd)
- self.join(self.config.channel)
+ # XXX
+ if 1:
+ self.join(self.config.channel)
def joined(self, channel):
log.msg("I have joined", channel)
+ self.chan2user[channel] = []
def left(self, channel):
log.msg("I have left", channel)
+ del self.chan2user[channel]
def kickedFrom(self, channel, kicker, message):
log.msg("I have been kicked from %s by %s: %s" %
(channel, kicker, message))
+ del self.chan2user[channel]
+ def topicUpdated(self, user, channel, newTopic):
+ """In channel, user changed the topic to newTopic.
+ """
+ log.msg("The topic in %s is ''" % (channel, newTopic))
+
+ def userJoined(self, user, channel):
+ log.msg("User %s has joined channel %s" % (user, channel))
+ users = self.chan2user.setdefault(channel, [])
+ if not user in users:
+ users.append(user)
+
+ def userLeft(self, user, channel):
+ """Called when I see another user leaving a channel.
+ """
+ log.msg("User %s has left channel %s" % (user, channel))
+ users = self.chan2user.get(channel, [])
+ try:
+ users.remove(user)
+ except ValueError:
+ pass
+
+ def userQuit(self, user, quitMessage):
+ """Called when I see another user disconnect from the network.
+ """
+ log.msg("User %s has quit" % user)
+ for users in self.chan2user.values():
+ try:
+ users.remove(user)
+ except ValueError:
+ pass
+
+ def userKicked(self, kickee, channel, kicker, message):
+ """Called when I observe someone else being kicked from a channel.
+ """
+ log.msg("User %s was kicked from channel %s" % (kickee, channel))
+ users = self.chan2user.get(channel, [])
+ try:
+ users.remove(kickee)
+ except ValueError:
+ pass
+
+ def userRenamed(self, oldname, newname):
+ log.msg("User %s is now known as %s" % (oldname, newname))
+ for users in self.chan2user.values():
+ if oldname in users:
+ users.remove(oldname)
+ users.append(newname)
+
+ def irc_unknown(self, prefix, command, params):
+ print prefix, command, params
+
class IRCChatRelayFactory(protocol.ReconnectingClientFactory):
protocol = IRCChatRelay
config = None
@@ -114,3 +177,21 @@
p = self.protocol()
p.factory = self
return p
+
+_services = {}
+def getIRCRelayService(name="IRC Relay", config=None):
+ """
+ """
+ global _services
+ service = _services.get(name, None)
+ if service is not None:
+ return service
+ config = IConfiguration(config)
+ factory = IRCChatRelayFactory()
+ factory.config = config
+ service = internet.TCPClient(config.network, config.port, factory)
+ service.setName(name)
+ _services[name] = service
+ return service
+
+
Modified: pymoul/trunk/src/moul/chatrelay/service.py
===================================================================
--- pymoul/trunk/src/moul/chatrelay/service.py 2007-05-30 14:49:24 UTC (rev 297)
+++ pymoul/trunk/src/moul/chatrelay/service.py 2007-06-01 01:49:57 UTC (rev 298)
@@ -110,3 +110,19 @@
data = fp.read()
if data:
funcs[0](path, data)
+
+_services = {}
+def getAppendWatchService(name="AppendWatch", interval=None):
+ """Service factory, holds a global service per name
+ """
+ global _services
+ service = _services.get(name, None)
+ if service is not None:
+ return service
+ if interval is None:
+ raise KeyError(name)
+ service = PollingFileAppendWatchService(interval)
+ service.setName(name)
+ _services[name] = service
+ return service
+
Property changes on: pymoul/trunk/src/twisted/plugins
___________________________________________________________________
Name: svn:ignore
+ dropin.cache
dropin.cache.new
Added: pymoul/trunk/src/twisted/plugins/chatrelay.py
===================================================================
--- pymoul/trunk/src/twisted/plugins/chatrelay.py (rev 0)
+++ pymoul/trunk/src/twisted/plugins/chatrelay.py 2007-06-01 01:49:57 UTC (rev 298)
@@ -0,0 +1,33 @@
+from zope.interface import implements
+
+from twisted.python import usage
+from twisted.plugin import IPlugin
+from twisted.application.service import IServiceMaker
+from twisted.application import service
+
+from moul.chatrelay.config import FileConfiguration
+from moul.chatrelay.config import defaultcfg
+
+from moul.chatrelay.service import getAppendWatchService
+from moul.chatrelay.ircrelay import getIRCRelayService
+
+class Options(usage.Options):
+ optParameters = [["configfile", "c", defaultcfg, "Path to the config.ini"]]
+
+class ChatRelayMaker(object):
+ implements(IServiceMaker, IPlugin)
+ tapname = "chatrelay"
+ description = "MOUL IRC Chat relay."
+ options = Options
+
+ def makeService(self, options):
+ root = service.MultiService()
+ root.setName(self.tapname)
+ config = FileConfiguration(options['configfile'])
+ watchService = getAppendWatchService(interval=config.watch_interval)
+ watchService.setServiceParent(root)
+ ircService = getIRCRelayService(config=config)
+ ircService.setServiceParent(root)
+ return root
+
+serviceMaker = ChatRelayMaker()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|