188 lines
5.3 KiB
Python
188 lines
5.3 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
LogBot
|
|
|
|
A minimal IRC log bot with FTP uploads
|
|
|
|
Written by Chris Oliver
|
|
|
|
Includes python-irclib from http://python-irclib.sourceforge.net/
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
"""
|
|
|
|
__author__ = "Chris Oliver <excid3@gmail.com>"
|
|
__version__ = "0.2.1"
|
|
__date__ = "08/11/2009"
|
|
__copyright__ = "Copyright (c) Chris Oliver"
|
|
__license__ = "GPL2"
|
|
|
|
# Imports
|
|
import os
|
|
import os.path
|
|
import irclib
|
|
from ftplib import FTP
|
|
from time import strftime
|
|
|
|
# Customizable Variables
|
|
########################
|
|
# Log format
|
|
extensions = {'text':'log',
|
|
'html':'html'}
|
|
# Valid formats: text, html
|
|
FORMAT = 'text'
|
|
|
|
# Connection information
|
|
network = 'irc.freenode.net'
|
|
port = 6667
|
|
channels = ['#keryx']
|
|
nick = 'Excid3LogBot'
|
|
name = 'Excid3LogBot'
|
|
|
|
# FTP information
|
|
USE_FTP = False # Allow FTP uploads
|
|
host = '' # Server Ex. deathlok.dreamhost.com
|
|
username = ''
|
|
password = ''
|
|
# Folder on the server where the logs will be stored
|
|
# ALWAYS terminate with a /
|
|
# NOTE: This directory should already exist
|
|
# Ex: chdir = 'excid3.com/logs/'
|
|
chdir = ''
|
|
|
|
counter = 0
|
|
lines = 50
|
|
|
|
def write(channel, message):
|
|
""" Write to the log file and console """
|
|
# Format the message
|
|
string = '%s %s' % (strftime('[%H:%M]'), message)
|
|
if FORMAT == 'html':
|
|
string += '<br />'
|
|
string += '\n'
|
|
|
|
# Make sure the local folder exists for logging this channel
|
|
if not os.path.exists(channel):
|
|
os.mkdir(channel)
|
|
|
|
# Append the message to the file locally
|
|
path = os.path.join(channel, '%s_%s.%s' % (channel, strftime('%m-%d-%Y'), \
|
|
extensions[FORMAT]))
|
|
f = open(path, 'a')
|
|
f.write(string)
|
|
f.close()
|
|
print '%s> %s' % (channel, message)
|
|
|
|
def handleJoin(connection, event):
|
|
""" User joins channel """
|
|
nick = event.source().split("!")
|
|
|
|
try:
|
|
nickmask = nick[1]
|
|
nick = nick[0]
|
|
except:
|
|
nick = "unknown"
|
|
nickmask = "unknown"
|
|
|
|
write(event.target(), '%s (%s) has joined %s' %
|
|
(nick, nickmask, event.target()))
|
|
|
|
def handleInvite(connection, event):
|
|
""" User invites bot to join channel """
|
|
connection.join(event.arguments()[0])
|
|
|
|
def handlePubMessage(connection, event): # Any public message
|
|
""" Public message is sent """
|
|
global counter, lines
|
|
write(event.target(), '%s: %s' % \
|
|
(event.source().split ('!')[0], event.arguments()[0]))
|
|
|
|
# Update the counter and check it to see if its time to upload
|
|
counter += 1
|
|
if counter == lines and USE_FTP:
|
|
upload()
|
|
counter = 0
|
|
|
|
def handlePart(connection, event):
|
|
""" User parts channel """
|
|
write(event.target(), '%s has parted %s' % \
|
|
(event.source().split('!')[0], event.target()))
|
|
|
|
def upload():
|
|
""" Upload files via FTP """
|
|
try:
|
|
print 'Uploading logs to %s ...' % host
|
|
|
|
# Create the FTP connection
|
|
ftp = FTP(host, username, password)
|
|
|
|
# Attempt to create the directory if it does not already exist
|
|
try: ftp.mkd(chdir)
|
|
except: pass
|
|
|
|
for channel in channels:
|
|
# Attempt to create subdirectory for channel
|
|
try: ftp.mkd('%s%s' % (chdir, channel))
|
|
except: pass
|
|
|
|
# Move to the directory
|
|
ftp.cwd('%s%s' % (chdir, channel))
|
|
|
|
# Get the path for the filename
|
|
path = os.path.join(channel, '%s_%s' % \
|
|
(channel, strftime('%m-%d-%Y')))
|
|
|
|
# Open the file and store it via FTP
|
|
f = open(path, 'rb')
|
|
ftp.storbinary('STOR %s_%s.%s' % \
|
|
(channel, strftime('%m-%d-%Y'), extensions[FORMAT]), f)
|
|
f.close()
|
|
|
|
# Close the FTP connection
|
|
ftp.quit()
|
|
print 'Finished uploading logs to %s' % chdir
|
|
|
|
except Exception, e:
|
|
print e
|
|
print 'Make sure your FTP information is correct.'
|
|
|
|
def main():
|
|
""" Join the IRC server """
|
|
|
|
# Write logs locally to logs/
|
|
if not os.path.exists('logs'):
|
|
os.mkdir('logs')
|
|
os.chdir('logs')
|
|
|
|
# Create an IRC object
|
|
irc = irclib.IRC()
|
|
|
|
# Setup the IRC functionality we want to log
|
|
irc.add_global_handler('join', handleJoin)
|
|
irc.add_global_handler('pubmsg', handlePubMessage)
|
|
irc.add_global_handler('part', handlePart)
|
|
irc.add_global_handler('invite', handleInvite)
|
|
|
|
# Create a server object, connect and join the channel
|
|
server = irc.server()
|
|
server.connect(network, port, nick, ircname=name)
|
|
for channel in channels:
|
|
server.join(channel)
|
|
|
|
# Jump into an infinte loop
|
|
irc.process_forever()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|