RC2Bot/cogs/info.py
2025-02-17 03:49:16 +01:00

123 lines
4.3 KiB
Python

import logging
import discord
from discord.ext import commands
from utils import about_me_embed
from utils import handle_api_request
from table2ascii import table2ascii as t2a, PresetStyle
logger = logging.getLogger(__name__)
# Setup function for the cog
async def setup(bot):
await bot.add_cog(Info(bot))
class Info(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.hybrid_command(
name="info_bot",
description="Displays information about the bot.",
aliases=["about", "bot_info"],
) # fun fact, commands can't start with cog_ or bot_
async def info_bot(self, ctx):
# see utils.py
embed = about_me_embed(self.bot)
await ctx.send(embed=embed, ephemeral=True)
@commands.hybrid_command(
name="server_info",
description="Displays information about a server.",
aliases=["server"],
)
async def server_info(self, ctx, *, server_name: str):
result, message = handle_api_request("servers")
if not result:
await ctx.send(f"Failed to retrieve server status: {message}", ephemeral=True)
return
for server in result:
if server_name.lower() in server["name"].lower():
found_server = server
break
else:
await ctx.send(f"Couldn't find server with name {server_name}", ephemeral=True)
return
game_map = server.get("mapAliasAndVersion", "Unknown")
map_alias, map_version = game_map.split('/')
result, message = handle_api_request("maps")
if not result:
await ctx.send(f"Failed to retrieve maps: {message}", ephemeral=True)
return
for game_map in result:
if map_alias == game_map["alias"]:
found_map = game_map
break
else:
await ctx.send(f"Couldn't find map with alias {map_alias}", ephemeral=True)
return
# make the embed
embed = discord.Embed(
title=f"{found_server['name']}",
description="",
color=discord.Color.dark_orange(),
)
# add fields
game_state = found_server["gameState"]
match game_state:
case "waiting":
game_state = "waiting for players"
case "running":
game_state = "game in progress"
case "ending":
game_state = "game over"
embed.add_field(name="Map", value=f"{found_map['name']}")
embed.add_field(name="Map version",value=f"{map_version}")
embed.add_field(name="Players", value=f"{found_server['onlinePlayers']}/{found_server['gameSettings']['maxPlayers']}")
embed.add_field(name="Status", value=f"{game_state}")
await ctx.send(embed=embed, ephemeral=True)
@commands.hybrid_command(
name="servers", description="Fetches info about the game servers",
aliases=["server_list"]
)
async def servers(self, ctx):
result, message = handle_api_request("servers")
table_body = []
if result:
for server in result:
name = server.get("name", "Unknown")
online_players = server.get("onlinePlayers", -1)
game_state = server.get("gameState", "Unknown")
map = server.get("mapAliasAndVersion", "Unknown")
game_settings = server.get("gameSettings", {})
max_players = game_settings.get("maxPlayers", -1)
table_body.append([name, map, game_state, f"{online_players}/{max_players}"])
output = t2a(
header=["Name", "Map", "State", "Players"],
body=table_body,
style=PresetStyle.thin_compact
)
await ctx.send(f"```\nServers:\n{output}\n```", ephemeral=True)
elif len(result) == 0:
await ctx.send("There are no servers online at the moment", ephemeral=True)
else:
await ctx.send(f"Failed to retrieve server status: {message}", ephemeral=True)
@commands.command()
@commands.is_owner()
async def sync(self, ctx: commands.Context) -> None:
"""Sync commands"""
synced = await ctx.bot.tree.sync()
await ctx.send(f"Synced {len(synced)} commands for the server")