164 lines
4.5 KiB
Python
164 lines
4.5 KiB
Python
#!/usr/bin/env python
|
|
#
|
|
# LolBot
|
|
#
|
|
# Code originally based on example bot and irc-bot class from
|
|
# Joel Rosdahl <joel@rosdahl.net>, author of included python-irclib.
|
|
|
|
"""
|
|
Useful bot for folks stuck behind censor walls at work
|
|
"""
|
|
|
|
import sys, string, random, time
|
|
from ircbot import SingleServerIRCBot
|
|
from irclib import nm_to_n, nm_to_h, irc_lower
|
|
import botcommon
|
|
import time
|
|
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.",
|
|
]
|
|
|
|
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.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; <url> - 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:
|
|
print ex
|
|
title = ''
|
|
self.urls[url] = title
|
|
return title
|
|
|
|
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.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."
|
|
self.queue.send(text, self.channel)
|
|
|
|
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 string indicating what Pinky's 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":
|
|
# self.reply() sees 'from_private = None' and sends to public channel.
|
|
target = None
|
|
else:
|
|
# assume that from_private comes from a 'privmsg' event.
|
|
target = from_private.strip()
|
|
|
|
# Be forgiving about capitalization and whitespace.
|
|
#cmd = cmd.replace(" ", "").lower()
|
|
|
|
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."
|
|
|