Files
chrani-bot-tng/bot/modules/players/actions/getadmins.py
2025-11-21 07:26:02 +01:00

80 lines
2.9 KiB
Python

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<datetime>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})\s(?P<stardate>[-+]?\d*\.\d+|\d+)\s"
r"INF Executing\scommand\s\'admin list\'\sby\sTelnet\sfrom\s(?P<called_by>.*?)\r?\n"
r"(?P<raw_adminlist>Defined 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<level>\d{1,2})\:\s+Steam_(?P<steamid>\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)