From b88b107343f40a628a5871f1283d6a7f1ffce633 Mon Sep 17 00:00:00 2001 From: Ryan Hitchman Date: Fri, 17 Apr 2009 15:54:11 -0600 Subject: [PATCH] beginning of log plugin --- bot.py | 11 +++++--- plugins/hook.py | 9 ++++--- plugins/log.py | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 plugins/log.py diff --git a/bot.py b/bot.py index 63e4173..f5727d6 100755 --- a/bot.py +++ b/bot.py @@ -88,19 +88,21 @@ class Input(object): self.msg = msg if command == "PRIVMSG": self.chan = paraml[0] + else: + self.chan = "" class FakeBot(object): def __init__(self, bot, input, func): self.bot = bot self.persist_dir = bot.persist_dir + self.network = bot.network self.input = input self.msg = bot.irc.msg self.cmd = bot.irc.cmd self.join = bot.irc.join self.func = func self.doreply = True - if input.command == "PRIVMSG": - self.chan = input.paraml[0] + self.chan = input.chan def say(self, msg): self.bot.irc.msg(self.input.paraml[0], msg) @@ -124,6 +126,7 @@ while True: try: out = bot.irc.out.get(timeout=1) reload_plugins() + printed = False for csig, func, args in (bot.plugs['command'] + bot.plugs['event']): input = Input(*out) for fsig, sieve in bot.plugs['sieve']: @@ -136,7 +139,9 @@ while True: break if input == None: continue - print '<<<', input.raw + if not printed: + print '<<<', input.raw + printed = True thread.start_new_thread(FakeBot(bot, input, func).run, ()) except Queue.Empty: pass diff --git a/plugins/hook.py b/plugins/hook.py index c392ca7..a0a72bf 100644 --- a/plugins/hook.py +++ b/plugins/hook.py @@ -39,8 +39,8 @@ def command(func=None, hook=None, **kwargs): else: return command_wrapper(func) -def event(arg): - args = {} +def event(arg=None, **kwargs): + args = kwargs def event_wrapper(func): if func.func_code.co_argcount != 2: raise ValueError, \ @@ -52,7 +52,8 @@ def event(arg): return func if _isfunc(arg): - return event_wrapper(arg) + return event_wrapper(arg, kwargs) else: - args['events'] = arg.split() + if arg is not None: + args['events'] = arg.split() return event_wrapper diff --git a/plugins/log.py b/plugins/log.py new file mode 100644 index 0000000..1a56220 --- /dev/null +++ b/plugins/log.py @@ -0,0 +1,68 @@ +""" +log.py: written by Scaevolus 2009 +""" + +from __future__ import with_statement + +import os +import thread +import codecs +import time + +import hook + +lock = thread.allocate_lock() +log_fds = {} # '%(net)s %(chan)s' : (filename, fd) + +timestamp_format = '%H:%M:%S' + +def get_log_filename(dir, network, chan): + return os.path.join(dir, 'log', gmtime('%Y'), network, + gmtime('%%s.%m-%d.log') % chan) + +def gmtime(format): + return time.strftime(format, time.gmtime()) + +def load_memory(filename, mtimes={}): + if not os.path.exists(filename): + return {} + mtime = os.stat(filename).st_mtime + if mtimes.get(filename, 0) != mtime: + mtimes[filename] = mtime + return dict((x.split(None, 1)[0].lower(), x.strip()) for x in + codecs.open(filename, 'r', 'utf-8')) + +def save_memory(filename, memory): + out = codecs.open(filename, 'w', 'utf-8') + out.write('\n'.join(sorted(memory.itervalues()))) + out.flush() + out.close() + +def get_log_fd(dir, network, chan): + fn = get_log_filename(dir, network, chan) + cache_key = '%s %s' % (network, chan) + filename, fd = log_fds.get(cache_key, ('', 0)) + + if fn != filename: # we need to open a file for writing + if fd != 0: # is a valid fd + fd.flush() + fd.close() + dir = os.path.split(fn)[0] + if not os.path.exists(dir): + os.makedirs(dir) + fd = codecs.open(fn, 'wab', 'utf-8') + log_fds[cache_key] = (fn, fd) + + return fd + +@hook.event(ignorebots=False) +def log(bot, input): + ".remember -- maps word to data in the memory" + with lock: + fd = get_log_fd(bot.persist_dir, bot.network, 'RAW') + fd.write(gmtime(timestamp_format) + ' ' + input.raw + '\n') + + if input.chan: + fd = get_log_fd(bot.persist_dir, bot.network, input.chan) + fd.write(gmtime(timestamp_format) + ' ' + input.raw + '\n') +