import math from core.chat_blob import ChatBlob from core.command_param_types import Int from core.db import DB from core.decorators import instance, command @instance() class LevelController: def inject(self, registry): self.db: DB = registry.get_instance("db") self.util = registry.get_instance("util") self.text = registry.get_instance("text") self.command_alias_service = registry.get_instance("command_alias_service") def pre_start(self): self.db.load_sql_file(self.module_dir + "/" + "alien_level.sql", pre_optimized=True) self.db.create_view("alien_level") self.db.load_sql_file(self.module_dir + "/" + "level.sql", pre_optimized=True) self.db.create_view("level") def start(self): self.command_alias_service.add_alias("lvl", "level") self.command_alias_service.add_alias("pvp", "level") self.command_alias_service.add_alias("team", "level") self.command_alias_service.add_alias("missions", "mission") self.command_alias_service.add_alias("mish", "mission") self.command_alias_service.add_alias("ailevel", "axp") @command(command="level", params=[Int("level")], access_level="member", description="Show information about a character level") def level_cmd(self, _, level): row = self.get_level_info(level) if row: msg = f"L {row.level:d}: " \ f"Team {row.team_min:d}-{row.team_max:d} | " \ f"PvP {row.pvp_min:d}-{row.pvp_max:d} | " \ f"Missions {row.missions} | " \ f"{row.tokens:d} token(s)" return msg else: return "Level must be between 1 and 220." @command(command="mission", params=[Int("mission_level")], access_level="member", description="Show what character levels can roll a specified mission level", extended_description="Updated mission levels provided by Zetabyte") def mission_cmd(self, _, level): if 1 <= level <= 250: levels = self.get_mission_levels(level) return f"QL {level:d} missions can be rolled from these levels: {' '.join(levels)}" else: return "Mission level must be between 1 and 250." @command(command="xp", params=[Int("start_level"), Int("end_level", is_optional=True)], access_level="member", description="Show the amount of XP needed to reach a certain level") def xp_range_cmd(self, _, start_level, end_level): end_level = end_level or start_level + 1 if start_level == end_level: return "Start level must be different than end level." if start_level > end_level: start_level, end_level = end_level, start_level if 1 <= start_level <= 220 and 1 <= end_level <= 220: if end_level <= 200: xp = self.db.query_single("SELECT SUM(xpsk) AS total_xp " "FROM level WHERE level >= ? AND level < ?", [start_level, end_level]) needed = f"{self.util.format_number(xp.total_xp)} XP" elif start_level >= 200: sk = self.db.query_single("SELECT SUM(xpsk) AS total_sk " "FROM level WHERE level >= ? AND level < ?", [start_level, end_level]) needed = f"{self.util.format_number(sk.total_sk)} SK" else: xp = self.db.query_single("SELECT SUM(xpsk) AS total_xp " "FROM level WHERE level >= ? AND level < 200", [start_level]) sk = self.db.query_single("SELECT SUM(xpsk) AS total_sk " "FROM level WHERE level >= 200 AND level < ?", [end_level]) needed = f"{self.util.format_number(xp.total_xp)} XP " \ f"and {self.util.format_number(sk.total_sk)} SK" return f"From the beginning of level {start_level:d} " \ f"you need {needed} to reach level {end_level:d}" else: return "Level must be between 1 and 219." @command(command="axp", params=[], access_level="member", description="Show information about alien levels") def axp_single_cmd(self, _): data = self.db.query("SELECT * FROM alien_level ORDER BY alien_level") rows = [] for row in data: rows.append([f"{row.alien_level}", self.util.format_number(row.axp), f"{row.defender_rank}", f"Min Level: {row.min_level}"]) display_table = self.text.pad_table(rows, " ") blob = "" for cols in display_table: blob += " ".join(cols) + "\n" return ChatBlob("Alien Levels", blob) def get_level_info(self, level): return self.db.query_single("SELECT * FROM level WHERE level = ?", [level]) def get_mission_levels(self, level): levels = [] data = self.db.query("SELECT * FROM level") str_level = str(level) for row in data: if str_level in row.missions.split(","): levels.append(str(row.level)) return levels def get_mission_levels2(self, level): mission_coefficients = [0.7001, 0.75, 0.8, 0.85, 0.9, 1.0, 1.1, 1.2, 1.3, 1.5, 1.7913] mission_levels = set() for i in mission_coefficients: val = math.floor(level * i) if val < 1: val = 1 elif val > 250: val = 250 # I couldn't get 4 values to match with 1.3? if i == 1.3 and (level == 90 or level == 170 or level == 180 or level == 190): val -= 1 mission_levels.add(val) return ",".join(map(lambda x: str(x), sorted(mission_levels)))