#! /usr/bin/env python import sys, random, string, ssl import irc.bot, irc.strings from irc.client import ip_numstr_to_quad#, ip_quad_to_numstr from postgres import Postgres import commands.public, commands.admin, commands.games import events.on_join from common.networkservices import NickServ bold = "\x02" italic = "\x1D" underline = "\x1F" reverse = "\x16" # swap background and foreground colors ("reverse video") reset = "\x0F" blue = "\x0302" green = "\x0303" red = "\x0304" grey = "\x0314" class PyRot(irc.bot.SingleServerIRCBot): def __init__(self, network, db, homechannel, nickname, username, password, host, port=6667, usessl=False, cmdchar="!", helpchar="@"): self.network = network self.db = db self.homechannel = homechannel self.password = password self.cmdchar = cmdchar self.helpchar = helpchar if usessl: factory = irc.connection.Factory(wrapper=ssl.wrap_socket) else: factory = irc.connection.Factory() print("Connecting to " + host + ":" + str(port) + "/" + self.homechannel) try: irc.bot.SingleServerIRCBot.__init__(self, [(host, port)], nickname, username, connect_factory=factory) except irc.client.ServerConnectionError: sys.stderr.write(sys.exc_info()[1]) # Events. def on_nicknameinuse(self, connection, event): print("Nickname in use, attempting to recover: " + connection.nickname) connection.nick(connection.nickname + ''.join(random.choice(string.digits) for _ in range(3))) # Take temporary nick. Without this recovering via NickServ won't work. NickServ.recover_nick(connection, self.password) def on_nick(self, connection, event): if event.source.nick == connection.nickname: # If the nick boing changes is the bots prefered nickname. print("Assuming original nick.") NickServ.recover_nick(connection, self.password) def on_welcome(self, connection, event): print(event) if self.password: connection.privmsg("NickServ", "identify " + connection.nickname + " " + self.password) # Identify with NickServ. print("Joining " + self.homechannel) connection.join(self.homechannel) def on_join(self, connection, event): print(event) events.on_join.process_event(self, connection, event) def on_privmsg(self, connection, event): print(str(event)) commands.public.do_command(self, connection, event) commands.admin.do_command(self, connection, event) commands.games.do_command(self, connection, event) def on_privnotice(self, connection, event): print(str(event)) commands.public.do_command(self, connection, event) commands.admin.do_command(self, connection, event) commands.games.do_command(self, connection, event) if event.source.nick == NickServ and event.arguments[0].startswith("This nickname is registered"): connection.privmsg("NickServ", "identify " + connection.nickname + " " + connection.password) # Identify with NickServ. def on_pubmsg(self, connection, event): commands.public.do_command(self, connection, event) commands.admin.do_command(self, connection, event) try: games = self.db.one("SELECT games FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'") except: pass if games: commands.games.do_command(self, connection, event) if connection.get_nickname().lower() in event.arguments[0].lower() and event.source.nick is not connection.get_nickname(): # Bot's name was mentioned messages = [ "Hello " + event.source.nick + ".", "How are you today " + event.source.nick + "?", "Piss off " + event.source.nick + "!", event.source.nick + ", what are you botherring me for?", "Go bother someone else...", "Is life treating you fair?", "What's up?", "Why are you talking to me?", "I'm not talking to you!", "What have you been up to?", "How is life?", "What do you wan't from me?", event.source.nick + ", why are you bothering me?", event.source.nick + ", when will you stop talking about me?", event.source.nick + " I hate you!", "Get bent!", "Go and cut yourself.", "Do you think i care about you?", "Stop nickalerting me " + event.source.nick + ", you wanker!", ] actions = [ "hides!", "dies.", "runs away.", "is ignoring that.", "is not feeling like caring.", "is away", "will be ignoring that.", "is faggaliciouz!! <333", "likes you! <3", "looks the other way...", "does a little dance with " + event.source.nick + ".", "makes a little love.", "get's down tonight.", "thinks SAM Broadcaster sucks raw cocks in hell!", "is secretly in love with " + event.source.nick + ".", "tosses " + event.source.nick + "'s salad.", "tortures " + event.source.nick + " horribly!", "is smelling like tuna when looking at " + event.source.nick + ".", "sniffing armpits.. Eew! Smells like " + event.source.nick + ".", "rapes " + event.source.nick + ".", ] if random.randint(0, 1) == 0: connection.privmsg(event.target, random.choice(messages)) else: connection.action(event.target, random.choice(actions)) def on_dccmsg(self, c, e): # non-chat DCC messages are raw bytes; decode as text text = e.arguments[0].decode('utf-8') c.privmsg("You said: " + text) def on_dccchat(self, c, e): if len(e.arguments) != 2: return args = e.arguments[1].split() if len(args) == 4: try: address = ip_numstr_to_quad(args[2]) port = int(args[3]) except ValueError: return self.dcc_connect(address, port) def main(): # Check system arguments. if len(sys.argv) != 2: print(sys.argv) print("Usage: rotbot ") sys.exit(1) # Check instance. Instance is the database network id. instance = sys.argv[1] db = Postgres("postgres://pyRot:4h8q(.@localhost/pyRot") try: network = db.one("SELECT * FROM networks WHERE id=" + str(instance)) except: print("Invalid network ID.") sys.exit(1) if not network: print("Invalid network ID.") sys.exit(1) bot = PyRot(network.name, db, network.home_channel, network.nickname, network.username, network.password, network.host, network.port, network.use_ssl, network.command_character, network.help_character) bot.start() if __name__ == "__main__": main()