From 2fbd8cde9e7a1b4cd5f29a54c94857c6e4ca3738 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Fri, 1 Mar 2024 00:23:00 -0500 Subject: [PATCH] feat(pterodactyl): added user join/leave --- pterodactyl/config.py | 3 +++ pterodactyl/pterodactyl.py | 50 +++++++++++++++++++++++++++----------- pterodactyl/websocket.py | 50 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 14 deletions(-) diff --git a/pterodactyl/config.py b/pterodactyl/config.py index 2461c4c..014ebb7 100644 --- a/pterodactyl/config.py +++ b/pterodactyl/config.py @@ -13,9 +13,12 @@ def register_config(config_obj: Config) -> None: current_status='', chat_regex=r"\[(\d{2}:\d{2}:\d{2})\sINFO\]:\s<(\w+)>\s(.*)", server_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: \[Not Secure\] \[.*\] (.*)", + join_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: ([^<\n]+) joined the game$", chat_command='tellraw @a ["",{"text":".$U ","color":".$C"},{"text":" (DISCORD): ","color":"blue"},{"text":".$M","color":"white"}]', api_endpoint="minecraft", chat_channel=None, startup_msg='Server started!', shutdown_msg='Server stopped!', + join_msg='Welcome to the server! 👋', + leave_msg='Goodbye! 👋', ) diff --git a/pterodactyl/pterodactyl.py b/pterodactyl/pterodactyl.py index e60eb30..a77e82f 100644 --- a/pterodactyl/pterodactyl.py +++ b/pterodactyl/pterodactyl.py @@ -130,18 +130,6 @@ class Pterodactyl(commands.Cog): await config.chat_channel.set(channel.id) await ctx.send(f"Chat channel set to {channel.mention}") - @pterodactyl_config_chat.command(name = "regex") - async def pterodactyl_config_chat_regex(self, ctx: commands.Context, *, regex: str = None) -> None: - """Set the regex pattern to match chat messages on the server. - - See [documentation]() for more information.""" - #TODO - fix this link - if regex is None: - regex = await config.chat_regex() - return await ctx.send(f"Chat regex is currently set to:\n{box(regex, 'regex')}") - await config.chat_regex.set(regex) - await ctx.send(f"Chat regex set to:\n{box(regex, 'regex')}") - @pterodactyl_config_chat.command(name = "command") async def pterodactyl_config_chat_command(self, ctx: commands.Context, *, command: str = None) -> None: """Set the command that will be used to send messages from Discord. @@ -155,8 +143,24 @@ class Pterodactyl(commands.Cog): await config.chat_command.set(command) await ctx.send(f"Chat command set to:\n{box(command, 'json')}") - @pterodactyl_config_chat.command(name = "server") - async def pterodactyl_config_chat_server(self, ctx: commands.Context, *, regex: str = None) -> None: + @pterodactyl_config.group(name = "regex") + async def pterodactyl_config_regex(self, ctx: commands.Context) -> None: + """Set regex patterns.""" + + @pterodactyl_config_regex.command(name = "chat") + async def pterodactyl_config_regex_chat(self, ctx: commands.Context, *, regex: str = None) -> None: + """Set the regex pattern to match chat messages on the server. + + See [documentation]() for more information.""" + #TODO - fix this link + if regex is None: + regex = await config.chat_regex() + return await ctx.send(f"Chat regex is currently set to:\n{box(regex, 'regex')}") + await config.chat_regex.set(regex) + await ctx.send(f"Chat regex set to:\n{box(regex, 'regex')}") + + @pterodactyl_config_regex.command(name = "server") + async def pterodactyl_config_regex_server(self, ctx: commands.Context, *, regex: str = None) -> None: """Set the regex pattern to match server messages on the server. See [documentation]() for more information.""" @@ -188,3 +192,21 @@ class Pterodactyl(commands.Cog): return await ctx.send(f"Shutdown message is currently set to: {message}") await config.shutdown_msg.set(message) await ctx.send(f"Shutdown message set to: {message}") + + @pterodactyl_config_messages.command(name = "join") + async def pterodactyl_config_messages_join(self, ctx: commands.Context, *, message: str = None) -> None: + """Set the message that will be sent when a user joins the server. This is only shown in embeds.""" + if message is None: + message = await config.join_msg() + return await ctx.send(f"Join message is currently set to: {message}") + await config.join_msg.set(message) + await ctx.send(f"Join message set to: {message}") + + @pterodactyl_config_messages.command(name = "leave") + async def pterodactyl_config_messages_leave(self, ctx: commands.Context, *, message: str = None) -> None: + """Set the message that will be sent when a user leaves the server. This is only shown in embeds.""" + if message is None: + message = await config.leave_msg() + return await ctx.send(f"Leave message is currently set to: {message}") + await config.leave_msg.set(message) + await ctx.send(f"Leave message set to: {message}") diff --git a/pterodactyl/websocket.py b/pterodactyl/websocket.py index 3e4daae..11676ab 100644 --- a/pterodactyl/websocket.py +++ b/pterodactyl/websocket.py @@ -67,6 +67,24 @@ async def establish_websocket_connection(coginstance: Pterodactyl) -> None: if channel is not None: await channel.send(server_message if len(server_message) < 2000 else server_message[:1997] + '...') + join_message = await check_if_join_message(content) + if join_message: + channel = coginstance.bot.get_channel(await config.chat_channel()) + if channel is not None: + if coginstance.bot.embed_requested(channel): + await channel.send(embed=await generate_join_leave_embed(join_message, True)) + else: + await channel.send(f"{join_message} joined the game") + + leave_message = await check_if_leave_message(content) + if leave_message: + channel = coginstance.bot.get_channel(await config.chat_channel()) + if channel is not None: + if coginstance.bot.embed_requested(channel): + await channel.send(embed=await generate_join_leave_embed(leave_message, False)) + else: + await channel.send(f"{leave_message} left the game") + if json.loads(message)['event'] == 'status': old_status = await config.current_status() current_status = json.loads(message)['args'][0] @@ -134,6 +152,26 @@ async def check_if_chat_message(text: str) -> Union[bool, dict]: logger.debug("Message is not a chat message") return False +async def check_if_join_message(text: str) -> Union[bool, str]: + logger.debug("Checking if message is a join message") + regex = await config.join_regex() + match: Optional[re.Match[str]] = re.match(regex, text) + if match: + logger.debug("Message is a join message") + return match.group(1) + logger.debug("Message is not a join message") + return False + +async def check_if_leave_message(text: str) -> Union[bool, str]: + logger.debug("Checking if message is a leave message") + regex = await config.leave_regex() + match: Optional[re.Match[str]] = re.match(regex, text) + if match: + logger.debug("Message is a leave message") + return match.group(1) + logger.debug("Message is not a leave message") + return False + async def get_info(username: str) -> Optional[dict]: logger.debug("Retrieving player info for %s", username) endpoint = await config.api_endpoint() @@ -157,3 +195,15 @@ async def send_chat_discord(coginstance: Pterodactyl, username: str, message: st logger.debug("Chat message sent to Discord") else: logger.debug("Chat channel not set. Skipping sending chat message to Discord") + +async def generate_join_leave_embed(username: str, join: bool) -> discord.Embed: + embed = discord.Embed() + embed.color = discord.Color.green if join else discord.Color.red + embed.description = await config.join_msg() if join else await config.leave_msg() + info = await get_info(username) + if info: + embed.set_author(name=username, icon_url=info['data']['player']['avatar']) + else: + embed.set_author(name=username, icon_url='https://seafsh.cc/u/j3AzqQ.png') + embed.timestamp = discord.utils.utcnow() + return embed