diff options
Diffstat (limited to 'logger.py')
-rw-r--r-- | logger.py | 594 |
1 files changed, 332 insertions, 262 deletions
@@ -13,15 +13,28 @@ import Queue import ssl import urllib2 import irc +import codecs -modemapping = dict( - Y="ircop", q="owner", a="admin", o="op", h="halfop", v="voice") +modemapping = dict(Y="ircop", q="owner", + a="admin", o="op", h="halfop", v="voice") + + +def LoggerReload(log): + newlog = Logger(logroot=log.logroot) + with newlog.rotatelock, log.rotatelock: + newlog.logs = log.logs + log.logs = {} + for context, conf in log.conf.items(): + context.rmAddon(log) + context.addAddon(newlog, label=conf.label) + return newlog class Logger(Thread): + def __init__(self, logroot): self.logroot = logroot - path = [logroot] + path = [os.path.expanduser(logroot)] while not os.path.isdir(path[0]): split = os.path.split(path[0]) @@ -31,11 +44,11 @@ class Logger(Thread): while len(path) > 1: path[0] = os.path.join(*path[:2]) del path[1] - #print path + # print path os.mkdir(path[0]) self.logs = {} - self.labels = {} + self.conf = {} self.rotatelock = Lock() Thread.__init__(self) @@ -45,114 +58,134 @@ class Logger(Thread): def run(self): try: Y, M, D, h, m, s, w, d, dst = time.localtime() - nextrotate = int(time.mktime((Y, M, D+1, 0, 0, 0, 0, 0, -1))) + nextrotate = int(time.mktime((Y, M, D + 1, 0, 0, 0, 0, 0, -1))) while True: while nextrotate > time.time(): # May need to do this in a loop in case the following time.sleep command wakes up a second too early. - time.sleep(max(0.1, min((nextrotate-time.time(), 3600)))) + time.sleep(max(0.1, min((nextrotate - time.time(), 3600)))) with self.rotatelock: if all([not log or log.closed for log in self.logs.values()]): break Y, M, D, h, m, s, w, d, dst = now = time.localtime() - for IRC in self.labels.keys(): - if IRC.connected: - with IRC.lock: + + logroot = os.path.expanduser(self.logroot) + for context in self.conf.keys(): + if context.connected: + with context.lock: try: - self.rotateLog(IRC) + self.rotateLog(context) except: exc, excmsg, tb = sys.exc_info() - IRC.logwrite(*["!!! [Logger] Exception in module %(module)s" % vars()]+["!!! [Logger] %s" % tbline for tbline in traceback.format_exc().split("\n")]) - if IRC.identity: - for channel in IRC.identity.channels: + context.logwrite(*["!!! [Logger] Exception in module %(module)s" % vars()] + [ + "!!! [Logger] %s" % tbline for tbline in traceback.format_exc().split("\n")]) + if context.identity: + for channel in context.identity.channels: try: self.rotateLog(channel) except: exc, excmsg, tb = sys.exc_info() - IRC.logwrite(*["!!! [Logger] Exception in module %(module)s" % vars()]+["!!! [Logger] %s" % tbline for tbline in traceback.format_exc().split("\n")]) - for user in IRC.users: + context.logwrite(*["!!! [Logger] Exception in module %(module)s" % vars()] + [ + "!!! [Logger] %s" % tbline for tbline in traceback.format_exc().split("\n")]) + for user in context.users: if user in self.logs.keys(): try: self.closeLog(user) except: exc, excmsg, tb = sys.exc_info() - IRC.logwrite(*["!!! [Logger] Exception in module %(module)s" % vars()]+["!!! [Logger] %s" % tbline for tbline in traceback.format_exc().split("\n")]) - IRC.logopen(os.path.join(self.logroot, self.labels[IRC], "rawdata-%04d.%02d.%02d.log"%now[:3])) - nextrotate = int(time.mktime((Y, M, D+1, 0, 0, 0, 0, 0, -1))) + context.logwrite(*["!!! [Logger] Exception in module %(module)s" % vars()] + [ + "!!! [Logger] %s" % tbline for tbline in traceback.format_exc().split("\n")]) + context.logopen( + os.path.join(logroot, self.conf[context].label, "rawdata-%04d.%02d.%02d.log" % now[:3])) + nextrotate = int(time.mktime((Y, M, D + 1, 0, 0, 0, 0, 0, -1))) finally: Thread.__init__(self) + self.daemon = True + + def onAddonAdd(self, context, label): + logroot = os.path.expanduser(self.logroot) + + for (context2, conf2) in self.conf.items(): + if context == context2: + raise ValueError, "Context already exists in config." + if label == conf2.label: + raise ValueError, "Unique label required." + + conf = irc.Config(self, label=label) - def onAddonAdd(self, IRC, label): - if label in self.labels.values(): - raise BaseException("Label already exists") - if IRC in self.labels.keys(): - raise BaseException("Network already exists") - if not os.path.isdir(os.path.join(self.logroot, label)): - os.mkdir(os.path.join(self.logroot, label)) - self.labels[IRC] = label - if IRC.connected: - self.openLog(IRC) - if IRC.identity: - for channel in IRC.identity.channels: + contextroot = os.path.join(logroot, label) + if not os.path.isdir(contextroot): + os.mkdir(contextroot) + + if context.connected: + self.openLog(context) + if context.identity: + for channel in context.identity.channels: self.openLog(channel) now = time.localtime() - timestamp = reduce(lambda x, y: x+":"+y, [str(t).rjust(2, - "0") for t in now[0:6]]) - IRC.logopen(os.path.join(self.logroot, self.labels[IRC], - "rawdata-%04d.%02d.%02d.log"%now[:3])) - - def onAddonRem(self, IRC): - if IRC.connected: + timestamp = reduce(lambda x, y: x + ":" + y, [ + str(t).rjust(2, "0") for t in now[0:6]]) + context.logopen( + os.path.join(contextroot, "rawdata-%04d.%02d.%02d.log" % now[:3])) + self.conf[context] = conf + return conf + + def onAddonRem(self, context): + if context.connected: for channel in self.logs.keys(): - if channel in IRC.channels: + if channel in context.channels: if not self.logs[channel].closed: self.closeLog(channel) for user in self.logs.keys(): - if user in IRC.users: + if user in context.users: if not self.logs[user].closed: self.closeLog(user) - if not self.logs[IRC].closed: - self.closeLog(IRC) - del self.labels[IRC] + if context in self.logs.keys() and not self.logs[context].closed: + self.closeLog(context) + del self.conf[context] def openLog(self, window): + logroot = os.path.expanduser(self.logroot) + with self.rotatelock: if not self.isAlive(): self.start() + + if window in self.logs.keys(): + # Don't do anything + return + now = time.localtime() - timestamp = reduce(lambda x, y: x+":"+y, [str(t).rjust(2, - "0") for t in now[0:6]]) + timestamp = reduce(lambda x, y: x + ":" + y, [ + str(t).rjust(2, "0") for t in now[0:6]]) if type(window) == irc.Connection: - log = self.logs[window] = open(os.path.join(self.logroot, self.labels[window], "console-%04d.%02d.%02d.log"%now[:3]), "a") + log = self.logs[window] = codecs.open( + os.path.join(logroot, self.conf[window].label, "console-%04d.%02d.%02d.log" % now[:3]), "a", encoding="utf8") print >>log, "%s ### Log file opened" % (irc.timestamp()) + elif type(window) == irc.Channel: - label = self.labels[window.context] - log = self.logs[window] = open(os.path.join(self.logroot, label, "channel-%s-%04d.%02d.%02d.log"%((urllib2.quote(window.name.lower()).replace("/", "%2f"),)+now[:3])), "a") + label = self.conf[window.context].label + log = self.logs[window] = codecs.open(os.path.join(logroot, label, "channel-%s-%04d.%02d.%02d.log" % ( + (urllib2.quote(window.name.lower().decode("utf8")).replace("/", "%2f"),) + now[:3])), "a", encoding="utf8") print >>log, "%s ### Log file opened" % (irc.timestamp()) self.logs[window].flush() - if window.context.identity in window.users: + if window in window.context.identity.channels: if window.topic: - print >>log, "%s <<< :%s 332 %s %s :%s" % (irc.timestamp(), window.context.serv, window.context.identity.nick, window.name, window.topic) - if window.topicsetby and window.topictime: - print >>log, "%s <<< :%s 333 %s %s %s %s" % (irc.timestamp(), window.context.serv, window.context.identity.nick, window.name, window.topicsetby, window.topictime) + for line in window.fmttopic(): + print >>log, "%s <<< %s" % (irc.timestamp(), line) if window.users: - secret = "s" in window.modes.keys() and window.modes["s"] - private = "p" in window.modes.keys() and window.modes["p"] - namesusers = [] - modes, symbols = window.context.supports["PREFIX"] - print >>log, "%s <<< :%s 353 %s %s %s :%s" % (irc.timestamp(), - window.context.serv, - window.context.identity.nick, - "@" if secret else ("*" if private else "="), - window.name, - " ".join(["".join([symbols[k] if modes[k] in window.modes.keys() and user in window.modes[modes[k]] else "" for k in xrange(len(modes))])+user.nick for user in window.users])) + for line in window.fmtnames(sort="mode"): + print >>log, "%s <<< %s" % (irc.timestamp(), line) if window.modes: - modes = window.modes.keys() - modestr = "".join([mode for mode in modes if mode not in window.context.supports["CHANMODES"][0]+window.context.supports["PREFIX"][0] and window.modes[mode]]) - params = " ".join([window.modes[mode] for mode in modes if mode in window.context.supports["CHANMODES"][1]+window.context.supports["CHANMODES"][2] and window.modes[mode]]) - print >>log, "%s <<< :%s 324 %s %s +%s %s" % (irc.timestamp(), window.context.serv, window.context.identity.nick, window.name, modestr, params) + print >>log, "%s <<< %s" % ( + irc.timestamp(), window.fmtmodes()) if window.created: - print >>log, "%s <<< :%s 329 %s %s %s" % (irc.timestamp(), window.context.serv, window.context.identity.nick, window.name, window.created) + print >>log, "%s <<< %s" % ( + irc.timestamp(), window.fmtchancreated()) + if type(window) == irc.User: - logname = os.path.join(self.logroot, self.labels[window.context], "query-%s-%04d.%02d.%02d.log"%((urllib2.quote(window.nick.lower()).replace("/", "%2f"),)+now[:3])) + label = self.conf[window.context].label + logname = os.path.join( + logroot, label, "query-%s-%04d.%02d.%02d.log" % + ((urllib2.quote(window.nick.lower()).replace("/", "%2f"),) + now[:3])) for (other, log) in self.logs.items(): if other == window: continue @@ -161,16 +194,17 @@ class Logger(Thread): del self.logs[other] self.logs[window] = log if window not in self.logs.keys(): - log = self.logs[window] = open(logname, "a") + log = self.logs[window] = codecs.open( + logname, "a", encoding="utf8") else: log = self.logs[window] print >>log, "%s ### Log file opened" % (irc.timestamp()) log.flush() def closeLog(self, window): - if window in self.logs.keys() and type(self.logs[window]) == file and not self.logs[window].closed: - print >>self.logs[window], "%s ### Log file closed" % ( - irc.timestamp()) + if window in self.logs.keys() and isinstance(self.logs[window], codecs.StreamReaderWriter) and not self.logs[window].closed: + print >>self.logs[ + window], "%s ### Log file closed" % (irc.timestamp()) self.logs[window].close() if window in self.logs.keys(): del self.logs[window] @@ -179,193 +213,216 @@ class Logger(Thread): self.closeLog(window) self.openLog(window) - def onConnectAttempt(self, IRC): - if IRC not in self.logs.keys() or (not self.logs[IRC]) or self.logs[IRC].closed: - self.openLog(IRC) + def onConnectAttempt(self, context): + if context not in self.logs.keys() or (not self.logs[context]) or self.logs[context].closed: + self.openLog(context) ts = irc.timestamp() - print >>self.logs[IRC], "%s *** Attempting connection to %s:%s." % ( - ts, IRC.server, IRC.port) + print >>self.logs[context], "%s *** Attempting connection to %s:%s." % ( + ts, context.server, context.port) - def onConnect(self, IRC): - if IRC not in self.logs.keys() or (not self.logs[IRC]) or self.logs[IRC].closed: - self.openLog(IRC) + def onConnect(self, context): + if context not in self.logs.keys() or (not self.logs[context]) or self.logs[context].closed: + self.openLog(context) ts = irc.timestamp() - print >>self.logs[IRC], "%s *** Connection to %s:%s established." % ( - ts, IRC.server, IRC.port) + print >>self.logs[context], "%s *** Connection to %s:%s established." % ( + ts, context.server, context.port) - def onConnectFail(self, IRC, exc, excmsg, tb): - ### Called when a connection attempt fails. - if IRC not in self.logs.keys() or (not self.logs[IRC]) or self.logs[IRC].closed: - self.openLog(IRC) + def onConnectFail(self, context, exc, excmsg, tb): + # Called when a connection attempt fails. + if context not in self.logs.keys() or (not self.logs[context]) or self.logs[context].closed: + self.openLog(context) ts = irc.timestamp() - print >>self.logs[IRC], "%s *** Connection to %s:%s failed: %s." % ( - ts, IRC.server, IRC.port, excmsg) + print >>self.logs[context], "%s *** Connection to %s:%s failed: %s." % ( + ts, context.server, context.port, excmsg) - def onDisconnect(self, IRC, expected=False): + def onDisconnect(self, context, expected=False): ts = irc.timestamp() for window in self.logs.keys(): - if type(window) in (irc.Channel, irc.User) and window.context == IRC: - print >>self.logs[window], "%s *** Connection to %s:%s terminated." % (ts, IRC.server, IRC.port) + if type(window) in (irc.Channel, irc.User) and window.context == context: + print >>self.logs[window], "%s *** Connection to %s:%s terminated." % ( + ts, context.server, context.port) self.logs[window].flush() self.closeLog(window) - print >>self.logs[IRC], "%s *** Connection %s:%s terminated." % ( - ts, IRC.server, IRC.port) - self.logs[IRC].flush() - self.closeLog(IRC) - - def onJoin(self, IRC, user, channel): - ### Called when somebody joins a channel, includes bot. - ts = irc.timestamp() - if user == IRC.identity: + print >>self.logs[context], "%s *** Connection %s:%s terminated." % ( + ts, context.server, context.port) + self.logs[context].flush() + self.closeLog(context) + + def onJoin(self, context, user, channel): + # Called when somebody joins a channel, includes bot. + if user == context.identity: self.openLog(channel) + ts = irc.timestamp() print >>self.logs[channel], "%s <<< :%s!%s@%s JOIN %s" % ( ts, user.nick, user.username, user.host, channel.name) self.logs[channel].flush() - def onChanMsg(self, IRC, user, channel, targetprefix, msg): - ### Called when someone sends a PRIVMSG to channel. + def onChanMsg(self, context, user, channel, targetprefix, msg): + # Called when someone sends a PRIVMSG to channel. ts = irc.timestamp() if type(user) == irc.User: - classes = " ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and user in channel.modes[mode]]) + classes = " ".join([modemapping[mode] + for mode in context.supports["PREFIX"][0] if mode in channel.modes.keys() and user in channel.modes[mode]]) if classes: - print >>self.logs[channel], "%s %s <<< :%s!%s@%s PRIVMSG %s%s :%s" % (ts, classes, user.nick, user.username, user.host, targetprefix, channel.name, msg) + print >>self.logs[channel], "%s %s <<< :%s!%s@%s PRIVMSG %s%s :%s" % ( + ts, classes, user.nick, user.username, user.host, targetprefix, channel.name, msg) else: - print >>self.logs[channel], "%s <<< :%s!%s@%s PRIVMSG %s%s :%s" % (ts, user.nick, user.username, user.host, targetprefix, channel.name, msg) + print >>self.logs[channel], "%s <<< :%s!%s@%s PRIVMSG %s%s :%s" % ( + ts, user.nick, user.username, user.host, targetprefix, channel.name, msg) elif type(user) in (str, unicode): classes = "server" - print >>self.logs[channel], "%s %s <<< :%s PRIVMSG %s%s :%s" % (ts, - classes, user, targetprefix, channel.name, msg) + print >>self.logs[channel], "%s %s <<< :%s PRIVMSG %s%s :%s" % ( + ts, classes, user, targetprefix, channel.name, msg) self.logs[channel].flush() - def onChanAction(self, IRC, user, channel, targetprefix, action): - self.onChanMsg(IRC, user, channel, targetprefix, - "\x01ACTION %s\x01"%action) + def onChanAction(self, context, user, channel, targetprefix, action): + self.onChanMsg(context, user, channel, + targetprefix, "\x01ACTION %s\x01" % action) - def onChanNotice(self, IRC, origin, channel, targetprefix, msg): - ### Called when someone sends a NOTICE to channel. + def onChanNotice(self, context, origin, channel, targetprefix, msg): + # Called when someone sends a NOTICE to channel. ts = irc.timestamp() if type(origin) == irc.User: - classes = " ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and origin in channel.modes[mode]]) + classes = " ".join([modemapping[mode] + for mode in context.supports["PREFIX"][0] if mode in channel.modes.keys() and origin in channel.modes[mode]]) if classes: - print >>self.logs[channel], "%s %s <<< :%s!%s@%s NOTICE %s%s :%s" % (ts, classes, origin.nick, origin.username, origin.host, targetprefix, channel.name, msg) + print >>self.logs[channel], "%s %s <<< :%s!%s@%s NOTICE %s%s :%s" % ( + ts, classes, origin.nick, origin.username, origin.host, targetprefix, channel.name, msg) else: - print >>self.logs[channel], "%s <<< :%s!%s@%s NOTICE %s%s :%s" % (ts, origin.nick, origin.username, origin.host, targetprefix, channel.name, msg) + print >>self.logs[channel], "%s <<< :%s!%s@%s NOTICE %s%s :%s" % ( + ts, origin.nick, origin.username, origin.host, targetprefix, channel.name, msg) elif type(origin) in (str, unicode): classes = "server" - print >>self.logs[channel], "%s %s <<< :%s NOTICE %s%s :%s" % (ts, - classes, origin, targetprefix, channel.name, msg) + print >>self.logs[channel], "%s %s <<< :%s NOTICE %s%s :%s" % ( + ts, classes, origin, targetprefix, channel.name, msg) self.logs[channel].flush() - def onPart(self, IRC, user, channel, partmsg): - ### Called when somebody parts the channel, includes bot. + def onPart(self, context, user, channel, partmsg): + # Called when somebody parts the channel, includes bot. ts = irc.timestamp() if partmsg: - print >>self.logs[channel], "%s <<< :%s!%s@%s PART %s :%s" % (ts, user.nick, user.username, user.host, channel.name, partmsg) + print >>self.logs[channel], "%s <<< :%s!%s@%s PART %s :%s" % ( + ts, user.nick, user.username, user.host, channel.name, partmsg) else: - print >>self.logs[channel], "%s <<< :%s!%s@%s PART %s" % (ts, - user.nick, user.username, user.host, channel.name) + print >>self.logs[channel], "%s <<< :%s!%s@%s PART %s" % ( + ts, user.nick, user.username, user.host, channel.name) self.logs[channel].flush() - if user == IRC.identity: + if user == context.identity: self.closeLog(channel) - def onKick(self, IRC, kicker, channel, kicked, kickmsg): - ### Called when somebody is kicked from the channel, includes bot. + def onKick(self, context, kicker, channel, kicked, kickmsg): + # Called when somebody is kicked from the channel, includes bot. ts = irc.timestamp() if kickmsg: - print >>self.logs[channel], "%s <<< :%s!%s@%s KICK %s %s :%s" % (ts, kicker.nick, kicker.username, kicker.host, channel.name, kicked.nick, kickmsg) + print >>self.logs[channel], "%s <<< :%s!%s@%s KICK %s %s :%s" % ( + ts, kicker.nick, kicker.username, kicker.host, channel.name, kicked.nick, kickmsg) else: - print >>self.logs[channel], "%s <<< :%s!%s@%s KICK %s %s" % (ts, user.nick, user.username, user.host, channel.name, kicked.nick) + print >>self.logs[channel], "%s <<< :%s!%s@%s KICK %s %s" % ( + ts, user.nick, user.username, user.host, channel.name, kicked.nick) self.logs[channel].flush() - if user == IRC.identity: + if kicked == context.identity: self.closeLog(channel) - def onSendChanMsg(self, IRC, origin, channel, targetprefix, msg): - ### Called when bot sends a PRIVMSG to channel. - ### The variable origin refers to a class instance voluntarily identifying itself as that which requested data be sent. + def onSendChanMsg(self, context, origin, channel, targetprefix, msg): + # Called when bot sends a PRIVMSG to channel. + # The variable origin refers to a class instance voluntarily + # identifying itself as that which requested data be sent. ts = irc.timestamp() - classes = " ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and IRC.identity in channel.modes[mode]]) + classes = " ".join([modemapping[mode] + for mode in context.supports["PREFIX"][0] if mode in channel.modes.keys() and context.identity in channel.modes[mode]]) if classes: - print >>self.logs[channel], "%s %s >>> :%s!%s@%s PRIVMSG %s%s :%s" % (ts, classes, IRC.identity.nick, IRC.identity.username, IRC.identity.host, targetprefix, channel.name, msg) + print >>self.logs[channel], "%s %s >>> :%s!%s@%s PRIVMSG %s%s :%s" % ( + ts, classes, context.identity.nick, context.identity.username, context.identity.host, targetprefix, channel.name, msg) else: - print >>self.logs[channel], "%s >>> :%s!%s@%s PRIVMSG %s%s :%s" % (ts, IRC.identity.nick, IRC.identity.username, IRC.identity.host, targetprefix, channel.name, msg) + print >>self.logs[channel], "%s >>> :%s!%s@%s PRIVMSG %s%s :%s" % ( + ts, context.identity.nick, context.identity.username, context.identity.host, targetprefix, channel.name, msg) self.logs[channel].flush() - def onSendChanAction(self, IRC, origin, channel, targetprefix, action): - ### origin is the source of the channel message - ### Called when bot sends an action (/me) to channel. - ### The variable origin refers to a class instance voluntarily identifying itself as that which requested data be sent. - self.onSendChanMsg(IRC, origin, channel, targetprefix, - "\x01ACTION %s\x01"%action) + def onSendChanAction(self, context, origin, channel, targetprefix, action): + # origin is the source of the channel message + # Called when bot sends an action (/me) to channel. + # The variable origin refers to a class instance voluntarily + # identifying itself as that which requested data be sent. + self.onSendChanMsg( + context, origin, channel, targetprefix, "\x01ACTION %s\x01" % action) - def onPrivMsg(self, IRC, user, msg): - ### Called when someone sends a PRIVMSG to the bot. + def onPrivMsg(self, context, user, msg): + # Called when someone sends a PRIVMSG to the bot. if user not in self.logs.keys(): self.openLog(user) ts = irc.timestamp() - print >>self.logs[user], "%s <<< :%s!%s@%s PRIVMSG %s :%s" % (ts, user.nick, user.username, user.host, IRC.identity.nick, msg) + print >>self.logs[user], "%s <<< :%s!%s@%s PRIVMSG %s :%s" % ( + ts, user.nick, user.username, user.host, context.identity.nick, msg) self.logs[user].flush() - def onPrivNotice(self, IRC, origin, msg): - ### Called when someone sends a NOTICE to the bot. + def onPrivNotice(self, context, origin, msg): + # Called when someone sends a NOTICE to the bot. ts = irc.timestamp() if type(origin) == irc.User: if origin not in self.logs.keys(): self.openLog(origin) - print >>self.logs[origin], "%s <<< :%s!%s@%s NOTICE %s :%s" % (ts, origin.nick, origin.username, origin.host, IRC.identity.nick, msg) + ts = irc.timestamp() + print >>self.logs[origin], "%s <<< :%s!%s@%s NOTICE %s :%s" % ( + ts, origin.nick, origin.username, origin.host, context.identity.nick, msg) self.logs[origin].flush() else: - print >>self.logs[IRC], "%s <<< :%s NOTICE %s :%s" % ( - ts, origin, IRC.identity.nick, msg) - self.logs[IRC].flush() - - def onPrivAction(self, IRC, user, action): - ### Called when someone sends an action (/me) to the bot. - self.onPrivMsg(IRC, user, "\x01ACTION %s\x01"%action) - - def onSendPrivMsg(self, IRC, origin, user, msg): - ### Called when bot sends a PRIVMSG to a user. - ### The variable origin refers to a class instance voluntarily identifying itself as that which requested data be sent. + print >>self.logs[context], "%s <<< :%s NOTICE %s :%s" % ( + ts, origin, context.identity.nick, msg) + self.logs[context].flush() + + def onPrivAction(self, context, user, action): + # Called when someone sends an action (/me) to the bot. + self.onPrivMsg(context, user, "\x01ACTION %s\x01" % action) + + def onSendPrivMsg(self, context, origin, user, msg): + # Called when bot sends a PRIVMSG to a user. + # The variable origin refers to a class instance voluntarily + # identifying itself as that which requested data be sent. if user not in self.logs.keys(): self.openLog(user) ts = irc.timestamp() - print >>self.logs[user], "%s >>> :%s!%s@%s PRIVMSG %s :%s" % (ts, IRC.identity.nick, IRC.identity.username, IRC.identity.host, user.nick, msg) + print >>self.logs[user], "%s >>> :%s!%s@%s PRIVMSG %s :%s" % ( + ts, context.identity.nick, context.identity.username, context.identity.host, user.nick, msg) self.logs[user].flush() - def onSendPrivAction(self, IRC, origin, user, action): - ### Called when bot sends an action (/me) to a user. - ### The variable origin refers to a class instance voluntarily identifying itself as that which requested data be sent. - self.onSendPrivMsg(IRC, origin, user, "\x01ACTION %s\x01"%action) + def onSendPrivAction(self, context, origin, user, action): + # Called when bot sends an action (/me) to a user. + # The variable origin refers to a class instance voluntarily + # identifying itself as that which requested data be sent. + self.onSendPrivMsg(context, origin, user, "\x01ACTION %s\x01" % action) - def onNickChange(self, IRC, user, newnick): - ### Called when somebody changes nickname. + def onNickChange(self, context, user, newnick): + # Called when somebody changes nickname. ts = irc.timestamp() line = "%s <<< :%s!%s@%s NICK %s" % ( ts, user.nick, user.username, user.host, newnick) - ### Print nick change in each channel the user is in. + # Print nick change in each channel the user is in. for channel in user.channels: - print >>self.logs[channel], line - self.logs[channel].flush() + if channel in context.identity.channels: + print >>self.logs[channel], line + self.logs[channel].flush() - ### And in the query if open. + # And in the query if open. if user in self.logs.keys(): print >>self.logs[user], line self.logs[user].flush() - def onMeNickChange(self, IRC, newnick): - ### Called when the bot changes nickname. + def onMeNickChange(self, context, newnick): + # Called when the bot changes nickname. - ### Print nick change to all open queries, except for query with self (already done with onNickChange). + # Print nick change to all open queries, except for query with self + # (already done with onNickChange). ts = irc.timestamp() - line = "%s <<< :%s!%s@%s NICK %s" % (ts, IRC.identity.nick, - IRC.identity.username, IRC.identity.host, newnick) + line = "%s <<< :%s!%s@%s NICK %s" % ( + ts, context.identity.nick, context.identity.username, context.identity.host, newnick) for (window, log) in self.logs.items(): - if type(window) == irc.User and window != IRC.identity: + if type(window) == irc.User and window != context.identity: print >>log, line log.flush() - def onQuit(self, IRC, user, quitmsg): - ### Called when somebody quits IRC. + def onQuit(self, context, user, quitmsg): + # Called when somebody quits context. ts = irc.timestamp() if quitmsg: line = "%s <<< :%s!%s@%s QUIT :%s" % ( @@ -374,169 +431,178 @@ class Logger(Thread): line = "%s <<< :%s!%s@%s QUIT" % ( ts, user.nick, user.username, user.host) - ### Print quit in each channel the user was in. + # Print quit in each channel the user was in. for channel in user.channels: - if channel in self.logs.keys() and not self.logs[channel].closed: + if channel in context.identity.channels and channel in self.logs.keys() and not self.logs[channel].closed: print >>self.logs[channel], line self.logs[channel].flush() - ### And in the query if open. + # And in the query if open. if user in self.logs.keys(): print >>self.logs[user], line self.logs[user].flush() self.closeLog(user) - def onNames(self, IRC, origin, channel, flag, channame, nameslist): - ### Called when a NAMES list is received. + def onNames(self, context, origin, channel, flag, channame, nameslist): + # Called when a NAMES list is received. if channel in self.logs.keys() and not self.logs[channel].closed: log = self.logs[channel] else: - log = self.logs[IRC] + log = self.logs[context] ts = irc.timestamp() secret = "s" in channel.modes.keys() and channel.modes["s"] private = "p" in channel.modes.keys() and channel.modes["p"] modes, symbols = channel.context.supports["PREFIX"] - print >>log, "%s <<< :%s 353 %s %s %s :%s" % (ts, origin, IRC.identity.nick, flag, channame, - " ".join(["%s%s!%s@%s"%(prefix, nick, username, host) if username and host else "%s%s"%(prefix, nick) for (prefix, nick, username, host) in nameslist])) + print >>log, "%s <<< :%s 353 %s %s %s :%s" % (ts, origin, context.identity.nick, flag, channame, + " ".join(["%s%s!%s@%s" % (prefix, nick, username, host) if username and host else "%s%s" % (prefix, nick) for (prefix, nick, username, host) in nameslist])) log.flush() - def onNamesEnd(self, IRC, origin, channel, channame, endmsg): + def onNamesEnd(self, context, origin, channel, channame, endmsg): if channel in self.logs.keys() and not self.logs[channel].closed: log = self.logs[channel] else: - log = self.logs[IRC] + log = self.logs[context] ts = irc.timestamp() print >>log, "%s <<< :%s 366 %s %s :%s" % ( - ts, origin, IRC.identity.nick, channame, endmsg) + ts, origin, context.identity.nick, channame, endmsg) log.flush() - def onWhoisStart(self, IRC, origin, user, nickname, username, host, realname): - ### Called when a WHOIS reply is received. + def onWhoisStart(self, context, origin, user, nickname, username, host, realname): + # Called when a WHOIS reply is received. if user not in self.logs.keys(): self.openLog(user) - print >>self.logs[user], "%s <<< :%s 311 %s %s %s %s * :%s" % (irc.timestamp(), origin, IRC.identity.nick, nickname, username, host, realname) + print >>self.logs[user], "%s <<< :%s 311 %s %s %s %s * :%s" % ( + irc.timestamp(), origin, context.identity.nick, nickname, username, host, realname) - def onWhoisRegisteredNick(self, IRC, origin, user, nickname, msg): - ### Called when a WHOIS reply is received. + def onWhoisRegisteredNick(self, context, origin, user, nickname, msg): + # Called when a WHOIS reply is received. if user not in self.logs.keys(): self.openLog(user) print >>self.logs[user], "%s <<< :%s 307 %s %s :%s" % ( - irc.timestamp(), origin, IRC.identity.nick, nickname, msg) + irc.timestamp(), origin, context.identity.nick, nickname, msg) - def onWhoisAway(self, IRC, origin, user, nickname, awaymsg): - ### Called when a WHOIS reply is received. + def onWhoisAway(self, context, origin, user, nickname, awaymsg): + # Called when a WHOIS reply is received. if user not in self.logs.keys(): self.openLog(user) - print >>self.logs[user], "%s <<< :%s 301 %s %s :%s" % (irc.timestamp( - ), origin, IRC.identity.nick, nickname, awaymsg) + print >>self.logs[user], "%s <<< :%s 301 %s %s :%s" % ( + irc.timestamp(), origin, context.identity.nick, nickname, awaymsg) - def onWhoisConnectingFrom(self, IRC, origin, user, nickname, msg): - ### Called when a WHOIS reply is received. + def onWhoisConnectingFrom(self, context, origin, user, nickname, msg): + # Called when a WHOIS reply is received. if user not in self.logs.keys(): self.openLog(user) print >>self.logs[user], "%s <<< :%s 378 %s %s :%s" % ( - irc.timestamp(), origin, IRC.identity.nick, nickname, msg) + irc.timestamp(), origin, context.identity.nick, nickname, msg) - def onWhoisChannels(self, IRC, origin, user, nickname, chanlist): - ### Called when a WHOIS reply is received. + def onWhoisChannels(self, context, origin, user, nickname, chanlist): + # Called when a WHOIS reply is received. if user not in self.logs.keys(): self.openLog(user) - print >>self.logs[user], "%s <<< :%s 319 %s %s :%s" % (irc.timestamp(), - origin, IRC.identity.nick, nickname, " ".join(chanlist)) + print >>self.logs[user], "%s <<< :%s 319 %s %s :%s" % ( + irc.timestamp(), origin, context.identity.nick, nickname, " ".join(chanlist)) - def onWhoisAvailability(self, IRC, origin, user, nickname, msg): - ### Called when a WHOIS reply is received. + def onWhoisAvailability(self, context, origin, user, nickname, msg): + # Called when a WHOIS reply is received. if user not in self.logs.keys(): self.openLog(user) print >>self.logs[user], "%s <<< :%s 310 %s %s :%s" % ( - irc.timestamp(), origin, IRC.identity.nick, nickname, msg) + irc.timestamp(), origin, context.identity.nick, nickname, msg) - def onWhoisServer(self, IRC, origin, user, nickname, server, servername): - ### Called when a WHOIS reply is received. + def onWhoisServer(self, context, origin, user, nickname, server, servername): + # Called when a WHOIS reply is received. if user not in self.logs.keys(): self.openLog(user) - print >>self.logs[user], "%s <<< :%s 312 %s %s %s :%s" % (irc.timestamp(), origin, IRC.identity.nick, nickname, server, servername) + print >>self.logs[user], "%s <<< :%s 312 %s %s %s :%s" % ( + irc.timestamp(), origin, context.identity.nick, nickname, server, servername) - def onWhoisOp(self, IRC, origin, user, nickname, msg): + def onWhoisOp(self, context, origin, user, nickname, msg): if user not in self.logs.keys(): self.openLog(user) print >>self.logs[user], "%s <<< :%s 313 %s %s :%s" % ( - irc.timestamp(), origin, IRC.identity.nick, nickname, msg) + irc.timestamp(), origin, context.identity.nick, nickname, msg) - def onWhoisTimes(self, IRC, origin, user, nickname, idletime, signontime, msg): + def onWhoisTimes(self, context, origin, user, nickname, idletime, signontime, msg): if user not in self.logs.keys(): self.openLog(user) - print >>self.logs[user], "%s <<< :%s 317 %s %s %d %d :%s" % (irc.timestamp(), origin, IRC.identity.nick, nickname, idletime, signontime, msg) + print >>self.logs[user], "%s <<< :%s 317 %s %s %d %d :%s" % ( + irc.timestamp(), origin, context.identity.nick, nickname, idletime, signontime, msg) - def onWhoisSSL(self, IRC, origin, user, nickname, msg): + def onWhoisSSL(self, context, origin, user, nickname, msg): if user not in self.logs.keys(): self.openLog(user) print >>self.logs[user], "%s <<< :%s 671 %s %s :%s" % ( - irc.timestamp(), origin, IRC.identity.nick, nickname, msg) + irc.timestamp(), origin, context.identity.nick, nickname, msg) - def onWhoisModes(self, IRC, origin, user, nickname, msg): + def onWhoisModes(self, context, origin, user, nickname, msg): if user not in self.logs.keys(): self.openLog(user) print >>self.logs[user], "%s <<< :%s 339 %s %s :%s" % ( - irc.timestamp(), origin, IRC.identity.nick, nickname, msg) + irc.timestamp(), origin, context.identity.nick, nickname, msg) - def onWhoisLoggedInAs(self, IRC, origin, user, nickname, loggedinas, msg): + def onWhoisLoggedInAs(self, context, origin, user, nickname, loggedinas, msg): if user not in self.logs.keys(): self.openLog(user) - print >>self.logs[user], "%s <<< :%s 330 %s %s %s :%s" % (irc.timestamp(), origin, IRC.identity.nick, nickname, loggedinas, msg) + print >>self.logs[user], "%s <<< :%s 330 %s %s %s :%s" % ( + irc.timestamp(), origin, context.identity.nick, nickname, loggedinas, msg) - def onWhoisEnd(self, IRC, origin, user, nickname, msg): + def onWhoisEnd(self, context, origin, user, nickname, msg): if user not in self.logs.keys(): self.openLog(user) print >>self.logs[user], "%s <<< :%s 318 %s %s :%s" % ( - irc.timestamp(), origin, IRC.identity.nick, nickname, msg) + irc.timestamp(), origin, context.identity.nick, nickname, msg) self.logs[user].flush() - def onWhoEntry(self, IRC, **kwargs): - ### Called when a WHO list is received. + def onWhoEntry(self, context, **kwargs): + # Called when a WHO list is received. pass - def onWhoEnd(self, IRC, **kwargs): - ### Called when a WHO list is received. + def onWhoEnd(self, context, **kwargs): + # Called when a WHO list is received. pass - def onList(self, IRC, chanlistbegin, chanlist, endmsg): - ### Called when a channel list is received. + def onList(self, context, chanlistbegin, chanlist, endmsg): + # Called when a channel list is received. pass - def onTopic(self, IRC, origin, channel, topic): - ### Called when channel topic is received via 332 response. + def onTopic(self, context, origin, channel, topic): + # Called when channel topic is received via 332 response. ts = irc.timestamp() if channel in self.logs.keys() and not self.logs[channel].closed: log = self.logs[channel] else: - log = self.logs[IRC] + log = self.logs[context] print >>log, "%s <<< :%s 332 %s %s :%s" % ( - ts, origin, IRC.identity.nick, channel.name, topic) + ts, origin, context.identity.nick, channel.name, topic) log.flush() - def onTopicInfo(self, IRC, origin, channel, topicsetby, topictime): - ### Called when channel topic info is received via 333 response. + def onTopicInfo(self, context, origin, channel, topicsetby, topictime): + # Called when channel topic info is received via 333 response. ts = irc.timestamp() if channel in self.logs.keys() and not self.logs[channel].closed: log = self.logs[channel] else: - log = self.logs[IRC] - print >>log, "%s <<< :%s 333 %s %s %s %d" % (ts, origin, - IRC.identity.nick, channel.name, topicsetby, topictime) + log = self.logs[context] + print >>log, "%s <<< :%s 333 %s %s %s %d" % ( + ts, origin, context.identity.nick, channel.name, topicsetby, topictime) log.flush() - def onTopicSet(self, IRC, user, channel, topic): - ### Called when channel topic is changed. + def onTopicSet(self, context, user, channel, topic): + # Called when channel topic is changed. ts = irc.timestamp() - print >>self.logs[channel], "%s <<< :%s!%s@%s TOPIC %s :%s" % (ts, - user.nick, user.username, user.host, channel.name, topic) + if type(user) == irc.User: + print >>self.logs[channel], "%s <<< :%s!%s@%s TOPIC %s :%s" % ( + ts, user.nick, user.username, user.host, channel.name, topic) + else: + print >>self.logs[channel], "%s <<< :%s TOPIC %s :%s" % ( + ts, user, channel.name, topic) self.logs[channel].flush() - def onChanModeSet(self, IRC, user, channel, modedelta): - ### Called when channel modes are changed. - ### modedelta is a list of tuples of the format ("+x", parameter), ("+x", None) if no parameter is provided. + def onChanModeSet(self, context, user, channel, modedelta): + # Called when channel modes are changed. + # modedelta is a list of tuples of the format ("+x", parameter), ("+x", + # None) if no parameter is provided. ts = irc.timestamp() modestr = "" params = [] @@ -546,28 +612,31 @@ class Logger(Thread): modestr += sgn sign = sgn modestr += modechar - if param is not None: + if param != None: params.append(param.nick if type(param) == irc.User else param) if len(params): if type(user) == irc.User: - print >>self.logs[channel], "%s <<< :%s!%s@%s MODE %s %s %s" % (ts, user.nick, user.username, user.host, channel.name, modestr, " ".join(params)) + print >>self.logs[channel], "%s <<< :%s!%s@%s MODE %s %s %s" % ( + ts, user.nick, user.username, user.host, channel.name, modestr, " ".join(params)) else: - print >>self.logs[channel], "%s <<< :%s MODE %s %s %s" % (ts, user, channel.name, modestr, " ".join(params)) + print >>self.logs[channel], "%s <<< :%s MODE %s %s %s" % ( + ts, user, channel.name, modestr, " ".join(params)) else: if type(user) == irc.User: - print >>self.logs[channel], "%s <<< :%s!%s@%s MODE %s %s" % (ts, user.nick, user.username, user.host, channel.name, modestr) + print >>self.logs[channel], "%s <<< :%s!%s@%s MODE %s %s" % ( + ts, user.nick, user.username, user.host, channel.name, modestr) else: print >>self.logs[channel], "%s <<< :%s MODE %s %s" % ( ts, user, channel.name, modestr) self.logs[channel].flush() - def onChannelModes(self, IRC, channel, modedelta): - ### Called when channel modes are received via 324 response. + def onChannelModes(self, context, origin, channel, modedelta): + # Called when channel modes are received via 324 response. ts = irc.timestamp() if channel in self.logs.keys() and not self.logs[channel].closed: log = self.logs[channel] else: - log = self.logs[IRC] + log = self.logs[context] modestr = "" params = [] sign = "" @@ -576,27 +645,28 @@ class Logger(Thread): modestr += sgn sign = sgn modestr += modechar - if param is not None: + if param != None: params.append(param) if len(params): - print >>log, "%s <<< :%s 324 %s %s %s %s" % (ts, IRC.serv, IRC.identity.nick, channel.name, modestr, " ".join(params)) + print >>log, "%s <<< :%s 324 %s %s %s %s" % ( + ts, origin, context.identity.nick, channel.name, modestr, " ".join(params)) else: - print >>log, "%s <<< :%s 324 %s %s %s" % (ts, IRC.serv, - IRC.identity.nick, channel.name, modestr) + print >>log, "%s <<< :%s 324 %s %s %s" % ( + ts, origin, context.identity.nick, channel.name, modestr) log.flush() - def onChanCreated(self, IRC, channel, created): - ### Called when a 329 response is received. + def onChanCreated(self, context, origin, channel, created): + # Called when a 329 response is received. ts = irc.timestamp() if channel in self.logs.keys() and not self.logs[channel].closed: log = self.logs[channel] else: - log = self.logs[IRC] + log = self.logs[context] print >>log, "%s <<< :%s 329 %s %s %d" % ( - ts, IRC.serv, IRC.identity.nick, channel.name, created) + ts, origin, context.identity.nick, channel.name, created) log.flush() - def onUnhandled(self, IRC, line, origin, cmd, target, params, extinfo): + def onUnhandled(self, context, line, origin, cmd, target, params, extinfo, targetprefix): ts = irc.timestamp() - print >>self.logs[IRC], "%s <<< %s" % (ts, line) - self.logs[IRC].flush() + print >>self.logs[context], "%s <<< %s" % (ts, line) + self.logs[context].flush() |