Files
chrani-bot-tng/bot/modules/telnet/widgets/telnet_log_widget.py
2025-11-21 07:26:02 +01:00

234 lines
7.6 KiB
Python

from bot import loaded_modules_dict
from os import path, pardir
module_name = path.basename(path.normpath(path.join(path.abspath(__file__), pardir, pardir)))
widget_name = path.basename(path.abspath(__file__))[:-3]
# View Registry (mirrors locations menu pattern, but only one visible button here)
VIEW_REGISTRY = {
'frontend': {
'label_active': 'back',
'label_inactive': 'main',
'action': 'show_frontend',
'include_in_menu': False
},
'options': {
'label_active': 'back',
'label_inactive': 'options',
'action': 'show_options',
'include_in_menu': True
},
'test': {
'label_active': 'back',
'label_inactive': 'test',
'action': 'show_test',
'include_in_menu': True
}
}
def get_log_line_css_class(log_line):
css_classes = [
"log_line"
]
if r"INF Chat" in log_line:
css_classes.append("game_chat")
if r"(BCM) Command from" in log_line:
css_classes.append("bot_command")
if any([
r"joined the game" in log_line,
r"left the game" in log_line
]):
css_classes.append("player_logged")
return " ".join(css_classes)
def select_view(*args, **kwargs):
module = args[0]
dispatchers_steamid = kwargs.get('dispatchers_steamid', None)
current_view = module.get_current_view(dispatchers_steamid)
if current_view == "options":
options_view(module, dispatchers_steamid=dispatchers_steamid)
elif current_view == "test":
test_view(module, dispatchers_steamid=dispatchers_steamid)
else:
frontend_view(module, dispatchers_steamid=dispatchers_steamid)
def frontend_view(*args, **kwargs):
module = args[0]
dispatchers_steamid = kwargs.get("dispatchers_steamid", None)
telnet_log_frontend = module.templates.get_template('telnet_log_widget/view_frontend.html')
template_table_header = module.templates.get_template('telnet_log_widget/table_header.html')
log_line = module.templates.get_template('telnet_log_widget/log_line.html')
# new view menu (pattern from locations module)
template_view_menu = module.templates.get_template('telnet_log_widget/control_view_menu.html')
if len(module.webserver.connected_clients) >= 1:
telnet_lines = module.dom.data.get("module_telnet", {}).get("telnet_lines", {})
if len(telnet_lines) >= 1:
# Build log lines efficiently using list comprehension
log_lines_list = []
for line in reversed(telnet_lines):
css_class = get_log_line_css_class(line)
log_lines_list.append(module.template_render_hook(
module,
template=log_line,
log_line=line,
css_class=css_class
))
log_lines = ''.join(log_lines_list)
current_view = module.get_current_view(dispatchers_steamid)
options_toggle = module.template_render_hook(
module,
template=template_view_menu,
views=VIEW_REGISTRY,
current_view=current_view,
steamid=dispatchers_steamid
)
data_to_emit = module.template_render_hook(
module,
template=telnet_log_frontend,
options_toggle=options_toggle,
log_lines=log_lines,
table_header=module.template_render_hook(
module,
template=template_table_header
)
)
module.webserver.send_data_to_client_hook(
module,
payload=data_to_emit,
data_type="widget_content",
clients=[dispatchers_steamid],
method="update",
target_element={
"id": "telnet_log_widget",
"type": "table",
"selector": "body > main > div"
}
)
def options_view(*args, **kwargs):
module = args[0]
dispatchers_steamid = kwargs.get('dispatchers_steamid', None)
template_frontend = module.templates.get_template('telnet_log_widget/view_options.html')
template_view_menu = module.templates.get_template('telnet_log_widget/control_view_menu.html')
current_view = module.get_current_view(dispatchers_steamid)
options_toggle = module.template_render_hook(
module,
template=template_view_menu,
views=VIEW_REGISTRY,
current_view=current_view,
steamid=dispatchers_steamid
)
data_to_emit = module.template_render_hook(
module,
template=template_frontend,
options_toggle=options_toggle,
widget_options=module.options
)
module.webserver.send_data_to_client_hook(
module,
payload=data_to_emit,
data_type="widget_content",
clients=[dispatchers_steamid],
method="update",
target_element={
"id": "telnet_log_widget",
"type": "table",
"selector": "body > main > div"
}
)
def test_view(*args, **kwargs):
module = args[0]
dispatchers_steamid = kwargs.get('dispatchers_steamid', None)
template_test = module.templates.get_template('telnet_log_widget/view_test.html')
template_view_menu = module.templates.get_template('telnet_log_widget/control_view_menu.html')
current_view = module.get_current_view(dispatchers_steamid)
options_toggle = module.template_render_hook(
module,
template=template_view_menu,
views=VIEW_REGISTRY,
current_view=current_view,
steamid=dispatchers_steamid
)
data_to_emit = module.template_render_hook(
module,
template=template_test,
options_toggle=options_toggle
)
module.webserver.send_data_to_client_hook(
module,
payload=data_to_emit,
data_type="widget_content",
clients=[dispatchers_steamid],
method="update",
target_element={
"id": "telnet_log_widget",
"type": "table",
"selector": "body > main > div"
}
)
def update_widget(*args, **kwargs):
module = args[0]
updated_values_dict = kwargs.get("updated_values_dict", None)
# Iterate directly over connected clients (no need to convert to list)
for clientid in module.webserver.connected_clients.keys():
current_view = module.get_current_view(clientid)
if current_view == "frontend":
telnet_log_line = module.templates.get_template('telnet_log_widget/log_line.html')
css_class = get_log_line_css_class(updated_values_dict["telnet_lines"])
data_to_emit = module.template_render_hook(
module,
template=telnet_log_line,
log_line=updated_values_dict["telnet_lines"],
css_class=css_class
)
module.webserver.send_data_to_client_hook(
module,
method="prepend",
data_type="widget_content",
payload=data_to_emit,
clients=[clientid],
target_element={
"id": "telnet_log_widget",
"type": "table",
"selector": "body > main > div"
}
)
widget_meta = {
"description": "displays a bunch of telnet lines, updating in real time",
"main_widget": select_view,
"handlers": {
"module_telnet/visibility/%steamid%/current_view": select_view,
"module_telnet/telnet_lines": update_widget,
},
"enabled": True
}
loaded_modules_dict["module_" + module_name].register_widget(widget_name, widget_meta)