import random from common import font class CommandHelpers(): def disect_command(self, event): trigger = event.arguments[0] # Everything the user inputted. command = trigger[1:].lower() # Command without prefix. = trigger minus first character. # Determine command type. if trigger.startswith(self.network.command_character): cmdtype = 'cmd' elif trigger.startswith(self.network.help_character): cmdtype = 'help' else: cmdtype = False # Determine where to reply to. if event.type == 'pubmsg': replyto = event.target elif event.type == 'privmsg': replyto = event.source.nick else: replyto = False return(cmdtype, trigger, command, replyto) def ccc(self, command, rights=False, event=False): # Commandlist colour coding and channel rights filter. if rights: show = False if rights["homechan"] == "owner": if self.channels[self.network.home_channel].is_owner(event.source.nick): show = True if rights["homechan"] == "admin": if self.channels[self.network.home_channel].is_owner(event.source.nick) or self.channels[self.network.home_channel].is_admin(event.source.nick): show = True if rights["homechan"] == "oper": if self.channels[self.network.home_channel].is_owner(event.source.nick) or self.channels[self.network.home_channel].is_admin(event.source.nick) or self.channels[self.network.home_channel].is_oper(event.source.nick): show = True if not event.target == self.connection.get_nickname(): # Channel message. if rights["chan"] == "owner": if self.channels[event.target].is_owner(event.source.nick): show = True if rights["chan"] == "admin": if self.channels[event.target].is_owner(event.source.nick) or self.channels[event.target].is_admin(event.source.nick): show = True if rights["chan"] == "oper": if self.channels[event.target].is_owner(event.source.nick) or self.channels[event.target].is_admin(event.source.nick) or self.channels[event.target].is_oper(event.source.nick): show = True if show: return font.blue + self.network.command_character + command + font.grey + ", " else: return font.blue + self.network.command_character + command + font.grey + ", " class AdminHelpers(): def get_channelfunctions(self, channel): #channelfunctions = self.db.one("SELECT autojoin, aggressiveness, join_greeting, statistics_commands, games, chat FROM channels WHERE LOWER(name)=LOWER('" + channel + "') AND network='" + self.network + "'") channelfunctions = self.db.one("SELECT autojoin FROM rotbot_channels WHERE LOWER(name)=LOWER('" + channel + "') AND network='" + self.network.id + "'") if channelfunctions[0]: autojoin = "on" else: autojoin = "off" # if channelfunctions[2]: # joingreet = "on" # else: # joingreet = "off" # if channelfunctions[3]: # statscmds = "on" # else: # statscmds = "off" # if channelfunctions[4]: # games = "on" # else: # games = "off""" # if channelfunctions[5]: # chat = "on" # else: # chat = "off""" #return ("autojoin " + font.green + autojoin + font.reset + ", aggressiveness " + font.green + channelfunctions[1] + font.reset + ", join_greeting " + font.green + joingreet + font.reset + ", statistics_commands " + font.green + statscmds + font.reset + ", games " + font.green + games + font.reset + ", chat " + font.green + chat + font.reset + ".") return ('autojoin %s %s %s.' % font.green, autojoin, font.reset) def is_channelfunction(value): if value.lower() in ["autojoin", "aggressiveness", "join_greeting", "statistics_commands", "games", "chat"]: return True else: return False def describe_channelfunction(function): if function == "autojoin": message = "Join the channel automaticly after connecting." elif function == "aggressiveness": message = "How to respond to kick, ban and mode events. Options: " + font.blue + "passive" + font.reset + ", " + font.blue + "defense_only" + font.reset + ", " + font.blue + "equal_retalliation" + font.reset + ", " + font.blue + "battlebot" + font.reset + "." elif function == "join_greeting": message = "Greet users joining the channel on the first few joins, and later on large amounts." elif function == "statistics_commands": message = "Enable use of statistics commands." elif function == "games": message = "Enable use of game commands." elif function == "chat": message = "Respond to and initiate chat." else: message = "Sorry, this function has no description yet." return message def is_aggressiveness(value): if value.lower() in ["passive", "defense_only", "equal_retalliation", "battlebot"]: return True else: return False class GameHelpers(): def roll_dice(amount, type): rolls = [] for iterations in range(amount): rolls.append(random.randint(1, type)) return rolls def get_info(self, user): user = user.lower() all_joins = self.db.all("SELECT joins FROM joins WHERE LOWER(\"user\")=%s AND user_network='" + self.network + "'", (user, )) all_kicks = self.db.all("SELECT given, received FROM kicks WHERE LOWER(\"user\")=%s AND user_network='" + self.network + "'", (user, )) all_messages = self.db.all("SELECT messages, messages_words, messages_characters, actions, actions_words, actions_characters, notices, notices_words, notices_characters FROM messages WHERE LOWER(\"user\")=%s AND user_network='" + self.network + "'", (user, )) joins =0 for record in all_joins: joins += record given = 0 received = 0 for record in all_kicks: given += int(record[0]) received += int(record[1]) messages = 0 messages_words = 0 messages_characters = 0 actions = 0 actions_words = 0 actions_characters = 0 notices = 0 notices_words = 0 notices_characters = 0 for record in all_messages: messages += int(record[0]) messages_words += int(record[1]) messages_characters += int(record[2]) actions += int(record[3]) actions_words += int(record[4]) actions_characters += int(record[5]) notices += int(record[6]) notices_words += int(record[7]) notices_characters += int(record[8]) userrecord = self.db.one("SELECT xp_spent, level, coin, coin_given, coin_spent, ap_spent, karma_correction FROM users WHERE LOWER(name)=%s AND network='" + self.network + "'", (user, )) xp_spent = userrecord[0] level = userrecord[1] coin = userrecord[2] coin_given = userrecord[3] coin_spent = userrecord[4] ap_spent = userrecord[5] karma_correction = userrecord[6] chatxp = messages + (messages_words / 4) + (messages_characters / 10) + ((actions + (actions_words / 4) + (actions_characters / 10)) * 2) + ((notices + (notices_words / 4) + (notices_characters / 10)) / 2) kickxp = given * received total_xp = ((joins + kickxp + chatxp) / 120) + float(coin_spent + ap_spent / 8) xp = total_xp - xp_spent ap = total_xp - float(ap_spent) total_messages = messages + actions + notices total_words = messages_words + actions_words + notices_words total_characters = messages_characters + actions_characters + notices_characters if total_xp < 1: total_xp = 1 joinkarma = (((messages / 19) - joins) / total_xp) /10 words_per_message = (total_words / 6) - total_messages characters_per_message = (total_characters / 20) - total_messages characters_per_word = (total_characters / 6) - total_words chatkarma = ((words_per_message + characters_per_message + characters_per_message + characters_per_word) / total_xp) / 100 kickkarma = ((given * received) / total_xp) / 2 xpkarma = xp / 25 coinkarma = (coin - coin_given / (xp_spent + 1)) / 99 karma = float(joinkarma) + float(chatkarma) - float(kickkarma) + float(xpkarma) - float(coinkarma) + float(karma_correction) if xp < 0: xp = 0 return level, xp, xp_spent, total_xp, karma, coin, coin_spent, coin_given, ap, ap_spent def list_top_players(self, sort): result = self.db.all("SELECT name, level, xp_spent, coin FROM users WHERE network=%s ORDER BY " + sort + " DESC LIMIT 3 ", (self.network, )) if sort == "level": column = 1 threshold = 0 if sort == "xp_spent": column = 2 threshold = 0 if sort == "coin": column = 3 threshold = 10 message = "" for record in result: if not record[column] <= threshold: level, xp, xpspent, totalxp, karma, coin, coinspent, coingiven, ap, apspent = GameHelpers.get_info(self, record[0]) if ap < 0: ap = 0 if sort == "level": message += red + str(record[0]) + font.reset + " [" + font.blue + "L " + font.green + str(level) + font.reset + ", X " + font.grey + str(xpspent) + "/" + font.green + str(int(xp)) + font.reset + ", A " + str(int(ap)) + ", C " + font.green + str(coin) + font.reset + ", K " + font.green + str(round(karma, 2)) + font.reset + "], " if sort == "xp_spent": message += red + str(record[0]) + font.reset + " [L " + font.green + str(level) + font.reset + ", " + font.blue + "X " + font.grey + str(xpspent) + "/" + font.green + str(int(xp)) + font.reset + ", A " + str(int(ap)) + ", C " + font.green + str(coin) + font.reset + ", K " + font.green + str(round(karma, 2)) + font.reset + "], " if sort == "coin": message += red + str(record[0]) + font.reset + " [L " + font.green + str(level) + font.reset + ", X " + font.grey + str(xpspent) + "/" + font.green + str(int(xp)) + font.reset + ", " + font.reset + "A " + str(int(ap)) + ", " + font.blue + "C " + font.green + str(coin) + font.reset + ", K " + font.green + str(round(karma, 2)) + font.reset + "], " return message[:-2] def player_info(self, user): level, xp, xpspent, totalxp, karma, coin, coinspent, coingiven, ap, apspent = GameHelpers.get_info(self, user) if ap < 0: ap = 0 return "Level: " + str(level) + font.grey + ", " + font.reset + "XP: " + str(int(xp)) + "/" + font.grey + str(round(totalxp, 4)) + ", " + font.reset + "AP: " + str(int(ap)) + font.grey + ", " + font.reset + "coin: " + str(coin) + font.grey + "[S " + str(coinspent) + ", G " + str(coingiven) + "], " + font.reset + "karma: " + str(round(karma, 4)) class StatisticsHelpers(): def add_message_stats(stats): messages = 0 words = 0 characters = 0 for record in stats: messages += record[0] words += record[1] characters += record[2] return messages, words, characters