Commit cc83cfdb authored by Jonathan Harker's avatar Jonathan Harker

Working IRC LOL bot.

parents
#!/bin/sh
/usr/bin/python lolbot.py irc.freenode.net "#zomglol" lolbot
#!/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 urllib
import libxml2doc
# 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.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 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."
# TODO: log it
# TODO: parse it for links and add it to the list
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)
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':
urls = ' || '.join(self.urls)
if urls == '':
urls = 'No URLs yet.'
self.reply(urls, target)
elif cmd.startswith('http:') or cmd.startswith('https:'):
self.urls.append(cmd)
self.reply("URL added.", 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."
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment