From 66d29f80b5f25b33efe5451bed379de0ba944b97 Mon Sep 17 00:00:00 2001 From: Jonathan Harker Date: Sun, 30 May 2010 23:30:42 +1200 Subject: [PATCH] Collect URLs in a dictionary. Fetch page title. --- lolbot.py | 49 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/lolbot.py b/lolbot.py index 7daf75a..c3a985c 100644 --- a/lolbot.py +++ b/lolbot.py @@ -13,11 +13,10 @@ import sys, string, random, time from ircbot import SingleServerIRCBot from irclib import nm_to_n, nm_to_h, irc_lower import botcommon -import urllib -import libxml2doc +import time +from mechanize import Browser # Exclamations - wrong input - exclamations = [ "Zing!", "Burns!", @@ -28,7 +27,6 @@ exclamations = [ ] # Ponderings - ponderings = [ "Hi, can I have a medium lamb roast, with just potatoes.", "Can I slurp on your Big Cock?", @@ -41,7 +39,8 @@ class LolBot(SingleServerIRCBot): self.channel = channel self.nickname = nickname - self.urls = [] + self.urls = {} + self.logfile = open('/tmp/lolbot.log', 'a') 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." @@ -49,6 +48,17 @@ class LolBot(SingleServerIRCBot): self.queue.start() self.start() + def save_url(self, url): + try: + br = Browser() + br.open(url) + title = br.title() + except Exception as ex: + print ex + title = '' + self.urls[url] = title + return title + def on_nicknameinuse(self, connection, event): self.nickname = connection.get_nickname() + "_" connection.nick(self.nickname) @@ -64,14 +74,20 @@ class LolBot(SingleServerIRCBot): def on_pubmsg(self, connection, event): "Deal with a public message in a channel." - # TODO: log it - - # TODO: parse it for links and add it to the list + # log it + self.logfile.write("%s\n" % event.arguments()[0]) 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." @@ -119,18 +135,21 @@ class LolBot(SingleServerIRCBot): self.reply(self.ponder(), target) elif cmd == 'urls' or cmd == 'list': - urls = ' || '.join(self.urls) - if urls == '': - urls = 'No URLs yet.' - self.reply(urls, target) + 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:'): - self.urls.append(cmd) - self.reply("URL added.", target) + 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.urls = {} self.reply('URLs cleared.', target) else: -- 2.22.0