#!/bin/python # MyBot: BotInstance # # (c) 2006 Andreas Jaggi <andreas.jaggi@waterwave.ch> import re, os, copy, random, datetime from IRCClient import IRCClient, LogAllMixin import BotManager class BotInstance(LogAllMixin, IRCClient): def __init__(self, manager = None, server = "irc.freenode.net", port = 6667, nick = "saf02oitgawsg", channel = "#asdf"): print "Spawning bot for: %s:%s %s on %s" % (server, port, nick, channel) if manager == None: manager = BotManager.BotManager() self.manager = manager self.server = server self.channel = channel self.nickname = nick self.port = port self.observedChannels = [] self.availableChannels = [] self.nickre = re.compile(nick) self.answer = "Um, Richard, I didn't see the question." self.queries = [] self.results = {} self.queriesre = {} self.channelLimitReached = 0 self.nextInstance = None IRCClient.__init__(self, server, port) self.connect(nick, nick) self.join(channel) self.start(); def requestChannelList(self): self.send("LIST") def join(self, channel, key = None): if channel not in self.observedChannels: if self.channelLimitReached: self.nextInstance.join(channel, key) else: IRCClient.join(self, channel, key) self.observedChannels.append(channel) self.manager.observedChannelsUpdated(self) def handle_say(self, source, to, message): #print "----(%s->%s): %s" % (source, to, message) sourcenick = source.split("!")[0] if message == "Shane": self.say(self.channel, self.answer) elif message == "PrintChannels": for x in self.observedChannels: self.say(self.channel, x) elif message == "DoList": self.send("LIST") elif message.split(' ')[0] == 'JoinChannel': self.join(message.split(' ')[1]) elif self.nickre.match(message): self.readFuzzyText(message) if to != self.nickname: self.say(to, self.answer) else: self.say(sourcenick, self.answer) else: self.readFuzzyText(message) for query in self.queries: queryre = self.queriesre.setdefault(query, re.compile(query)) if queryre.match(message) or queryre.match(source) or queryre.match(to): if not self.results.has_key(query): self.results[query] = [] self.results[query].append((datetime.date.today().ctime(), self.server, self.channel, source, to, message)) self.manager.resultsUpdated(self) def readFuzzyText(self, message): if len(message) > 0: newtokens = set(message.split(" ")) oldtokens = set(self.answer.split(" ")) nexttokens = list(newtokens.union(oldtokens)) random.shuffle(nexttokens) a = random.randint(0, (len(nexttokens)-1)/2) b = random.randint(a, len(nexttokens)-1) self.answer = ' '.join(nexttokens[a:b]) def handle_reply(self, prefix, code, params): print "reply: %s" % code if code == 322: # reply to a LIST command newchannel = params.split(' ')[1] if newchannel not in self.availableChannels: self.availableChannels.append(newchannel) if code == 323: # end of LIST command self.availableChannels.sort() self.observedChannels.sort() self.manager.availableChannelsUpdated(self) if code == 405: # "You can't join that many channels" channelname = params.split(' ')[1] print "recieved channel: %s" % channelname if not self.channelLimitReached: self.channelLimitReached = 1 newnick = self.manager.genNick() self.nextInstance = BotInstance(self.manager, self.server, self.port, newnick, self.channel) self.nextInstance.join(channelname) def handle_notice(self, source, to, message): print "notice: (%s->%s): %s" % (source, to, message) def handle_command(self, prefix, command, params): print "command: %s" % command if __name__ == "__main__": bot = BotInstance() bot.tjoin()