# -*- coding: utf-8 -*- import random import re import irc3 from docopt import Dict from irc3.plugins.command import command from irc3.utils import IrcString from psycopg2 import Error from . import DatabasePlugin from ..utils import re_generator RAINBOW = (5, 7, 8, 9, 3, 10, 12, 2, 6, 13) RAINBOW_LEN = len(RAINBOW) ISPS = ( 't-ipconnect', 'telefonica', 'vodafone', 'kabel', 'unity-media', ) GENDERS = ( 'male', 'female', 'shemale', 'hermaphrodite', ) @irc3.plugin class Useless(DatabasePlugin): requires = ['irc3.plugins.command', 'bot.plugins.storage'] WOAH = ( 'woah', 'woah indeed', 'woah woah woah!', 'keep your woahs to yourself', ) @command(permission='admin', show_in_help=False) def kim(self, mask: IrcString, target: IrcString, args: Dict): """Kicks Kim, most useful command. %%kim """ self.bot.kick(target, 'Kim') @irc3.event(r'(?i)^:(?P\S+@\S+({isps})\S+) JOIN :(?P#\S+)$'.format(isps='|'.join(ISPS))) def bounce(self, mask, target): nick = IrcString(mask).nick if target == '#w0bm' and nick != self.bot.nick: self.bot.privmsg(target, '{}: Du musst bouncen!'.format(nick)) @irc3.event(r'(?i)^:\S+ PRIVMSG (?P\S+) :.*(woah|whoa).*$') def woah(self, target: str): """Colorize words in a sentence with rainbow colors.""" if random.randint(0, 4) is 0: self.bot.privmsg(target, random.choice(self.WOAH)) @irc3.event(r'(?i)^:\S+ PRIVMSG (?P\S+) :(?Phuehuehue)$') def huehuehue(self, target: str, msg: str): """Returns a huehuehue when someone writes it.""" self.bot.privmsg(target, msg) @irc3.event(r'(?i)^:\S+ PRIVMSG (?P\S+) :re+$') def reeeeee(self, target: str): """Returns a REEEE.""" self.bot.privmsg(target, re_generator()) @irc3.event(r'(?i)^:\S+ PRIVMSG (?P\S+) :same$') def same(self, target: str): """Returns a plain same when a user writes same.""" self.bot.privmsg(target, 'same') @irc3.event(r'(?i)^:\S+ PRIVMSG (?P\S+) :\[(?P.*)\]$') def intensifies(self, target: str, msg: str): """String with brackets around will be returned with INTENSIFIES.""" self.bot.privmsg(target, '\x02[{} INTENSIFIES]'.format(msg.upper())) @command def kill(self, mask: IrcString, target: IrcString, args: Dict): """Kills a user with a random message %%kill [] """ self.cur.execute(''' SELECT item FROM kills ORDER BY random() LIMIT 1 ''') self.bot.action(target, self.cur.fetchone()['item'].format( nick=args.get('', mask.nick), )) @command def yiff(self, mask: IrcString, target: IrcString, args: Dict): """Yiffs a user with a random message %%yiff [] """ self.cur.execute(''' SELECT item FROM yiffs ORDER BY random() LIMIT 1 ''') self.bot.action(target, self.cur.fetchone()['item'].format( nick=args.get('', mask.nick), yiffer=mask.nick, )) @command def waifu(self, mask: IrcString, target: IrcString, args: Dict): """Get waifu for a user (set with prefixing the user with =) %%waifu [...] """ return self.husbando_waifu('waifu', mask, target, args) @command def husbando(self, mask: IrcString, target: IrcString, args: Dict): """Get husbando for a user (set with prefixing the user with =) %%husbando [...] """ return self.husbando_waifu('husbando', mask, target, args) @command def storyofpomfface(self, mask: IrcString, target: IrcString, args: Dict): """Story of pomf face %%storyofpomfface """ for face in (':O C==3', ':OC==3', ':C==3', ':C=3', ':C3', ':3'): self.bot.privmsg(target, face) @command def choose(self, mask: IrcString, target: IrcString, args: Dict): """Decides between items (separated by comma) %%choose ... """ choice = random.choice(' '.join(args['']).split(',')) return '{}: {}'.format(mask.nick, choice.strip()) @command def jn(self, mask: IrcString, target: IrcString, args: Dict): """Decides between yes and no (for a question). %%jn ... %%jn """ choice = random.choice(['3Ja', '4Nein']) return '{}: \x02\x030{}'.format(mask.nick, choice) @command def kiss(self, mask: IrcString, target: IrcString, args: Dict): """Kisses a user %%kiss [] """ return '(づ。◕‿‿◕。)\x0304。。・゜゜・。。・゜❤\x03 {} \x0304❤'.format(args.get('', mask.nick)) @command def hug(self, mask: IrcString, target: IrcString, args: Dict): """Hugs a user %%hug [] """ return '\x0304♥♡❤♡♥\x03 {} \x0304♥♡❤♡♥'.format(args.get('', mask.nick)) @command def bier(self, mask: IrcString, target: IrcString, args: Dict): """Gives a user a beer %%bier [] """ nick = args.get('', mask.nick) self.bot.action(target, 'schenkt ein kühles Blondes an {} aus.'.format(nick)) @command def fucken(self, mask: IrcString, target: IrcString, args: Dict): """Kills and fucks a user %%fucken [] """ nick = args.get('', mask.nick) self.bot.action(target, 'fuckt {0} und tötet {0} anschließend.'.format(nick, nick)) @command(aliases=['anhero', 'sudoku']) def seppuku(self, mask: IrcString, target: IrcString, args: Dict): """Kicks a user %%seppuku """ self.bot.kick(target, mask.nick, 'Sayonara bonzai-chan...') @command def hack(self, mask: IrcString, target: IrcString, args: Dict): """Hacks (a user) %%hack [] """ nick = args.get('') return 'hacking{}...'.format(' %s' % nick if nick else '') @command def gay(self, mask: IrcString, target: IrcString, args: Dict): """Make someone gay (alias to rainbow) %%gay ... """ return self.rainbow(mask, target, args) @command def rainbow(self, mask: IrcString, target: IrcString, args: Dict): """Colorize a word in rainbow colors %%rainbow ... """ last = 0 word = [] for char in ' '.join(args.get('')): if char != ' ': char = self._rainbow(last, char) last += 1 word.append(char) return ''.join(word) @command def wrainbow(self, mask: IrcString, target: IrcString, args: Dict): """Colorize words in a sentence with rainbow colors %%wrainbow ... """ return ' '.join([self._rainbow(i, word) for i, word in enumerate(args[''])]) @command def halfwidth(self, mask: IrcString, target: IrcString, args: Dict): """Turns UPPERCASE words into halfwidth characters %%halfwidth ... """ def replace(match): return ''.join(chr(0xFF20 + (ord(c) - 64)) for c in match.group(0)) return '\x02[HALFWIDTH]\x02 {}'.format(re.sub(r'(?:\b)[A-Z]+(?:\b)', replace, ' '.join(args['']))) @command def asshole(self, mask: IrcString, target: IrcString, args: Dict): """Checks how much of an asshole you are %%asshole [] """ nick = args.get('', mask.nick) if nick.lower() == 'mrhanky': perc_min = 100 elif nick.lower() == 'flummi': perc_min = 90 else: perc_min = 0 asshole_perc = random.randint(perc_min, 100) return 'Asshole scan... {} is {}% of an asshole.'.format(nick, asshole_perc) @command def assume(self, mask: IrcString, target: IrcString, args: Dict): """Assumes the gender of a nick or yourself %%assume [] """ nick = args.get('', mask.nick) gender = random.choice(GENDERS) return 'Assuming {}\'s gender... they\'re a {}.'.format(nick, gender) def husbando_waifu(self, field: str, mask: IrcString, target: IrcString, args: Dict): nick = args.get('', mask.nick) if isinstance(nick, list): nick = ' '.join(nick) if nick.startswith('='): nick = nick[1:] try: self.cur.execute(''' INSERT INTO users (nick, {0}) VALUES (lower(%s), %s) ON CONFLICT (nick) DO UPDATE SET {0} = excluded.{0} '''.format(field), [mask.nick, nick]) self.con.commit() self.bot.notice(mask.nick, '{} set to: {}'.format(field.title(), nick)) except Error as ex: self.log.error(ex) self.con.rollback() else: self.cur.execute(''' SELECT {} FROM users WHERE lower(nick) = lower(%s) '''.format(field), [nick]) result = self.cur.fetchone() if result and result[field]: return '\x02[{}]\x02 {}: {}'.format(field.title(), nick, result[field]) # noinspection PyMethodMayBeStatic def _rainbow(self, i, char): return '\x03{0:02d}{1}'.format(RAINBOW[i % RAINBOW_LEN], char)