202 lines
8.8 KiB
Python
202 lines
8.8 KiB
Python
|
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,
|
|||
|
),
|
|||
|
)
|