General improvements and refactoring

This commit is contained in:
kku 2024-12-15 23:21:41 +01:00
parent 19d2ef281c
commit 982d0bce43
5 changed files with 246 additions and 192 deletions

View File

@ -1,4 +1,5 @@
import logging import logging
import sys
from discord import ApplicationContext, Embed, User, option, slash_command from discord import ApplicationContext, Embed, User, option, slash_command
from discord import utils as ds_utils from discord import utils as ds_utils
@ -14,9 +15,12 @@ logger = logging.getLogger(__name__)
class Admin(commands.Cog): class Admin(commands.Cog):
"""Cog with utility commands for admins."""
def __init__(self, client: PycordBot): def __init__(self, client: PycordBot):
self.client = client self.client = client
# Disabled because warning functionality is temporarily not needed
# @slash_command( # @slash_command(
# name="warning", # name="warning",
# description="Попередити юзера про порушення правил", # description="Попередити юзера про порушення правил",
@ -119,20 +123,25 @@ class Admin(commands.Cog):
amount, amount,
ctx.channel.id, ctx.channel.id,
) )
await ctx.respond( await ctx.respond(
embed=Embed(description="Видаляю..."), ephemeral=True, delete_after=2.0 embed=Embed(description="Видаляю..."), ephemeral=True, delete_after=2.0
) )
if user == None:
if user is None:
await ctx.channel.purge(limit=amount) await ctx.channel.purge(limit=amount)
else: else:
await ctx.channel.purge( await ctx.channel.purge(
limit=amount, check=lambda msg: msg.author == user limit=amount, check=lambda msg: msg.author == user
) )
else:
return
logging.warning( logging.warning(
"User %s tried to use /clear but permission denied", "User %s tried to use /clear but permission denied",
guild_name(ctx.user), guild_name(ctx.user),
) )
await ctx.respond( await ctx.respond(
embed=Embed( embed=Embed(
title="Відмовлено в доступі", title="Відмовлено в доступі",
@ -140,6 +149,7 @@ class Admin(commands.Cog):
color=Color.fail, color=Color.fail,
) )
) )
mod_role = ds_utils.get( mod_role = ds_utils.get(
ctx.user.guild.roles, id=await config_get("moderators", "roles") ctx.user.guild.roles, id=await config_get("moderators", "roles")
) )
@ -147,6 +157,7 @@ class Admin(commands.Cog):
ctx.user.guild.channels, ctx.user.guild.channels,
id=await config_get("adminchat", "channels", "text"), id=await config_get("adminchat", "channels", "text"),
) )
await admin_chan.send( await admin_chan.send(
content=f"{mod_role.mention}", content=f"{mod_role.mention}",
embed=Embed( embed=Embed(
@ -163,6 +174,7 @@ class Admin(commands.Cog):
) )
async def reboot_cmd(self, ctx: ApplicationContext): async def reboot_cmd(self, ctx: ApplicationContext):
await ctx.defer(ephemeral=True) await ctx.defer(ephemeral=True)
if ctx.user.id in self.client.owner_ids: if ctx.user.id in self.client.owner_ids:
logging.info("Calling shutdown initiated by %s", guild_name(ctx.user)) logging.info("Calling shutdown initiated by %s", guild_name(ctx.user))
await ctx.respond( await ctx.respond(
@ -173,12 +185,13 @@ class Admin(commands.Cog):
) )
scheduler.shutdown() scheduler.shutdown()
await self.client.close() await self.client.close()
exit() sys.exit()
else:
logging.warning( logging.warning(
"User %s tried to use /reboot but permission denied", "User %s tried to use /reboot but permission denied",
guild_name(ctx.user), guild_name(ctx.user),
) )
await ctx.respond( await ctx.respond(
embed=Embed( embed=Embed(
title="Відмовлено в доступі", title="Відмовлено в доступі",
@ -186,6 +199,7 @@ class Admin(commands.Cog):
color=Color.fail, color=Color.fail,
) )
) )
mod_role = ds_utils.get( mod_role = ds_utils.get(
ctx.user.guild.roles, id=await config_get("moderators", "roles") ctx.user.guild.roles, id=await config_get("moderators", "roles")
) )
@ -193,6 +207,7 @@ class Admin(commands.Cog):
ctx.user.guild.channels, ctx.user.guild.channels,
id=await config_get("adminchat", "channels", "text"), id=await config_get("adminchat", "channels", "text"),
) )
await admin_chan.send( await admin_chan.send(
content=f"{mod_role.mention}", content=f"{mod_role.mention}",
embed=Embed( embed=Embed(

View File

@ -17,8 +17,8 @@ class Analytics(commands.Cog):
async def on_message(self, message: Message): async def on_message(self, message: Message):
if ( if (
(message.author != self.client.user) (message.author != self.client.user)
and (message.author.bot == False) and (message.author.bot is False)
and (message.author.system == False) and (message.author.system is False)
): ):
stickers = [] stickers = []
for sticker in message.stickers: for sticker in message.stickers:

View File

@ -37,8 +37,20 @@ class CustomChannels(commands.Cog):
): ):
holo_user_ctx = HoloUser(ctx.user) holo_user_ctx = HoloUser(ctx.user)
if holo_user_ctx.customchannel == None: # Return if the user already has a custom channel
if holo_user_ctx.customchannel is not None:
await ctx.defer(ephemeral=True)
await ctx.respond(
embed=Embed(
title="Помилка виконання",
description="У вас вже є особистий канал.\nДля редагування каналу є `/customchannel edit` або просто відкрийте меню керування вашим каналом.",
color=Color.fail,
)
)
return
await ctx.defer() await ctx.defer()
created_channel = await ctx.user.guild.create_text_channel( created_channel = await ctx.user.guild.create_text_channel(
name=name, name=name,
reason=f"Користувач {guild_name(ctx.user)} отримав власний приватний канал", reason=f"Користувач {guild_name(ctx.user)} отримав власний приватний канал",
@ -47,6 +59,7 @@ class CustomChannels(commands.Cog):
id=await config_get("customchannels", "categories"), id=await config_get("customchannels", "categories"),
), ),
) )
await created_channel.set_permissions( await created_channel.set_permissions(
ctx.user.guild.default_role, ctx.user.guild.default_role,
send_messages=False, send_messages=False,
@ -62,7 +75,9 @@ class CustomChannels(commands.Cog):
embed_links=True, embed_links=True,
manage_channels=True, manage_channels=True,
) )
holo_user_ctx.set("customchannel", created_channel.id) holo_user_ctx.set("customchannel", created_channel.id)
await ctx.respond( await ctx.respond(
embed=Embed( embed=Embed(
title="Створено канал", title="Створено канал",
@ -70,21 +85,14 @@ class CustomChannels(commands.Cog):
color=Color.success, color=Color.success,
) )
) )
bots = await config_get("bots") bots = await config_get("bots")
for bot in bots: for bot in bots:
await created_channel.set_permissions( await created_channel.set_permissions(
ds_utils.get(ctx.user.guild.roles, id=bots[bot]["role"]), ds_utils.get(ctx.user.guild.roles, id=bots[bot]["role"]),
view_channel=False, view_channel=False,
) )
else:
await ctx.defer(ephemeral=True)
await ctx.respond(
embed=Embed(
title="Помилка виконання",
description="У вас вже є особистий канал.\nДля редагування каналу є `/customchannel edit` або просто відкрийте меню керування вашим каналом.",
color=Color.fail,
)
)
@customchannel.command( @customchannel.command(
name="edit", name="edit",
@ -102,6 +110,8 @@ class CustomChannels(commands.Cog):
custom_channel = ds_utils.get( custom_channel = ds_utils.get(
ctx.guild.channels, id=holo_user_ctx.customchannel ctx.guild.channels, id=holo_user_ctx.customchannel
) )
# Return if the channel was not found
if custom_channel is None: if custom_channel is None:
await ctx.respond( await ctx.respond(
embed=Embed( embed=Embed(
@ -111,6 +121,7 @@ class CustomChannels(commands.Cog):
) )
) )
return return
await custom_channel.edit(name=name) await custom_channel.edit(name=name)
await custom_channel.set_permissions( await custom_channel.set_permissions(
ctx.user.guild.default_role, ctx.user.guild.default_role,
@ -119,6 +130,7 @@ class CustomChannels(commands.Cog):
create_public_threads=threads, create_public_threads=threads,
create_private_threads=threads, create_private_threads=threads,
) )
await ctx.respond( await ctx.respond(
embed=Embed( embed=Embed(
title="Канал змінено", title="Канал змінено",
@ -138,11 +150,25 @@ class CustomChannels(commands.Cog):
): ):
holo_user_ctx = HoloUser(ctx.user) holo_user_ctx = HoloUser(ctx.user)
if holo_user_ctx.customchannel is not None: # Return if the user does not have a custom channel
if holo_user_ctx.customchannel is None:
await ctx.defer(ephemeral=True)
await ctx.respond(
embed=Embed(
title="Помилка виконання",
description="У вас немає особистого каналу.",
color=Color.fail,
)
)
return
await ctx.defer() await ctx.defer()
custom_channel = ds_utils.get( custom_channel = ds_utils.get(
ctx.guild.channels, id=holo_user_ctx.customchannel ctx.guild.channels, id=holo_user_ctx.customchannel
) )
# Return if the channel was not found
if custom_channel is None: if custom_channel is None:
await ctx.respond( await ctx.respond(
embed=Embed( embed=Embed(
@ -153,6 +179,8 @@ class CustomChannels(commands.Cog):
) )
holo_user_ctx.set("customchannel", None) holo_user_ctx.set("customchannel", None)
return return
# Return if the confirmation is missing
if not confirm: if not confirm:
await ctx.respond( await ctx.respond(
embed=Embed( embed=Embed(
@ -162,8 +190,11 @@ class CustomChannels(commands.Cog):
) )
) )
return return
await custom_channel.delete(reason="Власник запросив видалення") await custom_channel.delete(reason="Власник запросив видалення")
holo_user_ctx.set("customchannel", None) holo_user_ctx.set("customchannel", None)
await ctx.respond( await ctx.respond(
embed=Embed( embed=Embed(
title="Канал знищено", title="Канал знищено",
@ -171,15 +202,6 @@ class CustomChannels(commands.Cog):
color=Color.default, color=Color.default,
) )
) )
else:
await ctx.defer(ephemeral=True)
await ctx.respond(
embed=Embed(
title="Помилка виконання",
description="У вас немає особистого каналу.",
color=Color.fail,
)
)
def setup(client: PycordBot): def setup(client: PycordBot):

View File

@ -35,13 +35,47 @@ class Data(commands.Cog):
async def data_export_cmd(self, ctx: ApplicationContext, kind: str): async def data_export_cmd(self, ctx: ApplicationContext, kind: str):
await ctx.defer() await ctx.defer()
holo_user = HoloUser(ctx.author) holo_user = HoloUser(ctx.author)
if (ctx.user.id in self.client.owner_ids) or (
# Return if the user is not an owner and not in the council
if (ctx.user.id not in self.client.owner_ids) and not (
await holo_user.is_council(ctx.author) await holo_user.is_council(ctx.author)
): ):
logging.info( logging.info(
"Moderator %s exported current users list", guild_name(ctx.user) "User %s tried to use /export but permission denied",
guild_name(ctx.user),
) )
await ctx.respond(
embed=Embed(
title="Відмовлено в доступі",
description="Здається, це команда лише для модераторів",
color=Color.fail,
)
)
mod_role = ds_utils.get(
ctx.user.guild.roles, id=await config_get("moderators", "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,
),
)
return
logging.info("Moderator %s exported current users list", guild_name(ctx.user))
makedirs("tmp", exist_ok=True) makedirs("tmp", exist_ok=True)
uuid = str(uuid4()) uuid = str(uuid4())
if kind == "Користувачі": if kind == "Користувачі":
@ -62,33 +96,6 @@ class Data(commands.Cog):
await ctx.respond( await ctx.respond(
file=File(str(Path(f"tmp/{uuid}")), filename="users.json") file=File(str(Path(f"tmp/{uuid}")), filename="users.json")
) )
else:
logging.info(
"User %s tried to use /export but permission denied",
guild_name(ctx.user),
)
await ctx.respond(
embed=Embed(
title="Відмовлено в доступі",
description="Здається, це команда лише для модераторів",
color=Color.fail,
)
)
mod_role = ds_utils.get(
ctx.user.guild.roles, id=await config_get("moderators", "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,
),
)
@data.command( @data.command(
name="migrate", name="migrate",
@ -100,10 +107,45 @@ class Data(commands.Cog):
) )
async def data_migrate_cmd(self, ctx: ApplicationContext, kind: str): async def data_migrate_cmd(self, ctx: ApplicationContext, kind: str):
await ctx.defer() await ctx.defer()
holo_user = HoloUser(ctx.author) holo_user = HoloUser(ctx.author)
if (ctx.user.id in self.client.owner_ids) or (
# Return if the user is not an owner and not in the council
if (ctx.user.id not in self.client.owner_ids) and not (
await holo_user.is_council(ctx.author) await holo_user.is_council(ctx.author)
): ):
logging.info(
"User %s tried to use /migrate but permission denied",
guild_name(ctx.user),
)
await ctx.respond(
embed=Embed(
title="Відмовлено в доступі",
description="Здається, це команда лише для модераторів",
color=Color.fail,
)
)
mod_role = ds_utils.get(
ctx.user.guild.roles, id=await config_get("moderators", "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,
),
)
return
logging.info( logging.info(
"Moderator %s started migration of all members to the database", "Moderator %s started migration of all members to the database",
guild_name(ctx.user), guild_name(ctx.user),
@ -113,6 +155,7 @@ class Data(commands.Cog):
for member in ctx.guild.members: for member in ctx.guild.members:
if member.bot: if member.bot:
continue continue
if col_users.find_one({"user": member.id}) is None: if col_users.find_one({"user": member.id}) is None:
user = {} user = {}
defaults = await config_get("user", "defaults") defaults = await config_get("user", "defaults")
@ -123,6 +166,7 @@ class Data(commands.Cog):
user[key] = defaults[key] user[key] = defaults[key]
col_users.insert_one(document=user) col_users.insert_one(document=user)
logging.info( logging.info(
"Added DB record for user %s during migration", member.id "Added DB record for user %s during migration", member.id
) )
@ -134,33 +178,6 @@ class Data(commands.Cog):
color=Color.success, color=Color.success,
) )
) )
else:
logging.info(
"User %s tried to use /migrate but permission denied",
guild_name(ctx.user),
)
await ctx.respond(
embed=Embed(
title="Відмовлено в доступі",
description="Здається, це команда лише для модераторів",
color=Color.fail,
)
)
mod_role = ds_utils.get(
ctx.user.guild.roles, id=await config_get("moderators", "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,
),
)
def setup(client: PycordBot): def setup(client: PycordBot):

View File

@ -15,8 +15,8 @@ class Logger(commands.Cog):
async def on_message(self, message: Message): async def on_message(self, message: Message):
if ( if (
(message.author != self.client.user) (message.author != self.client.user)
and (message.author.bot == False) and (message.author.bot is False)
and (message.author.system == False) and (message.author.system is False)
): ):
if col_users.find_one({"user": message.author.id}) is None: if col_users.find_one({"user": message.author.id}) is None:
user = {} user = {}
@ -42,8 +42,8 @@ class Logger(commands.Cog):
if ( if (
(member != self.client.user) (member != self.client.user)
and (member.bot == False) and (member.bot is False)
and (member.system == False) and (member.system is False)
): ):
await welcome_chan.send( await welcome_chan.send(
content=(await config_get("welcome", "messages")).format( content=(await config_get("welcome", "messages")).format(