feat(pterodactyl): added achievements
Some checks failed
Actions / Lint Code (Ruff & Pylint) (pull_request) Failing after 20s
Actions / Build Documentation (MkDocs) (pull_request) Successful in 21s

This commit is contained in:
Seaswimmer 2024-03-01 00:46:51 -05:00
parent 8954df4c1d
commit 7e03696e10
Signed by: cswimr
GPG key ID: B8953EC01E5C4063
3 changed files with 73 additions and 0 deletions

View file

@ -15,6 +15,7 @@ def register_config(config_obj: Config) -> None:
server_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: \[Not Secure\] \[.*\] (.*)", 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$", join_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: ([^<\n]+) joined the game$",
leave_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: ([^<\n]+) left the game$", leave_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: ([^<\n]+) left the game$",
achievement_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: (.*) has (made the advancement|completed the challenge) \[(.*)\]$",
chat_command='tellraw @a ["",{"text":".$U ","color":".$C"},{"text":" (DISCORD): ","color":"blue"},{"text":".$M","color":"white"}]', chat_command='tellraw @a ["",{"text":".$U ","color":".$C"},{"text":" (DISCORD): ","color":"blue"},{"text":".$M","color":"white"}]',
api_endpoint="minecraft", api_endpoint="minecraft",
chat_channel=None, chat_channel=None,

View file

@ -175,6 +175,42 @@ class Pterodactyl(commands.Cog):
await config.server_regex.set(regex) await config.server_regex.set(regex)
await ctx.send(f"Server regex set to:\n{box(regex, 'regex')}") await ctx.send(f"Server regex set to:\n{box(regex, 'regex')}")
@pterodactyl_config_regex.command(name = "join")
async def pterodactyl_config_regex_join(self, ctx: commands.Context, *, regex: str = None) -> None:
"""Set the regex pattern to match join messages on the server.
See [documentation]() for more information."""
#TODO - fix this link
if regex is None:
regex = await config.join_regex()
return await ctx.send(f"Join regex is currently set to:\n{box(regex, 'regex')}")
await config.join_regex.set(regex)
await ctx.send(f"Join regex set to:\n{box(regex, 'regex')}")
@pterodactyl_config_regex.command(name = "leave")
async def pterodactyl_config_regex_leave(self, ctx: commands.Context, *, regex: str = None) -> None:
"""Set the regex pattern to match leave messages on the server.
See [documentation]() for more information."""
#TODO - fix this link
if regex is None:
regex = await config.leave_regex()
return await ctx.send(f"Leave regex is currently set to:\n{box(regex, 'regex')}")
await config.leave_regex.set(regex)
await ctx.send(f"Leave regex set to:\n{box(regex, 'regex')}")
@pterodactyl_config_regex.command(name = "achievement")
async def pterodactyl_config_regex_achievement(self, ctx: commands.Context, *, regex: str = None) -> None:
"""Set the regex pattern to match achievement messages on the server.
See [documentation]() for more information."""
#TODO - fix this link
if regex is None:
regex = await config.achievement_regex()
return await ctx.send(f"Achievement regex is currently set to:\n{box(regex, 'regex')}")
await config.achievement_regex.set(regex)
await ctx.send(f"Achievement regex set to:\n{box(regex, 'regex')}")
@pterodactyl_config.group(name = "messages", aliases = ['msg', 'msgs', 'message']) @pterodactyl_config.group(name = "messages", aliases = ['msg', 'msgs', 'message'])
async def pterodactyl_config_messages(self, ctx: commands.Context): async def pterodactyl_config_messages(self, ctx: commands.Context):
"""Configure message settings.""" """Configure message settings."""

View file

@ -85,6 +85,15 @@ async def establish_websocket_connection(coginstance: Pterodactyl) -> None:
else: else:
await channel.send(f"{leave_message} left the game") await channel.send(f"{leave_message} left the game")
achievement_message = await check_if_achievement_message(content)
if achievement_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_achievement_embed(achievement_message['username'], achievement_message['achievement'], achievement_message['challenge']))
else:
await channel.send(f"{achievement_message['username']} has {'completed the challenge' if achievement_message['challenge'] else 'made the advancement'} {achievement_message['achievement']}")
if json.loads(message)['event'] == 'status': if json.loads(message)['event'] == 'status':
old_status = await config.current_status() old_status = await config.current_status()
current_status = json.loads(message)['args'][0] current_status = json.loads(message)['args'][0]
@ -172,6 +181,21 @@ async def check_if_leave_message(text: str) -> Union[bool, str]:
logger.debug("Message is not a leave message") logger.debug("Message is not a leave message")
return False return False
async def check_if_achievement_message(text: str) -> Union[bool, dict]:
logger.debug("Checking if message is an achievement message")
regex = await config.achievement_regex()
match: Optional[re.Match[str]] = re.match(regex, text)
if match:
groups = {"username": match.group(1), "achievement": match.group(3)}
if match.group(2) == "completed the challenge":
groups["challenge"] = True
else:
groups["challenge"] = False
logger.debug("Message is an achievement message\n%s", json.dumps(groups))
return groups
logger.debug("Message is not an achievement message")
return False
async def get_info(username: str) -> Optional[dict]: async def get_info(username: str) -> Optional[dict]:
logger.debug("Retrieving player info for %s", username) logger.debug("Retrieving player info for %s", username)
endpoint = await config.api_endpoint() endpoint = await config.api_endpoint()
@ -207,3 +231,15 @@ async def generate_join_leave_embed(username: str, join: bool) -> discord.Embed:
embed.set_author(name=username, icon_url='https://seafsh.cc/u/j3AzqQ.png') embed.set_author(name=username, icon_url='https://seafsh.cc/u/j3AzqQ.png')
embed.timestamp = discord.utils.utcnow() embed.timestamp = discord.utils.utcnow()
return embed return embed
async def generate_achievement_embed(username: str, achievement: str, challenge: bool) -> discord.Embed:
embed = discord.Embed()
embed.color = discord.Color.dark_purple() if challenge else discord.Color.brand_green()
embed.description = f"{username} has {'completed the challenge' if challenge else 'made the advancement'} {achievement}"
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