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