From 71216e5082346dc6824b50dd103fb264fb205f3d Mon Sep 17 00:00:00 2001 From: Ritabrata Das Date: Sat, 15 Feb 2025 18:58:01 +0530 Subject: Work on plugin apis, add command support --- lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py | 2 +- lib/Player.py | 3 + lib/discordSync.py | 8 +- lib/plugin_manager.py | 28 ++++- lib/triggerCommand.py | 13 +++ lib/triggerRespectiveHook.py | 127 ++++++++++++++++++++++ 6 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 lib/triggerCommand.py create mode 100644 lib/triggerRespectiveHook.py (limited to 'lib') diff --git a/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py b/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py index 1c683a5..4cd0f42 100644 --- a/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py +++ b/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py @@ -6,7 +6,7 @@ class FSNETCMD_TEXTMESSAGE: #32 self.buffer = buffer self.raw_message = None self.user = None - self.message = None + self.message = "" if should_decode: self.decode() diff --git a/lib/Player.py b/lib/Player.py index 747f8cd..7f54914 100644 --- a/lib/Player.py +++ b/lib/Player.py @@ -35,3 +35,6 @@ class Player: }) return True return False + + def __str__(self): + return f"Player {self.username} flying {self.aircraft.name} at {self.aircraft.position}" diff --git a/lib/discordSync.py b/lib/discordSync.py index fe5c37b..0a8e8be 100644 --- a/lib/discordSync.py +++ b/lib/discordSync.py @@ -89,6 +89,12 @@ async def monitor_channel(channel_id, playerList:list): playerList.remove(player) # Remove disconnected players continue player.streamWriterObject.write(encoded_msg) - await player.streamWriterObject.drain() + try: + await player.streamWriterObject.drain() + except Exception as e: + warning(f"Error while sending message to {player.username}: {e}") + if not player.is_a_bot: + asyncio.create_task(discord_send_message(channel_id, f"{player.username} has left the server!")) + playerList.remove(player) on_new_message(message) await asyncio.sleep(1) # Poll every second (adjust as needed) diff --git a/lib/plugin_manager.py b/lib/plugin_manager.py index 73c2ac1..ae4cf0b 100644 --- a/lib/plugin_manager.py +++ b/lib/plugin_manager.py @@ -1,7 +1,7 @@ import importlib import os import sys -from logging import info +from logging import info, warning PLUGIN_DIR = os.path.join(os.path.dirname(__file__), '../plugins') sys.path.append(PLUGIN_DIR) @@ -10,6 +10,8 @@ class PluginManager: def __init__(self): self.plugins = {} self.hooks= {} + self.commands = {} + self.help_message = "List of Available Commands:\n" self.load_plugins() def load_plugins(self): @@ -18,21 +20,20 @@ class PluginManager: if plugin.endswith('.py') and not plugin.startswith('__'): plugin_name = plugin[:-3] plugin_module = importlib.import_module(plugin_name) - if hasattr(plugin_module, 'Plugin'): - if plugin_module.ENABLED: + if hasattr(plugin_module, 'ENABLED') and plugin_module.ENABLED: + if hasattr(plugin_module, 'Plugin'): plugin_instance = plugin_module.Plugin() self.register_plugin(plugin_instance) info(f"Loaded plugin {plugin_name}") self.plugins[plugin_name] = plugin_instance elif os.path.isdir(plugin_path) and os.path.exists(os.path.join(plugin_path, '__init__.py')): plugin_module = importlib.import_module(plugin) - if hasattr(plugin_module, 'Plugin'): - if plugin_module.ENABLED: + if hasattr(plugin_module, 'ENABLED') and plugin_module.ENABLED: + if hasattr(plugin_module, 'Plugin'): plugin_instance = plugin_module.Plugin() self.register_plugin(plugin_instance) info(f"Loaded plugin {plugin}") self.plugins[plugin] = plugin_instance - def register_plugin(self, plugin): """Registers the plugin with the plugin manager""" @@ -44,6 +45,14 @@ class PluginManager: self.hooks[hook_name] = [] self.hooks[hook_name].append(callback) + def register_command(self, command_name, callback): + """Registers the command with the plugin manager""" + if command_name in self.commands: + warning(f"Command {command_name} already registered, Ignoring this registration") + else: + self.commands[command_name] = callback + self.help_message = self.help_message + f"/{command_name}\n" + def triggar_hook(self, hook_name, data, *args, **kwargs): """Triggars the callbacks for the hook. If a callback returns False, then the original data is set to None @@ -56,3 +65,10 @@ class PluginManager: if keep == False: keep_orignal = False return keep_orignal + + def trigger_command(self, command:str, player, full_message:str, message_to_client:list, message_to_server:list): + """Triggers the command""" + if command in self.commands: + self.commands[command](full_message, player, message_to_client, message_to_server) + return True + return False diff --git a/lib/triggerCommand.py b/lib/triggerCommand.py new file mode 100644 index 0000000..d6a6116 --- /dev/null +++ b/lib/triggerCommand.py @@ -0,0 +1,13 @@ +from config import * +from lib import YSchat +from logging import debug + +async def triggerCommand(command, full_message, player, message_to_client, message_to_server, plugin_manager): + debug(f"{player.username} triggered command {command}") + if command == "help": + message_to_client.append(YSchat.message(plugin_manager.help_message)) + return 0 + + h = plugin_manager.trigger_command(command, player, full_message , message_to_client, message_to_server) + if not h: + message_to_client.append(YSchat.message(f"Command not found, Type {PREFIX}help for all commands.")) diff --git a/lib/triggerRespectiveHook.py b/lib/triggerRespectiveHook.py new file mode 100644 index 0000000..25801a0 --- /dev/null +++ b/lib/triggerRespectiveHook.py @@ -0,0 +1,127 @@ +from logging import debug + +def triggerRespectiveHook(packet_type, packet, player, message_to_client, message_to_server, plugin_manager): + if packet_type == "FSNETCMD_LOGON": + keep_message = plugin_manager.triggar_hook('on_login', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_LOGOFF": + keep_message = plugin_manager.triggar_hook('on_logout', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_ERROR": + keep_message = plugin_manager.triggar_hook('on_error', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_LOADFIELD": + keep_message = plugin_manager.triggar_hook('on_load_field', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_ADDOBJECT": + keep_message = plugin_manager.triggar_hook('on_add_object', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_READBACK": + keep_message = plugin_manager.triggar_hook('on_readback', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_SMOKECOLOR": + keep_message = plugin_manager.triggar_hook('on_smoke_color', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_JOINREQUEST": + keep_message = plugin_manager.triggar_hook('on_join_request', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_JOINAPPROVAL": + keep_message = plugin_manager.triggar_hook('on_join_approval', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_REJECTJOINREQ": + keep_message = plugin_manager.triggar_hook('on_reject_join_request', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_AIRPLANESTATE": + keep_message = plugin_manager.triggar_hook('on_flight_data', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_UNJOIN": + keep_message = plugin_manager.triggar_hook('on_unjoin', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_REMOVEAIRPLANE": + keep_message = plugin_manager.triggar_hook('on_remove_airplane', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_REQUESTTESTAIRPLANE": + keep_message = plugin_manager.triggar_hook('on_request_test_airplane', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_KILLSERVER": + keep_message = plugin_manager.triggar_hook('on_kill_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_PREPARESIMULATION": + keep_message = plugin_manager.triggar_hook('on_prepare_simulation', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_TESTPACKET": + keep_message = plugin_manager.triggar_hook('on_test_packet', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_LOCKON": + keep_message = plugin_manager.triggar_hook('on_lockon', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_REMOVEGROUND": + keep_message = plugin_manager.triggar_hook('on_remove_ground', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_MISSILELAUNCH": + keep_message = plugin_manager.triggar_hook('on_missile_launch', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_GETDAMAGE": + keep_message = plugin_manager.triggar_hook('on_get_damage', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_WEAPONCONFIG": + keep_message = plugin_manager.triggar_hook('on_weapon_config', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_AIRCMD": + keep_message = plugin_manager.triggar_hook('on_air_cmd', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_TEXTMESSAGE": + keep_message = plugin_manager.triggar_hook('on_chat', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_ENVIRONMENT": + keep_message = plugin_manager.triggar_hook('on_environment', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_SKYCOLOR": + keep_message = plugin_manager.triggar_hook('on_sky_color', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_FOGCOLOR": + keep_message = plugin_manager.triggar_hook('on_fog_color', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_LIST": + keep_message = plugin_manager.triggar_hook('on_list', packet, player, message_to_client, message_to_server) + else: + keep_message = True + debug(f"Unknown packet type {packet_type}, C2S") + + return keep_message + +def triggerRespectiveHookServer(packet_type, packet, player, message_to_client, message_to_server, plugin_manager): + if packet_type == "FSNETCMD_LOGON": + keep_message = plugin_manager.triggar_hook('on_login_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_LOGOFF": + keep_message = plugin_manager.triggar_hook('on_logout_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_ERROR": + keep_message = plugin_manager.triggar_hook('on_error_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_LOADFIELD": + keep_message = plugin_manager.triggar_hook('on_load_field_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_ADDOBJECT": + keep_message = plugin_manager.triggar_hook('on_add_object_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_READBACK": + keep_message = plugin_manager.triggar_hook('on_readback_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_SMOKECOLOR": + keep_message = plugin_manager.triggar_hook('on_smoke_color_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_JOINREQUEST": + keep_message = plugin_manager.triggar_hook('on_join_request_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_JOINAPPROVAL": + keep_message = plugin_manager.triggar_hook('on_join_approval_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_REJECTJOINREQ": + keep_message = plugin_manager.triggar_hook('on_reject_join_request_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_AIRPLANESTATE": + keep_message = plugin_manager.triggar_hook('on_flight_data_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_UNJOIN": + keep_message = plugin_manager.triggar_hook('on_unjoin_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_REMOVEAIRPLANE": + keep_message = plugin_manager.triggar_hook('on_remove_airplane_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_REQUESTTESTAIRPLANE": + keep_message = plugin_manager.triggar_hook('on_request_test_airplane_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_KILLSERVER": + keep_message = plugin_manager.triggar_hook('on_kill_server_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_PREPARESIMULATION": + keep_message = plugin_manager.triggar_hook('on_prepare_simulation_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_TESTPACKET": + keep_message = plugin_manager.triggar_hook('on_test_packet_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_LOCKON": + keep_message = plugin_manager.triggar_hook('on_lockon_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_REMOVEGROUND": + keep_message = plugin_manager.triggar_hook('on_remove_ground_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_MISSILELAUNCH": + keep_message = plugin_manager.triggar_hook('on_missile_launch_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_GETDAMAGE": + keep_message = plugin_manager.triggar_hook('on_get_damage_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_WEAPONCONFIG": + keep_message = plugin_manager.triggar_hook('on_weapon_config_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_AIRCMD": + keep_message = plugin_manager.triggar_hook('on_air_cmd_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_TEXTMESSAGE": + keep_message = plugin_manager.triggar_hook('on_chat_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_ENVIRONMENT": + keep_message = plugin_manager.triggar_hook('on_environment_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_SKYCOLOR": + keep_message = plugin_manager.triggar_hook('on_sky_color_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_FOGCOLOR": + keep_message = plugin_manager.triggar_hook('on_fog_color_server', packet, player, message_to_client, message_to_server) + elif packet_type == "FSNETCMD_LIST": + keep_message = plugin_manager.triggar_hook('on_list_server', packet, player, message_to_client, message_to_server) + else: + keep_message = True + debug(f"Unknown packet type {packet_type}, S2C") + + return keep_message -- cgit v1.2.3