[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. |