def __init__(self, server, channels, nick, name): self.nick = nick self.irc = Irc() self.irc.connect(server) self.irc.set_info(nick, nick) # Lock object for sending messages self.sendLock = threading.Lock() self.channels = channels for channel in channels: self.irc.join(channel) self.irc.me(channel, "has initiated self-destruct sequence!") self.input = Input.Input(self.irc) self.input.registerObserver(self) self.input.start() self.output = Output.Output(self.irc) self.output.start() self.callbacks = {} self.activity = {} # Maps usernames to activity # Create bot's LyricMaster self.lymaster = LyricMaster() # Create bot's RSSReader self.rssReader = RSSReader() # Create bot's simple parser and context analyser self.parser = SimpleParser(ContextAnalyser())
class Bot(Observer): """ Simple IRC bot. Respond to chatter by registering callbacks which are triggered by a regular expression pattern match. """ def __init__(self, server, channels, nick, name): self.nick = nick self.irc = Irc() self.irc.connect(server) self.irc.set_info(nick, nick) # Lock object for sending messages self.sendLock = threading.Lock() self.channels = channels for channel in channels: self.irc.join(channel) self.irc.me(channel, "has initiated self-destruct sequence!") self.input = Input.Input(self.irc) self.input.registerObserver(self) self.input.start() self.output = Output.Output(self.irc) self.output.start() self.callbacks = {} self.activity = {} # Maps usernames to activity # Create bot's LyricMaster self.lymaster = LyricMaster() # Create bot's RSSReader self.rssReader = RSSReader() # Create bot's simple parser and context analyser self.parser = SimpleParser(ContextAnalyser()) def notify(self, data): """Respond to notification that some event being observed has occurred. Compares the given message against a collection of patterns and executes any appropriate callbacks. * data = {"from", "to", "message"} """ for pattern in self.callbacks.keys(): if re.match(pattern, data["message"]) != None: # This makes the bot respond directly to personal messages if data["to"] == self.nick: data["to"] = data["from"] self.callbacks[pattern](self, data) break self.activity[data["from"]] = datetime.now() def register(self, pattern, callback): """ Registers a callback for an input pattern. """ if pattern not in self.callbacks: self.callbacks[pattern] = callback def unregister(self, pattern): """ Unregister a function """ self.callbacks.pop(pattern) def send(self, msg, channel=""): """Sends a message to specified channel.""" self.sendLock.acquire() self.irc.send(channel, msg) self.sendLock.release() def me(self, msg, channel=""): """Sends a /me message to specified channel.""" self.irc.me(channel, msg)