h/bot.py

114 lines
2.7 KiB
Python
Raw Normal View History

2008-06-09 11:59:56 +00:00
#!/usr/bin/python
network = "irc.synirc.net"
nickname = "skybot"
channel = "#mongbot"
import sys, os, glob, imp, re
import thread, Queue, copy
import irc, yaml
os.chdir(sys.path[0]) #do stuff relative to the installation directory
class Empty(object): #this is used to store attributes
pass
class Bot(object):
def __init__(self):
self.plugins = {}
self.commands = {}
self.listens = {}
self.filters = {}
self.daemons = {}
def command(self, name, func, **filterargs):
self.commands[name] = (func, filterargs)
def listen(self, name, func):
self.listens[name] = func
def filter(self, name, func):
self.filters[name] = func
def daemon(self, name, func):
self.daemons[name] = func
bot = Bot()
print 'Loading plugins'
for filename in glob.glob("plugins/*.py"):
shortname = os.path.splitext(os.path.basename(filename))[0]
try:
bot.plugins[shortname] = imp.load_source(shortname,filename)
except Exception, e:
print e
print bot.plugins
print 'Registering plugins'
for name, plugin in bot.plugins.iteritems():
if hasattr(plugin, 'setup'):
try:
plugin.setup(bot)
except Exception, e:
print e
print 'Connecting to IRC'
bot.irc = irc.irc(network, nickname)
bot.irc.join(channel)
bot.commandprefix = '^(?:\.|'+nickname+'[:,]*\s*)'
if bot.daemons:
print 'Running daemons'
for daemon in bot.daemons.itervalues():
thread.start_new_thread(daemon, ())
print 'Running main loop'
class Input(object):
def __init__(self, raw, prefix, command,
params, nick, user, host, paraml, msg):
self.raw = raw
self.prefix = prefix
self.command = command
self.params = params
self.nick = nick
self.user = user
self.host = host
self.paraml = paraml
self.msg = msg
class FakeBot(object):
def __init__(self, bot, input):
self.bot = bot
self.input = input
def say(self, msg):
self.bot.irc.msg(input.paraml[0], msg)
def reply(self, msg):
self.say(input.nick + ': ' + msg)
print bot.commands
while True:
try:
out = bot.irc.out.get(timeout=1)
#print repr(out)
for func, args in bot.commands.itervalues():
input = Input(*out)
for filt in bot.filters.itervalues():
input = filt(bot, func, args, input)
if input == False:
break
if input == False:
continue
thread.start_new_thread(func,(FakeBot(bot, input), input))
except Queue.Empty:
pass
#except KeyboardInterrupt:
# sys.exit()