summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py2
-rw-r--r--lib/Player.py3
-rw-r--r--lib/discordSync.py8
-rw-r--r--lib/plugin_manager.py28
-rw-r--r--lib/triggerCommand.py13
-rw-r--r--lib/triggerRespectiveHook.py127
6 files changed, 173 insertions, 8 deletions
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