diff --git a/admin_ext/ban.py b/admin_ext/ban.py new file mode 100644 index 0000000..9b4b1b7 --- /dev/null +++ b/admin_ext/ban.py @@ -0,0 +1,15 @@ +import discord + +class Extension: + def __init__(self, core): + @core.tree.command(name = "ban", description = "Забанить игрока на серверах") + @discord.app_commands.describe(profile=core.ANY_INPUT, reason="причина", minutes="время бана | 0 - навсегда") + async def ban_player( + interaction: discord.Interaction, + profile: str, + reason: str, + minutes: int = 0 + ): + steam64 = await core.GetSteam64OfDiscord(interaction.user) + player = await core.GetPlayer(profile, steam64, False) + return await interaction.response.send_message(f'{await player.ban(reason, minutes)}', ephemeral=False) \ No newline at end of file diff --git a/bot.py b/bot.py index 50c78bd..7ecf646 100644 --- a/bot.py +++ b/bot.py @@ -7,14 +7,9 @@ from datetime import datetime from discord.ext import tasks from player import * import traceback +from exceptions import * #Скрыть сообщение если надо ephemeral=True - - -class NeedDiscordAuthOfSteam(Exception): - pass - - class DiscordClient(discord.Client): ANY_INPUT = "ссылка на стим | имя игрока | стимид" discord2steam_cache = {} @@ -62,7 +57,16 @@ class DiscordClient(discord.Client): @self.tree.error async def on_app_command_error(interaction, error): if isinstance(error.original, CannotCastToSteamID): - return await interaction.response.send_message(f'Не возможно найти такой профиль, попробуй написать иные данные!', ephemeral=True) + return await interaction.response.send_message("Не возможно найти такой профиль, попробуй написать иные данные!", ephemeral=True) + elif isinstance(error.original, LowPermition): + #Добавить проверку на модератора или в бекенде добавить другой код ответа + return await interaction.response.send_message("Это не для тебя и не для таких как ты сделано...\n", ephemeral=True) + elif isinstance(error.original, NotFoundPlayerOnServer): + return await interaction.response.send_message("Игрок не найден на серверах", ephemeral=True) + elif isinstance(error.original, UnknownBackendResponse): + return await interaction.response.send_message("Ошибка на стороне сервера в исполнении говнокода, стоит подождать или позвать помощь", ephemeral=False) + elif isinstance(error.original, discord.errors.NotFound): + return await interaction.response.send_message("Слишком долгий ответ со стороны сервера, причины:\n1) Возможно бекенд сдох\n2)Cлишком долгий незапланированный ответ с сервера\n3)Стоит позвать помощь", ephemeral=True) traceback.print_exc() async def GetSteam64OfDiscord(self, user, no_cache = False): diff --git a/exceptions.py b/exceptions.py new file mode 100644 index 0000000..e2bb3dd --- /dev/null +++ b/exceptions.py @@ -0,0 +1,17 @@ +class CannotCastToSteamID(Exception): + pass + +class NotLoadProfile(Exception): + pass + +class NeedDiscordAuthOfSteam(Exception): + pass + +class LowPermition(Exception): + pass + +class NotFoundPlayerOnServer(Exception): + pass + +class UnknownBackendResponse(Exception): + pass \ No newline at end of file diff --git a/player.py b/player.py index 6eee3d8..65f73a1 100644 --- a/player.py +++ b/player.py @@ -2,12 +2,7 @@ from email import message import aiohttp, os from datetime import datetime from discord import Embed - -class CannotCastToSteamID(Exception): - pass - -class NotLoadProfile(Exception): - pass +from exceptions import * class Player: original_request = "" @@ -27,7 +22,11 @@ class Player: self.steamid = await self.GetSteamIDOfProfile(self.original_request) async def LoadProfile(self): - self.current = await self.GetProfile(self.steamid.get("steam64")) + self.current = await self.GetProfile(self.steam64) + + @property + def steam64(self): + return self.steamid.get('steam64', 0) @property def embed(self) -> Embed: @@ -160,15 +159,15 @@ class Player: async with aiohttp.ClientSession(cookies={ "secretkey":os.getenv("BACKEND_SECRETKEY"), "steam64": self.requester_steam64}) as session: - async with session.post(f"{os.getenv('BACKEND_URL')}/api/admin/kick?steam64={self.steamid.get('steam64')}", ssl=False) as response: + async with session.post(f"{os.getenv('BACKEND_URL')}/api/admin/kick?steam64={self.steam64}", ssl=False) as response: result = await response.text() if response.status == 200: return "Кикнут с серверов" if response.status == 404: - return "Игрок не найден на серверах" + raise NotFoundPlayerOnServer if response.status == 403: - return "Это не для тебя и не для таких как ты сделано..." - return "помогите я обосрался" + raise LowPermition + raise UnknownBackendResponse async def rcon(self, command, args): if not self.current: @@ -184,8 +183,20 @@ class Player: async with session.post(f"{os.getenv('BACKEND_URL')}/api/admin/rcon?srv={server}&command={final_command}", ssl=False) as response: return await response.text() else: - return "Игрок не играет на серверах" + raise NotFoundPlayerOnServer + async def ban(self, reason, minutes): + async with aiohttp.ClientSession(cookies={ + "secretkey":os.getenv("BACKEND_SECRETKEY"), + "steam64": self.requester_steam64}) as session: + async with session.post(f"{os.getenv('BACKEND_URL')}/api/admin/ban?steam64={self.steam64}&ban_reason={reason}&ban_length={minutes}", ssl=False) as response: + if response.status == 200: + return "Игрок забанен или уже был в бане" + if response.status == 404: + raise NotFoundPlayerOnServer + if response.status == 403: + raise LowPermition + raise UnknownBackendResponse ############### #user command @@ -194,12 +205,14 @@ class Player: async with aiohttp.ClientSession(cookies={ "secretkey":os.getenv("BACKEND_SECRETKEY"), "steam64": self.requester_steam64}) as session: - async with session.post(f"{os.getenv('BACKEND_URL')}/api/profile/current/report?steam64={self.steamid.get('steam64')}&text={reason}", ssl=False) as response: + async with session.post(f"{os.getenv('BACKEND_URL')}/api/profile/current/report?steam64={self.steam64}&text={reason}", ssl=False) as response: result = int(await response.text()) if result == 0: - return "Игрок с таким именем не играет на серверах в данный момент" + return "Игрок с таким именем не играет на серверах в данный момент..." + elif result < 0: + return f"Падажди, следующий репорт можно отправить только после: {-1 * result} секунд" else: - return f"Падажди, следующий репорт можно отправить только после: {utime2human(result)}" + return f"Репорт отправлен!" def workshopmap2bsp(map_name):