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)