IRC logger [release] |
IRC logger [release] |
Oct 31 2009, 12:06 AM
Post
#1
|
|
/人◕‿‿◕人\ Group: Official Member Posts: 8,283 Joined: Dec 2007 Member No: 602,927 |
This is a release of the logbot I use. If you don't already know how to use it, you probably shouldn't be trying. Entire thing is written in Python, and you need irclib for it to run properly.
Here it is, all 219 lines of it: CODE #! /usr/bin/env python import os network = 'server' port = 6667 nick = 'nick' channels = ['#channel'] # lowercase only name = 'log bot' password = 'PASSWORD' if os.name == 'nt': LOG_PATH = 'C:/logs/' else: LOG_PATH = '/var/www/' __author__ = "Buttsex <Buttfisting@hotmail.com>" __version__ = "All of them" __date__ = "October 18 2009" __copyright__ = "Yeah, sure" __license__ = "WTFPL" from time import strftime import irclib import time class LogFile(object): def __init__(self,path,extention='.txt',constant_write=False,mode=3,new_folders=True): # path = path to store logs # extention = log extention # constant_write = keep the file open inbetween writes or # open & close it every time. # mode = 1/2/3 # 1 = save file name as time.time() value # 2 = save file as a human readable value # 3 = save it as "log_file.log" self.path = path self.mode = mode self.keep_open = constant_write self.extention = extention self.file = None self.name = '' self._total_name = '' self.new_folders=new_folders self._init_file() def close(self,message=''): # close the log file if message: self.write(message) if self.keep_open: self.file.close() self.keep_open = True self.file = None def write(self,message,prefix=True): if self.file == None: raise Exception('File has been closed, oh noes!') if not self.keep_open: self.file = open(self._total_name,'a+') if prefix: _prefix = '[%s] '%time.strftime('%H:%M:%S') else: _prefix = '' self.file.write(_prefix+message+'\n') if not self.keep_open: self.file.close() def _init_file(self): if self.new_folders: self.path = self.path + time.strftime("%Y/%m/") if not os.path.exists(self.path): os.makedirs(self.path) # Create shit if self.mode == 1: self.name = str(time.time()) elif self.mode == 2: self.name = time.strftime("%d") else: self.name = time.strftime("%d") self._total_name = self.path+self.name+self.extention if os.path.isfile(self._total_name): self.file = open(self._total_name,'a+') else: self.file = open(self._total_name,'w') self.write('[IRC logfile - Started %s]'%time.ctime(),False) class LogFileManager(object): def __init__(self,values): self.value = values self.logs = {} for value in self.value: self.logs[value] = LogFile(LOG_PATH+value[1:]+'/') def reload_logs(self): for value in self.value: self.logs[value] = LogFile(LOG_PATH+value[1:]+'/') def write(self,name,text): self.logs[name.lower()].write(text) def write_all(self,text): for log in self.logs: self.logs[log].write(text) def close(self,name): self.logs[name.lower()].close() def close_all(self): for log in self.logs: self.logs[log].close() def _real_handler(message,name=None): global current_hour,manager now_hour = time.strftime('%H') if now_hour == current_hour: if name: manager.write(name,message) else: manager.write_all(message) else: current_hour = now_hour manager.close_all() manager.reload_logs() if name: manager.write(name,message) else: manager.write_all(message) def handleJoin(connection,event): # Join notifications _real_handler(event.source().split('!')[0] + ' has joined ' + event.target(),name=event.target()) def handlePart(connection,event): # Join notifications _real_handler(event.source().split('!')[0] + ' has left ' + event.target(),name=event.target()) def handlePubMessage(connection, event): # Any public message _real_handler(event.source().split ('!')[0] + ': ' + event.arguments()[0], name=event.target()) def handleTopic(connection,event): _real_handler(event.source().split( '!' )[0] + ' has set the topic to "' + event.arguments()[0],name=event.target()) def handleQuit(connection,event): _real_handler(event.source().split ( '!' ) [ 0 ] + ' has disconnected : ' + event.arguments() [ 0 ]) def handleKick(connection,event): if nick == event.arguments() [ 0 ]: server.join(event.target()) _real_handler(event.arguments() [ 0 ] + ' has been kicked by ' +event.source().split ( '!' ) [ 0 ] + ': ' + event.arguments()[ 1 ],name=event.target()) def handleMode ( connection, event ): # chanmodes if len ( event.arguments() ) < 2: _real_handler(event.source().split ( '!' ) [ 0 ] + ' has altered the channel\'s mode: ' + event.arguments() [ 0 ],name=event.target()) # usermode else: _real_handler(event.source().split ( '!' ) [ 0 ] + ' has altered '+ ' '.join(event.arguments() [ 1: ]) + '\'s mode: ' + event.arguments()[ 0 ],name=event.target()) def handleNick(connection,event): _real_handler(event.source().split('!')[0] +' changed nick to ' + event.target()) #(self,path,extention='.log',constant_write=False,mode=2) manager = LogFileManager(channels) current_hour = time.strftime('%H') irclib.DEBUG = 1 irc = irclib.IRC() irc.add_global_handler('join', handleJoin) irc.add_global_handler('part',handlePart) irc.add_global_handler('pubmsg', handlePubMessage) irc.add_global_handler('topic', handleTopic)#################################################################### ### #irc.add_global_handler('quit', handleQuit) ## Quits and Nick changes can NOT be handled by the bot at this time, ## irc.add_global_handler('kick', handleKick) ## due to the fact there is no "source" for the change in the ircd; ## irc.add_global_handler('mode', handleMode) ## hence if you log multiple rooms, a quit or nickname change will do things ## #irc.add_global_handler('nick',handleNick) ## you don't want this. ## ######################################################################## # create server object, connect and join all channels server = irc.server() server.connect(network, port, nick, ircname=name,ssl=False) if password: server.privmsg("nickserv","identify %s"%password) time.sleep(10) ## Waiting on the IRCd to accept your password before joining rooms for channel in channels: server.join(channel) irc.process_forever() It's a bit sloppy, but it works pretty good, and is stable enough to be released. I've had mine running since october 18th, so far with only one error. |
|
|
Nov 16 2009, 03:50 PM
Post
#2
|
|
Senior Member Group: Official Designer Posts: 5,880 Joined: Nov 2007 Member No: 593,382 |
although I'd like to tell you how cool this is, I have absolutely no clue what this is nor do I think anyone else does. I have never studied python.
|
|
|
Nov 16 2009, 04:00 PM
Post
#3
|
|
Senior Member Group: Administrator Posts: 2,648 Joined: Apr 2008 Member No: 639,265 |
|
|
|