| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #! /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 <server ID from database>")
- 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()
|