#!/usr/bin/env python # # LolBot # # Code originally based on example bot and irc-bot class from # Joel Rosdahl , author of included python-irclib. """ Useful bot for folks stuck behind censor walls at work Logs a channel and collects URLs for later. """ import sys, string, random, time from ircbot import SingleServerIRCBot from irclib import nm_to_n, nm_to_h, irc_lower import botcommon import os from datetime import datetime from mechanize import Browser # Exclamations - wrong input exclamations = [ "Zing!", "Burns!", "Tard!", "Lol.", "Crazy!", "WTF?", ] # Ponderings ponderings = [ "Hi, can I have a medium lamb roast, with just potatoes.", "Can I slurp on your Big Cock?", "Your Mum likes it two in the pink one in the stink.", "Quentin Tarantino is so awesome I want to have his babies.", "No it's a week night 8pm is past my bedtime.", ] class LolBot(SingleServerIRCBot): def __init__(self, channel, nickname, server, port): SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname) self.channel = channel self.nickname = nickname self.urls = {} self.helptext = "Adds URLs to a list. Commands: list - prints a bunch of URLs; clear - clears the list; lol - say something funny; - adds the URL to the list; help - this message." self.queue = botcommon.OutputManager(self.connection) self.queue.start() self.start() def save_url(self, url): try: br = Browser() br.open(url) title = br.title() except Exception as ex: title = '' self.urls[url] = title return title def now(self): return datetime.today().strftime("%Y-%m-%d %H:%M:%S") def log_event(self, event): nick = nm_to_n(event.source()) text = event.arguments()[0] print "(%s) %s: %s" % (self.now(), nick, text) def on_nicknameinuse(self, connection, event): self.nickname = connection.get_nickname() + "_" connection.nick(self.nickname) def on_welcome(self, connection, event): connection.join(self.channel) def on_privmsg(self, connection, event): "Deal with a /msg private message." from_nick = nm_to_n(event.source()) self.do_command(event, event.arguments()[0], from_nick) def on_pubmsg(self, connection, event): "Deal with a public message in a channel." # log it self.log_event(event) from_nick = nm_to_n(event.source()) args = string.split(event.arguments()[0], ":", 1) if len(args) > 1 and irc_lower(args[0]) == irc_lower(self.nickname): self.do_command(event, string.strip(args[1]), from_nick) else: # parse it for links, add URLs to the list words = event.arguments()[0].split(" ") for w in words: if w.startswith('http://') or w.startswith('https://'): title = self.save_url(w) self.say_public(title) def say_public(self, text): "Print TEXT into public channel, for all to see." self.queue.send(text, self.channel) print "(%s) %s: %s" % (self.now(), self.nickname, text) def say_private(self, nick, text): "Send private message of TEXT to NICK." self.queue.send(text, nick) def reply(self, text, to_private=None): "Send TEXT to either public channel or TO_PRIVATE nick (if defined)." if to_private is not None: self.say_private(to_private, text) else: self.say_public(text) def ponder(self): "Return a random pondering." return random.choice(ponderings) def exclaim(self): "Return a random exclamation string." return random.choice(exclamations) def do_command(self, event, cmd, from_private): """ This is the function called whenever someone sends a public or private message addressed to the bot. (e.g. "bot: blah"). """ if event.eventtype() == "pubmsg": target = None else: target = from_private.strip() if cmd == 'help': self.reply(self.helptext, target) elif cmd == 'lol': self.reply(self.ponder(), target) elif cmd == 'urls' or cmd == 'list': for url, title in self.urls.items(): line = "%s %s" % (url, title) self.reply(line, target) time.sleep(1) elif cmd.startswith('http:') or cmd.startswith('https:'): title = self.save_url(cmd) if title == '': self.reply('URL added.', target) if title != '': self.reply('URL added: %s' % title, target) elif cmd == 'clear': del self.urls self.urls = {} self.reply('URLs cleared.', target) else: self.reply(self.exclaim(), target) if __name__ == "__main__": try: botcommon.trivial_bot_main(LolBot) except KeyboardInterrupt: print "Shutting down."