From eaa5d9ad1a96dcaaf78cd6e1c7c8281f18255fd8 Mon Sep 17 00:00:00 2001 From: th3-z Date: Mon, 7 Oct 2019 15:02:46 +0100 Subject: [PATCH 01/33] Cleanup smells in web_admin.py --- magicked_admin/web_admin/web_admin.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/magicked_admin/web_admin/web_admin.py b/magicked_admin/web_admin/web_admin.py index f4c62e50..1c12f4a6 100644 --- a/magicked_admin/web_admin/web_admin.py +++ b/magicked_admin/web_admin/web_admin.py @@ -206,7 +206,7 @@ def __get_players(info_tree): "//text()" theads_result = info_tree.xpath(theads_path) - if len(theads_result): + if theads_result: name_col = theads_result.index("Name") perk_col = theads_result.index("Perk") dosh_col = theads_result.index("Dosh") @@ -225,7 +225,7 @@ def __get_players(info_tree): ] # If players in game, a lone message is left in the table - if len(trows_result) == 1: + if trows_result == 1: return players # Group rows in the table by the non-breaking space in first cell @@ -255,12 +255,9 @@ def __get_game(info_tree): zeds_path = "//dd[@class=\"gs_wave\"]/text()" zeds_result = info_tree.xpath(zeds_path) - if len(zeds_result): + if zeds_result: zeds_dead, zeds_total = map(int, zeds_result[0].split("/")) - if zeds_dead == zeds_total and zeds_total > 1: - trader_open = True - else: - trader_open = False + trader_open = bool(zeds_dead == zeds_total and zeds_total > 1) else: zeds_dead, zeds_total = None, None trader_open = False @@ -269,7 +266,7 @@ def __get_game(info_tree): "/following-sibling::dd[1]/text()" players_result = info_tree.xpath(players_path) - if len(players_result): + if players_result: players, players_max = map(int, players_result[0].split("/")) else: players_max = None @@ -278,7 +275,7 @@ def __get_game(info_tree): "/following-sibling::dd[1]/text()" wave_result = info_tree.xpath(wave_path) - if len(wave_result): + if wave_result: wave, length = map(int, wave_result[0].split("/")) else: wave, length = None, LEN_UNKNOWN @@ -288,7 +285,7 @@ def __get_game(info_tree): "/following-sibling::dd[1]/text()" difficulty_result = info_tree.xpath(difficulty_path) - if len(difficulty_result): + if difficulty_result: difficulty_name = difficulty_result[0] if difficulty_name == "Normal": difficulty = DIFF_NORM @@ -307,7 +304,7 @@ def __get_game(info_tree): "/following-sibling::dd[1]/@title" game_type_result = info_tree.xpath(game_type_path) - if len(game_type_result): + if game_type_result: game_type = game_type_result[0] else: game_type = GAME_TYPE_UNKNOWN @@ -319,7 +316,7 @@ def __get_game(info_tree): "/following-sibling::dd[1]/text()" map_name_result = info_tree.xpath(map_name_path) - if len(map_title_result) and len(map_name_result): + if map_title_result and map_name_result: map_title, map_name = map_title_result[0], map_name_result[0] else: map_title, map_name = None, None @@ -352,8 +349,8 @@ def get_player_identity(self, username): player_keys_path = "//table[@id=\"players\"]/tbody" \ "//input[@name=\"playerkey\"]//@value" player_keys_result = player_tree.xpath(player_keys_path) - for i in range(0, len(player_keys_result)): - trows_result[i][player_key_col] = player_keys_result[i] + for i, player_key in enumerate(player_keys_result): + trows_result[i][player_key_col] = player_key # Duplicate usernames cannot be identified reliably players_found = 0 From 122e2e8bda35594d4e02db92f614303fabe6d5a7 Mon Sep 17 00:00:00 2001 From: th3-z Date: Mon, 7 Oct 2019 15:06:50 +0100 Subject: [PATCH 02/33] Cleanup smells in web_interface.py --- magicked_admin/web_admin/web_interface.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/magicked_admin/web_admin/web_interface.py b/magicked_admin/web_admin/web_interface.py index 829e053a..43f0e2e7 100644 --- a/magicked_admin/web_admin/web_interface.py +++ b/magicked_admin/web_admin/web_interface.py @@ -140,11 +140,11 @@ def __new_session(self): login=True) if "hashAlg = \"sha1\"" in login_page_response.text: - hash = "$sha1$" + sha1( + hex_dig = "$sha1$" + sha1( self.__password.encode("iso-8859-1", "ignore") + self.__username.encode("iso-8859-1", "ignore") ).hexdigest() - login_payload['password_hash'] = hash + login_payload['password_hash'] = hex_dig else: login_payload['password'] = self.__password login_payload['password_hash'] = self.__password @@ -338,11 +338,11 @@ def get_payload_general_settings(self): 'settings_GameDifficulty': difficulty_val, 'action': 'save'} - for i in range(0, len(settings_names)): - settings[settings_names[i]] = settings_vals[i] + for i, setting_name in enumerate(settings_names): + settings[setting_name] = settings_vals[i] - for i in range(0, len(radio_settings_names)): - settings[radio_settings_names[i]] = radio_settings_vals[i] + for i, radio_setting_name in enumerate(radio_settings_names): + settings[radio_setting_name] = radio_settings_vals[i] return settings @@ -354,10 +354,10 @@ def get_payload_motd_settings(self): web_link = motd_tree.xpath('//input[@name="WebLink"]/@value')[0] clan_motto = motd_tree.xpath('//textarea[@name="ClanMotto"]/text()') - clan_motto = clan_motto[0] if len(clan_motto) else "" + clan_motto = clan_motto[0] if clan_motto else "" motd = motd_tree.xpath('//textarea[@name="ServerMOTD"]/text()') - motd = motd[0] if len(motd) else "" + motd = motd[0] if motd else "" return { 'BannerLink': banner_link, From 3b31e574942525ea8769bdf36898ba896b962613 Mon Sep 17 00:00:00 2001 From: th3-z Date: Mon, 7 Oct 2019 15:11:17 +0100 Subject: [PATCH 03/33] Fixup str formats in SQL queries --- magicked_admin/database/database.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/magicked_admin/database/database.py b/magicked_admin/database/database.py index 1b063e9d..177a109f 100644 --- a/magicked_admin/database/database.py +++ b/magicked_admin/database/database.py @@ -53,16 +53,16 @@ def __rank_by_col(self, steam_id, col): FROM players as player2 WHERE - player2.{} >= player1.{} + player2.? >= player1.? ), 0) AS col_rank FROM players AS player1 WHERE player1.steam_id = ? - """.format(col, col) + """ lock.acquire(True) - self.cur.execute(query, (steam_id,)) + self.cur.execute(query, (col, col, steam_id,)) result = self.cur.fetchall() lock.release() @@ -112,17 +112,17 @@ def rank_kd(self, steam_id): def __server_sum_col(self, col): query = """ SELECT - COALESCE(SUM({}), 0) as total + COALESCE(SUM(?), 0) as total FROM players - """.format(col) + """ lock.acquire(True) - self.cur.execute(query) + self.cur.execute(query, (col,)) result = self.cur.fetchall() lock.release() - if len(result): + if result: return result[0]["total"] else: return 0 @@ -140,15 +140,15 @@ def __server_top_by_col(self, col): query = """ SELECT username, - {} as score + ? AS score FROM players ORDER BY - {} DESC - """.format(col, col) + ? DESC + """ lock.acquire(True) - self.cur.execute(query) + self.cur.execute(query, (col, col,)) result = self.cur.fetchall() lock.release() From 70604fa2955f283487d752bc84bcc933aa392351 Mon Sep 17 00:00:00 2001 From: th3-z Date: Mon, 7 Oct 2019 15:14:52 +0100 Subject: [PATCH 04/33] Cleanup smells in database.py --- magicked_admin/database/database.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/magicked_admin/database/database.py b/magicked_admin/database/database.py index 177a109f..30b32eda 100644 --- a/magicked_admin/database/database.py +++ b/magicked_admin/database/database.py @@ -66,7 +66,7 @@ def __rank_by_col(self, steam_id, col): result = self.cur.fetchall() lock.release() - if len(result): + if result: return result[0]["col_rank"] else: return None @@ -104,7 +104,7 @@ def rank_kd(self, steam_id): result = self.cur.fetchall() lock.release() - if len(result): + if result: return result[0]["kd_rank"] else: return None @@ -152,10 +152,7 @@ def __server_top_by_col(self, col): result = self.cur.fetchall() lock.release() - if len(result): - return result - else: - return [] + return result or [] def top_kills(self): return self.__server_top_by_col("kills") @@ -261,7 +258,7 @@ def highest_wave(self, game_map): highest_wave_result = self.cur.fetchall() lock.release() - if not len(highest_wave_result): + if not highest_wave_result: return 0 return highest_wave_result[0]['game_wave'] From a1377b3b2b082234dfd2ec26e10b7e6e12f9f00c Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 10:04:02 +0100 Subject: [PATCH 05/33] Clean elifs --- .../chatbot/commands/event_commands.py | 16 +++++----- .../chatbot/commands/info_commands.py | 18 +++++------ .../chatbot/commands/player_commands.py | 20 ++++++------ .../chatbot/commands/server_commands.py | 32 +++++++++---------- 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/magicked_admin/chatbot/commands/event_commands.py b/magicked_admin/chatbot/commands/event_commands.py index 96d7912e..973c4000 100644 --- a/magicked_admin/chatbot/commands/event_commands.py +++ b/magicked_admin/chatbot/commands/event_commands.py @@ -24,7 +24,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not args.command: @@ -53,7 +53,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) return self.format_response( @@ -79,7 +79,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if args.wave: @@ -117,7 +117,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) return self.format_response( @@ -144,7 +144,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not args.time: @@ -187,7 +187,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) return self.format_response( @@ -214,7 +214,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not args.command: @@ -250,7 +250,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) return self.format_response( diff --git a/magicked_admin/chatbot/commands/info_commands.py b/magicked_admin/chatbot/commands/info_commands.py index c6096999..beaff8a5 100644 --- a/magicked_admin/chatbot/commands/info_commands.py +++ b/magicked_admin/chatbot/commands/info_commands.py @@ -42,7 +42,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not args.filename: @@ -83,7 +83,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) return self.format_response( @@ -106,7 +106,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) players = self.server.players @@ -131,7 +131,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) return self.format_response(str(self.server.game), args) @@ -148,7 +148,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) return self.format_response(str(self.server.game.game_map), args) @@ -167,7 +167,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) return self.format_response(str(self.server.game.time), args) @@ -184,7 +184,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) return self.format_response( @@ -205,7 +205,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) message = _("\nAvailable commands:\n" @@ -242,7 +242,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) self.server.write_all_players() diff --git a/magicked_admin/chatbot/commands/player_commands.py b/magicked_admin/chatbot/commands/player_commands.py index 07bdf368..0fd4c726 100644 --- a/magicked_admin/chatbot/commands/player_commands.py +++ b/magicked_admin/chatbot/commands/player_commands.py @@ -18,7 +18,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) self.server.write_all_players() @@ -40,7 +40,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) self.server.write_all_players() @@ -66,7 +66,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if args.username: @@ -104,7 +104,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if args.username: @@ -138,7 +138,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) self.server.write_all_players() @@ -167,7 +167,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) self.server.write_all_players() @@ -196,7 +196,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) self.server.write_all_players() @@ -225,7 +225,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) message = _("Scoreboard (name, kills, dosh):\n") @@ -258,7 +258,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not len(self.server.players): @@ -289,7 +289,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not len(self.server.players): diff --git a/magicked_admin/chatbot/commands/server_commands.py b/magicked_admin/chatbot/commands/server_commands.py index 901da5b5..997f8917 100644 --- a/magicked_admin/chatbot/commands/server_commands.py +++ b/magicked_admin/chatbot/commands/server_commands.py @@ -22,7 +22,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if args.username: @@ -55,7 +55,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) message = ' '.join(args.message) @@ -80,7 +80,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if args.username: @@ -116,7 +116,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if args.username: @@ -154,7 +154,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) message = ", ".join(self.server.get_maps(not args.all)) @@ -174,7 +174,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if args.map_name: @@ -216,7 +216,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) self.server.enforce_dosh() @@ -235,7 +235,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if args.username: @@ -271,7 +271,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not args.file: @@ -296,7 +296,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) self.server.restart_map() @@ -316,7 +316,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not args.map_name: @@ -343,7 +343,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not (args.state or args.set): @@ -386,7 +386,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if self.chatbot.silent: @@ -416,7 +416,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not args.length: @@ -457,7 +457,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not args.difficulty: @@ -500,7 +500,7 @@ def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) if err: return err - elif args.help: + if args.help: return self.format_response(self.help_text, args) if not args.game_mode: From 0b40d1880af328fb54cb3a977a67f2d2d32414c5 Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 10:16:35 +0100 Subject: [PATCH 06/33] Misc cleanups --- .../chatbot/commands/player_commands.py | 54 +++++++++---------- .../chatbot/commands/server_commands.py | 22 ++++---- magicked_admin/web_admin/web_admin.py | 20 +++---- magicked_admin/web_admin/web_interface.py | 1 - 4 files changed, 47 insertions(+), 50 deletions(-) diff --git a/magicked_admin/chatbot/commands/player_commands.py b/magicked_admin/chatbot/commands/player_commands.py index 0fd4c726..1f14cb09 100644 --- a/magicked_admin/chatbot/commands/player_commands.py +++ b/magicked_admin/chatbot/commands/player_commands.py @@ -73,22 +73,22 @@ def execute(self, username, args, user_flags): username = " ".join(args.username) player = self.server.get_player_by_username(username) - if player: - pos_kills = self.server.database.rank_kills(player.steam_id) - return self.format_response( - _("You've killed a total of {} ZEDs (#{}), and {} this game") - .format( - str(player.total_kills), - str(pos_kills), - str(player.kills) - ), - args - ) - else: + if not player: return self.format_response( _("Player {} not in game").format(username), args ) + pos_kills = self.server.database.rank_kills(player.steam_id) + return self.format_response( + _("You've killed a total of {} ZEDs (#{}), and {} this game") + .format( + str(player.total_kills), + str(pos_kills), + str(player.kills) + ), + args + ) + class CommandDosh(Command): def __init__(self, server): @@ -111,21 +111,21 @@ def execute(self, username, args, user_flags): username = " ".join(args.username) player = self.server.get_player_by_username(username) - if player: - pos_dosh = self.server.database.rank_dosh(player.steam_id) - return self.format_response( - _("You've earned a total of £{} dosh (#{}), and £{} this" - " game") - .format( - str(player.total_dosh), - str(pos_dosh), - str(player.game_dosh) - ), - args - ) - else: + if not player: return self.format_response(_("Player not in game"), args) + pos_dosh = self.server.database.rank_dosh(player.steam_id) + return self.format_response( + _("You've earned a total of £{} dosh (#{}), and £{} this" + " game") + .format( + str(player.total_dosh), + str(pos_dosh), + str(player.game_dosh) + ), + args + ) + class CommandTopKills(Command): def __init__(self, server): @@ -261,7 +261,7 @@ def execute(self, username, args, user_flags): if args.help: return self.format_response(self.help_text, args) - if not len(self.server.players): + if not self.server.players: return self.format_response(_("No players in game"), args) self.server.players.sort( @@ -292,7 +292,7 @@ def execute(self, username, args, user_flags): if args.help: return self.format_response(self.help_text, args) - if not len(self.server.players): + if not self.server.players: return None self.server.players.sort( diff --git a/magicked_admin/chatbot/commands/server_commands.py b/magicked_admin/chatbot/commands/server_commands.py index 997f8917..8a58606c 100644 --- a/magicked_admin/chatbot/commands/server_commands.py +++ b/magicked_admin/chatbot/commands/server_commands.py @@ -33,14 +33,13 @@ def execute(self, username, args, user_flags): ) banned = self.server.ban_player(username) - - if banned: - return self.format_response( - _("Player, {}, was banned").format(banned), args - ) - else: + if not banned: return self.format_response(_("Player not found"), args) + return self.format_response( + _("Player, {}, was banned").format(banned), args + ) + class CommandSay(Command): def __init__(self, server): @@ -246,14 +245,13 @@ def execute(self, username, args, user_flags): ) kicked = self.server.kick_player(username) - - if kicked: - return self.format_response( - _("Player, {}, was kicked").format(kicked), args - ) - else: + if not kicked: return self.format_response(_("Player not found"), args) + return self.format_response( + _("Player, {}, was kicked").format(kicked), args + ) + class CommandRun(Command): def __init__(self, server, chatbot): diff --git a/magicked_admin/web_admin/web_admin.py b/magicked_admin/web_admin/web_admin.py index 1c12f4a6..977857ca 100644 --- a/magicked_admin/web_admin/web_admin.py +++ b/magicked_admin/web_admin/web_admin.py @@ -364,16 +364,7 @@ def get_player_identity(self, username): player_key = player_row[player_key_col] country, country_code = get_country(ip) - if players_found == 1: - return { - 'ip': ip, - 'country': country, - 'country_code': country_code, - 'steam_id': sid, - 'network_id': nid, - 'player_key': player_key - } - else: + if players_found != 1: warning(_("Couldn't find identify player: {}").format(username)) return { 'ip': None, @@ -383,3 +374,12 @@ def get_player_identity(self, username): 'network_id': None, 'player_key': None } + + return { + 'ip': ip, + 'country': country, + 'country_code': country_code, + 'steam_id': sid, + 'network_id': nid, + 'player_key': player_key + } diff --git a/magicked_admin/web_admin/web_interface.py b/magicked_admin/web_admin/web_interface.py index 43f0e2e7..4eab44c8 100644 --- a/magicked_admin/web_admin/web_interface.py +++ b/magicked_admin/web_admin/web_interface.py @@ -167,7 +167,6 @@ def __new_session(self): self.ma_installed = True info(_("Detected KF2-MA install on server.")) else: - pass warning(_("KF2-MA install not detected on server side! " "Consequently, only Survival mode will function fully.")) From 6585c658d39ead5d90bba3f1674205d3dacdd682 Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 10:20:47 +0100 Subject: [PATCH 07/33] Fix lints --- magicked_admin/chatbot/commands/player_commands.py | 2 +- magicked_admin/utils/net.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/magicked_admin/chatbot/commands/player_commands.py b/magicked_admin/chatbot/commands/player_commands.py index 1f14cb09..f14313ea 100644 --- a/magicked_admin/chatbot/commands/player_commands.py +++ b/magicked_admin/chatbot/commands/player_commands.py @@ -124,7 +124,7 @@ def execute(self, username, args, user_flags): str(player.game_dosh) ), args - ) + ) class CommandTopKills(Command): diff --git a/magicked_admin/utils/net.py b/magicked_admin/utils/net.py index 688ee1b6..037c18f6 100644 --- a/magicked_admin/utils/net.py +++ b/magicked_admin/utils/net.py @@ -39,8 +39,8 @@ def resolve_address(address): if not __is_valid_address(address): return None - else: - return __follow_redirect(address) + + return __follow_redirect(address) # Ping home url @@ -60,9 +60,9 @@ def get_country(ip): geo_data = requests.get(url).json() - if 'country' in geo_data: - country = geo_data['country'] - country_code = geo_data['countryCode'] - return country, country_code - else: + if 'country' not in geo_data: return unknown + + country = geo_data['country'] + country_code = geo_data['countryCode'] + return country, country_code From dcba0bec04585a6262dad88db43c33ca7c0f0c5d Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 10:44:35 +0100 Subject: [PATCH 08/33] Remove dosh threshold config option --- README.md | 9 ++----- docs/steam_guide.txt | 12 ++------- .../chatbot/commands/server_commands.py | 25 +++++++++++++++---- magicked_admin/magicked_admin.py | 5 ---- magicked_admin/server/server.py | 9 ------- magicked_admin/settings.py | 7 ++---- magicked_admin/utils/net.py | 2 +- 7 files changed, 27 insertions(+), 42 deletions(-) mode change 100644 => 100755 README.md mode change 100644 => 100755 docs/steam_guide.txt mode change 100644 => 100755 magicked_admin/chatbot/commands/server_commands.py mode change 100644 => 100755 magicked_admin/magicked_admin.py mode change 100644 => 100755 magicked_admin/server/server.py mode change 100644 => 100755 magicked_admin/settings.py mode change 100644 => 100755 magicked_admin/utils/net.py diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 9b646e14..afa47e3b --- a/README.md +++ b/README.md @@ -169,9 +169,8 @@ the `!op` command. * `!marquee ` - Runs a marquee in the chat from the `conf/marquee` folder, _experimental_ - Example: `!marquee example` -* `!enforce_dosh` - Kicks all players that have more dosh than the - `dosh_threshold` configuration option - - Example: `!start_tc 600 enforce_dosh` +* `!enforce_dosh ` - Kicks all players that have more dosh than the specified `amount` + - Example: `!start_tc 600 enforce_dosh 60000` ### MOTD leaderboard @@ -243,10 +242,6 @@ Options can be configured in the config file `conf/magicked_admin.conf`. * `scoreboard_type` - Possible values: `kills`, or `dosh`. Change the type of scores that are displayed in the MOTD scoreboard. -* `dosh_threshold` - - Integer value, configures the `!enforce_dosh` command. The dosh threshold - is the amount of dosh a player can carry before they are kicked by the next - call to `!enforce_dosh`. Running with Docker --------------------------- diff --git a/docs/steam_guide.txt b/docs/steam_guide.txt old mode 100644 new mode 100755 index 13858bba..e4f13450 --- a/docs/steam_guide.txt +++ b/docs/steam_guide.txt @@ -204,8 +204,8 @@ Commands that can be ran by server administrators, and users authorized with the [*] '[b]!marquee [/b]' - Runs a marquee in the chat from the '[b]conf/marquee[/b]' folder, [i]experimental[/i] - Example: '[b]!marquee example[/b]' -[*] '[b]!enforce_dosh[/b]' - Kicks all players that have more dosh than the 'dosh_threshold' configuration option - - Example: '[b]!start_tc 600 enforce_dosh[/b]' +[*] '[b]!enforce_dosh [/b]' - Kicks all players that have more dosh than the specified amount. + - Example: '[b]!start_tc 600 enforce_dosh 60000[/b]' [/list] ## Welcome screen leaderboards @@ -308,8 +308,6 @@ The following options can be configured in the config file '[b]conf/magicked_adm [*] '[b]scoreboard_type[/b]' - Possible values: '[b]kills[/b]', or '[b]dosh[/b]'. Change the type of scores that are displayed in the motd leaderboard. - Example: '[b]scoreboard_type=dosh[/b]' -[*] '[b]dosh_threshold[/b]' - Integer value, configures the '[b]!enforce_dosh[/b]' command. The dosh threshold is the amount of dosh a player can carry before they are kicked by the next call to '[b]!enforce_dosh[/b]'. This can be useful on endless servers where it is possible to crash the server by dropping a huge amount of dosh. - - Example: '[b]dosh_threshold=40000[/b]' [/list] ## Renaming the chatbot (multi-admin) @@ -375,9 +373,6 @@ Below is an example. game_password = 123 motd_scoreboard = False scoreboard_type = Kills -max_players = 6 -enable_greeter = True -dosh_threshold = 40000 address = http://127.0.0.1:8080 username = Admin password = root @@ -386,9 +381,6 @@ password = root game_password = Hunter69 motd_scoreboard = True scoreboard_type = Dosh -max_players = 6 -enable_greeter = True -dosh_threshold = 40000 address = http://127.0.0.1:8081 username = Admin password = 123 diff --git a/magicked_admin/chatbot/commands/server_commands.py b/magicked_admin/chatbot/commands/server_commands.py old mode 100644 new mode 100755 index 8a58606c..31172550 --- a/magicked_admin/chatbot/commands/server_commands.py +++ b/magicked_admin/chatbot/commands/server_commands.py @@ -205,11 +205,11 @@ class CommandEnforceDosh(Command): def __init__(self, server): Command.__init__(self, server, admin_only=True, requires_patch=False) - self.help_text = _("Usage: !enforce_dosh\n" + self.help_text = _("Usage: !enforce_dosh AMOUNT\n" + "\tAMOUNT - Kicks players over this amount\n" "Desc: Kicks players with more dosh than the " - "threshold configured in " - "'conf/magicked_admin.conf'") - # TODO amount optional argument + "amount specified") + self.parser.add_argument("amount", nargs="?") def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) @@ -218,7 +218,22 @@ def execute(self, username, args, user_flags): if args.help: return self.format_response(self.help_text, args) - self.server.enforce_dosh() + if not args.amount: + return self.format_response( + _("Please specify a maximum amount of dosh"), args + ) + + try: + amount = int(args.amount) + except ValueError: + return self.format_response( + _("'{}' is not a valid number").format(args.amount), + args + ) + + for player in self.server.players: + if player.dosh > amount: + self.server.web_admin.kick_player(player.player_key) class CommandKick(Command): diff --git a/magicked_admin/magicked_admin.py b/magicked_admin/magicked_admin.py old mode 100644 new mode 100755 index 54e8e4b0..ec8e92d4 --- a/magicked_admin/magicked_admin.py +++ b/magicked_admin/magicked_admin.py @@ -72,11 +72,6 @@ def run(self): server.url_extras = \ settings.setting(server_name, "url_extras") - dosh_threshold = int( - settings.setting(server_name, "dosh_threshold")) - if dosh_threshold > 0: - server.dosh_threshold = dosh_threshold - has_motd_scoreboard = str_to_bool( settings.setting(server_name, "motd_scoreboard") ) diff --git a/magicked_admin/server/server.py b/magicked_admin/server/server.py old mode 100644 new mode 100755 index 6dc014ef..8b99d8f1 --- a/magicked_admin/server/server.py +++ b/magicked_admin/server/server.py @@ -24,7 +24,6 @@ def __init__(self, name, address, username, password): self.database = ServerDatabase(name) self.game_password = None - self.dosh_threshold = None self.game = Game(GameMap(), GAME_TYPE_UNKNOWN) self.trader_time = False @@ -161,14 +160,6 @@ def ban_player(self, username): self.web_admin.ban_player(player.steam_id, player.player_key) return player.username - def enforce_dosh(self): - if not self.dosh_threshold: - return - - for player in self.players: - if player.dosh > self.dosh_threshold: - self.web_admin.kick_player(player.player_key) - def restart_map(self): self.change_map(self.game.game_map.title) diff --git a/magicked_admin/settings.py b/magicked_admin/settings.py old mode 100644 new mode 100755 index 54c709a1..73898c50 --- a/magicked_admin/settings.py +++ b/magicked_admin/settings.py @@ -18,14 +18,11 @@ # password = 123 'game_password': '123', 'motd_scoreboard': 'False', - 'scoreboard_type': 'Kills', - 'max_players': "6", - 'dosh_threshold': "0", + 'scoreboard_type': 'Kills' } SETTINGS_REQUIRED = ['address', 'password', 'motd_scoreboard', - 'scoreboard_type', 'dosh_threshold', - 'max_players'] + 'scoreboard_type'] CONFIG_DIE_MESG = _("Please correct this manually or delete '{}' to create " "a clean config next run.").format(CONFIG_PATH) diff --git a/magicked_admin/utils/net.py b/magicked_admin/utils/net.py old mode 100644 new mode 100755 index 037c18f6..f157324e --- a/magicked_admin/utils/net.py +++ b/magicked_admin/utils/net.py @@ -39,7 +39,7 @@ def resolve_address(address): if not __is_valid_address(address): return None - + return __follow_redirect(address) From eccaae7ab110e8aec29730bdf44a967f5035d1a7 Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 10:52:36 +0100 Subject: [PATCH 09/33] Improve exit handling --- magicked_admin/chatbot/chatbot.py | 3 +++ magicked_admin/chatbot/command_scheduler.py | 3 +++ magicked_admin/magicked_admin.py | 5 ++++- magicked_admin/server/game_tracker.py | 2 +- magicked_admin/server/motd_updater.py | 7 ++++++- magicked_admin/server/server.py | 2 +- 6 files changed, 18 insertions(+), 4 deletions(-) mode change 100644 => 100755 magicked_admin/chatbot/chatbot.py mode change 100644 => 100755 magicked_admin/chatbot/command_scheduler.py mode change 100644 => 100755 magicked_admin/server/game_tracker.py mode change 100644 => 100755 magicked_admin/server/motd_updater.py diff --git a/magicked_admin/chatbot/chatbot.py b/magicked_admin/chatbot/chatbot.py old mode 100644 new mode 100755 index 4438cfe3..476e8ab4 --- a/magicked_admin/chatbot/chatbot.py +++ b/magicked_admin/chatbot/chatbot.py @@ -38,6 +38,9 @@ def __init__(self, server, name=None): with open(init_path, 'w+') as script_file: script_file.write(INIT_TEMPLATE) + def stop(self): + self.scheduler.stop() + def receive_message(self, username, message, user_flags): if message[0] == '!': # Drop the '!' because its no longer relevant diff --git a/magicked_admin/chatbot/command_scheduler.py b/magicked_admin/chatbot/command_scheduler.py old mode 100644 new mode 100755 index 4a36820c..bc8cb433 --- a/magicked_admin/chatbot/command_scheduler.py +++ b/magicked_admin/chatbot/command_scheduler.py @@ -40,6 +40,9 @@ def __init__(self, server, chatbot): self.poller = CommandSchedulerPollThread(self, self.poll_interval) self.poller.start() + def stop(self): + self.poller.stop() + def schedule_command(self, command): self.scheduled_commands.append(command) diff --git a/magicked_admin/magicked_admin.py b/magicked_admin/magicked_admin.py index ec8e92d4..55ec10b3 100755 --- a/magicked_admin/magicked_admin.py +++ b/magicked_admin/magicked_admin.py @@ -56,6 +56,7 @@ def __init__(self): phone_home() signal.signal(signal.SIGINT, self.terminate) self.servers = [] + self.bots = [] self.sigint_count = 0 def run(self): @@ -83,7 +84,9 @@ def run(self): self.servers.append(server) - Chatbot(server, settings.setting(server_name, "username")) + self.bots.append( + Chatbot(server, settings.setting(server_name, "username")) + ) info(_("Initialisation complete!\n")) diff --git a/magicked_admin/server/game_tracker.py b/magicked_admin/server/game_tracker.py old mode 100644 new mode 100755 index 10d2b044..b8af35a7 --- a/magicked_admin/server/game_tracker.py +++ b/magicked_admin/server/game_tracker.py @@ -33,7 +33,7 @@ def run(self): self.__poll() time.sleep(self.__refresh_rate) - def stop(self): + def close(self): self.__exit = True def __poll(self): diff --git a/magicked_admin/server/motd_updater.py b/magicked_admin/server/motd_updater.py old mode 100644 new mode 100755 index 8840a23c..3495704e --- a/magicked_admin/server/motd_updater.py +++ b/magicked_admin/server/motd_updater.py @@ -14,6 +14,7 @@ class MotdUpdater(threading.Thread): def __init__(self, server, scoreboard_type): self.server = server self.motd_path = find_data_file("conf/" + server.name + ".motd") + self.__exit = False self.scoreboard_type = scoreboard_type self.time_interval = 5 * 60 @@ -32,11 +33,15 @@ def __init__(self, server, scoreboard_type): threading.Thread.__init__(self) + def stop(self): + self.__exit = True + def run(self): if not self.motd: return - while True: + # TODO: Can take up to time_interval seconds to close + while not self.__exit: self.server.write_all_players() motd = self.render_motd(self.motd) diff --git a/magicked_admin/server/server.py b/magicked_admin/server/server.py index 8b99d8f1..d88eef4f 100755 --- a/magicked_admin/server/server.py +++ b/magicked_admin/server/server.py @@ -39,7 +39,7 @@ def supported_mode(self): return self.web_admin.supported_mode(self.game.game_type) def close(self): - self.tracker.stop() + self.tracker.close() self.write_game_map() self.write_all_players() self.web_admin.close() From 58171651eac271ea86f2312bacb6be93c32d6c7d Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 11:06:07 +0100 Subject: [PATCH 10/33] Cleanup server.py --- magicked_admin/server/server.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/magicked_admin/server/server.py b/magicked_admin/server/server.py index d88eef4f..f7660f3b 100755 --- a/magicked_admin/server/server.py +++ b/magicked_admin/server/server.py @@ -54,11 +54,11 @@ def get_player_by_username(self, username): matched_players += 1 matched_player = player - if matched_players == 1: - return matched_player - else: + if matched_players != 1: return None + return matched_player + def get_player_by_key(self, player_key): for player in self.players: if player.player_key == player_key: @@ -74,10 +74,10 @@ def get_player_by_sid(self, sid): matched_players += 1 matched_player = player - if matched_players == 1: - return matched_player - else: + if matched_players != 1: return None + + return matched_player def set_game_password(self, password): self.game_password = password @@ -127,18 +127,18 @@ def find_map(self, search_title): matches += 1 matched_title = map_title - if matched_title and matches == 1: - return matched_title - else: - return None + if matches != 1: + return None + + return matched_title def change_map(self, new_map): matched_title = self.find_map(new_map) - if matched_title: - self.web_admin.set_map(matched_title) - else: + if not matched_title: return None + + self.web_admin.set_map(matched_title) def kick_player(self, username): player = self.get_player_by_username(username) From b6aa8429a3bd67774c6dd9a34706f864aab3abba Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 11:11:45 +0100 Subject: [PATCH 11/33] Fix lints --- magicked_admin/server/server.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/magicked_admin/server/server.py b/magicked_admin/server/server.py index f7660f3b..9f722672 100755 --- a/magicked_admin/server/server.py +++ b/magicked_admin/server/server.py @@ -76,7 +76,7 @@ def get_player_by_sid(self, sid): if matched_players != 1: return None - + return matched_player def set_game_password(self, password): @@ -128,7 +128,7 @@ def find_map(self, search_title): matched_title = map_title if matches != 1: - return None + return None return matched_title @@ -137,7 +137,7 @@ def change_map(self, new_map): if not matched_title: return None - + self.web_admin.set_map(matched_title) def kick_player(self, username): From 8bd27e1c629c3d75fa6658d30ea01ab161ec1872 Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 14:26:43 +0100 Subject: [PATCH 12/33] Simplify motd updater --- .../chatbot/commands/server_commands.py | 33 +++++++++ magicked_admin/server/motd_updater.py | 73 ++++++++----------- 2 files changed, 62 insertions(+), 44 deletions(-) diff --git a/magicked_admin/chatbot/commands/server_commands.py b/magicked_admin/chatbot/commands/server_commands.py index 31172550..d768f2da 100755 --- a/magicked_admin/chatbot/commands/server_commands.py +++ b/magicked_admin/chatbot/commands/server_commands.py @@ -268,6 +268,39 @@ def execute(self, username, args, user_flags): ) +class CommandUpdateMotd(Command): + def __init__(self, server, motd_updater): + Command.__init__(self, server, admin_only=True, requires_patch=False) + + self.motd_updater = motd_updater + + self.parser.add_argument("score_type", nargs="?") + self.help_text = _("Usage: !update_motd TYPE\n" + "\tTYPE - Score type, one of: kills, dosh, time\n" + "Desc: Updates the MOTD scoreboard.") + + def execute(self, username, args, user_flags): + args, err = self.parse_args(username, args, user_flags) + if err: + return err + if args.help: + return self.format_response(self.help_text, args) + + if not args.score_type: + return self.format_response(_("Missing argument: type"), args) + + if args.score_type.lower() not in ['kill', 'kills', 'dosh', 'time']: + return self.format_response( + _("Unrecognised score type: {}").format(args.score_type), args + ) + + self.motd_updater.update() + + return self.format_response( + _("Updated the MOTD"), args + ) + + class CommandRun(Command): def __init__(self, server, chatbot): Command.__init__(self, server, admin_only=True, requires_patch=False) diff --git a/magicked_admin/server/motd_updater.py b/magicked_admin/server/motd_updater.py index 3495704e..c65dcc39 100755 --- a/magicked_admin/server/motd_updater.py +++ b/magicked_admin/server/motd_updater.py @@ -1,6 +1,4 @@ import gettext -import threading -import time from os import path from utils import debug, find_data_file, warning @@ -9,16 +7,16 @@ _ = gettext.gettext -class MotdUpdater(threading.Thread): +class MotdUpdater: - def __init__(self, server, scoreboard_type): + def __init__(self, server): self.server = server self.motd_path = find_data_file("conf/" + server.name + ".motd") - self.__exit = False - self.scoreboard_type = scoreboard_type - self.time_interval = 5 * 60 + self.motd = "" + self.reload() + def reload(self): if not path.exists(find_data_file(self.motd_path)): warning( _("No MOTD file for {} found, pulling from web admin!").format( @@ -29,47 +27,34 @@ def __init__(self, server, scoreboard_type): with open(self.motd_path, "w+") as motd_file: motd_file.write(self.server.web_admin.get_motd()) - self.motd = self.load_motd() - - threading.Thread.__init__(self) - - def stop(self): - self.__exit = True + motd_f = open(find_data_file(self.motd_path)) + motd = motd_f.read() + motd_f.close() + self.motd = motd - def run(self): + def update(self, score_type): if not self.motd: return - # TODO: Can take up to time_interval seconds to close - while not self.__exit: - self.server.write_all_players() - - motd = self.render_motd(self.motd) - self.server.web_admin.set_motd(motd) - - debug(_("Updated the MOTD!")) + self.server.write_all_players() + self.server.web_admin.set_motd(self.render_motd(score_type)) + debug(_("Updated the MOTD!")) - time.sleep(self.time_interval) + def render_motd(self, score_type): + motd = self.motd - def load_motd(self): - motd_f = open(find_data_file(self.motd_path)) - motd = motd_f.read() - motd_f.close() - return motd - - def render_motd(self, src_motd): - if self.scoreboard_type in ['kills', 'Kills', 'kill', 'Kill']: + if score_type in ['kills', 'Kills', 'kill', 'Kill']: scores = self.server.database.top_kills() - elif self.scoreboard_type in ['Dosh', 'dosh']: + elif score_type in ['Dosh', 'dosh']: scores = self.server.database.top_dosh() + elif score_type in ['Time', 'time']: + scores = self.server.database.top_time() else: warning( - _("Scoreboard_type not recognised '{}' for {}. Options are: " - "dosh, kills").format( - self.scoreboard_type, self.server.name - ) + _("Scoreboard_type not recognised '{}'. Options are: " + "dosh, kills").format(score_type) ) - return src_motd + return motd for player in scores: if not player['username']: @@ -78,15 +63,15 @@ def render_motd(self, src_motd): name = trim_string(name, 12) score = player['score'] - src_motd = src_motd.replace("%PLR", name, 1) - src_motd = src_motd.replace("%SCR", millify(score), 1) + motd = motd.replace("%PLR", name, 1) + motd = motd.replace("%SCR", millify(score), 1) - if "%SRV_K" in src_motd: + if "%SRV_K" in motd: server_kills = self.server.database.server_kills() - src_motd = src_motd.replace("%SRV_K", millify(server_kills), 1) + motd = motd.replace("%SRV_K", millify(server_kills), 1) - if "%SRV_D" in src_motd: + if "%SRV_D" in motd: server_dosh = self.server.database.server_dosh() - src_motd = src_motd.replace("%SRV_D", millify(server_dosh), 1) + motd = motd.replace("%SRV_D", millify(server_dosh), 1) - return src_motd + return motd From 6c9bcc995efce56efd2a986db467d77b1b4874a3 Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 14:27:25 +0100 Subject: [PATCH 13/33] Move init files to scripts --- magicked_admin/chatbot/chatbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magicked_admin/chatbot/chatbot.py b/magicked_admin/chatbot/chatbot.py index 476e8ab4..e7d1d1b5 100755 --- a/magicked_admin/chatbot/chatbot.py +++ b/magicked_admin/chatbot/chatbot.py @@ -30,7 +30,7 @@ def __init__(self, server, name=None): self.silent = False self.greeter_enabled = True - init_path = find_data_file("conf/" + server.name + ".init") + init_path = find_data_file("conf/scripts/" + server.name + ".init") if path.exists(init_path): self.execute_script(init_path) From 922df499df4de1eb5f22350110c317995a85d8a6 Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 14:32:45 +0100 Subject: [PATCH 14/33] Add motd control commands --- .../chatbot/commands/server_commands.py | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/magicked_admin/chatbot/commands/server_commands.py b/magicked_admin/chatbot/commands/server_commands.py index d768f2da..3e807042 100755 --- a/magicked_admin/chatbot/commands/server_commands.py +++ b/magicked_admin/chatbot/commands/server_commands.py @@ -274,10 +274,10 @@ def __init__(self, server, motd_updater): self.motd_updater = motd_updater - self.parser.add_argument("score_type", nargs="?") + self.parser.add_argument("score_type", nargs="?", type=str) self.help_text = _("Usage: !update_motd TYPE\n" "\tTYPE - Score type, one of: kills, dosh, time\n" - "Desc: Updates the MOTD scoreboard.") + "Desc: Updates the MOTD scoreboard") def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) @@ -301,6 +301,29 @@ def execute(self, username, args, user_flags): ) +class CommandReloadMotd(Command): + def __init__(self, server, motd_updater): + Command.__init__(self, server, admin_only=True, requires_patch=False) + + self.motd_updater = motd_updater + + self.help_text = _("Usage: !reload_motd\n" + "Desc: Reload the server's *.motd file") + + def execute(self, username, args, user_flags): + args, err = self.parse_args(username, args, user_flags) + if err: + return err + if args.help: + return self.format_response(self.help_text, args) + + self.motd_updater.reload() + + return self.format_response( + _("Reloaded the MOTD"), args + ) + + class CommandRun(Command): def __init__(self, server, chatbot): Command.__init__(self, server, admin_only=True, requires_patch=False) From 5f85cfe3f276356ac2dda60ad82acc3ae53e536d Mon Sep 17 00:00:00 2001 From: th3-z Date: Tue, 8 Oct 2019 14:42:06 +0100 Subject: [PATCH 15/33] Transform motd_updater into a command --- magicked_admin/chatbot/chatbot.py | 4 +- magicked_admin/chatbot/command_map.py | 5 +- magicked_admin/magicked_admin.py | 11 ---- magicked_admin/server/motd_updater.py | 77 --------------------------- 4 files changed, 6 insertions(+), 91 deletions(-) mode change 100644 => 100755 magicked_admin/chatbot/command_map.py delete mode 100755 magicked_admin/server/motd_updater.py diff --git a/magicked_admin/chatbot/chatbot.py b/magicked_admin/chatbot/chatbot.py index e7d1d1b5..95869d39 100755 --- a/magicked_admin/chatbot/chatbot.py +++ b/magicked_admin/chatbot/chatbot.py @@ -2,6 +2,7 @@ from os import path from chatbot import INIT_TEMPLATE +from chatbot.motd_updater import MotdUpdater from chatbot.command_map import CommandMap from chatbot.command_scheduler import CommandScheduler from utils import debug, find_data_file, warning @@ -26,9 +27,8 @@ def __init__(self, server, name=None): self.scheduler = CommandScheduler(server, self) self.chat.add_listener(self.scheduler) - self.commands = CommandMap(server, self) + self.commands = CommandMap(server, self, MotdUpdater(server)) self.silent = False - self.greeter_enabled = True init_path = find_data_file("conf/scripts/" + server.name + ".init") diff --git a/magicked_admin/chatbot/command_map.py b/magicked_admin/chatbot/command_map.py old mode 100644 new mode 100755 index e2b04f28..89cf2d65 --- a/magicked_admin/chatbot/command_map.py +++ b/magicked_admin/chatbot/command_map.py @@ -16,9 +16,10 @@ class CommandMap: - def __init__(self, server, chatbot): + def __init__(self, server, chatbot, motd_updater): self.server = server self.chatbot = chatbot + self.motd_updater = motd_updater self.command_map = self.generate_map() def generate_map(self): @@ -50,6 +51,8 @@ def generate_map(self): _('op'): CommandOp(self.server), _('deop'): CommandDeop(self.server), _('marquee'): CommandMarquee(self.server, self.chatbot), + _('update_motd'): CommandMarquee(self.server, self.motd_updater), + _('reload_motd'): CommandMarquee(self.server, self.motd_updater), # Player commands _('commands'): CommandCommands(self.server), diff --git a/magicked_admin/magicked_admin.py b/magicked_admin/magicked_admin.py index 55ec10b3..c62c9b0d 100755 --- a/magicked_admin/magicked_admin.py +++ b/magicked_admin/magicked_admin.py @@ -13,12 +13,10 @@ from colorama import init from chatbot.chatbot import Chatbot -from server.motd_updater import MotdUpdater from server.server import Server from settings import Settings from utils import banner, die, find_data_file, info, warning from utils.net import phone_home -from utils.text import str_to_bool _ = gettext.gettext @@ -73,15 +71,6 @@ def run(self): server.url_extras = \ settings.setting(server_name, "url_extras") - has_motd_scoreboard = str_to_bool( - settings.setting(server_name, "motd_scoreboard") - ) - - if has_motd_scoreboard: - scoreboard_type = settings.setting(server_name, - "scoreboard_type") - MotdUpdater(server, scoreboard_type).start() - self.servers.append(server) self.bots.append( diff --git a/magicked_admin/server/motd_updater.py b/magicked_admin/server/motd_updater.py deleted file mode 100755 index c65dcc39..00000000 --- a/magicked_admin/server/motd_updater.py +++ /dev/null @@ -1,77 +0,0 @@ -import gettext -from os import path - -from utils import debug, find_data_file, warning -from utils.text import millify, trim_string - -_ = gettext.gettext - - -class MotdUpdater: - - def __init__(self, server): - self.server = server - self.motd_path = find_data_file("conf/" + server.name + ".motd") - - self.motd = "" - self.reload() - - def reload(self): - if not path.exists(find_data_file(self.motd_path)): - warning( - _("No MOTD file for {} found, pulling from web admin!").format( - self.server.name - ) - ) - - with open(self.motd_path, "w+") as motd_file: - motd_file.write(self.server.web_admin.get_motd()) - - motd_f = open(find_data_file(self.motd_path)) - motd = motd_f.read() - motd_f.close() - self.motd = motd - - def update(self, score_type): - if not self.motd: - return - - self.server.write_all_players() - self.server.web_admin.set_motd(self.render_motd(score_type)) - debug(_("Updated the MOTD!")) - - def render_motd(self, score_type): - motd = self.motd - - if score_type in ['kills', 'Kills', 'kill', 'Kill']: - scores = self.server.database.top_kills() - elif score_type in ['Dosh', 'dosh']: - scores = self.server.database.top_dosh() - elif score_type in ['Time', 'time']: - scores = self.server.database.top_time() - else: - warning( - _("Scoreboard_type not recognised '{}'. Options are: " - "dosh, kills").format(score_type) - ) - return motd - - for player in scores: - if not player['username']: - continue - name = player['username'].replace("<", "<") - name = trim_string(name, 12) - score = player['score'] - - motd = motd.replace("%PLR", name, 1) - motd = motd.replace("%SCR", millify(score), 1) - - if "%SRV_K" in motd: - server_kills = self.server.database.server_kills() - motd = motd.replace("%SRV_K", millify(server_kills), 1) - - if "%SRV_D" in motd: - server_dosh = self.server.database.server_dosh() - motd = motd.replace("%SRV_D", millify(server_dosh), 1) - - return motd From 9d5ccb201b678a71a78d55ddbbc45582e0840c51 Mon Sep 17 00:00:00 2001 From: the_z Date: Tue, 8 Oct 2019 20:16:48 +0100 Subject: [PATCH 16/33] Refactor MA init --- magicked_admin/chatbot/motd_updater.py | 77 ++++++++++++++++++++++++++ magicked_admin/magicked_admin.py | 48 +++++++++++----- magicked_admin/settings.py | 5 +- 3 files changed, 113 insertions(+), 17 deletions(-) create mode 100755 magicked_admin/chatbot/motd_updater.py diff --git a/magicked_admin/chatbot/motd_updater.py b/magicked_admin/chatbot/motd_updater.py new file mode 100755 index 00000000..c65dcc39 --- /dev/null +++ b/magicked_admin/chatbot/motd_updater.py @@ -0,0 +1,77 @@ +import gettext +from os import path + +from utils import debug, find_data_file, warning +from utils.text import millify, trim_string + +_ = gettext.gettext + + +class MotdUpdater: + + def __init__(self, server): + self.server = server + self.motd_path = find_data_file("conf/" + server.name + ".motd") + + self.motd = "" + self.reload() + + def reload(self): + if not path.exists(find_data_file(self.motd_path)): + warning( + _("No MOTD file for {} found, pulling from web admin!").format( + self.server.name + ) + ) + + with open(self.motd_path, "w+") as motd_file: + motd_file.write(self.server.web_admin.get_motd()) + + motd_f = open(find_data_file(self.motd_path)) + motd = motd_f.read() + motd_f.close() + self.motd = motd + + def update(self, score_type): + if not self.motd: + return + + self.server.write_all_players() + self.server.web_admin.set_motd(self.render_motd(score_type)) + debug(_("Updated the MOTD!")) + + def render_motd(self, score_type): + motd = self.motd + + if score_type in ['kills', 'Kills', 'kill', 'Kill']: + scores = self.server.database.top_kills() + elif score_type in ['Dosh', 'dosh']: + scores = self.server.database.top_dosh() + elif score_type in ['Time', 'time']: + scores = self.server.database.top_time() + else: + warning( + _("Scoreboard_type not recognised '{}'. Options are: " + "dosh, kills").format(score_type) + ) + return motd + + for player in scores: + if not player['username']: + continue + name = player['username'].replace("<", "<") + name = trim_string(name, 12) + score = player['score'] + + motd = motd.replace("%PLR", name, 1) + motd = motd.replace("%SCR", millify(score), 1) + + if "%SRV_K" in motd: + server_kills = self.server.database.server_kills() + motd = motd.replace("%SRV_K", millify(server_kills), 1) + + if "%SRV_D" in motd: + server_dosh = self.server.database.server_dosh() + motd = motd.replace("%SRV_D", millify(server_dosh), 1) + + return motd diff --git a/magicked_admin/magicked_admin.py b/magicked_admin/magicked_admin.py index c62c9b0d..1cff8a91 100755 --- a/magicked_admin/magicked_admin.py +++ b/magicked_admin/magicked_admin.py @@ -12,7 +12,7 @@ from colorama import init -from chatbot.chatbot import Chatbot +from chatbot.chatbot import Chatbot, CommandScheduler, CommandMap, MotdUpdater from server.server import Server from settings import Settings from utils import banner, die, find_data_file, info, warning @@ -57,21 +57,43 @@ def __init__(self): self.bots = [] self.sigint_count = 0 - def run(self): - for server_name in settings.sections(): + def makeServer(self, name, settings): + address = settings.setting(name, "address") + username = settings.setting(name, "username") + password = settings.setting(name, "password") + game_password = settings.setting(name, "game_password") + url_extras = settings.setting(name, "url_extras") + + server = Server(name, address, username, password) + if game_password: + server.game_password = game_password + if url_extras: + server.url_extras = url_extras + + return server + + def makeBot(self, name, server): + chatbot = Chatbot(server, commands) + commands = CommandMap(server, chatbot, MotdUpdater(server)).generate_map() + - server = Server(server_name, - settings.setting(server_name, "address"), - settings.setting(server_name, "username"), - settings.setting(server_name, "password") - ) + scheduler = CommandScheduler(server, chatbot) - server.game_password = \ - settings.setting(server_name, "game_password") - server.url_extras = \ - settings.setting(server_name, "url_extras") + self.bots.append( + chatbot + ) + + server.web_admin.chat.add_listener(chatbot) + server.web_admin.chat.add_listener(scheduler) + + + def run(self): + for server_name in settings.sections(): + self.servers.append( + self.makeServer(server_name, settings) + ) - self.servers.append(server) + scheduler = CommandScheduler(server, self) self.bots.append( Chatbot(server, settings.setting(server_name, "username")) diff --git a/magicked_admin/settings.py b/magicked_admin/settings.py index 73898c50..cbf74303 100755 --- a/magicked_admin/settings.py +++ b/magicked_admin/settings.py @@ -17,12 +17,9 @@ # username = Admin # password = 123 'game_password': '123', - 'motd_scoreboard': 'False', - 'scoreboard_type': 'Kills' } -SETTINGS_REQUIRED = ['address', 'password', 'motd_scoreboard', - 'scoreboard_type'] +SETTINGS_REQUIRED = ['address', 'username', 'password'] CONFIG_DIE_MESG = _("Please correct this manually or delete '{}' to create " "a clean config next run.").format(CONFIG_PATH) From 83287b981857e855a414dbb58a5ae58d97d885f1 Mon Sep 17 00:00:00 2001 From: the_z Date: Tue, 8 Oct 2019 21:04:16 +0100 Subject: [PATCH 17/33] Dependency injections --- magicked_admin/chatbot/chatbot.py | 18 ++--- magicked_admin/chatbot/command_map.py | 79 --------------------- magicked_admin/chatbot/commands/__init__.py | 68 ++++++++++++++++++ magicked_admin/magicked_admin.py | 67 ++++++++++------- magicked_admin/server/game_tracker.py | 2 +- magicked_admin/server/server.py | 25 ++----- magicked_admin/web_admin/web_admin.py | 13 +--- magicked_admin/web_admin/web_interface.py | 2 + 8 files changed, 129 insertions(+), 145 deletions(-) delete mode 100755 magicked_admin/chatbot/command_map.py diff --git a/magicked_admin/chatbot/chatbot.py b/magicked_admin/chatbot/chatbot.py index 95869d39..9631b9fa 100755 --- a/magicked_admin/chatbot/chatbot.py +++ b/magicked_admin/chatbot/chatbot.py @@ -3,7 +3,6 @@ from chatbot import INIT_TEMPLATE from chatbot.motd_updater import MotdUpdater -from chatbot.command_map import CommandMap from chatbot.command_scheduler import CommandScheduler from utils import debug, find_data_file, warning from web_admin.chat import ChatListener @@ -14,7 +13,7 @@ class Chatbot(ChatListener): - def __init__(self, server, name=None): + def __init__(self, server, commands, name=None): self.server_name = server.name if name: self.name = name @@ -22,12 +21,7 @@ def __init__(self, server, name=None): self.name = _("Unnamed") self.chat = server.web_admin.chat - self.chat.add_listener(self) - - self.scheduler = CommandScheduler(server, self) - self.chat.add_listener(self.scheduler) - - self.commands = CommandMap(server, self, MotdUpdater(server)) + self.commands = {} self.silent = False init_path = find_data_file("conf/scripts/" + server.name + ".init") @@ -38,8 +32,8 @@ def __init__(self, server, name=None): with open(init_path, 'w+') as script_file: script_file.write(INIT_TEMPLATE) - def stop(self): - self.scheduler.stop() + def add_command(self, name, command): + self.commands[name] = command def receive_message(self, username, message, user_flags): if message[0] == '!': @@ -51,8 +45,8 @@ def command_handler(self, username, args, user_flags): if args is None or len(args) == 0: return - if args[0].lower() in self.commands.command_map: - command = self.commands.command_map[args[0].lower()] + if args[0].lower() in self.commands: + command = self.commands[args[0].lower()] response = command.execute(username, args, user_flags) if not self.silent and response: diff --git a/magicked_admin/chatbot/command_map.py b/magicked_admin/chatbot/command_map.py deleted file mode 100755 index 89cf2d65..00000000 --- a/magicked_admin/chatbot/command_map.py +++ /dev/null @@ -1,79 +0,0 @@ -import gettext - -from chatbot.commands.event_commands import * -from chatbot.commands.info_commands import * -from chatbot.commands.player_commands import * -from chatbot.commands.server_commands import * - -_ = gettext.gettext - -# Internal command definitions -COMMAND_NEW_WAVE = "new_wave" # Params: wave number -COMMAND_NEW_GAME = "new_game" -COMMAND_PLAYER_JOIN = "player_join" # Params: username -COMMAND_TRADER_OPEN = "t_open" -COMMAND_TRADER_CLOSE = "t_close" - - -class CommandMap: - def __init__(self, server, chatbot, motd_updater): - self.server = server - self.chatbot = chatbot - self.motd_updater = motd_updater - self.command_map = self.generate_map() - - def generate_map(self): - scheduler = self.chatbot.scheduler - - command_map = { - # Operator commands - _('start_jc'): CommandStartJoinCommand(self.server, scheduler), - _('stop_jc'): CommandStopJoinCommands(self.server, scheduler), - _('start_wc'): CommandStartWaveCommand(self.server, scheduler), - _('stop_wc'): CommandStopWaveCommands(self.server, scheduler), - _('start_tc'): CommandStartTimeCommand(self.server, scheduler), - _('stop_tc'): CommandStopTimeCommands(self.server, scheduler), - _('start_trc'): CommandStartTraderCommand(self.server, scheduler), - _('stop_trc'): CommandStopTraderCommands(self.server, scheduler), - _('enforce_dosh'): CommandEnforceDosh(self.server), - _('say'): CommandSay(self.server), - _('restart'): CommandRestart(self.server), - _('load_map'): CommandLoadMap(self.server), - _('password'): CommandPassword(self.server), - _('silent'): CommandSilent(self.server, self.chatbot), - _('run'): CommandRun(self.server, self.chatbot), - _('length'): CommandLength(self.server), - _('difficulty'): CommandDifficulty(self.server), - _('game_mode'): CommandGameMode(self.server), - _('players'): CommandPlayers(self.server), - _('kick'): CommandKick(self.server), - _('ban'): CommandBan(self.server), - _('op'): CommandOp(self.server), - _('deop'): CommandDeop(self.server), - _('marquee'): CommandMarquee(self.server, self.chatbot), - _('update_motd'): CommandMarquee(self.server, self.motd_updater), - _('reload_motd'): CommandMarquee(self.server, self.motd_updater), - - # Player commands - _('commands'): CommandCommands(self.server), - _('record_wave'): CommandHighWave(self.server), - _('game'): CommandGame(self.server), - _('kills'): CommandKills(self.server), - _('dosh'): CommandDosh(self.server), - _('top_kills'): CommandTopKills(self.server), - _('top_dosh'): CommandTopDosh(self.server), - _('top_time'): CommandTopTime(self.server), - _('top_wave_kills'): CommandTopWaveKills(self.server), - _('top_wave_dosh'): CommandTopWaveDosh(self.server), - _('stats'): CommandStats(self.server), - _('game_time'): CommandGameTime(self.server), - _('server_kills'): CommandServerKills(self.server), - _('server_dosh'): CommandServerDosh(self.server), - _('map'): CommandGameMap(self.server), - _('maps'): CommandGameMaps(self.server), - _('player_count'): CommandPlayerCount(self.server), - _('scoreboard'): CommandScoreboard(self.server), - _('sb'): CommandScoreboard(self.server) - } - - return command_map diff --git a/magicked_admin/chatbot/commands/__init__.py b/magicked_admin/chatbot/commands/__init__.py index e69de29b..043c608f 100644 --- a/magicked_admin/chatbot/commands/__init__.py +++ b/magicked_admin/chatbot/commands/__init__.py @@ -0,0 +1,68 @@ +import gettext + +from chatbot.commands.event_commands import * +from chatbot.commands.info_commands import * +from chatbot.commands.player_commands import * +from chatbot.commands.server_commands import * + +_ = gettext.gettext + +# Internal command definitions +COMMAND_NEW_WAVE = "new_wave" # Params: wave number +COMMAND_NEW_GAME = "new_game" +COMMAND_PLAYER_JOIN = "player_join" # Params: username +COMMAND_TRADER_OPEN = "t_open" +COMMAND_TRADER_CLOSE = "t_close" + + +def get_commands(server, chatbot, scheduler, motd_updater): + return { + # Operator commands + _('start_jc'): CommandStartJoinCommand(server, scheduler), + _('stop_jc'): CommandStopJoinCommands(server, scheduler), + _('start_wc'): CommandStartWaveCommand(server, scheduler), + _('stop_wc'): CommandStopWaveCommands(server, scheduler), + _('start_tc'): CommandStartTimeCommand(server, scheduler), + _('stop_tc'): CommandStopTimeCommands(server, scheduler), + _('start_trc'): CommandStartTraderCommand(server, scheduler), + _('stop_trc'): CommandStopTraderCommands(server, scheduler), + _('enforce_dosh'): CommandEnforceDosh(server), + _('say'): CommandSay(server), + _('restart'): CommandRestart(server), + _('load_map'): CommandLoadMap(server), + _('password'): CommandPassword(server), + _('silent'): CommandSilent(server, chatbot), + _('run'): CommandRun(server, chatbot), + _('marquee'): CommandMarquee(server, chatbot), + _('length'): CommandLength(server), + _('difficulty'): CommandDifficulty(server), + _('game_mode'): CommandGameMode(server), + _('players'): CommandPlayers(server), + _('kick'): CommandKick(server), + _('ban'): CommandBan(server), + _('op'): CommandOp(server), + _('deop'): CommandDeop(server), + _('update_motd'): CommandMarquee(server, motd_updater), + _('reload_motd'): CommandMarquee(server, motd_updater), + + # Player commands + _('commands'): CommandCommands(server), + _('record_wave'): CommandHighWave(server), + _('game'): CommandGame(server), + _('kills'): CommandKills(server), + _('dosh'): CommandDosh(server), + _('top_kills'): CommandTopKills(server), + _('top_dosh'): CommandTopDosh(server), + _('top_time'): CommandTopTime(server), + _('top_wave_kills'): CommandTopWaveKills(server), + _('top_wave_dosh'): CommandTopWaveDosh(server), + _('stats'): CommandStats(server), + _('game_time'): CommandGameTime(server), + _('server_kills'): CommandServerKills(server), + _('server_dosh'): CommandServerDosh(server), + _('map'): CommandGameMap(server), + _('maps'): CommandGameMaps(server), + _('player_count'): CommandPlayerCount(server), + _('scoreboard'): CommandScoreboard(server), + _('sb'): CommandScoreboard(server) + } diff --git a/magicked_admin/magicked_admin.py b/magicked_admin/magicked_admin.py index 1cff8a91..e9e1a760 100755 --- a/magicked_admin/magicked_admin.py +++ b/magicked_admin/magicked_admin.py @@ -12,11 +12,19 @@ from colorama import init -from chatbot.chatbot import Chatbot, CommandScheduler, CommandMap, MotdUpdater +from chatbot.chatbot import Chatbot, CommandScheduler, MotdUpdater +from chatbot.commands import get_commands from server.server import Server from settings import Settings from utils import banner, die, find_data_file, info, warning from utils.net import phone_home +from server.game_tracker import GameTracker +from database.database import ServerDatabase +from server.game import Game, GameMap +from web_admin import WebAdmin +from web_admin.web_interface import WebInterface +from web_admin.chat import Chat +from web_admin.constants import * _ = gettext.gettext @@ -53,58 +61,70 @@ class MagickedAdmin: def __init__(self): phone_home() signal.signal(signal.SIGINT, self.terminate) - self.servers = [] - self.bots = [] + self.stop_list = [] self.sigint_count = 0 - def makeServer(self, name, settings): + def make_server(self, name): address = settings.setting(name, "address") username = settings.setting(name, "username") password = settings.setting(name, "password") game_password = settings.setting(name, "game_password") url_extras = settings.setting(name, "url_extras") - server = Server(name, address, username, password) + web_interface = WebInterface(address, username, password, name) + chat = Chat(WebInterface) + chat.start() + + web_admin = WebAdmin(web_interface, chat) + database = ServerDatabase(name) + game = Game(GameMap(), GAME_TYPE_UNKNOWN) + + server = Server(web_admin, database, game, name) + if game_password: server.game_password = game_password if url_extras: server.url_extras = url_extras - return server + tracker = GameTracker(server) + tracker.start() - def makeBot(self, name, server): - chatbot = Chatbot(server, commands) - commands = CommandMap(server, chatbot, MotdUpdater(server)).generate_map() + self.stop_list.append(server) + self.stop_list.append(chat) + self.stop_list.append(tracker) + return server + def make_chatbot(self, name, server): + chatbot = Chatbot(server, name) scheduler = CommandScheduler(server, chatbot) + self.stop_list.append(scheduler) - self.bots.append( - chatbot + commands = get_commands( + server, chatbot, scheduler, MotdUpdater(server) ) + for name, command in commands.items(): + chatbot.add_command(name, command) server.web_admin.chat.add_listener(chatbot) server.web_admin.chat.add_listener(scheduler) + return chatbot def run(self): - for server_name in settings.sections(): - self.servers.append( - self.makeServer(server_name, settings) - ) - - scheduler = CommandScheduler(server, self) + servers = [] - self.bots.append( - Chatbot(server, settings.setting(server_name, "username")) - ) + for server_name in settings.sections(): + server = self.makeServer(server_name, settings) + self.makeBot(settings.setting(server_name, "username"), server) + servers.append(server) info(_("Initialisation complete!\n")) if not args.skip_setup: while True: command = input() - for server in self.servers: + for server in servers: server.web_admin.chat.submit_message(command) def terminate(self, signal, frame): @@ -121,9 +141,8 @@ def terminate(self, signal, frame): print() # \n info(_("Program interrupted, saving data...")) - for server in self.servers: - server.close() - + for item in self.stop_list: + item.close() die() diff --git a/magicked_admin/server/game_tracker.py b/magicked_admin/server/game_tracker.py index b8af35a7..10d2b044 100755 --- a/magicked_admin/server/game_tracker.py +++ b/magicked_admin/server/game_tracker.py @@ -33,7 +33,7 @@ def run(self): self.__poll() time.sleep(self.__refresh_rate) - def close(self): + def stop(self): self.__exit = True def __poll(self): diff --git a/magicked_admin/server/server.py b/magicked_admin/server/server.py index 9f722672..2ebaf334 100755 --- a/magicked_admin/server/server.py +++ b/magicked_admin/server/server.py @@ -2,47 +2,34 @@ from termcolor import colored -import web_admin as api -from database.database import ServerDatabase -from server.game import Game, GameMap -from server.game_tracker import GameTracker from server.player import Player -from utils import debug, info, warning +from utils import debug, warning from web_admin.constants import * _ = gettext.gettext class Server: - def __init__(self, name, address, username, password): + def __init__(self, web_admin, database, game, name): self.name = name - - info(_("Connecting to {} ({})...").format(name, address)) - self.web_admin = api.WebAdmin(address, username, password, name) - info(_("Connected to {} ({})").format(name, address)) - - self.database = ServerDatabase(name) + self.database = database + self.web_admin = web_admin self.game_password = None - self.game = Game(GameMap(), GAME_TYPE_UNKNOWN) + self.game = game self.trader_time = False self.players = [] # Initial game's record data is discarded because some may be missed self.record_games = True - self.tracker = GameTracker(self) - self.tracker.start() - def supported_mode(self): return self.web_admin.supported_mode(self.game.game_type) - def close(self): - self.tracker.close() + def stop(self): self.write_game_map() self.write_all_players() - self.web_admin.close() def get_player_by_username(self, username): matched_players = 0 diff --git a/magicked_admin/web_admin/web_admin.py b/magicked_admin/web_admin/web_admin.py index 977857ca..a630ee01 100644 --- a/magicked_admin/web_admin/web_admin.py +++ b/magicked_admin/web_admin/web_admin.py @@ -6,19 +6,15 @@ from utils import warning from utils.net import get_country from utils.text import str_to_bool -from web_admin.chat import Chat from web_admin.constants import * -from web_admin.web_interface import WebInterface _ = gettext.gettext class WebAdmin(object): - def __init__(self, address, username, password, server_name="unnamed"): - self.__web_interface = \ - WebInterface(address, username, password, server_name) - self.chat = Chat(self.__web_interface) - self.chat.start() + def __init__(self, web_interface, chat): + self.__web_interface = web_interface + self.chat = chat self.__general_settings = \ self.__web_interface.get_payload_general_settings() @@ -33,9 +29,6 @@ def supported_mode(self, mode): # The other modes have various bits of data omitted! return self.__web_interface.ma_installed or mode == GAME_TYPE_SURVIVAL - def close(self): - self.chat.stop() - def __save_general_settings(self): self.__web_interface.post_general_settings( self.__general_settings diff --git a/magicked_admin/web_admin/web_interface.py b/magicked_admin/web_admin/web_interface.py index 4eab44c8..342519fa 100644 --- a/magicked_admin/web_admin/web_interface.py +++ b/magicked_admin/web_admin/web_interface.py @@ -12,6 +12,7 @@ class WebInterface(object): def __init__(self, address, username, password, server_name="unnamed"): + info(_("Connecting to {} ({})...").format(server_name, address)) self.__address = address self.__username = username self.__password = password @@ -43,6 +44,7 @@ def __init__(self, address, username, password, server_name="unnamed"): self.__sleeping = False self.__session = self.__new_session() + info(_("Connected to {} ({})").format(server_name, address)) def __get(self, session, url, retry_interval=6, login=False): while True: From 1becf0047742b734f9a50a376bb1455452a8c0a1 Mon Sep 17 00:00:00 2001 From: the_z Date: Tue, 8 Oct 2019 21:07:06 +0100 Subject: [PATCH 18/33] Cleanup --- magicked_admin/chatbot/chatbot.py | 8 ++------ magicked_admin/chatbot/command_scheduler.py | 1 - magicked_admin/chatbot/motd_updater.py | 1 - magicked_admin/database/database.py | 1 - magicked_admin/magicked_admin.py | 1 - magicked_admin/server/game_tracker.py | 1 - 6 files changed, 2 insertions(+), 11 deletions(-) diff --git a/magicked_admin/chatbot/chatbot.py b/magicked_admin/chatbot/chatbot.py index 9631b9fa..0cb0bb39 100755 --- a/magicked_admin/chatbot/chatbot.py +++ b/magicked_admin/chatbot/chatbot.py @@ -12,13 +12,9 @@ class Chatbot(ChatListener): - - def __init__(self, server, commands, name=None): + def __init__(self, server, name): self.server_name = server.name - if name: - self.name = name - else: - self.name = _("Unnamed") + self.name = name or "Unnamed" self.chat = server.web_admin.chat self.commands = {} diff --git a/magicked_admin/chatbot/command_scheduler.py b/magicked_admin/chatbot/command_scheduler.py index bc8cb433..09a58db9 100755 --- a/magicked_admin/chatbot/command_scheduler.py +++ b/magicked_admin/chatbot/command_scheduler.py @@ -29,7 +29,6 @@ def stop(self): class CommandScheduler(ChatListener): - def __init__(self, server, chatbot): self.server = server self.chatbot = chatbot diff --git a/magicked_admin/chatbot/motd_updater.py b/magicked_admin/chatbot/motd_updater.py index c65dcc39..2690c0f6 100755 --- a/magicked_admin/chatbot/motd_updater.py +++ b/magicked_admin/chatbot/motd_updater.py @@ -8,7 +8,6 @@ class MotdUpdater: - def __init__(self, server): self.server = server self.motd_path = find_data_file("conf/" + server.name + ".motd") diff --git a/magicked_admin/database/database.py b/magicked_admin/database/database.py index 30b32eda..78a6c065 100644 --- a/magicked_admin/database/database.py +++ b/magicked_admin/database/database.py @@ -10,7 +10,6 @@ class ServerDatabase: - def __init__(self, name): self.sqlite_db_file = find_data_file("conf/" + name + ".sqlite") diff --git a/magicked_admin/magicked_admin.py b/magicked_admin/magicked_admin.py index e9e1a760..7ddad777 100755 --- a/magicked_admin/magicked_admin.py +++ b/magicked_admin/magicked_admin.py @@ -57,7 +57,6 @@ class MagickedAdmin: - def __init__(self): phone_home() signal.signal(signal.SIGINT, self.terminate) diff --git a/magicked_admin/server/game_tracker.py b/magicked_admin/server/game_tracker.py index 10d2b044..e42338c6 100755 --- a/magicked_admin/server/game_tracker.py +++ b/magicked_admin/server/game_tracker.py @@ -13,7 +13,6 @@ class GameTracker(threading.Thread): - def __init__(self, server): threading.Thread.__init__(self) From b636427007ab30c87a0b77bdf65e3902eefa2daf Mon Sep 17 00:00:00 2001 From: th3-z Date: Wed, 9 Oct 2019 09:54:28 +0100 Subject: [PATCH 19/33] Update documentation --- README.md | 17 ++++++++++------- docs/steam_guide.txt | 35 +++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index afa47e3b..3cfa0b93 100755 --- a/README.md +++ b/README.md @@ -169,25 +169,28 @@ the `!op` command. * `!marquee ` - Runs a marquee in the chat from the `conf/marquee` folder, _experimental_ - Example: `!marquee example` +* `!update_motd ` - Refreshes the welcome screen leaderboard, type is + one of: kills, dosh, or time + - Example: `!start_tc 300 update_motd kills` +* `!reload_motd` - Reloads the server's `*.motd` file from `conf` * `!enforce_dosh ` - Kicks all players that have more dosh than the specified `amount` - Example: `!start_tc 600 enforce_dosh 60000` ### MOTD leaderboard -Writing a `conf/server_name.motd` file containing pairs of `%PLR` and `%SCR` -and enabling the `motd_scoreboard` option will put a live leaderboard in the -motd and update it every 5 minutes. +Create a `conf/server_name.motd` file containing pairs of `%PLR` and `%SCR`. +`%PLR` will be replaced with player names and `%SCR` will be replaced with +their current score. You can now use `!update_motd ` to draw the +leaderboard into your welcome screen, `` should be kills, dosh, or time +depending on the desired score metric. `%SRV_D` and `%SRV_K` will be replaced by the total dosh and kills on the server respectively. -The `scoreboard_type` configuration option allows you to change the score -metric on the leaderboard. The options for this are: `dosh` or `kills`. - ### Scripts -Writing a `server_name.init` in the `conf` folder with a series of commands +Writing a `server_name.init` in the `conf/scripts` folder with a series of commands will run the commands in sequence when the bot starts on `server_name`. Additional scripts can be written in the `conf/scripts` folder and ran with the diff --git a/docs/steam_guide.txt b/docs/steam_guide.txt index e4f13450..f6541fba 100755 --- a/docs/steam_guide.txt +++ b/docs/steam_guide.txt @@ -206,10 +206,15 @@ Commands that can be ran by server administrators, and users authorized with the [*] '[b]!enforce_dosh [/b]' - Kicks all players that have more dosh than the specified amount. - Example: '[b]!start_tc 600 enforce_dosh 60000[/b]' + +[*] '[b]!update_motd [/b]' - Refreshes the welcome screen leaderboard, type is one of: kills, dosh, or time + - Example: '[b]!start_tc 300 update_motd kills[/b]' + +[*] '[b]!reload_motd[/b]' - Reloads the server's '[b]*.motd[/b]' file from '[b]conf[/b]' [/list] ## Welcome screen leaderboards -Writing a '[b]conf/server_name.motd[/b]' file containing pairs of '[b]%PLR[/b]' and '[b]%SCR[/b]', and enabling the '[b]motd_scoreboard[/b]' option in the config file ('[b]conf/magicked_admin.conf[/b]') will allow you to render live leaderboard on the welcome screen. +Writing a '[b]conf/server_name.motd[/b]' file containing pairs of '[b]%PLR[/b]' and '[b]%SCR[/b]' will allow you to render live leaderboard on the welcome screen. A simple example could be as follows. [code]Welcome to our server. @@ -224,9 +229,12 @@ Top Players (total kills): Have fun and good luck! [/code] -KF2 Magicked Admin will replace '[b]%PLR[/b]' with the player's username, '[b]%SCR[/b]' with the player's total kills or total dosh, '[b]%SRV_K[/b]' with the global server kills, and '[b]%SRV_D[/b]' with the global server dosh. +KF2 Magicked Admin will replace '[b]%PLR[/b]' with the player's username, '[b]%SCR[/b]' with the player's total kills or total dosh, '[b]%SRV_K[/b]' with the global server kills, and '[b]%SRV_D[/b]' with the global server dosh. + +Once the file is written, use the '[b]!update_motd [/b]' command to refresh the leaderboard. This should be used in combination with '[b]!start_tc [/b]' so that it is refreshed automatically. + - Example: '[b]!start_tc 300 update_motd dosh[/b]' -The metric for '[b]%SCR[/b]' can be either 'kills', or 'dosh'. This is configured with the '[b]scoreboard_type[/b]' option in '[b]conf/magicked_admin.conf[/b]'. +The metric for '[b]%SCR[/b]' can be either 'kills', 'time', or 'dosh'. This is can be set by changing the '[b][/b]' parameter when using '[b]!update_motd [/b]' Here is my survival suicidal welcome screen as an example of what can be achieved. @@ -235,8 +243,8 @@ Here is my survival suicidal welcome screen as an example of what can be achieve [h1]Notes[/h1] [list] -[*] The leaderboard updates every 5 minutes. [*] This will overwrite your existing motd. +[*] '[b]!reload_motd[/b]' Can be used to reload the template file while KF2 Magicked Admin is still running. [/list] ## Scripts @@ -250,7 +258,7 @@ There are two categories of scripts, they differ in when and how they are execut [h1]Init scripts[/h1] -Writing a '[b]server_name.init[/b]' in the '[b]conf[/b]' folder with a series of commands will run the commands in sequence when the bot starts on '[b]server_name[/b]'. The server names are defined in '[b]conf/magicked_admin.conf[/b]', if you haven't changed the name it will default to '[b]server_one[/b]'. +Writing a '[b]server_name.init[/b]' in the '[b]conf/scripts[/b]' folder with a series of commands will run the commands in sequence when the bot starts on '[b]server_name[/b]'. The server names are defined in '[b]conf/magicked_admin.conf[/b]', if you haven't changed the name it will default to '[b]server_one[/b]'. An example init file will have been generated on first launch, this can be used as a template for writing your own init scripts. @@ -264,13 +272,14 @@ These scripts are formatted much the same as the init script, the commands will Some commands are particularly useful when used in scripts, these are: '[b]!start_tc[/b]', '[b]!start_trc[/b]', '[b]!start_wc[/b]', '[b]!start_jc[/b]', '[b]!top_wave_kills[/b]', '[b]!top_wave_dosh[/b]', '[b]!enforce_dosh[/b]', '[b]!say[/b]'. -'[b]conf/server_one.init[/b]' - [i]Show who earned the most dosh each wave when the trader opens[/i] -[code] start_trc top_wave_dosh[/code] +'[b]conf/scripts/server_one.init[/b]' - [i]Show who earned the most dosh each wave when the trader opens and update the welcome screen leaderboard every 5 minutes[/i] +[code] start_trc top_wave_dosh + start_tc 300 update_motd dosh[/code] -'[b]conf/server_one.init[/b]' - [i]Advertise your Steam group when the boss wave is reached[/i] +'[b]conf/scripts/server_one.init[/b]' - [i]Advertise your Steam group when the boss wave is reached[/i] [code] start_wc -w -1 say Join our steam group: http://our.steam/group[/code] -'[b]conf/server_one.init[/b]' - [i]Provide basic bot usage guidance to players[/i] +'[b]conf/scripts/server_one.init[/b]' - [i]Provide basic bot usage guidance to players[/i] [code] start_tc -rt 800 say I'm a bot, type !commands to see available commands[/code] '[b]conf/scripts/priv_game[/b]' - [i]Setup a private lobby with a single command[/i] @@ -302,12 +311,6 @@ The following options can be configured in the config file '[b]conf/magicked_adm [*] '[b]game_password[/b]' - Default game password to set when the password is toggled using '[b]!password [/b]'. - Example: '[b]game_password=Hunter69[/b]' -[*] '[b]motd_scoreboard[/b]' - Boolean value, enable or disable the motd leaderboard feature. Defaults to disabled. - - Example: '[b]motd_scoreboard=True[/b]' - -[*] '[b]scoreboard_type[/b]' - Possible values: '[b]kills[/b]', or '[b]dosh[/b]'. Change the type of scores that are displayed in the motd leaderboard. - - Example: '[b]scoreboard_type=dosh[/b]' - [/list] ## Renaming the chatbot (multi-admin) @@ -396,7 +399,7 @@ You first need to open '[b]conf/magicked_admin.conf[/b]' and here you can change You then need to go back and change '[b]server_one.motd[/b]' and '[b]server_one.init[/b]' to the name you just set it to in '[b]conf/magicked_admin.conf[/b]'. ## Resetting stats -To [b]reset[/b] the scoreboard all you have to do is [b]delete[/b] the '[b]conf/*.sqlite[/b]' file associated with the server name, a new one will be created the next time you start KF2 Magicked Admin. +To reset the scoreboard all you have to do is delete the '[b]conf/*.sqlite[/b]' file associated with the server name, a new one will be created the next time you start KF2 Magicked Admin. If I wanted to reset the stats on '[b]server_four[/b]', I would delete the '[b]conf/server_four.sqlite[/b]' file and restart KF2 Magicked Admin. From 24b4302bdd0ac81de7a3b0f5b56e6bc81b50fbb5 Mon Sep 17 00:00:00 2001 From: th3-z Date: Wed, 9 Oct 2019 10:55:14 +0100 Subject: [PATCH 20/33] Add more tokens to start_jc --- docs/steam_guide.txt | 6 +----- magicked_admin/chatbot/command_scheduler.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/steam_guide.txt b/docs/steam_guide.txt index f6541fba..2015fdfb 100755 --- a/docs/steam_guide.txt +++ b/docs/steam_guide.txt @@ -272,7 +272,7 @@ These scripts are formatted much the same as the init script, the commands will Some commands are particularly useful when used in scripts, these are: '[b]!start_tc[/b]', '[b]!start_trc[/b]', '[b]!start_wc[/b]', '[b]!start_jc[/b]', '[b]!top_wave_kills[/b]', '[b]!top_wave_dosh[/b]', '[b]!enforce_dosh[/b]', '[b]!say[/b]'. -'[b]conf/scripts/server_one.init[/b]' - [i]Show who earned the most dosh each wave when the trader opens and update the welcome screen leaderboard every 5 minutes[/i] +'[b]conf/scripts/server_one.init[/b]' - [i]Show who earned the most dosh each wave when the trader opens, and update the welcome screen leaderboard every 5 minutes[/i] [code] start_trc top_wave_dosh start_tc 300 update_motd dosh[/code] @@ -374,16 +374,12 @@ Below is an example. [code] [server_one] game_password = 123 -motd_scoreboard = False -scoreboard_type = Kills address = http://127.0.0.1:8080 username = Admin password = root [server_two] game_password = Hunter69 -motd_scoreboard = True -scoreboard_type = Dosh address = http://127.0.0.1:8081 username = Admin password = 123 diff --git a/magicked_admin/chatbot/command_scheduler.py b/magicked_admin/chatbot/command_scheduler.py index 09a58db9..ad10a3dd 100755 --- a/magicked_admin/chatbot/command_scheduler.py +++ b/magicked_admin/chatbot/command_scheduler.py @@ -4,6 +4,7 @@ from chatbot.commands.command import Command from utils import warning +from utils.time import seconds_to_hhmmss from web_admin.chat import ChatListener from web_admin.constants import * @@ -195,9 +196,24 @@ def resolve_command(self, internal_message): if "%PLR" in self.command: player = self.server.get_player_by_username(username) + pos_kills = self.server.database.rank_kills(player.steam_id) + pos_dosh = self.server.database.rank_dosh(player.steam_id) + pos_time = self.server.database.rank_time(player.steam_id) + command = command.replace("%PLR", player.username) + command = command.replace( + "%BCK", "back" if player.sessions > 1 else "" + ) + command = command.replace("%DSH", str(player.total_dosh)) + command = command.replace("%DRK", str(pos_dosh)) + command = command.replace("%KLL", str(player.total_kills)) + command = command.replace("%KRK", str(pos_kills)) + + command = command.replace("%TME", seconds_to_hhmmss(player.total_time)) + command = command.replace("%TRK", str(pos_time)) + command = command.replace("%SES", str(player.sessions)) return command From d9681aeaab0be44edf77ec7081245c87bc623b85 Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 15:46:26 +0100 Subject: [PATCH 21/33] Fix circular deps, fix sigint handler --- magicked_admin/chatbot/chatbot.py | 4 +- magicked_admin/chatbot/command_scheduler.py | 5 +- magicked_admin/chatbot/commands/__init__.py | 58 +---------------- .../chatbot/commands/command_map.py | 63 +++++++++++++++++++ .../chatbot/commands/event_commands.py | 5 +- .../chatbot/commands/info_commands.py | 2 +- .../chatbot/commands/player_commands.py | 2 +- .../chatbot/commands/server_commands.py | 2 +- magicked_admin/magicked_admin.py | 17 ++--- magicked_admin/web_admin/web_admin.py | 7 ++- 10 files changed, 88 insertions(+), 77 deletions(-) create mode 100644 magicked_admin/chatbot/commands/command_map.py diff --git a/magicked_admin/chatbot/chatbot.py b/magicked_admin/chatbot/chatbot.py index 0cb0bb39..5dec3b5c 100755 --- a/magicked_admin/chatbot/chatbot.py +++ b/magicked_admin/chatbot/chatbot.py @@ -2,9 +2,7 @@ from os import path from chatbot import INIT_TEMPLATE -from chatbot.motd_updater import MotdUpdater -from chatbot.command_scheduler import CommandScheduler -from utils import debug, find_data_file, warning +from utils import debug, find_data_file from web_admin.chat import ChatListener from web_admin.constants import * diff --git a/magicked_admin/chatbot/command_scheduler.py b/magicked_admin/chatbot/command_scheduler.py index ad10a3dd..71782d30 100755 --- a/magicked_admin/chatbot/command_scheduler.py +++ b/magicked_admin/chatbot/command_scheduler.py @@ -3,13 +3,13 @@ import time from chatbot.commands.command import Command +from chatbot.commands import ALL_WAVES from utils import warning from utils.time import seconds_to_hhmmss from web_admin.chat import ChatListener from web_admin.constants import * _ = gettext.gettext -ALL_WAVES = 999 class CommandSchedulerPollThread(threading.Thread): @@ -91,7 +91,8 @@ def run_command(self, command, internal_message=None): "internal", command_resolved.split(" "), USER_TYPE_INTERNAL ) - if command.run_once: + # TODO: Bug, shouldn't have to check command in commands + if command.run_once and command in self.scheduled_commands: self.scheduled_commands.remove(command) else: command.reset() diff --git a/magicked_admin/chatbot/commands/__init__.py b/magicked_admin/chatbot/commands/__init__.py index 043c608f..6abc519d 100644 --- a/magicked_admin/chatbot/commands/__init__.py +++ b/magicked_admin/chatbot/commands/__init__.py @@ -1,10 +1,5 @@ import gettext -from chatbot.commands.event_commands import * -from chatbot.commands.info_commands import * -from chatbot.commands.player_commands import * -from chatbot.commands.server_commands import * - _ = gettext.gettext # Internal command definitions @@ -14,55 +9,4 @@ COMMAND_TRADER_OPEN = "t_open" COMMAND_TRADER_CLOSE = "t_close" - -def get_commands(server, chatbot, scheduler, motd_updater): - return { - # Operator commands - _('start_jc'): CommandStartJoinCommand(server, scheduler), - _('stop_jc'): CommandStopJoinCommands(server, scheduler), - _('start_wc'): CommandStartWaveCommand(server, scheduler), - _('stop_wc'): CommandStopWaveCommands(server, scheduler), - _('start_tc'): CommandStartTimeCommand(server, scheduler), - _('stop_tc'): CommandStopTimeCommands(server, scheduler), - _('start_trc'): CommandStartTraderCommand(server, scheduler), - _('stop_trc'): CommandStopTraderCommands(server, scheduler), - _('enforce_dosh'): CommandEnforceDosh(server), - _('say'): CommandSay(server), - _('restart'): CommandRestart(server), - _('load_map'): CommandLoadMap(server), - _('password'): CommandPassword(server), - _('silent'): CommandSilent(server, chatbot), - _('run'): CommandRun(server, chatbot), - _('marquee'): CommandMarquee(server, chatbot), - _('length'): CommandLength(server), - _('difficulty'): CommandDifficulty(server), - _('game_mode'): CommandGameMode(server), - _('players'): CommandPlayers(server), - _('kick'): CommandKick(server), - _('ban'): CommandBan(server), - _('op'): CommandOp(server), - _('deop'): CommandDeop(server), - _('update_motd'): CommandMarquee(server, motd_updater), - _('reload_motd'): CommandMarquee(server, motd_updater), - - # Player commands - _('commands'): CommandCommands(server), - _('record_wave'): CommandHighWave(server), - _('game'): CommandGame(server), - _('kills'): CommandKills(server), - _('dosh'): CommandDosh(server), - _('top_kills'): CommandTopKills(server), - _('top_dosh'): CommandTopDosh(server), - _('top_time'): CommandTopTime(server), - _('top_wave_kills'): CommandTopWaveKills(server), - _('top_wave_dosh'): CommandTopWaveDosh(server), - _('stats'): CommandStats(server), - _('game_time'): CommandGameTime(server), - _('server_kills'): CommandServerKills(server), - _('server_dosh'): CommandServerDosh(server), - _('map'): CommandGameMap(server), - _('maps'): CommandGameMaps(server), - _('player_count'): CommandPlayerCount(server), - _('scoreboard'): CommandScoreboard(server), - _('sb'): CommandScoreboard(server) - } +ALL_WAVES = 999 diff --git a/magicked_admin/chatbot/commands/command_map.py b/magicked_admin/chatbot/commands/command_map.py new file mode 100644 index 00000000..427bdc4f --- /dev/null +++ b/magicked_admin/chatbot/commands/command_map.py @@ -0,0 +1,63 @@ +import gettext + +from .event_commands import * +from .info_commands import * +from .player_commands import * +from .server_commands import * + +_ = gettext.gettext + + +class CommandMap: + @staticmethod + def get_commands(server, chatbot, scheduler, motd_updater): + return { + # Operator commands + _('start_jc'): CommandStartJoinCommand(server, scheduler), + _('stop_jc'): CommandStopJoinCommands(server, scheduler), + _('start_wc'): CommandStartWaveCommand(server, scheduler), + _('stop_wc'): CommandStopWaveCommands(server, scheduler), + _('start_tc'): CommandStartTimeCommand(server, scheduler), + _('stop_tc'): CommandStopTimeCommands(server, scheduler), + _('start_trc'): CommandStartTraderCommand(server, scheduler), + _('stop_trc'): CommandStopTraderCommands(server, scheduler), + _('enforce_dosh'): CommandEnforceDosh(server), + _('say'): CommandSay(server), + _('restart'): CommandRestart(server), + _('load_map'): CommandLoadMap(server), + _('password'): CommandPassword(server), + _('silent'): CommandSilent(server, chatbot), + _('run'): CommandRun(server, chatbot), + _('marquee'): CommandMarquee(server, chatbot), + _('length'): CommandLength(server), + _('difficulty'): CommandDifficulty(server), + _('game_mode'): CommandGameMode(server), + _('players'): CommandPlayers(server), + _('kick'): CommandKick(server), + _('ban'): CommandBan(server), + _('op'): CommandOp(server), + _('deop'): CommandDeop(server), + _('update_motd'): CommandMarquee(server, motd_updater), + _('reload_motd'): CommandMarquee(server, motd_updater), + + # Player commands + _('commands'): CommandCommands(server), + _('record_wave'): CommandHighWave(server), + _('game'): CommandGame(server), + _('kills'): CommandKills(server), + _('dosh'): CommandDosh(server), + _('top_kills'): CommandTopKills(server), + _('top_dosh'): CommandTopDosh(server), + _('top_time'): CommandTopTime(server), + _('top_wave_kills'): CommandTopWaveKills(server), + _('top_wave_dosh'): CommandTopWaveDosh(server), + _('stats'): CommandStats(server), + _('game_time'): CommandGameTime(server), + _('server_kills'): CommandServerKills(server), + _('server_dosh'): CommandServerDosh(server), + _('map'): CommandGameMap(server), + _('maps'): CommandGameMaps(server), + _('player_count'): CommandPlayerCount(server), + _('scoreboard'): CommandScoreboard(server), + _('sb'): CommandScoreboard(server) + } diff --git a/magicked_admin/chatbot/commands/event_commands.py b/magicked_admin/chatbot/commands/event_commands.py index 973c4000..fc68560d 100644 --- a/magicked_admin/chatbot/commands/event_commands.py +++ b/magicked_admin/chatbot/commands/event_commands.py @@ -1,8 +1,9 @@ import gettext -from chatbot.command_scheduler import (ALL_WAVES, CommandOnJoin, CommandOnTime, +from chatbot.command_scheduler import (CommandOnJoin, CommandOnTime, CommandOnTrader, CommandOnWave) -from chatbot.commands.command import Command +from . import ALL_WAVES +from .command import Command _ = gettext.gettext diff --git a/magicked_admin/chatbot/commands/info_commands.py b/magicked_admin/chatbot/commands/info_commands.py index beaff8a5..4097c33b 100644 --- a/magicked_admin/chatbot/commands/info_commands.py +++ b/magicked_admin/chatbot/commands/info_commands.py @@ -2,7 +2,7 @@ import time import gettext -from chatbot.commands.command import Command +from .command import Command from server.player import Player from utils import find_data_file from utils.text import millify diff --git a/magicked_admin/chatbot/commands/player_commands.py b/magicked_admin/chatbot/commands/player_commands.py index f14313ea..d8f339a7 100644 --- a/magicked_admin/chatbot/commands/player_commands.py +++ b/magicked_admin/chatbot/commands/player_commands.py @@ -1,6 +1,6 @@ import gettext -from chatbot.commands.command import Command +from .command import Command from utils.text import millify, trim_string from utils.time import seconds_to_hhmmss diff --git a/magicked_admin/chatbot/commands/server_commands.py b/magicked_admin/chatbot/commands/server_commands.py index 3e807042..5c8044cd 100755 --- a/magicked_admin/chatbot/commands/server_commands.py +++ b/magicked_admin/chatbot/commands/server_commands.py @@ -2,7 +2,7 @@ import gettext import server.game as game -from chatbot.commands.command import Command +from .command import Command from utils import find_data_file from web_admin.constants import * diff --git a/magicked_admin/magicked_admin.py b/magicked_admin/magicked_admin.py index 7ddad777..c7060575 100755 --- a/magicked_admin/magicked_admin.py +++ b/magicked_admin/magicked_admin.py @@ -12,8 +12,11 @@ from colorama import init -from chatbot.chatbot import Chatbot, CommandScheduler, MotdUpdater -from chatbot.commands import get_commands +# TODO: Improve package layouts +from chatbot.chatbot import Chatbot +from chatbot.command_scheduler import CommandScheduler +from chatbot.motd_updater import MotdUpdater +from chatbot.commands.command_map import CommandMap from server.server import Server from settings import Settings from utils import banner, die, find_data_file, info, warning @@ -71,7 +74,7 @@ def make_server(self, name): url_extras = settings.setting(name, "url_extras") web_interface = WebInterface(address, username, password, name) - chat = Chat(WebInterface) + chat = Chat(web_interface) chat.start() web_admin = WebAdmin(web_interface, chat) @@ -99,7 +102,7 @@ def make_chatbot(self, name, server): scheduler = CommandScheduler(server, chatbot) self.stop_list.append(scheduler) - commands = get_commands( + commands = CommandMap().get_commands( server, chatbot, scheduler, MotdUpdater(server) ) for name, command in commands.items(): @@ -114,8 +117,8 @@ def run(self): servers = [] for server_name in settings.sections(): - server = self.makeServer(server_name, settings) - self.makeBot(settings.setting(server_name, "username"), server) + server = self.make_server(server_name) + self.make_chatbot(settings.setting(server_name, "username"), server) servers.append(server) info(_("Initialisation complete!\n")) @@ -141,7 +144,7 @@ def terminate(self, signal, frame): info(_("Program interrupted, saving data...")) for item in self.stop_list: - item.close() + item.stop() die() diff --git a/magicked_admin/web_admin/web_admin.py b/magicked_admin/web_admin/web_admin.py index a630ee01..b6126934 100644 --- a/magicked_admin/web_admin/web_admin.py +++ b/magicked_admin/web_admin/web_admin.py @@ -209,16 +209,17 @@ def __get_players(info_tree): else: return players - # xpath to s and retrieve text manually to catch empty text() + # xpath to s and retrieve text manually to catch empty cells trows_path = "//table[@id=\"players\"]/tbody//td" trows_result = info_tree.xpath(trows_path) trows_result = [ + # Some cells can be empty while the player is joining trow.text if trow.text else "" for trow in trows_result ] - # If players in game, a lone message is left in the table - if trows_result == 1: + # When no players are in game a single cell with a message is left + if len(trows_result) == 1: return players # Group rows in the table by the non-breaking space in first cell From 1683b9edbdcb9440eac079e004f6b40ad556f85a Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 16:38:12 +0100 Subject: [PATCH 22/33] Fix SQL formats --- .../chatbot/commands/server_commands.py | 2 +- magicked_admin/database/database.py | 34 +++++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/magicked_admin/chatbot/commands/server_commands.py b/magicked_admin/chatbot/commands/server_commands.py index 5c8044cd..eeb70139 100755 --- a/magicked_admin/chatbot/commands/server_commands.py +++ b/magicked_admin/chatbot/commands/server_commands.py @@ -334,7 +334,7 @@ def __init__(self, server, chatbot): "Desc: Runs a script") self.parser.add_argument("file", nargs="*") - self.scripts_folder = "scripts" + self.scripts_folder = "conf/scripts" def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) diff --git a/magicked_admin/database/database.py b/magicked_admin/database/database.py index 78a6c065..1b063e9d 100644 --- a/magicked_admin/database/database.py +++ b/magicked_admin/database/database.py @@ -10,6 +10,7 @@ class ServerDatabase: + def __init__(self, name): self.sqlite_db_file = find_data_file("conf/" + name + ".sqlite") @@ -52,20 +53,20 @@ def __rank_by_col(self, steam_id, col): FROM players as player2 WHERE - player2.? >= player1.? + player2.{} >= player1.{} ), 0) AS col_rank FROM players AS player1 WHERE player1.steam_id = ? - """ + """.format(col, col) lock.acquire(True) - self.cur.execute(query, (col, col, steam_id,)) + self.cur.execute(query, (steam_id,)) result = self.cur.fetchall() lock.release() - if result: + if len(result): return result[0]["col_rank"] else: return None @@ -103,7 +104,7 @@ def rank_kd(self, steam_id): result = self.cur.fetchall() lock.release() - if result: + if len(result): return result[0]["kd_rank"] else: return None @@ -111,17 +112,17 @@ def rank_kd(self, steam_id): def __server_sum_col(self, col): query = """ SELECT - COALESCE(SUM(?), 0) as total + COALESCE(SUM({}), 0) as total FROM players - """ + """.format(col) lock.acquire(True) - self.cur.execute(query, (col,)) + self.cur.execute(query) result = self.cur.fetchall() lock.release() - if result: + if len(result): return result[0]["total"] else: return 0 @@ -139,19 +140,22 @@ def __server_top_by_col(self, col): query = """ SELECT username, - ? AS score + {} as score FROM players ORDER BY - ? DESC - """ + {} DESC + """.format(col, col) lock.acquire(True) - self.cur.execute(query, (col, col,)) + self.cur.execute(query) result = self.cur.fetchall() lock.release() - return result or [] + if len(result): + return result + else: + return [] def top_kills(self): return self.__server_top_by_col("kills") @@ -257,7 +261,7 @@ def highest_wave(self, game_map): highest_wave_result = self.cur.fetchall() lock.release() - if not highest_wave_result: + if not len(highest_wave_result): return 0 return highest_wave_result[0]['game_wave'] From bd1edd15bde16cbefca6ec5c8e3874151735dd3a Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 22:21:20 +0100 Subject: [PATCH 23/33] Player logging, general logging Fixes #88 --- magicked_admin/server/server.py | 10 +++++- magicked_admin/utils/__init__.py | 59 +++++++++++++++++++++++--------- magicked_admin/utils/net.py | 5 ++- 3 files changed, 56 insertions(+), 18 deletions(-) diff --git a/magicked_admin/server/server.py b/magicked_admin/server/server.py index 2ebaf334..7dd9b663 100755 --- a/magicked_admin/server/server.py +++ b/magicked_admin/server/server.py @@ -3,7 +3,7 @@ from termcolor import colored from server.player import Player -from utils import debug, warning +from utils import debug, warning, info from web_admin.constants import * _ = gettext.gettext @@ -173,6 +173,10 @@ def event_player_join(self, player): message = _("Player {} joined {} from {}") \ .format(new_player.username, self.name, new_player.country) print(colored(message, 'cyan')) + info( + "{} (SteamID: {})".format(message, new_player.steam_id), + display=False + ) self.web_admin.chat.handle_message( "internal_command", "!player_join " + new_player.username, @@ -186,6 +190,10 @@ def event_player_quit(self, player): message = _("Player {} left {}") \ .format(player.username, self.name) print(colored(message, 'cyan')) + info( + "{} (SteamID: {})".format(message, player.steam_id), + display=False + ) self.web_admin.chat.handle_message("internal_command", "!player_quit " + player.username, USER_TYPE_INTERNAL) diff --git a/magicked_admin/utils/__init__.py b/magicked_admin/utils/__init__.py index b5ea22fc..05d2b62e 100644 --- a/magicked_admin/utils/__init__.py +++ b/magicked_admin/utils/__init__.py @@ -1,6 +1,8 @@ import os import sys import gettext +import logging +import logging.handlers from colorama import init from termcolor import colored @@ -15,14 +17,6 @@ BANNER_URL = "https://th3-z.xyz/kf2-ma" -def die(message=None, pause=False): - if message: - print(colored(' [!] ', 'red') + message) - if pause: - input(_("\nPress enter to exit...")) - sys.exit(0) - - def find_data_file(filename): if getattr(sys, 'frozen', False): datadir = os.path.dirname(sys.executable) @@ -34,6 +28,20 @@ def find_data_file(filename): return os.path.join(datadir, filename) +# TODO: logging module +logger = logging.getLogger("kf2-magicked-admin") +handler = logging.handlers.WatchedFileHandler( + os.environ.get("LOGFILE", find_data_file("conf/magicked_admin.log")) +) +formatter = logging.Formatter( + "[%(asctime)s %(levelname)s] %(message)s", + "%Y-%m-%d %H:%M:%S" +) +handler.setFormatter(formatter) +logger.addHandler(handler) +logger.setLevel(logging.DEBUG) + + def banner(): version_text = colored("<<", 'magenta') version_text += colored(VERSION, 'magenta') @@ -59,18 +67,37 @@ def banner(): print(str.join('', lines)) -def warning(mesg): - print(colored(' [!] ', 'yellow') + mesg) +def warning(mesg, log=True, display=True): + if display: + print(colored(' [!] ', 'yellow') + mesg) + if log: + logger.warning(mesg) -def debug(mesg): - if DEBUG: +def debug(mesg, log=True, display=True): + if DEBUG and display: print(colored(' [#] ' + mesg, 'red')) + if log: + logger.debug(mesg) + + +def info(mesg, log=True, display=True): + if display: + print(colored(' [*] ', 'green') + mesg) + if log: + logger.info(mesg) -def info(mesg): - print(colored(' [*] ', 'green') + mesg) +def fatal(mesg, log=True, display=True): + if display: + print(colored(' [!] ', 'red') + mesg) + if log: + logger.fatal(mesg) -def fatal(mesg): - print(colored(' [!] ', 'red') + mesg) +def die(mesg=None, pause=False): + if mesg: + fatal(mesg, log=True) + if pause: + input(_("\nPress enter to exit...")) + sys.exit(0) diff --git a/magicked_admin/utils/net.py b/magicked_admin/utils/net.py index f157324e..e93bf382 100755 --- a/magicked_admin/utils/net.py +++ b/magicked_admin/utils/net.py @@ -58,7 +58,10 @@ def get_country(ip): url = "http://ip-api.com/" + "/json/" + ip unknown = (_("Unknown"), "??") - geo_data = requests.get(url).json() + try: + geo_data = requests.get(url).json() + except Exception: + return unknown if 'country' not in geo_data: return unknown From ef848429dd49a54dc3ddd3edb09afcbb9d61ef28 Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 22:25:18 +0100 Subject: [PATCH 24/33] Pause patcher before exit --- admin_patches/admin_patches.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/admin_patches/admin_patches.py b/admin_patches/admin_patches.py index a18b5482..84e269cc 100644 --- a/admin_patches/admin_patches.py +++ b/admin_patches/admin_patches.py @@ -49,7 +49,7 @@ def run(target=None): server_path = ask_dir() if not server_path: - die(_("User cancelled installation")) + die(_("User cancelled installation"), pause=True) if not test_dir(server_path): die(_("Killing Floor 2 server not found in path:\n\t{}") .format(server_path), pause=True) @@ -60,13 +60,13 @@ def run(target=None): die(_("Server file validation failed, possible reasons:" "\n\t - Game update" "\n\t - User mods" - "\n\t - Patches already applied")) + "\n\t - Patches already applied"), pause=True) info(_("Patching files...")) patches_path = find_data_file(PATCHES_PATH) if not patch_files(target_path, patches_path): - die(_("Patching failed")) + die(_("Patching failed"), pause=True) else: print() # \n info(_("Patches installed successfully!\n")) @@ -74,3 +74,4 @@ def run(target=None): if __name__ == "__main__": run() + die(pause=True) From cf3fcab5d582e38a52a76b519b2661c9e8b887fe Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 22:28:11 +0100 Subject: [PATCH 25/33] Increment version --- magicked_admin/utils/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magicked_admin/utils/__init__.py b/magicked_admin/utils/__init__.py index 05d2b62e..f7abbe36 100644 --- a/magicked_admin/utils/__init__.py +++ b/magicked_admin/utils/__init__.py @@ -13,7 +13,7 @@ # TODO: Switch to Nuitka for compilation DEBUG = __debug__ and not hasattr(sys, 'frozen') -VERSION = "0.1.4" +VERSION = "0.1.5" BANNER_URL = "https://th3-z.xyz/kf2-ma" From 940524266fde22deacae0593a8e37466d3f6200d Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 22:29:31 +0100 Subject: [PATCH 26/33] Fix lints --- magicked_admin/chatbot/command_scheduler.py | 4 +++- magicked_admin/magicked_admin.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/magicked_admin/chatbot/command_scheduler.py b/magicked_admin/chatbot/command_scheduler.py index 71782d30..8b2b36ed 100755 --- a/magicked_admin/chatbot/command_scheduler.py +++ b/magicked_admin/chatbot/command_scheduler.py @@ -212,7 +212,9 @@ def resolve_command(self, internal_message): command = command.replace("%KLL", str(player.total_kills)) command = command.replace("%KRK", str(pos_kills)) - command = command.replace("%TME", seconds_to_hhmmss(player.total_time)) + command = command.replace( + "%TME", seconds_to_hhmmss(player.total_time) + ) command = command.replace("%TRK", str(pos_time)) command = command.replace("%SES", str(player.sessions)) diff --git a/magicked_admin/magicked_admin.py b/magicked_admin/magicked_admin.py index c7060575..c7df9321 100755 --- a/magicked_admin/magicked_admin.py +++ b/magicked_admin/magicked_admin.py @@ -118,7 +118,9 @@ def run(self): for server_name in settings.sections(): server = self.make_server(server_name) - self.make_chatbot(settings.setting(server_name, "username"), server) + self.make_chatbot( + settings.setting(server_name, "username"), server + ) servers.append(server) info(_("Initialisation complete!\n")) From 0a6749be7454121b2b1b67913329d980e7dc006d Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 22:32:02 +0100 Subject: [PATCH 27/33] Shorten start_jc delay --- magicked_admin/chatbot/commands/event_commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magicked_admin/chatbot/commands/event_commands.py b/magicked_admin/chatbot/commands/event_commands.py index fc68560d..71e583ba 100644 --- a/magicked_admin/chatbot/commands/event_commands.py +++ b/magicked_admin/chatbot/commands/event_commands.py @@ -19,7 +19,7 @@ def __init__(self, server, scheduler): "match") self.parser.add_argument("command", nargs="*") - self.run_delay = 8 + self.run_delay = 5 def execute(self, username, args, user_flags): args, err = self.parse_args(username, args, user_flags) From 4b1cdb9894ec1c6342e139c5327a980bbdb89fcc Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 22:45:16 +0100 Subject: [PATCH 28/33] Add example greeter --- magicked_admin/conf/scripts/greeter | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 magicked_admin/conf/scripts/greeter diff --git a/magicked_admin/conf/scripts/greeter b/magicked_admin/conf/scripts/greeter new file mode 100644 index 00000000..feefcdad --- /dev/null +++ b/magicked_admin/conf/scripts/greeter @@ -0,0 +1,10 @@ +; %PLR - Username +; %BCK - "Back" if sessions > 1 +; %DSH - Dosh +; %DRK - Dosh rank +; %KLL - Kills +; %KRK - Kill rank +; %TME - Play time +; %TRK - Play time rank +; %SES - Sessions +start_jc -q say "Welcome %BCK %PLR\nYou've killed %KLL ZEDs (#%KRK)\nand earned £%DSH (#%DRK)\nover %SES sessions. From ce59f68e53efea476d9040722e0c9c836d1f57ff Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 22:49:09 +0100 Subject: [PATCH 29/33] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cfa0b93..d6a76b61 100755 --- a/README.md +++ b/README.md @@ -139,7 +139,9 @@ the `!op` command. * `!start_jc ` - Start a command that runs every time a player joins - Example: `!start_jc say Welcome %PLR` - Greets a player on join - Available tokens: `%PLR` - username, `%KLL` - total kills, `%DSH` - - total dosh + total dosh; `%PLR` - username, `%BCK` - "back" if sessions > 1, `%DRK` - + dosh rank, `%KRK` - kill rank, `%TME` - play time, `%TRK` - play time + rank, `%SES` - sessions * `!stop_jc` - Stops all join commands * `!start_wc [-w ] ` - Start a command that runs on wave `` - `-w` Wave to run the command on, can be omitted to have the command From 045ca7ac2bc70921574cd8e7dd18720146d8b191 Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 22:52:02 +0100 Subject: [PATCH 30/33] Update steam_guide.txt --- docs/steam_guide.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/steam_guide.txt b/docs/steam_guide.txt index 2015fdfb..63ed4a79 100755 --- a/docs/steam_guide.txt +++ b/docs/steam_guide.txt @@ -169,7 +169,7 @@ Commands that can be ran by server administrators, and users authorized with the [*] '[b]!start_jc [/b]' - Start a command that runs every time a player joins - Example: '[b]!start_jc say Welcome %PLR[/b]' - Greets a player on join - - Available tokens: '[b]%PLR[/b]' - username, '[b]%KLL[/b]' - total kills, '[b]%DSH[/b]' - total dosh + - Available tokens: '[b]%PLR[/b]' - username, '[b]%KLL[/b]' - total kills, '[b]%DSH[/b]' - total dosh, '[b]%BCK[/b]' - "back" if sessions > 1, '[b]%DRK[/b]' - dosh rank, '[b]%KRK[/b]' - kill rank, '[b]%TME[/b]' - play time, '[b]%TRK[/b]' - play time rank, '[b]%SES[/b]' - sessions [*] '[b]!stop_jc[/b]' - Stops all join commands From 2b04507fdd552e4935736692bf60055232152228 Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 23:00:05 +0100 Subject: [PATCH 31/33] Update pots --- locale/admin_patches.pot | 2 +- locale/en_GB/admin_patches.po | 4 +- locale/en_GB/magicked_admin.po | 493 ++++++++++++++++++--------------- locale/magicked_admin.pot | 491 +++++++++++++++++--------------- 4 files changed, 536 insertions(+), 454 deletions(-) diff --git a/locale/admin_patches.pot b/locale/admin_patches.pot index 57aeb6d5..fefcdd98 100644 --- a/locale/admin_patches.pot +++ b/locale/admin_patches.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2019-10-07 14:28+0100\n" +"POT-Creation-Date: 2019-10-13 22:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locale/en_GB/admin_patches.po b/locale/en_GB/admin_patches.po index 9a8d9c1f..cbecb0ed 100644 --- a/locale/en_GB/admin_patches.po +++ b/locale/en_GB/admin_patches.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2019-10-07 14:28+0100\n" -"PO-Revision-Date: 2019-10-07 14:28+0100\n" +"POT-Creation-Date: 2019-10-13 22:59+0100\n" +"PO-Revision-Date: 2019-10-13 22:59+0100\n" "Last-Translator: FULL NAME \n" "Language: en_GB\n" "Language-Team: en_GB \n" diff --git a/locale/en_GB/magicked_admin.po b/locale/en_GB/magicked_admin.po index dd07930f..d68f369c 100644 --- a/locale/en_GB/magicked_admin.po +++ b/locale/en_GB/magicked_admin.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2019-10-07 14:28+0100\n" -"PO-Revision-Date: 2019-10-07 14:28+0100\n" +"POT-Creation-Date: 2019-10-13 22:59+0100\n" +"PO-Revision-Date: 2019-10-13 22:59+0100\n" "Last-Translator: FULL NAME \n" "Language: en_GB\n" "Language-Team: en_GB \n" @@ -18,83 +18,83 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.7.0\n" -#: magicked_admin/magicked_admin.py:28 +#: magicked_admin/magicked_admin.py:37 msgid "Killing Floor 2 Magicked Administrator" msgstr "" -#: magicked_admin/magicked_admin.py:31 +#: magicked_admin/magicked_admin.py:40 msgid "Skips the guided setup process" msgstr "" -#: magicked_admin/magicked_admin.py:93 +#: magicked_admin/magicked_admin.py:126 msgid "Initialisation complete!\n" msgstr "" -#: magicked_admin/magicked_admin.py:103 +#: magicked_admin/magicked_admin.py:137 msgid "Closing immediately!" msgstr "" -#: magicked_admin/magicked_admin.py:112 +#: magicked_admin/magicked_admin.py:146 msgid "Program interrupted, saving data..." msgstr "" -#: magicked_admin/settings.py:30 +#: magicked_admin/settings.py:24 msgid "" "Please correct this manually or delete '{}' to create a clean config " "next run." msgstr "" -#: magicked_admin/settings.py:37 +#: magicked_admin/settings.py:31 msgid "No configuration was found, first time setup is required!" msgstr "" -#: magicked_admin/settings.py:49 +#: magicked_admin/settings.py:43 msgid "Guided setup was skipped, a template has been generated." msgstr "" -#: magicked_admin/settings.py:51 +#: magicked_admin/settings.py:45 msgid "Setup is not complete yet, please amend '{}' with your server details." msgstr "" -#: magicked_admin/settings.py:59 +#: magicked_admin/settings.py:53 msgid "" "Configuration error(s) found!\n" "Section '{}' has a duplicate setting: '{}'." msgstr "" -#: magicked_admin/settings.py:66 +#: magicked_admin/settings.py:60 msgid "Configuration error(s) found!" msgstr "" -#: magicked_admin/settings.py:82 +#: magicked_admin/settings.py:76 msgid " Please input your web admin details below." msgstr "" -#: magicked_admin/settings.py:94 +#: magicked_admin/settings.py:88 msgid "" "\n" "Address [default - localhost:8080]: " msgstr "" -#: magicked_admin/settings.py:100 +#: magicked_admin/settings.py:94 msgid "" "Address not responding!\n" "Accepted formats are: 'ip:port', 'domain', or 'domain:port'" msgstr "" -#: magicked_admin/settings.py:103 +#: magicked_admin/settings.py:97 msgid "Username [default - Admin]: " msgstr "" -#: magicked_admin/settings.py:105 +#: magicked_admin/settings.py:99 msgid "Password (will not echo) [default - 123]: " msgstr "" -#: magicked_admin/settings.py:141 +#: magicked_admin/settings.py:135 msgid "Config file has no sections." msgstr "" -#: magicked_admin/settings.py:150 +#: magicked_admin/settings.py:144 msgid "Section '{}' is missing a required setting: '{}'." msgstr "" @@ -113,246 +113,262 @@ msgid "" "; silent\n" msgstr "" -#: magicked_admin/chatbot/chatbot.py:21 -msgid "Unnamed" +#: magicked_admin/chatbot/chatbot.py:50 +msgid "Executing script: " msgstr "" -#: magicked_admin/chatbot/chatbot.py:59 -msgid "Executing script: " +#: magicked_admin/chatbot/command_scheduler.py:58 +msgid "Stopped {} command(s)" msgstr "" -#: magicked_admin/chatbot/command_map.py:29 +#: magicked_admin/chatbot/command_scheduler.py:61 +msgid "None running" +msgstr "" + +#: magicked_admin/chatbot/command_scheduler.py:110 +msgid "Scheduled command ({}) ran directly by {}, please use CommandScheduler" +msgstr "" + +#: magicked_admin/chatbot/motd_updater.py:21 +msgid "No MOTD file for {} found, pulling from web admin!" +msgstr "" + +#: magicked_admin/chatbot/motd_updater.py:40 +msgid "Updated the MOTD!" +msgstr "" + +#: magicked_admin/chatbot/motd_updater.py:53 +msgid "Scoreboard_type not recognised '{}'. Options are: dosh, kills" +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:18 +msgid "You're not authorised to use that command" +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:21 +msgid "" +"This action isn't supported without Killing Floor 2 Magicked " +"Administrator's server side patch! Please review the documentation at " +"'{}' for guidance." +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:28 +msgid "The help text for this command hasn't been written!" +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:30 +msgid "$" +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:56 +msgid "Auth failure, username: {}, user flags: {:b}" +msgstr "" + +#: magicked_admin/chatbot/commands/command_map.py:16 msgid "start_jc" msgstr "" -#: magicked_admin/chatbot/command_map.py:30 +#: magicked_admin/chatbot/commands/command_map.py:17 msgid "stop_jc" msgstr "" -#: magicked_admin/chatbot/command_map.py:31 +#: magicked_admin/chatbot/commands/command_map.py:18 msgid "start_wc" msgstr "" -#: magicked_admin/chatbot/command_map.py:32 +#: magicked_admin/chatbot/commands/command_map.py:19 msgid "stop_wc" msgstr "" -#: magicked_admin/chatbot/command_map.py:33 +#: magicked_admin/chatbot/commands/command_map.py:20 msgid "start_tc" msgstr "" -#: magicked_admin/chatbot/command_map.py:34 +#: magicked_admin/chatbot/commands/command_map.py:21 msgid "stop_tc" msgstr "" -#: magicked_admin/chatbot/command_map.py:35 +#: magicked_admin/chatbot/commands/command_map.py:22 msgid "start_trc" msgstr "" -#: magicked_admin/chatbot/command_map.py:36 +#: magicked_admin/chatbot/commands/command_map.py:23 msgid "stop_trc" msgstr "" -#: magicked_admin/chatbot/command_map.py:37 +#: magicked_admin/chatbot/commands/command_map.py:24 msgid "enforce_dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:38 +#: magicked_admin/chatbot/commands/command_map.py:25 msgid "say" msgstr "" -#: magicked_admin/chatbot/command_map.py:39 +#: magicked_admin/chatbot/commands/command_map.py:26 msgid "restart" msgstr "" -#: magicked_admin/chatbot/command_map.py:40 +#: magicked_admin/chatbot/commands/command_map.py:27 msgid "load_map" msgstr "" -#: magicked_admin/chatbot/command_map.py:41 +#: magicked_admin/chatbot/commands/command_map.py:28 msgid "password" msgstr "" -#: magicked_admin/chatbot/command_map.py:42 +#: magicked_admin/chatbot/commands/command_map.py:29 msgid "silent" msgstr "" -#: magicked_admin/chatbot/command_map.py:43 +#: magicked_admin/chatbot/commands/command_map.py:30 msgid "run" msgstr "" -#: magicked_admin/chatbot/command_map.py:44 +#: magicked_admin/chatbot/commands/command_map.py:31 +msgid "marquee" +msgstr "" + +#: magicked_admin/chatbot/commands/command_map.py:32 msgid "length" msgstr "" -#: magicked_admin/chatbot/command_map.py:45 +#: magicked_admin/chatbot/commands/command_map.py:33 msgid "difficulty" msgstr "" -#: magicked_admin/chatbot/command_map.py:46 +#: magicked_admin/chatbot/commands/command_map.py:34 msgid "game_mode" msgstr "" -#: magicked_admin/chatbot/command_map.py:47 +#: magicked_admin/chatbot/commands/command_map.py:35 msgid "players" msgstr "" -#: magicked_admin/chatbot/command_map.py:48 +#: magicked_admin/chatbot/commands/command_map.py:36 msgid "kick" msgstr "" -#: magicked_admin/chatbot/command_map.py:49 +#: magicked_admin/chatbot/commands/command_map.py:37 msgid "ban" msgstr "" -#: magicked_admin/chatbot/command_map.py:50 +#: magicked_admin/chatbot/commands/command_map.py:38 msgid "op" msgstr "" -#: magicked_admin/chatbot/command_map.py:51 +#: magicked_admin/chatbot/commands/command_map.py:39 msgid "deop" msgstr "" -#: magicked_admin/chatbot/command_map.py:52 -msgid "marquee" +#: magicked_admin/chatbot/commands/command_map.py:40 +msgid "update_motd" +msgstr "" + +#: magicked_admin/chatbot/commands/command_map.py:41 +msgid "reload_motd" msgstr "" -#: magicked_admin/chatbot/command_map.py:55 +#: magicked_admin/chatbot/commands/command_map.py:44 msgid "commands" msgstr "" -#: magicked_admin/chatbot/command_map.py:56 +#: magicked_admin/chatbot/commands/command_map.py:45 msgid "record_wave" msgstr "" -#: magicked_admin/chatbot/command_map.py:57 +#: magicked_admin/chatbot/commands/command_map.py:46 msgid "game" msgstr "" -#: magicked_admin/chatbot/command_map.py:58 +#: magicked_admin/chatbot/commands/command_map.py:47 msgid "kills" msgstr "" -#: magicked_admin/chatbot/command_map.py:59 +#: magicked_admin/chatbot/commands/command_map.py:48 msgid "dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:60 +#: magicked_admin/chatbot/commands/command_map.py:49 msgid "top_kills" msgstr "" -#: magicked_admin/chatbot/command_map.py:61 +#: magicked_admin/chatbot/commands/command_map.py:50 msgid "top_dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:62 +#: magicked_admin/chatbot/commands/command_map.py:51 msgid "top_time" msgstr "" -#: magicked_admin/chatbot/command_map.py:63 +#: magicked_admin/chatbot/commands/command_map.py:52 msgid "top_wave_kills" msgstr "" -#: magicked_admin/chatbot/command_map.py:64 +#: magicked_admin/chatbot/commands/command_map.py:53 msgid "top_wave_dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:65 +#: magicked_admin/chatbot/commands/command_map.py:54 msgid "stats" msgstr "" -#: magicked_admin/chatbot/command_map.py:66 +#: magicked_admin/chatbot/commands/command_map.py:55 msgid "game_time" msgstr "" -#: magicked_admin/chatbot/command_map.py:67 +#: magicked_admin/chatbot/commands/command_map.py:56 msgid "server_kills" msgstr "" -#: magicked_admin/chatbot/command_map.py:68 +#: magicked_admin/chatbot/commands/command_map.py:57 msgid "server_dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:69 +#: magicked_admin/chatbot/commands/command_map.py:58 msgid "map" msgstr "" -#: magicked_admin/chatbot/command_map.py:70 +#: magicked_admin/chatbot/commands/command_map.py:59 msgid "maps" msgstr "" -#: magicked_admin/chatbot/command_map.py:71 +#: magicked_admin/chatbot/commands/command_map.py:60 msgid "player_count" msgstr "" -#: magicked_admin/chatbot/command_map.py:72 +#: magicked_admin/chatbot/commands/command_map.py:61 msgid "scoreboard" msgstr "" -#: magicked_admin/chatbot/command_map.py:73 +#: magicked_admin/chatbot/commands/command_map.py:62 msgid "sb" msgstr "" -#: magicked_admin/chatbot/command_scheduler.py:55 -msgid "Stopped {} command(s)" -msgstr "" - -#: magicked_admin/chatbot/command_scheduler.py:58 -msgid "None running" -msgstr "" - -#: magicked_admin/chatbot/command_scheduler.py:106 -msgid "Scheduled command ({}) ran directly by {}, please use CommandScheduler" -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:18 -msgid "You're not authorised to use that command" -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:21 -msgid "" -"This action isn't supported without Killing Floor 2 Magicked " -"Administrator's server side patch! Please review the documentation at " -"'{}' for guidance." -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:28 -msgid "The help text for this command hasn't been written!" -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:30 -msgid "$" -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:56 -msgid "Auth failure, username: {}, user flags: {:b}" -msgstr "" - -#: magicked_admin/chatbot/commands/event_commands.py:15 +#: magicked_admin/chatbot/commands/event_commands.py:16 msgid "" "Usage: !start_jc COMMAND\n" "\tCOMMAND - Command to run\n" "Desc: Runs a command when a player joins the match" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:32 -#: magicked_admin/chatbot/commands/event_commands.py:98 -#: magicked_admin/chatbot/commands/event_commands.py:166 -#: magicked_admin/chatbot/commands/event_commands.py:222 +#: magicked_admin/chatbot/commands/event_commands.py:33 +#: magicked_admin/chatbot/commands/event_commands.py:99 +#: magicked_admin/chatbot/commands/event_commands.py:167 +#: magicked_admin/chatbot/commands/event_commands.py:223 msgid "Please specify a command to run" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:41 +#: magicked_admin/chatbot/commands/event_commands.py:42 msgid "Player join command started" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:49 +#: magicked_admin/chatbot/commands/event_commands.py:50 msgid "" "Usage: !stop_jc\n" "Desc: Stops all join commands" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:70 +#: magicked_admin/chatbot/commands/event_commands.py:71 msgid "" "Usage: !start_wc [--wave] COMMAND\n" "\t-w --wave - Optional, wave to run on\n" @@ -361,22 +377,22 @@ msgid "" "on every wave" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:90 -#: magicked_admin/chatbot/commands/event_commands.py:230 +#: magicked_admin/chatbot/commands/event_commands.py:91 +#: magicked_admin/chatbot/commands/event_commands.py:231 msgid "'{}' is not a valid wave number" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:105 +#: magicked_admin/chatbot/commands/event_commands.py:106 msgid "Wave start command started" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:113 +#: magicked_admin/chatbot/commands/event_commands.py:114 msgid "" "Usage: !stop_wc\n" "Desc: Stops all wave commands" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:134 +#: magicked_admin/chatbot/commands/event_commands.py:135 msgid "" "Usage: !start_tc [-r -t] COMMAND\n" "\tCOMMAND - Command to run\n" @@ -385,25 +401,25 @@ msgid "" "Desc: Runs a command after some time delay" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:152 +#: magicked_admin/chatbot/commands/event_commands.py:153 msgid "Please specify a time interval, '!start_tc -h' for help" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:160 +#: magicked_admin/chatbot/commands/event_commands.py:161 msgid "'{}' is not a valid time interval" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:175 +#: magicked_admin/chatbot/commands/event_commands.py:176 msgid "Time interval command started" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:183 +#: magicked_admin/chatbot/commands/event_commands.py:184 msgid "" "Usage: !stop_tc\n" "Desc: Stops all timed commands" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:204 +#: magicked_admin/chatbot/commands/event_commands.py:205 msgid "" "Usage: !start_trc [--wave] COMMAND\n" "\tCOMMAND - Command to run\n" @@ -412,11 +428,11 @@ msgid "" "every time the trader opens" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:238 +#: magicked_admin/chatbot/commands/event_commands.py:239 msgid "Trader open command started" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:246 +#: magicked_admin/chatbot/commands/event_commands.py:247 msgid "" "Usage: !stop_trc\n" "Desc: Stops all trader commands" @@ -465,7 +481,7 @@ msgid "" msgstr "" #: magicked_admin/chatbot/commands/info_commands.py:144 -#: magicked_admin/chatbot/commands/server_commands.py:169 +#: magicked_admin/chatbot/commands/server_commands.py:168 msgid "" "Usage: !map\n" "Desc: Shows statistics about the current map" @@ -561,12 +577,12 @@ msgid "" "personal stats" msgstr "" -#: magicked_admin/chatbot/commands/player_commands.py:79 -msgid "You've killed a total of {} ZEDs (#{}), and {} this game" +#: magicked_admin/chatbot/commands/player_commands.py:78 +msgid "Player {} not in game" msgstr "" -#: magicked_admin/chatbot/commands/player_commands.py:89 -msgid "Player {} not in game" +#: magicked_admin/chatbot/commands/player_commands.py:83 +msgid "You've killed a total of {} ZEDs (#{}), and {} this game" msgstr "" #: magicked_admin/chatbot/commands/player_commands.py:97 @@ -577,12 +593,12 @@ msgid "" "personal stats" msgstr "" -#: magicked_admin/chatbot/commands/player_commands.py:117 -msgid "You've earned a total of £{} dosh (#{}), and £{} this game" +#: magicked_admin/chatbot/commands/player_commands.py:115 +msgid "Player not in game" msgstr "" -#: magicked_admin/chatbot/commands/player_commands.py:127 -msgid "Player not in game" +#: magicked_admin/chatbot/commands/player_commands.py:119 +msgid "You've earned a total of £{} dosh (#{}), and £{} this game" msgstr "" #: magicked_admin/chatbot/commands/player_commands.py:134 @@ -657,137 +673,174 @@ msgid "" msgstr "" #: magicked_admin/chatbot/commands/server_commands.py:32 -#: magicked_admin/chatbot/commands/server_commands.py:90 -#: magicked_admin/chatbot/commands/server_commands.py:126 -#: magicked_admin/chatbot/commands/server_commands.py:245 +#: magicked_admin/chatbot/commands/server_commands.py:89 +#: magicked_admin/chatbot/commands/server_commands.py:125 +#: magicked_admin/chatbot/commands/server_commands.py:259 msgid "Missing argument, username or Steam ID" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:39 -msgid "Player, {}, was banned" +#: magicked_admin/chatbot/commands/server_commands.py:37 +#: magicked_admin/chatbot/commands/server_commands.py:264 +msgid "Player not found" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:42 -#: magicked_admin/chatbot/commands/server_commands.py:255 -msgid "Player not found" +#: magicked_admin/chatbot/commands/server_commands.py:40 +msgid "Player, {}, was banned" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:49 +#: magicked_admin/chatbot/commands/server_commands.py:48 msgid "" "Usage: !say MESSAGE\n" "\tMESSAGE - Message to echo\n" "Desc: Echos a message in chat" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:74 +#: magicked_admin/chatbot/commands/server_commands.py:73 msgid "" "Usage: !op USERNAME\n" "\tUSERNAME - Player to give operator status\n" "Desc: Allows a player to use admin commands" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:95 -#: magicked_admin/chatbot/commands/server_commands.py:131 +#: magicked_admin/chatbot/commands/server_commands.py:94 +#: magicked_admin/chatbot/commands/server_commands.py:130 msgid "Couldn't find player '{}'" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:98 +#: magicked_admin/chatbot/commands/server_commands.py:97 msgid "Oped {}" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:109 +#: magicked_admin/chatbot/commands/server_commands.py:108 msgid "" "Usage: !deop USERNAME\n" "\tUSERNAME - Player to revoke op status for\n" "Desc: Revokes a players ability to use admin commands" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:134 +#: magicked_admin/chatbot/commands/server_commands.py:133 msgid "Deoped {}" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:145 +#: magicked_admin/chatbot/commands/server_commands.py:144 msgid "" "Usage: !maps [--all]\n" "\t-a --all - Show all available maps\n" "Desc: Shows maps that are in the map cycle" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:197 +#: magicked_admin/chatbot/commands/server_commands.py:196 msgid "Stats for {}:\n" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:198 +#: magicked_admin/chatbot/commands/server_commands.py:197 msgid "Total plays: {} \n" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:199 +#: magicked_admin/chatbot/commands/server_commands.py:198 msgid "Record wave: {} \n" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:200 +#: magicked_admin/chatbot/commands/server_commands.py:199 msgid "Survival wins: {} \n" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:209 +#: magicked_admin/chatbot/commands/server_commands.py:208 msgid "" -"Usage: !enforce_dosh\n" -"Desc: Kicks players with more dosh than the threshold configured in " -"'conf/magicked_admin.conf'" +"Usage: !enforce_dosh AMOUNT\n" +"\tAMOUNT - Kicks players over this amount\n" +"Desc: Kicks players with more dosh than the amount specified" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:223 +msgid "Please specify a maximum amount of dosh" msgstr "" #: magicked_admin/chatbot/commands/server_commands.py:230 +msgid "'{}' is not a valid number" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:244 msgid "" "Usage: !kick USERNAME\n" "\tUSERNAME - Player to kick\n" "Desc: Kicks a player from the match" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:252 +#: magicked_admin/chatbot/commands/server_commands.py:267 msgid "Player, {}, was kicked" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:263 +#: magicked_admin/chatbot/commands/server_commands.py:278 +msgid "" +"Usage: !update_motd TYPE\n" +"\tTYPE - Score type, one of: kills, dosh, time\n" +"Desc: Updates the MOTD scoreboard" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:290 +msgid "Missing argument: type" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:294 +msgid "Unrecognised score type: {}" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:300 +msgid "Updated the MOTD" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:310 +msgid "" +"Usage: !reload_motd\n" +"Desc: Reload the server's *.motd file" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:323 +msgid "Reloaded the MOTD" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:332 msgid "" "Usage: !run FILE\n" "\tFILE - Some file in 'conf/scripts'\n" "Desc: Runs a script" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:278 +#: magicked_admin/chatbot/commands/server_commands.py:347 msgid "No script was specified" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:283 +#: magicked_admin/chatbot/commands/server_commands.py:352 msgid "Script not found" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:292 +#: magicked_admin/chatbot/commands/server_commands.py:361 msgid "" "Usage: !restart\n" "Desc: Restarts the match" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:303 +#: magicked_admin/chatbot/commands/server_commands.py:372 msgid "Restarting map..." msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:310 +#: magicked_admin/chatbot/commands/server_commands.py:379 msgid "" "Usage: !load_map MAP_NAME\n" "\tMAP_NAME - Map to load\n" "Desc: Immediately changes the map." msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:323 +#: magicked_admin/chatbot/commands/server_commands.py:392 msgid "Missing argument (map name)" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:326 +#: magicked_admin/chatbot/commands/server_commands.py:395 msgid "Changing map" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:333 +#: magicked_admin/chatbot/commands/server_commands.py:402 msgid "" "Usage: !password [--set] STATE\n" "\tSTATE - On, off, or new password\n" @@ -796,93 +849,93 @@ msgid "" "'conf/magicked_admin.conf', state can be on, off, or a new password." msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:352 +#: magicked_admin/chatbot/commands/server_commands.py:421 msgid "Game password is currently {}" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:353 +#: magicked_admin/chatbot/commands/server_commands.py:422 msgid "enabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:353 +#: magicked_admin/chatbot/commands/server_commands.py:422 msgid "disabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:364 +#: magicked_admin/chatbot/commands/server_commands.py:433 msgid "Game password enabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:368 +#: magicked_admin/chatbot/commands/server_commands.py:437 msgid "Game password disabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:371 +#: magicked_admin/chatbot/commands/server_commands.py:440 msgid "Unrecognised option {}" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:381 +#: magicked_admin/chatbot/commands/server_commands.py:450 msgid "" "Usage: !silent [--quiet]\n" "\t-q --quiet - Suppresses output'\n" "Desc: Toggles command output globally" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:394 +#: magicked_admin/chatbot/commands/server_commands.py:463 msgid "Silent mode disabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:396 +#: magicked_admin/chatbot/commands/server_commands.py:465 msgid "Silent mode enabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:410 +#: magicked_admin/chatbot/commands/server_commands.py:479 msgid "" "Usage: !length LENGTH\n" "\tLENGTH - Length to change to\n" "Desc: Changes the game length next match" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:423 -#: magicked_admin/chatbot/commands/server_commands.py:435 +#: magicked_admin/chatbot/commands/server_commands.py:492 +#: magicked_admin/chatbot/commands/server_commands.py:504 msgid "Length not recognised, options are: short, medium, or long" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:442 +#: magicked_admin/chatbot/commands/server_commands.py:511 msgid "Length change will take effect next game" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:451 +#: magicked_admin/chatbot/commands/server_commands.py:520 msgid "" "Usage: !difficulty DIFFICULTY\n" "\tDIFFICULTY - Difficulty to change to\n" "Desc: Changes the difficulty next match" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:464 -#: magicked_admin/chatbot/commands/server_commands.py:478 +#: magicked_admin/chatbot/commands/server_commands.py:533 +#: magicked_admin/chatbot/commands/server_commands.py:547 msgid "Difficulty not recognised, options are: normal, hard, suicidal, or hell" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:485 +#: magicked_admin/chatbot/commands/server_commands.py:554 msgid "Difficulty change will take effect next game" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:494 +#: magicked_admin/chatbot/commands/server_commands.py:563 msgid "" "Usage: !game_mode MODE\n" "\tMODE - Mode to change to\n" "Desc: Immediately changes the game mode" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:508 +#: magicked_admin/chatbot/commands/server_commands.py:577 msgid "Mode not recognised, options are: endless, survival, weekly or versus" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:523 +#: magicked_admin/chatbot/commands/server_commands.py:592 msgid "GameMode not recognised, options are: endless, survival, weekly or versus" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:530 +#: magicked_admin/chatbot/commands/server_commands.py:599 msgid "Game mode will be changed to {}" msgstr "" @@ -907,24 +960,12 @@ msgid "" "Plays weekly: {}" msgstr "" -#: magicked_admin/server/game_tracker.py:56 +#: magicked_admin/server/game_tracker.py:55 msgid "" "Game type ({}) support not installed, please patch your webadmin to " "correct this! Guidance is available at: {}" msgstr "" -#: magicked_admin/server/motd_updater.py:23 -msgid "No MOTD file for {} found, pulling from web admin!" -msgstr "" - -#: magicked_admin/server/motd_updater.py:45 -msgid "Updated the MOTD!" -msgstr "" - -#: magicked_admin/server/motd_updater.py:62 -msgid "Scoreboard_type not recognised '{}' for {}. Options are: dosh, kills" -msgstr "" - #: magicked_admin/server/player.py:38 magicked_admin/utils/net.py:59 msgid "Unknown" msgstr "" @@ -937,82 +978,82 @@ msgid "" "Steam ID:{}" msgstr "" -#: magicked_admin/server/server.py:20 -msgid "Connecting to {} ({})..." -msgstr "" - -#: magicked_admin/server/server.py:22 -msgid "Connected to {} ({})" -msgstr "" - -#: magicked_admin/server/server.py:91 +#: magicked_admin/server/server.py:77 msgid "Flushing players on {}" msgstr "" -#: magicked_admin/server/server.py:96 +#: magicked_admin/server/server.py:82 msgid "Writing game to database ({})" msgstr "" -#: magicked_admin/server/server.py:195 +#: magicked_admin/server/server.py:173 msgid "Player {} joined {} from {}" msgstr "" -#: magicked_admin/server/server.py:208 +#: magicked_admin/server/server.py:190 msgid "Player {} left {}" msgstr "" -#: magicked_admin/server/server.py:217 +#: magicked_admin/server/server.py:203 msgid "Player {} died on {}" msgstr "" -#: magicked_admin/server/server.py:221 +#: magicked_admin/server/server.py:207 msgid "New game on {}, map: {}, mode: {}" msgstr "" -#: magicked_admin/server/server.py:238 +#: magicked_admin/server/server.py:224 msgid "Unknown game_type {}" msgstr "" -#: magicked_admin/server/server.py:245 +#: magicked_admin/server/server.py:231 msgid "End game on {}, map: {}, mode: {}, victory: {}" msgstr "" -#: magicked_admin/utils/__init__.py:22 +#: magicked_admin/utils/__init__.py:102 msgid "" "\n" "Press enter to exit..." msgstr "" -#: magicked_admin/web_admin/web_admin.py:93 +#: magicked_admin/web_admin/web_admin.py:86 msgid "Tried to toggle game password before setting value" msgstr "" -#: magicked_admin/web_admin/web_admin.py:380 +#: magicked_admin/web_admin/web_admin.py:362 msgid "Couldn't find identify player: {}" msgstr "" -#: magicked_admin/web_admin/web_interface.py:60 -#: magicked_admin/web_admin/web_interface.py:99 +#: magicked_admin/web_admin/web_interface.py:15 +msgid "Connecting to {} ({})..." +msgstr "" + +#: magicked_admin/web_admin/web_interface.py:47 +msgid "Connected to {} ({})" +msgstr "" + +#: magicked_admin/web_admin/web_interface.py:62 +#: magicked_admin/web_admin/web_interface.py:101 msgid "Session killed, renewing!" msgstr "" -#: magicked_admin/web_admin/web_interface.py:122 +#: magicked_admin/web_admin/web_interface.py:124 msgid "Web admin not responding, sleeping" msgstr "" -#: magicked_admin/web_admin/web_interface.py:127 +#: magicked_admin/web_admin/web_interface.py:129 msgid "Web admin is back, resuming" msgstr "" -#: magicked_admin/web_admin/web_interface.py:163 +#: magicked_admin/web_admin/web_interface.py:165 msgid "Login failure, bad credentials or login attempts exceeded." msgstr "" -#: magicked_admin/web_admin/web_interface.py:168 +#: magicked_admin/web_admin/web_interface.py:170 msgid "Detected KF2-MA install on server." msgstr "" -#: magicked_admin/web_admin/web_interface.py:171 +#: magicked_admin/web_admin/web_interface.py:172 msgid "" "KF2-MA install not detected on server side! Consequently, only Survival " "mode will function fully." diff --git a/locale/magicked_admin.pot b/locale/magicked_admin.pot index 2e818326..25d07273 100644 --- a/locale/magicked_admin.pot +++ b/locale/magicked_admin.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2019-10-07 14:28+0100\n" +"POT-Creation-Date: 2019-10-13 22:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,83 +17,83 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.7.0\n" -#: magicked_admin/magicked_admin.py:28 +#: magicked_admin/magicked_admin.py:37 msgid "Killing Floor 2 Magicked Administrator" msgstr "" -#: magicked_admin/magicked_admin.py:31 +#: magicked_admin/magicked_admin.py:40 msgid "Skips the guided setup process" msgstr "" -#: magicked_admin/magicked_admin.py:93 +#: magicked_admin/magicked_admin.py:126 msgid "Initialisation complete!\n" msgstr "" -#: magicked_admin/magicked_admin.py:103 +#: magicked_admin/magicked_admin.py:137 msgid "Closing immediately!" msgstr "" -#: magicked_admin/magicked_admin.py:112 +#: magicked_admin/magicked_admin.py:146 msgid "Program interrupted, saving data..." msgstr "" -#: magicked_admin/settings.py:30 +#: magicked_admin/settings.py:24 msgid "" "Please correct this manually or delete '{}' to create a clean config " "next run." msgstr "" -#: magicked_admin/settings.py:37 +#: magicked_admin/settings.py:31 msgid "No configuration was found, first time setup is required!" msgstr "" -#: magicked_admin/settings.py:49 +#: magicked_admin/settings.py:43 msgid "Guided setup was skipped, a template has been generated." msgstr "" -#: magicked_admin/settings.py:51 +#: magicked_admin/settings.py:45 msgid "Setup is not complete yet, please amend '{}' with your server details." msgstr "" -#: magicked_admin/settings.py:59 +#: magicked_admin/settings.py:53 msgid "" "Configuration error(s) found!\n" "Section '{}' has a duplicate setting: '{}'." msgstr "" -#: magicked_admin/settings.py:66 +#: magicked_admin/settings.py:60 msgid "Configuration error(s) found!" msgstr "" -#: magicked_admin/settings.py:82 +#: magicked_admin/settings.py:76 msgid " Please input your web admin details below." msgstr "" -#: magicked_admin/settings.py:94 +#: magicked_admin/settings.py:88 msgid "" "\n" "Address [default - localhost:8080]: " msgstr "" -#: magicked_admin/settings.py:100 +#: magicked_admin/settings.py:94 msgid "" "Address not responding!\n" "Accepted formats are: 'ip:port', 'domain', or 'domain:port'" msgstr "" -#: magicked_admin/settings.py:103 +#: magicked_admin/settings.py:97 msgid "Username [default - Admin]: " msgstr "" -#: magicked_admin/settings.py:105 +#: magicked_admin/settings.py:99 msgid "Password (will not echo) [default - 123]: " msgstr "" -#: magicked_admin/settings.py:141 +#: magicked_admin/settings.py:135 msgid "Config file has no sections." msgstr "" -#: magicked_admin/settings.py:150 +#: magicked_admin/settings.py:144 msgid "Section '{}' is missing a required setting: '{}'." msgstr "" @@ -112,246 +112,262 @@ msgid "" "; silent\n" msgstr "" -#: magicked_admin/chatbot/chatbot.py:21 -msgid "Unnamed" +#: magicked_admin/chatbot/chatbot.py:50 +msgid "Executing script: " msgstr "" -#: magicked_admin/chatbot/chatbot.py:59 -msgid "Executing script: " +#: magicked_admin/chatbot/command_scheduler.py:58 +msgid "Stopped {} command(s)" msgstr "" -#: magicked_admin/chatbot/command_map.py:29 +#: magicked_admin/chatbot/command_scheduler.py:61 +msgid "None running" +msgstr "" + +#: magicked_admin/chatbot/command_scheduler.py:110 +msgid "Scheduled command ({}) ran directly by {}, please use CommandScheduler" +msgstr "" + +#: magicked_admin/chatbot/motd_updater.py:21 +msgid "No MOTD file for {} found, pulling from web admin!" +msgstr "" + +#: magicked_admin/chatbot/motd_updater.py:40 +msgid "Updated the MOTD!" +msgstr "" + +#: magicked_admin/chatbot/motd_updater.py:53 +msgid "Scoreboard_type not recognised '{}'. Options are: dosh, kills" +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:18 +msgid "You're not authorised to use that command" +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:21 +msgid "" +"This action isn't supported without Killing Floor 2 Magicked " +"Administrator's server side patch! Please review the documentation at " +"'{}' for guidance." +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:28 +msgid "The help text for this command hasn't been written!" +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:30 +msgid "$" +msgstr "" + +#: magicked_admin/chatbot/commands/command.py:56 +msgid "Auth failure, username: {}, user flags: {:b}" +msgstr "" + +#: magicked_admin/chatbot/commands/command_map.py:16 msgid "start_jc" msgstr "" -#: magicked_admin/chatbot/command_map.py:30 +#: magicked_admin/chatbot/commands/command_map.py:17 msgid "stop_jc" msgstr "" -#: magicked_admin/chatbot/command_map.py:31 +#: magicked_admin/chatbot/commands/command_map.py:18 msgid "start_wc" msgstr "" -#: magicked_admin/chatbot/command_map.py:32 +#: magicked_admin/chatbot/commands/command_map.py:19 msgid "stop_wc" msgstr "" -#: magicked_admin/chatbot/command_map.py:33 +#: magicked_admin/chatbot/commands/command_map.py:20 msgid "start_tc" msgstr "" -#: magicked_admin/chatbot/command_map.py:34 +#: magicked_admin/chatbot/commands/command_map.py:21 msgid "stop_tc" msgstr "" -#: magicked_admin/chatbot/command_map.py:35 +#: magicked_admin/chatbot/commands/command_map.py:22 msgid "start_trc" msgstr "" -#: magicked_admin/chatbot/command_map.py:36 +#: magicked_admin/chatbot/commands/command_map.py:23 msgid "stop_trc" msgstr "" -#: magicked_admin/chatbot/command_map.py:37 +#: magicked_admin/chatbot/commands/command_map.py:24 msgid "enforce_dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:38 +#: magicked_admin/chatbot/commands/command_map.py:25 msgid "say" msgstr "" -#: magicked_admin/chatbot/command_map.py:39 +#: magicked_admin/chatbot/commands/command_map.py:26 msgid "restart" msgstr "" -#: magicked_admin/chatbot/command_map.py:40 +#: magicked_admin/chatbot/commands/command_map.py:27 msgid "load_map" msgstr "" -#: magicked_admin/chatbot/command_map.py:41 +#: magicked_admin/chatbot/commands/command_map.py:28 msgid "password" msgstr "" -#: magicked_admin/chatbot/command_map.py:42 +#: magicked_admin/chatbot/commands/command_map.py:29 msgid "silent" msgstr "" -#: magicked_admin/chatbot/command_map.py:43 +#: magicked_admin/chatbot/commands/command_map.py:30 msgid "run" msgstr "" -#: magicked_admin/chatbot/command_map.py:44 +#: magicked_admin/chatbot/commands/command_map.py:31 +msgid "marquee" +msgstr "" + +#: magicked_admin/chatbot/commands/command_map.py:32 msgid "length" msgstr "" -#: magicked_admin/chatbot/command_map.py:45 +#: magicked_admin/chatbot/commands/command_map.py:33 msgid "difficulty" msgstr "" -#: magicked_admin/chatbot/command_map.py:46 +#: magicked_admin/chatbot/commands/command_map.py:34 msgid "game_mode" msgstr "" -#: magicked_admin/chatbot/command_map.py:47 +#: magicked_admin/chatbot/commands/command_map.py:35 msgid "players" msgstr "" -#: magicked_admin/chatbot/command_map.py:48 +#: magicked_admin/chatbot/commands/command_map.py:36 msgid "kick" msgstr "" -#: magicked_admin/chatbot/command_map.py:49 +#: magicked_admin/chatbot/commands/command_map.py:37 msgid "ban" msgstr "" -#: magicked_admin/chatbot/command_map.py:50 +#: magicked_admin/chatbot/commands/command_map.py:38 msgid "op" msgstr "" -#: magicked_admin/chatbot/command_map.py:51 +#: magicked_admin/chatbot/commands/command_map.py:39 msgid "deop" msgstr "" -#: magicked_admin/chatbot/command_map.py:52 -msgid "marquee" +#: magicked_admin/chatbot/commands/command_map.py:40 +msgid "update_motd" +msgstr "" + +#: magicked_admin/chatbot/commands/command_map.py:41 +msgid "reload_motd" msgstr "" -#: magicked_admin/chatbot/command_map.py:55 +#: magicked_admin/chatbot/commands/command_map.py:44 msgid "commands" msgstr "" -#: magicked_admin/chatbot/command_map.py:56 +#: magicked_admin/chatbot/commands/command_map.py:45 msgid "record_wave" msgstr "" -#: magicked_admin/chatbot/command_map.py:57 +#: magicked_admin/chatbot/commands/command_map.py:46 msgid "game" msgstr "" -#: magicked_admin/chatbot/command_map.py:58 +#: magicked_admin/chatbot/commands/command_map.py:47 msgid "kills" msgstr "" -#: magicked_admin/chatbot/command_map.py:59 +#: magicked_admin/chatbot/commands/command_map.py:48 msgid "dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:60 +#: magicked_admin/chatbot/commands/command_map.py:49 msgid "top_kills" msgstr "" -#: magicked_admin/chatbot/command_map.py:61 +#: magicked_admin/chatbot/commands/command_map.py:50 msgid "top_dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:62 +#: magicked_admin/chatbot/commands/command_map.py:51 msgid "top_time" msgstr "" -#: magicked_admin/chatbot/command_map.py:63 +#: magicked_admin/chatbot/commands/command_map.py:52 msgid "top_wave_kills" msgstr "" -#: magicked_admin/chatbot/command_map.py:64 +#: magicked_admin/chatbot/commands/command_map.py:53 msgid "top_wave_dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:65 +#: magicked_admin/chatbot/commands/command_map.py:54 msgid "stats" msgstr "" -#: magicked_admin/chatbot/command_map.py:66 +#: magicked_admin/chatbot/commands/command_map.py:55 msgid "game_time" msgstr "" -#: magicked_admin/chatbot/command_map.py:67 +#: magicked_admin/chatbot/commands/command_map.py:56 msgid "server_kills" msgstr "" -#: magicked_admin/chatbot/command_map.py:68 +#: magicked_admin/chatbot/commands/command_map.py:57 msgid "server_dosh" msgstr "" -#: magicked_admin/chatbot/command_map.py:69 +#: magicked_admin/chatbot/commands/command_map.py:58 msgid "map" msgstr "" -#: magicked_admin/chatbot/command_map.py:70 +#: magicked_admin/chatbot/commands/command_map.py:59 msgid "maps" msgstr "" -#: magicked_admin/chatbot/command_map.py:71 +#: magicked_admin/chatbot/commands/command_map.py:60 msgid "player_count" msgstr "" -#: magicked_admin/chatbot/command_map.py:72 +#: magicked_admin/chatbot/commands/command_map.py:61 msgid "scoreboard" msgstr "" -#: magicked_admin/chatbot/command_map.py:73 +#: magicked_admin/chatbot/commands/command_map.py:62 msgid "sb" msgstr "" -#: magicked_admin/chatbot/command_scheduler.py:55 -msgid "Stopped {} command(s)" -msgstr "" - -#: magicked_admin/chatbot/command_scheduler.py:58 -msgid "None running" -msgstr "" - -#: magicked_admin/chatbot/command_scheduler.py:106 -msgid "Scheduled command ({}) ran directly by {}, please use CommandScheduler" -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:18 -msgid "You're not authorised to use that command" -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:21 -msgid "" -"This action isn't supported without Killing Floor 2 Magicked " -"Administrator's server side patch! Please review the documentation at " -"'{}' for guidance." -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:28 -msgid "The help text for this command hasn't been written!" -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:30 -msgid "$" -msgstr "" - -#: magicked_admin/chatbot/commands/command.py:56 -msgid "Auth failure, username: {}, user flags: {:b}" -msgstr "" - -#: magicked_admin/chatbot/commands/event_commands.py:15 +#: magicked_admin/chatbot/commands/event_commands.py:16 msgid "" "Usage: !start_jc COMMAND\n" "\tCOMMAND - Command to run\n" "Desc: Runs a command when a player joins the match" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:32 -#: magicked_admin/chatbot/commands/event_commands.py:98 -#: magicked_admin/chatbot/commands/event_commands.py:166 -#: magicked_admin/chatbot/commands/event_commands.py:222 +#: magicked_admin/chatbot/commands/event_commands.py:33 +#: magicked_admin/chatbot/commands/event_commands.py:99 +#: magicked_admin/chatbot/commands/event_commands.py:167 +#: magicked_admin/chatbot/commands/event_commands.py:223 msgid "Please specify a command to run" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:41 +#: magicked_admin/chatbot/commands/event_commands.py:42 msgid "Player join command started" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:49 +#: magicked_admin/chatbot/commands/event_commands.py:50 msgid "" "Usage: !stop_jc\n" "Desc: Stops all join commands" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:70 +#: magicked_admin/chatbot/commands/event_commands.py:71 msgid "" "Usage: !start_wc [--wave] COMMAND\n" "\t-w --wave - Optional, wave to run on\n" @@ -360,22 +376,22 @@ msgid "" "on every wave" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:90 -#: magicked_admin/chatbot/commands/event_commands.py:230 +#: magicked_admin/chatbot/commands/event_commands.py:91 +#: magicked_admin/chatbot/commands/event_commands.py:231 msgid "'{}' is not a valid wave number" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:105 +#: magicked_admin/chatbot/commands/event_commands.py:106 msgid "Wave start command started" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:113 +#: magicked_admin/chatbot/commands/event_commands.py:114 msgid "" "Usage: !stop_wc\n" "Desc: Stops all wave commands" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:134 +#: magicked_admin/chatbot/commands/event_commands.py:135 msgid "" "Usage: !start_tc [-r -t] COMMAND\n" "\tCOMMAND - Command to run\n" @@ -384,25 +400,25 @@ msgid "" "Desc: Runs a command after some time delay" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:152 +#: magicked_admin/chatbot/commands/event_commands.py:153 msgid "Please specify a time interval, '!start_tc -h' for help" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:160 +#: magicked_admin/chatbot/commands/event_commands.py:161 msgid "'{}' is not a valid time interval" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:175 +#: magicked_admin/chatbot/commands/event_commands.py:176 msgid "Time interval command started" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:183 +#: magicked_admin/chatbot/commands/event_commands.py:184 msgid "" "Usage: !stop_tc\n" "Desc: Stops all timed commands" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:204 +#: magicked_admin/chatbot/commands/event_commands.py:205 msgid "" "Usage: !start_trc [--wave] COMMAND\n" "\tCOMMAND - Command to run\n" @@ -411,11 +427,11 @@ msgid "" "every time the trader opens" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:238 +#: magicked_admin/chatbot/commands/event_commands.py:239 msgid "Trader open command started" msgstr "" -#: magicked_admin/chatbot/commands/event_commands.py:246 +#: magicked_admin/chatbot/commands/event_commands.py:247 msgid "" "Usage: !stop_trc\n" "Desc: Stops all trader commands" @@ -464,7 +480,7 @@ msgid "" msgstr "" #: magicked_admin/chatbot/commands/info_commands.py:144 -#: magicked_admin/chatbot/commands/server_commands.py:169 +#: magicked_admin/chatbot/commands/server_commands.py:168 msgid "" "Usage: !map\n" "Desc: Shows statistics about the current map" @@ -560,12 +576,12 @@ msgid "" "personal stats" msgstr "" -#: magicked_admin/chatbot/commands/player_commands.py:79 -msgid "You've killed a total of {} ZEDs (#{}), and {} this game" +#: magicked_admin/chatbot/commands/player_commands.py:78 +msgid "Player {} not in game" msgstr "" -#: magicked_admin/chatbot/commands/player_commands.py:89 -msgid "Player {} not in game" +#: magicked_admin/chatbot/commands/player_commands.py:83 +msgid "You've killed a total of {} ZEDs (#{}), and {} this game" msgstr "" #: magicked_admin/chatbot/commands/player_commands.py:97 @@ -576,12 +592,12 @@ msgid "" "personal stats" msgstr "" -#: magicked_admin/chatbot/commands/player_commands.py:117 -msgid "You've earned a total of £{} dosh (#{}), and £{} this game" +#: magicked_admin/chatbot/commands/player_commands.py:115 +msgid "Player not in game" msgstr "" -#: magicked_admin/chatbot/commands/player_commands.py:127 -msgid "Player not in game" +#: magicked_admin/chatbot/commands/player_commands.py:119 +msgid "You've earned a total of £{} dosh (#{}), and £{} this game" msgstr "" #: magicked_admin/chatbot/commands/player_commands.py:134 @@ -656,137 +672,174 @@ msgid "" msgstr "" #: magicked_admin/chatbot/commands/server_commands.py:32 -#: magicked_admin/chatbot/commands/server_commands.py:90 -#: magicked_admin/chatbot/commands/server_commands.py:126 -#: magicked_admin/chatbot/commands/server_commands.py:245 +#: magicked_admin/chatbot/commands/server_commands.py:89 +#: magicked_admin/chatbot/commands/server_commands.py:125 +#: magicked_admin/chatbot/commands/server_commands.py:259 msgid "Missing argument, username or Steam ID" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:39 -msgid "Player, {}, was banned" +#: magicked_admin/chatbot/commands/server_commands.py:37 +#: magicked_admin/chatbot/commands/server_commands.py:264 +msgid "Player not found" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:42 -#: magicked_admin/chatbot/commands/server_commands.py:255 -msgid "Player not found" +#: magicked_admin/chatbot/commands/server_commands.py:40 +msgid "Player, {}, was banned" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:49 +#: magicked_admin/chatbot/commands/server_commands.py:48 msgid "" "Usage: !say MESSAGE\n" "\tMESSAGE - Message to echo\n" "Desc: Echos a message in chat" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:74 +#: magicked_admin/chatbot/commands/server_commands.py:73 msgid "" "Usage: !op USERNAME\n" "\tUSERNAME - Player to give operator status\n" "Desc: Allows a player to use admin commands" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:95 -#: magicked_admin/chatbot/commands/server_commands.py:131 +#: magicked_admin/chatbot/commands/server_commands.py:94 +#: magicked_admin/chatbot/commands/server_commands.py:130 msgid "Couldn't find player '{}'" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:98 +#: magicked_admin/chatbot/commands/server_commands.py:97 msgid "Oped {}" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:109 +#: magicked_admin/chatbot/commands/server_commands.py:108 msgid "" "Usage: !deop USERNAME\n" "\tUSERNAME - Player to revoke op status for\n" "Desc: Revokes a players ability to use admin commands" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:134 +#: magicked_admin/chatbot/commands/server_commands.py:133 msgid "Deoped {}" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:145 +#: magicked_admin/chatbot/commands/server_commands.py:144 msgid "" "Usage: !maps [--all]\n" "\t-a --all - Show all available maps\n" "Desc: Shows maps that are in the map cycle" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:197 +#: magicked_admin/chatbot/commands/server_commands.py:196 msgid "Stats for {}:\n" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:198 +#: magicked_admin/chatbot/commands/server_commands.py:197 msgid "Total plays: {} \n" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:199 +#: magicked_admin/chatbot/commands/server_commands.py:198 msgid "Record wave: {} \n" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:200 +#: magicked_admin/chatbot/commands/server_commands.py:199 msgid "Survival wins: {} \n" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:209 +#: magicked_admin/chatbot/commands/server_commands.py:208 msgid "" -"Usage: !enforce_dosh\n" -"Desc: Kicks players with more dosh than the threshold configured in " -"'conf/magicked_admin.conf'" +"Usage: !enforce_dosh AMOUNT\n" +"\tAMOUNT - Kicks players over this amount\n" +"Desc: Kicks players with more dosh than the amount specified" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:223 +msgid "Please specify a maximum amount of dosh" msgstr "" #: magicked_admin/chatbot/commands/server_commands.py:230 +msgid "'{}' is not a valid number" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:244 msgid "" "Usage: !kick USERNAME\n" "\tUSERNAME - Player to kick\n" "Desc: Kicks a player from the match" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:252 +#: magicked_admin/chatbot/commands/server_commands.py:267 msgid "Player, {}, was kicked" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:263 +#: magicked_admin/chatbot/commands/server_commands.py:278 +msgid "" +"Usage: !update_motd TYPE\n" +"\tTYPE - Score type, one of: kills, dosh, time\n" +"Desc: Updates the MOTD scoreboard" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:290 +msgid "Missing argument: type" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:294 +msgid "Unrecognised score type: {}" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:300 +msgid "Updated the MOTD" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:310 +msgid "" +"Usage: !reload_motd\n" +"Desc: Reload the server's *.motd file" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:323 +msgid "Reloaded the MOTD" +msgstr "" + +#: magicked_admin/chatbot/commands/server_commands.py:332 msgid "" "Usage: !run FILE\n" "\tFILE - Some file in 'conf/scripts'\n" "Desc: Runs a script" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:278 +#: magicked_admin/chatbot/commands/server_commands.py:347 msgid "No script was specified" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:283 +#: magicked_admin/chatbot/commands/server_commands.py:352 msgid "Script not found" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:292 +#: magicked_admin/chatbot/commands/server_commands.py:361 msgid "" "Usage: !restart\n" "Desc: Restarts the match" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:303 +#: magicked_admin/chatbot/commands/server_commands.py:372 msgid "Restarting map..." msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:310 +#: magicked_admin/chatbot/commands/server_commands.py:379 msgid "" "Usage: !load_map MAP_NAME\n" "\tMAP_NAME - Map to load\n" "Desc: Immediately changes the map." msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:323 +#: magicked_admin/chatbot/commands/server_commands.py:392 msgid "Missing argument (map name)" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:326 +#: magicked_admin/chatbot/commands/server_commands.py:395 msgid "Changing map" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:333 +#: magicked_admin/chatbot/commands/server_commands.py:402 msgid "" "Usage: !password [--set] STATE\n" "\tSTATE - On, off, or new password\n" @@ -795,93 +848,93 @@ msgid "" "'conf/magicked_admin.conf', state can be on, off, or a new password." msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:352 +#: magicked_admin/chatbot/commands/server_commands.py:421 msgid "Game password is currently {}" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:353 +#: magicked_admin/chatbot/commands/server_commands.py:422 msgid "enabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:353 +#: magicked_admin/chatbot/commands/server_commands.py:422 msgid "disabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:364 +#: magicked_admin/chatbot/commands/server_commands.py:433 msgid "Game password enabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:368 +#: magicked_admin/chatbot/commands/server_commands.py:437 msgid "Game password disabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:371 +#: magicked_admin/chatbot/commands/server_commands.py:440 msgid "Unrecognised option {}" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:381 +#: magicked_admin/chatbot/commands/server_commands.py:450 msgid "" "Usage: !silent [--quiet]\n" "\t-q --quiet - Suppresses output'\n" "Desc: Toggles command output globally" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:394 +#: magicked_admin/chatbot/commands/server_commands.py:463 msgid "Silent mode disabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:396 +#: magicked_admin/chatbot/commands/server_commands.py:465 msgid "Silent mode enabled" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:410 +#: magicked_admin/chatbot/commands/server_commands.py:479 msgid "" "Usage: !length LENGTH\n" "\tLENGTH - Length to change to\n" "Desc: Changes the game length next match" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:423 -#: magicked_admin/chatbot/commands/server_commands.py:435 +#: magicked_admin/chatbot/commands/server_commands.py:492 +#: magicked_admin/chatbot/commands/server_commands.py:504 msgid "Length not recognised, options are: short, medium, or long" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:442 +#: magicked_admin/chatbot/commands/server_commands.py:511 msgid "Length change will take effect next game" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:451 +#: magicked_admin/chatbot/commands/server_commands.py:520 msgid "" "Usage: !difficulty DIFFICULTY\n" "\tDIFFICULTY - Difficulty to change to\n" "Desc: Changes the difficulty next match" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:464 -#: magicked_admin/chatbot/commands/server_commands.py:478 +#: magicked_admin/chatbot/commands/server_commands.py:533 +#: magicked_admin/chatbot/commands/server_commands.py:547 msgid "Difficulty not recognised, options are: normal, hard, suicidal, or hell" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:485 +#: magicked_admin/chatbot/commands/server_commands.py:554 msgid "Difficulty change will take effect next game" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:494 +#: magicked_admin/chatbot/commands/server_commands.py:563 msgid "" "Usage: !game_mode MODE\n" "\tMODE - Mode to change to\n" "Desc: Immediately changes the game mode" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:508 +#: magicked_admin/chatbot/commands/server_commands.py:577 msgid "Mode not recognised, options are: endless, survival, weekly or versus" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:523 +#: magicked_admin/chatbot/commands/server_commands.py:592 msgid "GameMode not recognised, options are: endless, survival, weekly or versus" msgstr "" -#: magicked_admin/chatbot/commands/server_commands.py:530 +#: magicked_admin/chatbot/commands/server_commands.py:599 msgid "Game mode will be changed to {}" msgstr "" @@ -906,24 +959,12 @@ msgid "" "Plays weekly: {}" msgstr "" -#: magicked_admin/server/game_tracker.py:56 +#: magicked_admin/server/game_tracker.py:55 msgid "" "Game type ({}) support not installed, please patch your webadmin to " "correct this! Guidance is available at: {}" msgstr "" -#: magicked_admin/server/motd_updater.py:23 -msgid "No MOTD file for {} found, pulling from web admin!" -msgstr "" - -#: magicked_admin/server/motd_updater.py:45 -msgid "Updated the MOTD!" -msgstr "" - -#: magicked_admin/server/motd_updater.py:62 -msgid "Scoreboard_type not recognised '{}' for {}. Options are: dosh, kills" -msgstr "" - #: magicked_admin/server/player.py:38 magicked_admin/utils/net.py:59 msgid "Unknown" msgstr "" @@ -936,82 +977,82 @@ msgid "" "Steam ID:{}" msgstr "" -#: magicked_admin/server/server.py:20 -msgid "Connecting to {} ({})..." -msgstr "" - -#: magicked_admin/server/server.py:22 -msgid "Connected to {} ({})" -msgstr "" - -#: magicked_admin/server/server.py:91 +#: magicked_admin/server/server.py:77 msgid "Flushing players on {}" msgstr "" -#: magicked_admin/server/server.py:96 +#: magicked_admin/server/server.py:82 msgid "Writing game to database ({})" msgstr "" -#: magicked_admin/server/server.py:195 +#: magicked_admin/server/server.py:173 msgid "Player {} joined {} from {}" msgstr "" -#: magicked_admin/server/server.py:208 +#: magicked_admin/server/server.py:190 msgid "Player {} left {}" msgstr "" -#: magicked_admin/server/server.py:217 +#: magicked_admin/server/server.py:203 msgid "Player {} died on {}" msgstr "" -#: magicked_admin/server/server.py:221 +#: magicked_admin/server/server.py:207 msgid "New game on {}, map: {}, mode: {}" msgstr "" -#: magicked_admin/server/server.py:238 +#: magicked_admin/server/server.py:224 msgid "Unknown game_type {}" msgstr "" -#: magicked_admin/server/server.py:245 +#: magicked_admin/server/server.py:231 msgid "End game on {}, map: {}, mode: {}, victory: {}" msgstr "" -#: magicked_admin/utils/__init__.py:22 +#: magicked_admin/utils/__init__.py:102 msgid "" "\n" "Press enter to exit..." msgstr "" -#: magicked_admin/web_admin/web_admin.py:93 +#: magicked_admin/web_admin/web_admin.py:86 msgid "Tried to toggle game password before setting value" msgstr "" -#: magicked_admin/web_admin/web_admin.py:380 +#: magicked_admin/web_admin/web_admin.py:362 msgid "Couldn't find identify player: {}" msgstr "" -#: magicked_admin/web_admin/web_interface.py:60 -#: magicked_admin/web_admin/web_interface.py:99 +#: magicked_admin/web_admin/web_interface.py:15 +msgid "Connecting to {} ({})..." +msgstr "" + +#: magicked_admin/web_admin/web_interface.py:47 +msgid "Connected to {} ({})" +msgstr "" + +#: magicked_admin/web_admin/web_interface.py:62 +#: magicked_admin/web_admin/web_interface.py:101 msgid "Session killed, renewing!" msgstr "" -#: magicked_admin/web_admin/web_interface.py:122 +#: magicked_admin/web_admin/web_interface.py:124 msgid "Web admin not responding, sleeping" msgstr "" -#: magicked_admin/web_admin/web_interface.py:127 +#: magicked_admin/web_admin/web_interface.py:129 msgid "Web admin is back, resuming" msgstr "" -#: magicked_admin/web_admin/web_interface.py:163 +#: magicked_admin/web_admin/web_interface.py:165 msgid "Login failure, bad credentials or login attempts exceeded." msgstr "" -#: magicked_admin/web_admin/web_interface.py:168 +#: magicked_admin/web_admin/web_interface.py:170 msgid "Detected KF2-MA install on server." msgstr "" -#: magicked_admin/web_admin/web_interface.py:171 +#: magicked_admin/web_admin/web_interface.py:172 msgid "" "KF2-MA install not detected on server side! Consequently, only Survival " "mode will function fully." From b7100285a35ea159ac5bc760ce3ab4c36a4217c1 Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 23:02:41 +0100 Subject: [PATCH 32/33] Update pull_request_template.md --- .github/pull_request_template.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 27e869c6..21ea6e46 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -10,14 +10,13 @@ Please delete options that are not relevant. - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] This change requires a documentation update # Checklist: - [ ] Follows the style guidelines of this project - [ ] Corresponding changes to the documentation and help texts -- [ ] Generates no new warnings +- [ ] Updated relevant locale files `make i18n-init` - [ ] Added tests - [ ] Pytests and linter passes - [ ] Added relevant labels to the pull request From 561404cb2c79a5c4211aca84bef99ccf5b9f7685 Mon Sep 17 00:00:00 2001 From: the_z Date: Sun, 13 Oct 2019 23:04:06 +0100 Subject: [PATCH 33/33] Update bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 33f4b058..9666bd1f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -24,12 +24,13 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - - OS: [e.g. Windows] + - OS: [e.g. Windows 10] - KF2-MA version: [e.g. 0.1.3] **Server (please complete the following information):** - Mods: [e.g. ControlledDifficulty] - Web admin resource modifications: [e.g. Perk levels on info page] + - Applied web-admin patches: [e.g. Yes] **Log** ```