[Pymoul-svn] SF.net SVN: pymoul: [290] pymoul/trunk/src/moul/chatrelay
Status: Alpha
Brought to you by:
tiran
From: <ti...@us...> - 2007-05-24 14:00:54
|
Revision: 290 http://pymoul.svn.sourceforge.net/pymoul/?rev=290&view=rev Author: tiran Date: 2007-05-24 07:00:41 -0700 (Thu, 24 May 2007) Log Message: ----------- First working version Modified Paths: -------------- pymoul/trunk/src/moul/chatrelay/io.py pymoul/trunk/src/moul/chatrelay/ircclient.py Modified: pymoul/trunk/src/moul/chatrelay/io.py =================================================================== --- pymoul/trunk/src/moul/chatrelay/io.py 2007-05-24 00:30:38 UTC (rev 289) +++ pymoul/trunk/src/moul/chatrelay/io.py 2007-05-24 14:00:41 UTC (rev 290) @@ -34,45 +34,48 @@ """ def __init__(self, fname): self._fname = fname - self._fd = None + self._fd = None self._fifo = [] self._incomplete = [] - + def exists(self): return os.path.isfile(self._fname) def open(self): self._fd = open(self._fname, 'r') - self._fd.seek(0, 2) # eof + self._fd.seek(0, 2) # eof def close(self): if self._fd: - self._fd.close() + self._fd.close() self._fd = None self._fifo = [] - self._incomplete = [] - + self._incomplete = [] + + @property + def isOpen(self): + return self._fd is not None + def _read(self): - fd = self._fd - data = self.read() - if not data: - return - lines = data.split(os.linesep) - # XXX - KISS, don't check for imcomplete lines - for line in lines: - line = line.strip() - if line: - self._fifo.append(line) + data = self._fd.read() + if not data: + return + lines = data.split(os.linesep) + # XXX - KISS, don't check for imcomplete lines + for line in lines: + line = line.strip() + if line: + self._fifo.append(line) def __iter__(self): - self._read() - return self + self._read() + return self def next(self): try: - return self._fifo.pop(0) - except IndexError: - raise StopIteration + return self._fifo.pop(0) + except IndexError: + raise StopIteration class MessageWriter(object): """Write messages to a channel @@ -81,11 +84,11 @@ def __init__(self, client, channel, formatter=None): self._client = client - self._channel = channel - if formatter is None: - formatter = NullFormatter() - self._fmt = formatter + self._channel = channel + if formatter is None: + formatter = NullFormatter() + self._fmt = formatter def log(self, msg): msg = self._fmt.format(msg) - self._client.say(self._channel, msg, self.maxlength) + self._client.say(self._channel, msg, self.maxlength) Modified: pymoul/trunk/src/moul/chatrelay/ircclient.py =================================================================== --- pymoul/trunk/src/moul/chatrelay/ircclient.py 2007-05-24 00:30:38 UTC (rev 289) +++ pymoul/trunk/src/moul/chatrelay/ircclient.py 2007-05-24 14:00:41 UTC (rev 290) @@ -24,14 +24,21 @@ __revision__ = "$Revision: 108 $" import sys +import os from twisted.words.protocols import irc from twisted.internet import reactor, protocol +from twisted.internet.task import LoopingCall from twisted.python import log, failure from moul.chatrelay.io import MessageWriter from moul.chatrelay.io import LogFileReader +from moul.osdependent import getMoulUserDataDir +datadir = getMoulUserDataDir() +chatlog = os.path.join(datadir, 'Log', 'chat.0.log') +print chatlog + def requirePasswd(func): """@decorator""" func.requirePassword = True @@ -57,6 +64,10 @@ class ChatRelayBot(irc.IRCClient): """A chat relay bot""" + reader = None + writer = None + interval = 5 + def __init__(self, nickname, channel, realname=None, username=None, serverpasswd=None, nickpasswd=None, adminpasswd=None): """ @@ -68,13 +79,34 @@ self.password = serverpasswd self.nickpasswd = nickpasswd self.adminpasswd = adminpasswd - + + self.loop = LoopingCall(self.checkLogfile) + self.identified = [] + def connectionMade(self): irc.IRCClient.connectionMade(self) def connectionLost(self, reason): irc.IRCClient.connectionLost(self, reason) + # core method - check log file + + def checkLogfile(self): + for line in iter(self.reader): + self.writer.log(line) + + def start(self): + #if not self.reader.isOpen: + # return + if not self.reader.exists(): + return "File does not exist" + self.reader.open() + self.loop.start(self.interval) + + def stop(self): + self.loop.stop() + self.reader.close() + # callbacks for events def signedOn(self): @@ -206,15 +238,22 @@ reactor.callLater(3.0, self.reply, reply, "0-/") reactor.callLater(3.5, self.reply, reply, "0-\\") - @usage("Open the chatlog") - @requirePasswd - def command_OPENLOG(self, user, reply, args): - self.reply(reply, 'Opening chatlog') + #@requirePasswd + @usage("Open the chatlog and start relaying") + def command_STARTLOG(self, user, reply, args): + self.reply(reply, 'Opening chatlog ...') + msg = self.start() + if msg is not None: + self.reply(reply, 'Error: %s' % msg) + return + self.msg(self.channel, "*** I'm relaying chat ***") - @usage("Close the chatlog") - @requirePasswd - def command_CLOSELOG(self, user, reply, args): - self.reply(reply, 'Closing chatlog') + #@requirePasswd + @usage("Stop relaying") + def command_STOPLOG(self, user, reply, args): + self.stop() + self.reply(reply, 'chatlog closed') + self.msg(self.channel, "*** I've stopped to relay chat ***") class ThrottledClientFactory(protocol.ClientFactory): lostDelay = 2 @@ -229,6 +268,8 @@ shuttingDown = False p = None + readerClass = LogFileReader + writerClass = MessageWriter def __init__(self, nickname, channel, realname=None, username=None, serverpasswd=None, nickpasswd=None, adminpasswd=None): @@ -257,6 +298,8 @@ self.username, self.password, self.nickpasswd, self.adminpasswd) p.factory = self + p.reader = self.readerClass(chatlog) + p.writer = self.writerClass(p, self.channel) self.p = p return p This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |