diff options
| -rw-r--r-- | README.md | 7 | ||||
| -rw-r--r-- | config.py | 13 | ||||
| -rw-r--r-- | lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py | 2 | ||||
| -rw-r--r-- | lib/Player.py | 3 | ||||
| -rw-r--r-- | lib/discordSync.py | 8 | ||||
| -rw-r--r-- | lib/plugin_manager.py | 28 | ||||
| -rw-r--r-- | lib/triggerCommand.py | 13 | ||||
| -rw-r--r-- | lib/triggerRespectiveHook.py | 127 | ||||
| -rw-r--r-- | plugins/chat_weather_setter.py | 54 | ||||
| -rw-r--r-- | plugins/command_test.py | 26 | ||||
| -rw-r--r-- | plugins/over_g_damage.py | 7 | ||||
| -rw-r--r-- | plugins/smoke_on_damage/Plugin.py | 22 | ||||
| -rw-r--r-- | proxy.py | 63 |
13 files changed, 313 insertions, 60 deletions
@@ -29,6 +29,7 @@ Sakuya AC and G Limiter at 20. It also has all the experimental options turned o - All features are server side, vanilla client can join - Supports clients post 20150425 version to join the server (Experimental) - Easy configuration via `config.py`. +- Plugin Support --- @@ -73,10 +74,8 @@ PROXY_PORT = 9000 # Port where the proxy listens --- ## **TODO :memo:** 1. Add more detection rules. -2. Negative g-values are wrong interpeted -3. Add more documentation. -4. Add radar features -5. Add Plugin API +2. Radar. +3. More documentation. --- ## **Contact** @@ -8,16 +8,25 @@ LOGGING_LEVEL = INFO # Server Configuration # Replace with the YSFlight server address SERVER_HOST = "127.0.0.1" -SERVER_PORT = 7914 # Please put where the normal YSFlight server is running +SERVER_PORT = 7915 # Please put where the normal YSFlight server is running # Port for the proxy server -PROXY_PORT = 7915 +PROXY_PORT = 9000 # Welcome Message to the playe # For formatting use {username} # eg. "Welcome {username} to the server!" # > Welcome Sakuya to the server! + WELCOME_MESSAGE = "Welcome {username} to the server!" +# Command Prefix for the server +# When commands are entered in chat, this will be treated +# as command when it starts with the prefix +# eg. if PREFIX = "/" +# /help will be treated as command + +PREFIX = "/" + # Native YSFlight Server # Please select the YSFlight server version for the # local ysflight server 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 diff --git a/plugins/chat_weather_setter.py b/plugins/chat_weather_setter.py index 4bcdf0b..5b31a38 100644 --- a/plugins/chat_weather_setter.py +++ b/plugins/chat_weather_setter.py @@ -11,9 +11,56 @@ class Plugin: def register(self, plugin_manager): self.plugin_manager = plugin_manager - self.plugin_manager.register_hook('on_chat', self.on_chat) + #self.plugin_manager.register_hook('on_chat', self.on_chat) self.plugin_manager.register_hook('on_environment_server', self.on_environment) + self.plugin_manager.register_command('fog', self.fog) + self.plugin_manager.register_command('sky', self.sky) + self.plugin_manager.register_command('time', self.time) + self.plugin_manager.register_command('vis', self.visibility) + def fog(self, full_message, player, message_to_client, message_to_server): + try: + args = list(map(int, full_message[4:].split(','))) + except: + message_to_client.append(FSNETCMD_TEXTMESSAGE.encode("Invalid fog argument, usage /fog r,g,b", True)) + return + fog_colour_packet = FSNETCMD_FOGCOLOR.encode(args[0], args[1], args[2], True) + message_to_client.append(fog_colour_packet) + + def sky(self, full_message, player, message_to_client, message_to_server): + try: + args = list(map(int, full_message[4:].split(','))) + except Exception as e: + message_to_client.append(FSNETCMD_TEXTMESSAGE.encode("Invalid sky argument, usage /sky r,g,b", True)) + return True + sky_colour_packet = FSNETCMD_SKYCOLOR.encode(args[0], args[1], args[2], True) + message_to_client.append(sky_colour_packet) + return True + + def time(self, full_message, player, message_to_client, message_to_server): + requested = full_message[6:].lower() + if requested == 'day' and self.initialWeather: + packet = FSNETCMD_ENVIRONMENT.set_time(self.initialWeather.buffer, False, True) + self.initialWeather = FSNETCMD_ENVIRONMENT(packet[4:]) + message_to_client.append(packet) + + elif requested == 'night' and self.initialWeather: + packet = FSNETCMD_ENVIRONMENT.set_time(self.initialWeather.buffer, True, True) + self.initialWeather = FSNETCMD_ENVIRONMENT(packet[4:]) + message_to_client.append(packet) + + else: + message_to_client.append(FSNETCMD_TEXTMESSAGE.encode("Invalid time argument, usage /time night or /time day", True)) + return True + + def visibility(self, full_message, player, message_to_client, message_to_server): + visibility = int(full_message[4:]) + returnpacket = FSNETCMD_ENVIRONMENT.set_visibility(self.initialWeather.buffer, visibility, True) + self.initialWeather = FSNETCMD_ENVIRONMENT(returnpacket[4:]) + message_to_client.append(returnpacket) + return True + + """ def on_chat(self, data, player, messages_to_client, *args): if ENABLED: message = FSNETCMD_TEXTMESSAGE(data).message @@ -44,9 +91,10 @@ class Plugin: self.initialWeather = FSNETCMD_ENVIRONMENT(returnpacket[4:]) messages_to_client.append(returnpacket) return False + """ + def on_environment(self, data, *args): """Store the initial weather packet for the server.""" - if ENABLED: - self.initialWeather = FSNETCMD_ENVIRONMENT(data) + self.initialWeather = FSNETCMD_ENVIRONMENT(data) return True diff --git a/plugins/command_test.py b/plugins/command_test.py new file mode 100644 index 0000000..6d8e8af --- /dev/null +++ b/plugins/command_test.py @@ -0,0 +1,26 @@ +""" +This is an example test command! +""" + +from lib import YSchat +from time import sleep + +ENABLED = False + +class Plugin: + def __init__(self): + self.plugin_manager = None + + def register(self, plugin_manager): + self.plugin_manager = plugin_manager + self.plugin_manager.register_command('test', self.test) + self.plugin_manager.register_command('timer', self.timer) + + def test(self, full_message, player, message_to_client, message_to_server): + message_to_client.append(YSchat.message("Test command received")) + return True + + def timer(self, full_message, player, message_to_client, message_to_server): + sleep(5) + message_to_client.append(YSchat.message("Timer ended")) + return True diff --git a/plugins/over_g_damage.py b/plugins/over_g_damage.py index aa44ca8..50c1b21 100644 --- a/plugins/over_g_damage.py +++ b/plugins/over_g_damage.py @@ -3,7 +3,10 @@ it exceeds the g-force limit set in the config file.""" from lib.PacketManager.packets import FSNETCMD_GETDAMAGE, FSNETCMD_TEXTMESSAGE from config import G_LIM import time -ENABLED = True + +# CONFIG +ENABLED = True # Enable or disable the plugin +INTERVAL = 0.3 # Interval of second before G Limit check is enforced class Plugin: def __init__(self): @@ -16,7 +19,7 @@ class Plugin: def on_receive(self, data, player, messages_to_client, *args): if ENABLED: if abs(player.aircraft.last_packet.g_value)> G_LIM: - if time.time() - player.aircraft.last_over_g_message > 1: # Only send every second. + if time.time() - player.aircraft.last_over_g_message > INTERVAL: player.aircraft.last_over_g_message = time.time() damage_packet = FSNETCMD_GETDAMAGE.encode(player.aircraft.id, 1, 1, diff --git a/plugins/smoke_on_damage/Plugin.py b/plugins/smoke_on_damage/Plugin.py index e6c57e2..08c184b 100644 --- a/plugins/smoke_on_damage/Plugin.py +++ b/plugins/smoke_on_damage/Plugin.py @@ -16,30 +16,30 @@ class Plugin: self.plugin_manager.register_hook('on_weapon_config', self.on_weapon_config) def on_flight_data(self, data, player,message_to_client, message_to_server): - """After the initial incoming flight packet, check whether + """After the initial incoming flight packet, check whether the health is below the threshold, if so add smoke""" - if ENABLED and SMOKE_PLANE and player.aircraft.life<SMOKE_LIFE: - + if SMOKE_PLANE and player.aircraft.life<SMOKE_LIFE: + #Add smoke to the plane smoke_packet = FSNETCMD_AIRPLANESTATE(data).smoke() #forward it on to the server - + message_to_server.append(smoke_packet) - - - + + + if not player.aircraft.damage_engine_warn_sent: player.aircraft.damage_engine_warn_sent = True #Warn the player message = "Your engine has been damaged! You can't turn on your afterburner!" message_to_client.append(FSNETCMD_TEXTMESSAGE.encode(message,True)) - + debug(f"Engine damage warning sent to {player.username}") - + message_to_client.append(FSNETCMD_AIRCMD.set_afterburner(player.aircraft.id, False, True)) - + return False - + def on_weapon_config(self, data, player, message_to_client, message_to_server): if ENABLED: player.aircraft.just_repaired = True @@ -6,7 +6,8 @@ Lisenced under GPLv3 import asyncio from struct import unpack, pack from lib.parseFlightData import parseFlightData -from lib import YSchat, YSviaversion, Player, Aircraft +from lib import YSchat, YSviaversion, Player, Aircraft, triggerCommand +from lib.triggerRespectiveHook import triggerRespectiveHook, triggerRespectiveHookServer from lib.plugin_manager import PluginManager from lib.PacketManager.PacketManager import PacketManager from lib.PacketManager.packets import * @@ -16,9 +17,6 @@ from config import * if DISCORD_ENABLED: from lib.discordSync import * import traceback -# TODO: Remove in Production -# from random import randint - # Configuration SERVER_HOST = SERVER_HOST SERVER_PORT = SERVER_PORT @@ -119,10 +117,11 @@ async def handle_client(client_reader, client_writer): try: + if packet_type == "FSNETCMD_LOGON": - keep_message = plugin_manager.triggar_hook('on_login', packet, player, message_to_client, message_to_server) - if not keep_message: - data = None + # keep_message = plugin_manager.triggar_hook('on_login', packet, player, message_to_client, message_to_server) + # if not keep_message: + # data = None player.login(FSNETCMD_LOGON(packet)) if player.version != YSF_VERSION and VIA_VERSION: info(f"ViaVersion enabled : Porting {player.username} from {player.version} to {YSF_VERSION}") @@ -134,11 +133,11 @@ async def handle_client(client_reader, client_writer): elif packet_type == "FSNETCMD_AIRPLANESTATE": player.aircraft.add_state(FSNETCMD_AIRPLANESTATE(packet)) #TODO: Do we want to convert all this to plugins? Probably not, but there is duplicated functionality - keep_message = plugin_manager.triggar_hook('on_flight_data', packet, player, message_to_client, message_to_server) - if not keep_message: - data = None + # keep_message = plugin_manager.triggar_hook('on_flight_data', packet, player, message_to_client, message_to_server) + # if not keep_message: + # data = None - elif player.aircraft.prev_life < player.aircraft.life and player.aircraft.prev_life != -1 and not player.aircraft.just_repaired: + if player.aircraft.prev_life < player.aircraft.life and player.aircraft.prev_life != -1 and not player.aircraft.just_repaired: cheatingMsg = YSchat.message(f"{HEALTH_HACK_MESSAGE} by {player.username}") warning(f"Health hack detected for {player.username}, Connected from {player.ip}") message_to_server.append(cheatingMsg) @@ -149,24 +148,35 @@ async def handle_client(client_reader, client_writer): player.aircraft.reset() elif packet_type == "FSNETCMD_WEAPONCONFIG": - keep_message = plugin_manager.triggar_hook('on_weapon_config', packet, player, message_to_client, message_to_server) - if not keep_message: - data = None + #keep_message = plugin_manager.triggar_hook('on_weapon_config', packet, player, message_to_client, message_to_server) + #if not keep_message: + # data = None + pass elif packet_type == "FSNETCMD_TEXTMESSAGE": msg = FSNETCMD_TEXTMESSAGE(packet) - keep_message = plugin_manager.triggar_hook('on_chat', packet, player, message_to_client, message_to_server) - if not keep_message: - data = None + # keep_message = plugin_manager.triggar_hook('on_chat', packet, player, message_to_client, message_to_server) + # if not keep_message: + # data = None + finalMsg = (f"{player.username} : {msg.message}") + if msg.message.startswith(PREFIX): + data = None + command = msg.message.split(" ")[0][1:] + asyncio.create_task(triggerCommand.triggerCommand(command, msg.message, player, message_to_client, message_to_server, plugin_manager)) if DISCORD_ENABLED: # Make it non blocking! asyncio.create_task(discord_send_message(CHANNEL_ID, finalMsg)) + elif packet_type == "FSNETCMD_LIST": - keep_message = plugin_manager.triggar_hook('on_list', packet, player, message_to_client, message_to_server) - if not keep_message: - data = None + # keep_message = plugin_manager.triggar_hook('on_list', packet, player, message_to_client, message_to_server) + # if not keep_message: + # data = None + pass + + keep_message = triggerRespectiveHook(packet_type, packet, player, message_to_client, message_to_server, plugin_manager) + if not keep_message: data = None except Exception as e: warning(f"Error parsing flight data: {e}", exc_info=True) @@ -176,6 +186,9 @@ async def handle_client(client_reader, client_writer): debug("S2C" + str(packet_type)) debug(data) + keep_message = triggerRespectiveHookServer(packet_type, packet, player, message_to_client, message_to_server, plugin_manager) + if not keep_message: data = None + #Coming from the server to the client if packet_type == "FSNETCMD_ADDOBJECT": if player.check_add_object(FSNETCMD_ADDOBJECT(packet)): @@ -196,16 +209,6 @@ async def handle_client(client_reader, client_writer): if DISCORD_ENABLED: asyncio.create_task(discord_send_message(CHANNEL_ID, f"{player.username} has joined the server!")) - elif packet_type == "FSNETCMD_ENVIRONMENT": - keep_message = plugin_manager.triggar_hook('on_environment_server', packet, player, message_to_client, message_to_server) - if not keep_message: - data = None - - elif packet_type == "FSNETCMD_LIST": - keep_message = plugin_manager.triggar_hook('on_list_server', packet, player, message_to_client, message_to_server) - if not keep_message: - data = None - # Forward the packet to the other endpoint if the data packet still exists. if data: writer.write(data) |
