diff --git a/cogs/admin.py b/cogs/admin.py new file mode 100644 index 0000000..f91d3a5 --- /dev/null +++ b/cogs/admin.py @@ -0,0 +1,201 @@ +import logging +from datetime import timedelta +from os import getpid, system +from typing import Union + +from discord import ApplicationContext, Embed, User, slash_command, option +from discord import utils as ds_utils +from discord.ext import commands + +from classes.holo_user import HoloUser +from enums.colors import Color +from modules.utils import config_get +from modules.utils_sync import config_get_sync, guild_name +from modules.scheduled import scheduler + +logger = logging.getLogger(__name__) + + +class Admin(commands.Cog): + def __init__(self, client): + self.client = client + + # @slash_command( + # name="warning", + # description="Попередити юзера про порушення правил", + # guild_ids=[config_get_sync("guild")], + # ) + # @option("user", description="Користувач") + # @option("reason", description="Причина") + # async def warn_cmd( + # self, + # ctx: ApplicationContext, + # user: User, + # reason: str = "Не вказана", + # ): + # logging.info(f"User {ctx.user.id} warned {user.id} for {reason}") + # await ctx.defer() + # jav_user = HoloUser(user) + # if ctx.user.id in await config_get("admins"): + # logging.info( + # f"Moderator {guild_name(ctx.user)} warned {guild_name(user)} for {reason} (has {jav_user.warnings} warns)" + # ) + # if jav_user.warnings >= 5: + # logging.info( + # f"User {guild_name(user)} was banned due to a big amount of warns ({jav_user.warnings})" + # ) + # await user.send( + # embed=Embed( + # title="Перманентне блокування", + # description=f"Вас було заблоковано за неодноразове порушення правил сервера.", + # color=Color.fail, + # ) + # ) + # await user.ban(reason=reason) + # elif jav_user.warnings >= 2: + # logging.info( + # f"User {guild_name(user)} was muted due to a big amount of warns ({jav_user.warnings})" + # ) + # jav_user.warn(reason=reason) + # await user.send( + # embed=Embed( + # title="Тимчасове блокування", + # description=f"Причина: `{reason}`\n\nНа вашому рахунку вже {jav_user.warnings} попереджень. Вас було тимчасово заблоковано на **1 годину**.\n\nЯкщо Ви продовжите порушувати правила сервера – згодом Вас заблокують.", + # color=0xDED56B, + # ) + # ) + # await user.timeout_for(timedelta(hours=1), reason=reason) + # else: + # jav_user.warn() + + # await ctx.respond( + # embed=Embed( + # title="Попередження", + # description=f"{user.mention} Будь ласка, не порушуйте правила. Ви отримали попередження з причини `{reason}`.\n\nЯкщо Ви продовжите порушувати правила – це може призвести до блокування в спільноті.", + # color=0xDED56B, + # ) + # ) + # else: + # logging.warning( + # f"User {guild_name(ctx.user)} tried to use /warn but permission denied" + # ) + # await ctx.respond( + # embed=Embed( + # title="Відмовлено в доступі", + # description="Здається, це команда лише для модераторів", + # color=Color.fail, + # ) + # ) + # mod_role = ds_utils.get( + # ctx.user.guild.roles, id=await config_get("moderator", "roles") + # ) + # admin_chan = ds_utils.get( + # ctx.user.guild.channels, + # id=await config_get("adminchat", "channels", "text"), + # ) + # await admin_chan.send( + # content=f"{mod_role.mention}", + # embed=Embed( + # title="Неавторизований запит", + # description=f"Користувач {ctx.user.mention} запитав у каналі {ctx.channel.mention} команду, до якої не повинен мати доступу/бачити.", + # color=Color.fail, + # ), + # ) + + @slash_command( + name="clear", + description="Видалити деяку кількість повідомлень в каналі", + guild_ids=[config_get_sync("guild")], + ) + @option("amount", description="Кількість") + @option("user", description="Користувач", default=None) + async def clear_cmd( + self, + ctx: ApplicationContext, + amount: int, + user: User, + ): + if ctx.user.id in await config_get("admins"): + logging.info( + f"User {ctx.user.id} removed {amount} message(s) in {ctx.channel.id}" + ) + await ctx.respond( + embed=Embed(description="Видаляю..."), ephemeral=True, delete_after=2.0 + ) + if user == None: + await ctx.channel.purge(limit=amount) + else: + await ctx.channel.purge( + limit=amount, check=lambda msg: msg.author == user + ) + else: + logging.warning( + f"User {guild_name(ctx.user)} tried to use /clear but permission denied" + ) + await ctx.respond( + embed=Embed( + title="Відмовлено в доступі", + description="Здається, це команда лише для модераторів", + color=Color.fail, + ) + ) + mod_role = ds_utils.get( + ctx.user.guild.roles, id=await config_get("moderator", "roles") + ) + admin_chan = ds_utils.get( + ctx.user.guild.channels, + id=await config_get("adminchat", "channels", "text"), + ) + await admin_chan.send( + content=f"{mod_role.mention}", + embed=Embed( + title="Неавторизований запит", + description=f"Користувач {ctx.user.mention} запитав у каналі {ctx.channel.mention} команду, до якої не повинен мати доступу/бачити.", + color=Color.fail, + ), + ) + + @slash_command( + name="reboot", + description="Перезапустити бота", + guild_ids=[config_get_sync("guild")], + ) + async def reboot_cmd(self, ctx: ApplicationContext): + await ctx.defer(ephemeral=True) + if ctx.user.id in await config_get("admins"): + logging.info(f"Calling shutdown initiated by {guild_name(ctx.user)}") + await ctx.respond( + embed=Embed( + title="Вимикаюсь...", + description="Спробую перезавантажитись за 5 секунд", + ) + ) + scheduler.shutdown() + await self.client.close() + exit() + else: + logging.warning( + f"User {guild_name(ctx.user)} tried to use /reboot but permission denied" + ) + await ctx.respond( + embed=Embed( + title="Відмовлено в доступі", + description="Здається, це команда лише для модераторів", + color=Color.fail, + ) + ) + mod_role = ds_utils.get( + ctx.user.guild.roles, id=await config_get("moderator", "roles") + ) + admin_chan = ds_utils.get( + ctx.user.guild.channels, + id=await config_get("adminchat", "channels", "text"), + ) + await admin_chan.send( + content=f"{mod_role.mention}", + embed=Embed( + title="Неавторизований запит", + description=f"Користувач {ctx.user.mention} запитав у каналі {ctx.channel.mention} команду, до якої не повинен мати доступу/бачити.", + color=Color.fail, + ), + )