Log In · Register

 
 
Reply to this topicStart new topic
IRC logger [release]
heyo-captain-jac...
post 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.
 
Maccabee
post 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.
 
mipadi
post Nov 16 2009, 04:00 PM
Post #3


Senior Member
******

Group: Administrator
Posts: 2,648
Joined: Apr 2008
Member No: 639,265



QUOTE(jcp @ Nov 16 2009, 03:50 PM) *
I have absolutely no clue what this is nor do I think anyone else does.


Speak for yourself. tongue.gif It's a program (a bot) that logs IRC activity.
 

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members: