from bot import loaded_modules_dict from bot.constants import TELNET_TIMEOUT_VERY_SHORT from os import path, pardir from time import sleep, time import re module_name = path.basename(path.normpath(path.join(path.abspath(__file__), pardir, pardir))) action_name = path.basename(path.abspath(__file__))[:-3] def main_function(module, event_data, dispatchers_steamid=None): timeout = TELNET_TIMEOUT_VERY_SHORT timeout_start = time() event_data[1]["action_identifier"] = action_name event_data[1]["fail_reason"] = [] if module.telnet.add_telnet_command_to_queue("admin list"): poll_is_finished = False # Updated regex for modern 7D2D server format (V 2.x+) # New format: "Defined User Permissions:" and SteamIDs have "Steam_" prefix # Timestamps are still present in "Executing command" lines regex = ( r"(?P\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})\s(?P[-+]?\d*\.\d+|\d+)\s" r"INF Executing\scommand\s\'admin list\'\sby\sTelnet\sfrom\s(?P.*?)\r?\n" r"(?PDefined User Permissions:[\s\S]*?(?=Defined Group Permissions:))" ) while not poll_is_finished and (time() < timeout_start + timeout): sleep(0.25) match = False for match in re.finditer(regex, module.telnet.telnet_buffer, re.DOTALL): poll_is_finished = True if match: module.callback_success(callback_success, module, event_data, dispatchers_steamid, match) return event_data[1]["fail_reason"].append("action timed out") else: event_data[1]["fail_reason"].append("action already queued up") module.callback_fail(callback_fail, module, event_data, dispatchers_steamid) def callback_success(module, event_data, dispatchers_steamid, match=None): # Updated regex for modern format with "Steam_" prefix # Example: " 0: Steam_76561198040658370 (stored name: MOTKU)" regex = ( r"(?:^\s{0,7})(?P\d{1,2})\:\s+Steam_(?P\d{17})" ) raw_adminlist = match.group("raw_adminlist") admin_dict = {} for m in re.finditer(regex, raw_adminlist, re.MULTILINE): admin_dict[m.group("steamid")] = m.group("level") module.dom.data.upsert({ module.get_module_identifier(): { "admins": admin_dict } }) disable_after_success = event_data[1]["disable_after_success"] if disable_after_success: module.disable_action(action_name) def callback_fail(module, event_data, dispatchers_steamid): pass action_meta = { "description": "gets a list of all admins and mods", "main_function": main_function, "callback_success": callback_success, "callback_fail": callback_fail, "requires_telnet_connection": True, "enabled": True } loaded_modules_dict["module_" + module_name].register_action(action_name, action_meta)