Исправлены все ошибки PyLance

This commit is contained in:
2025-08-21 10:57:51 +07:00
parent ec655ba4ac
commit 044134041b
6 changed files with 126 additions and 64 deletions

View File

@@ -192,7 +192,7 @@ class AnyBots(commands.Bot):
matches = re.findall(pattern, time_str) matches = re.findall(pattern, time_str)
for value, _, unit in matches: for value, _, unit in matches:
time_units[unit] += float(value) time_units[unit] += value
return FormatedTime(time_units) return FormatedTime(time_units)
@@ -208,6 +208,8 @@ class AnyBots(commands.Bot):
krekchat = await self.fetch_guild(self.krekchat.id) krekchat = await self.fetch_guild(self.krekchat.id)
bt_channel = await krekchat.fetch_channel(self.bots_talk_protocol_channel_id) bt_channel = await krekchat.fetch_channel(self.bots_talk_protocol_channel_id)
if not isinstance(bt_channel, disnake.TextChannel):
raise ValueError("bt_channel не найден")
punishment_keys = ['type', 'options', 'severity', 'member', 'moderator'] punishment_keys = ['type', 'options', 'severity', 'member', 'moderator']
complaint_keys = ['type', 'options', 'accepted', 'attack_member', 'defence_member', 'moderator'] complaint_keys = ['type', 'options', 'accepted', 'attack_member', 'defence_member', 'moderator']
@@ -321,7 +323,7 @@ class MainBot(AnyBots):
return wrapper return wrapper
@tasks.loop(seconds=30) @tasks.loop(seconds=30)
@catch_exceptions.__func__ @catch_exceptions
async def watchdog(self): async def watchdog(self):
for loop in self.loops: for loop in self.loops:
@@ -335,7 +337,7 @@ class MainBot(AnyBots):
@tasks.loop(seconds=60) @tasks.loop(seconds=60)
@catch_exceptions.__func__ @catch_exceptions
async def SendingDeferredMessages(self): async def SendingDeferredMessages(self):
async with self.DataBaseManager.session() as session: async with self.DataBaseManager.session() as session:
async with session.begin(): async with session.begin():
@@ -351,16 +353,18 @@ class MainBot(AnyBots):
await session.delete(message) await session.delete(message)
@tasks.loop(seconds=3600) @tasks.loop(seconds=3600)
@catch_exceptions.__func__ @catch_exceptions
async def MakeBackups(self): async def MakeBackups(self):
backup_file = await self.DataBaseManager.pg_dump() backup_file = await self.DataBaseManager.pg_dump()
krekchat = await self.fetch_guild(self.krekchat.id) krekchat = await self.fetch_guild(self.krekchat.id)
backups_channel = await krekchat.fetch_channel(self.databases_backups_channel_id) backups_channel = await krekchat.fetch_channel(self.databases_backups_channel_id)
if not isinstance(backups_channel, disnake.TextChannel):
raise ValueError("backups_channel не найден")
await backups_channel.send(content=f"Бэкап бд за {datetime.datetime.now()}:", file=disnake.File(backup_file)) await backups_channel.send(content=f"Бэкап бд за {datetime.datetime.now()}:", file=disnake.File(backup_file))
@tasks.loop(seconds=60) @tasks.loop(seconds=60)
@catch_exceptions.__func__ @catch_exceptions
async def CheckDataBases(self): async def CheckDataBases(self):
self.krekchat = await self.fetch_guild(self.krekchat.id) self.krekchat = await self.fetch_guild(self.krekchat.id)
members = [i async for i in self.krekchat.fetch_members(limit=None)] members = [i async for i in self.krekchat.fetch_members(limit=None)]
@@ -547,29 +551,30 @@ class MainBot(AnyBots):
if not inter.response.is_done():... if not inter.response.is_done():...
#await inter.response.send_message(embed=self.ErrEmbed(description=f'Ответ не был отправлен, возможно, кнопка перестала действовать'), ephemeral=True) #await inter.response.send_message(embed=self.ErrEmbed(description=f'Ответ не был отправлен, возможно, кнопка перестала действовать'), ephemeral=True)
async def on_message(self, msg): async def on_message(self, message):
if msg.author.bot or not self.task_start or not self.ready_once.is_set(): if message.author.bot or not self.task_start or not self.ready_once.is_set():
return 0 return
if msg.author.id == 479210801891115009 and msg.content == "botsoff": if message.author.id == 479210801891115009 and message.content == "botsoff":
await msg.reply(embed=self.AnswEmbed(description=f'Бот отключён', colour=0xff9900)) await message.reply(embed=self.AnswEmbed(description=f'Бот отключён', colour=0xff9900))
await self.BotOff() await self.BotOff()
return 0 return
if type(msg.channel).__name__!="DMChannel" and re.match(r"^⚠️?жалоба-от-(.+)-на-(.+)$", msg.channel.name): if type(message.channel).__name__!="DMChannel" and re.match(r"^⚠️?жалоба-от-(.+)-на-(.+)$", message.channel.name):
log_reports = disnake.utils.get(msg.guild.channels, id=1242373230384386068) log_reports = disnake.utils.get(message.guild.channels, id=1242373230384386068)
files=[] if isinstance(log_reports, disnake.TextChannel):
for att in msg.attachments: files=[]
files = files + [await att.to_file()] for att in message.attachments:
log_mess = await log_reports.send(f"Чат: `{msg.channel.name}`({msg.channel.id}).\n" files = files + [await att.to_file()]
f"Автор: `{msg.author.name} ({msg.author.id})`\n" + log_mess = await log_reports.send(f"Чат: `{message.channel.name}`({message.channel.id}).\n"
(f"Сообщение: ```{msg.content}```\n" if msg.content else ""), f"Автор: `{message.author.name} ({message.author.id})`\n" +
files = files) (f"Сообщение: ```{message.content}```\n" if message.content else ""),
return 0 files = files)
return
async with self.DataBaseManager.session() as session: async with self.DataBaseManager.session() as session:
if (await self.DataBaseManager.model_classes['staff_users'].is_admin_or_moder_by_id(msg.author.id, self.DataBaseManager, session)): if (await self.DataBaseManager.model_classes['staff_users'].is_admin_or_moder_by_id(message.author.id, self.DataBaseManager, session)):
return 0 return
def extract_root_domain(url): def extract_root_domain(url):
ext = tldextract.extract(url) ext = tldextract.extract(url)
@@ -577,10 +582,12 @@ class MainBot(AnyBots):
return None return None
return f"{ext.domain}.{ext.suffix}".lower() return f"{ext.domain}.{ext.suffix}".lower()
log = disnake.utils.get(msg.guild.channels, id=893065482263994378) log = disnake.utils.get(message.guild.channels, id=893065482263994378)
if not isinstance(log, disnake.TextChannel):
raise TypeError("Проверь канал логов для сомнительных ссылок")
url_pattern = re.compile(r'https?://[^\s]+') url_pattern = re.compile(r'https?://[^\s]+')
links = re.findall(url_pattern, msg.content) links = re.findall(url_pattern, message.content)
аllowed_domains_model = self.DataBaseManager.model_classes['аllowed_domains'] аllowed_domains_model = self.DataBaseManager.model_classes['аllowed_domains']
async with self.DataBaseManager.session() as session: async with self.DataBaseManager.session() as session:
for link in links: for link in links:
@@ -589,28 +596,28 @@ class MainBot(AnyBots):
link_in_wl = (await session.execute(stmt)).scalars().first() link_in_wl = (await session.execute(stmt)).scalars().first()
if link_in_wl is None: if link_in_wl is None:
await log.send(f"{msg.author.mention}({msg.author.id}) отправил в чат {msg.channel.mention} сомнительную ссылку, которой нет в вайлисте:```{msg.content}```") await log.send(f"{message.author.mention}({message.author.id}) отправил в чат {message.channel.mention} сомнительную ссылку, которой нет в вайлисте:```{message.content}```")
mess = await msg.reply(embed=self.ErrEmbed(description=f'Этой ссылки нет в белом списке, но заявка на добавление уже отправлена. Если это срочно, свяжитесь с разработчиком или модераторами.')) mess = await message.reply(embed=self.ErrEmbed(description=f'Этой ссылки нет в белом списке, но заявка на добавление уже отправлена. Если это срочно, свяжитесь с разработчиком или модераторами.'))
await msg.delete() await message.delete()
await asyncio.sleep(20) await asyncio.sleep(20)
await mess.delete() await mess.delete()
return 1 return
message_words = msg.content.replace("/", " ").split(" ") message_words = message.content.replace("/", " ").split(" ")
if "discord.gg" in message_words: if "discord.gg" in message_words:
for i in range(len(message_words)): for i in range(len(message_words)):
if message_words[i]=="discord.gg" and not msg.author.bot: if message_words[i]=="discord.gg" and not message.author.bot:
try: try:
inv = await self.fetch_invite(url = "https://discord.gg/"+message_words[i+1]) inv = await self.fetch_invite(url = "https://discord.gg/"+message_words[i+1])
if inv.guild.id != 490445877903622144: if (isinstance(inv.guild, disnake.PartialInviteGuild) or isinstance(inv.guild, disnake.Guild)) and inv.guild.id != 490445877903622144:
await log.send(f"{msg.author.mention}({msg.author.id}) отправил в чат {msg.channel.mention} сомнительную ссылку на сервер '{inv.guild.name}':```{msg.content}```") await log.send(f"{message.author.mention}({message.author.id}) отправил в чат {message.channel.mention} сомнительную ссылку на сервер '{inv.guild.name}':```{message.content}```")
mess = await msg.reply(embed=self.ErrEmbed(description=f'Ссылки-приглашения запрещены!', colour=0xff9900)) mess = await message.reply(embed=self.ErrEmbed(description=f'Ссылки-приглашения запрещены!', colour=0xff9900))
await msg.delete() await message.delete()
await asyncio.sleep(20) await asyncio.sleep(20)
await mess.delete() await mess.delete()
break break
except disnake.errors.NotFound: except disnake.errors.NotFound:
await log.send(f"{msg.author.mention}({msg.author.id}) отправил в чат {msg.channel.mention} [сомнительную ссылку]({msg.jump_url}) на неизвестный сервер:```{msg.content}```") await log.send(f"{message.author.mention}({message.author.id}) отправил в чат {message.channel.mention} [сомнительную ссылку]({message.jump_url}) на неизвестный сервер:```{message.content}```")
@@ -681,13 +688,15 @@ async def main():
except Exception as e: except Exception as e:
print(f"Произошла критическая ошибка: {e}") print(f"Произошла критическая ошибка: {e}")
finally: finally:
await bot.BotOff() if bot is not None:
await bot.BotOff()
for bot in all_bots: for bot in all_bots:
if not bot.is_closed(): if not bot.is_closed():
await bot.close() await bot.close()
await DataBase.close() if DataBase is not None:
await DataBase.close()
current_task = asyncio.current_task() current_task = asyncio.current_task()
pending = [t for t in asyncio.all_tasks() if t is not current_task and not t.done()] pending = [t for t in asyncio.all_tasks() if t is not current_task and not t.done()]

View File

@@ -30,14 +30,25 @@ class AdminModule(commands.Cog):
@commands.slash_command(name="bot_mod_off") @commands.slash_command(name="bot_mod_off")
async def BotModOff(self, ctx: disnake.ApplicationCommandInteraction): async def BotModOff(self, ctx: disnake.ApplicationCommandInteraction):
if isinstance(ctx.author, disnake.User):
await ctx.send(embed=self.client.ErrEmbed(description=f'Невозможно в личных сообщениях'), ephemeral=True)
return
if self.client.me in ctx.author.roles: if self.client.me in ctx.author.roles:
await ctx.send(embed=self.client.SuccessEmbed(description=f'Бот отключён', colour=0xff9900), ephemeral=True) await ctx.send(embed=self.client.SuccessEmbed(description=f'Бот отключён'), ephemeral=True)
await self.client.BotOff() await self.client.BotOff()
else: else:
await ctx.send(embed=self.client.ErrEmbed(description=f'Не допустимо', colour=0xff9900), ephemeral=True) await ctx.send(embed=self.client.ErrEmbed(description=f'Не допустимо'), ephemeral=True)
@commands.slash_command(name="очистка", administrator=True) @commands.slash_command(name="очистка", administrator=True)
async def clear(self, ctx: disnake.AppCmdInter, count: int): async def clear(self, ctx: disnake.AppCmdInter, count: int):
if isinstance(ctx.author, disnake.User):
await ctx.send(embed=self.client.ErrEmbed(description=f'Невозможно в личных сообщениях'), ephemeral=True)
return
if isinstance(ctx.channel, (disnake.DMChannel, disnake.GroupChannel, disnake.PartialMessageable)):
await ctx.send(embed=self.client.ErrEmbed(description=f'Неверный тип канала!'), ephemeral=True)
return
if self.client.me in ctx.author.roles: if self.client.me in ctx.author.roles:
await ctx.channel.purge(limit=count) await ctx.channel.purge(limit=count)
await ctx.send(embed = self.client.SuccessEmbed(description = f'очищено {count} сообщений!', colour = 0xff9900), ephemeral=True) await ctx.send(embed = self.client.SuccessEmbed(description = f'очищено {count} сообщений!', colour = 0xff9900), ephemeral=True)
@@ -51,6 +62,9 @@ class AdminModule(commands.Cog):
is_admin: bool = commands.Param(description="Имеют ли пользователи в этой роли права администратора? *(только при создании)", name="администратор", default=False), is_admin: bool = commands.Param(description="Имеют ли пользователи в этой роли права администратора? *(только при создании)", name="администратор", default=False),
is_moder: bool = commands.Param(description="Имеют ли пользователи в этой роли права модератора? *(только при создании)", name="модератор", default=False), is_moder: bool = commands.Param(description="Имеют ли пользователи в этой роли права модератора? *(только при создании)", name="модератор", default=False),
delete_branch: str = commands.Param(description="Вы уверены, что хотите удалить ветвь? Для подтверждения впишите \"уверен\"", name="удаление", default=None)): delete_branch: str = commands.Param(description="Вы уверены, что хотите удалить ветвь? Для подтверждения впишите \"уверен\"", name="удаление", default=None)):
if isinstance(ctx.author, disnake.User):
await ctx.send(embed=self.client.ErrEmbed(description=f'Невозможно в личных сообщениях'), ephemeral=True)
return
if not self.client.me in ctx.author.roles: if not self.client.me in ctx.author.roles:
await ctx.send(embed = self.client.ErrEmbed(description = f'Недостаточно прав', colour = 0xff9900), ephemeral=True) await ctx.send(embed = self.client.ErrEmbed(description = f'Недостаточно прав', colour = 0xff9900), ephemeral=True)
@@ -101,16 +115,20 @@ class AdminModule(commands.Cog):
@commands.slash_command(description="Позволяет менять/создавать/удалять роли в системе персонала", name="правка_роли", administrator=True) @commands.slash_command(description="Позволяет менять/создавать/удалять роли в системе персонала", name="правка_роли", administrator=True)
async def edit_role(self, ctx: disnake.AppCmdInter, roleid: str = commands.Param(description="Укажите id роли (используются идентификаторы дискорда)", name="id"), async def edit_role(self, ctx: disnake.AppCmdInter, roleid_str: str = commands.Param(description="Укажите id роли (используются идентификаторы дискорда)", name="id"),
staffsalary: int = commands.Param(description="Укажите зарплату этой роли", name="зарплата", default=0), staffsalary: int = commands.Param(description="Укажите зарплату этой роли", name="зарплата", default=0),
branchid: int = commands.Param(description="Укажите id ветви для этой роли *(только при создании)", name="ветвь", default=None), branchid: int = commands.Param(description="Укажите id ветви для этой роли *(только при создании)", name="ветвь", default=None),
layer: int = commands.Param(description="Укажите слой этой роли в ветке (у ролей нижних слоёв есть власть над верхними)", name="слой", default=None), layer: int = commands.Param(description="Укажите слой этой роли в ветке (у ролей нижних слоёв есть власть над верхними)", name="слой", default=None),
delete_role: str = commands.Param(description="Вы уверены, что хотите удалить роль из системы? Для подтверждения впишите \"уверен\"", name="удаление", default=None),): delete_role: str = commands.Param(description="Вы уверены, что хотите удалить роль из системы? Для подтверждения впишите \"уверен\"", name="удаление", default=None),):
if isinstance(ctx.author, disnake.User):
await ctx.send(embed=self.client.ErrEmbed(description=f'Невозможно в личных сообщениях'), ephemeral=True)
return
if not self.client.me in ctx.author.roles: if not self.client.me in ctx.author.roles:
await ctx.send(embed = self.client.ErrEmbed(description = f'Недостаточно прав', colour = 0xff9900), ephemeral=True) await ctx.send(embed = self.client.ErrEmbed(description = f'Недостаточно прав', colour = 0xff9900), ephemeral=True)
return 1 return 1
roleid = int(roleid) roleid = int(roleid_str)
staff_roles_model = self.DataBaseManager.models['staff_roles'].m staff_roles_model = self.DataBaseManager.models['staff_roles'].m
async with self.DataBaseManager.session() as session: async with self.DataBaseManager.session() as session:
@@ -153,13 +171,17 @@ class AdminModule(commands.Cog):
return 0 return 0
@commands.slash_command(description="Позволяет создавать/удалять пользователей в системе персонала", name="правка_пользователя", administrator=True) @commands.slash_command(description="Позволяет создавать/удалять пользователей в системе персонала", name="правка_пользователя", administrator=True)
async def edit_member(self, ctx: disnake.AppCmdInter, userid: str = commands.Param(description="Укажите id пользователя (используются идентификаторы дискорда)", name="id"), async def edit_member(self, ctx: disnake.AppCmdInter, userid_str: str = commands.Param(description="Укажите id пользователя (используются идентификаторы дискорда)", name="id"),
delete_user: str = commands.Param(description="Вы уверены, что хотите удалить пользователя из системы? Для подтверждения впишите \"уверен\"", name="удаление", default=None)): delete_user: str = commands.Param(description="Вы уверены, что хотите удалить пользователя из системы? Для подтверждения впишите \"уверен\"", name="удаление", default=None)):
if isinstance(ctx.author, disnake.User):
await ctx.send(embed=self.client.ErrEmbed(description=f'Невозможно в личных сообщениях'), ephemeral=True)
return
if not self.client.me in ctx.author.roles: if not self.client.me in ctx.author.roles:
await ctx.send(embed = self.client.ErrEmbed(description = f'Недостаточно прав', colour = 0xff9900), ephemeral=True) await ctx.send(embed = self.client.ErrEmbed(description = f'Недостаточно прав', colour = 0xff9900), ephemeral=True)
return 1 return 1
userid = int(userid) userid = int(userid_str)
staff_users_model = self.DataBaseManager.models['staff_users'].m staff_users_model = self.DataBaseManager.models['staff_users'].m
async with self.DataBaseManager.session() as session: async with self.DataBaseManager.session() as session:
@@ -187,15 +209,19 @@ class AdminModule(commands.Cog):
return 1 return 1
@commands.slash_command(description="!!ВАЖНО!! ИСПОЛЬЗОВАНИЕ ТОЛЬКО В ЭКСТРЕННЫХ СЛУЧАЯХ! Назначает пользователей на роль", name="назначить_пользователя", administrator=True) @commands.slash_command(description="!!ВАЖНО!! ИСПОЛЬЗОВАНИЕ ТОЛЬКО В ЭКСТРЕННЫХ СЛУЧАЯХ! Назначает пользователей на роль", name="назначить_пользователя", administrator=True)
async def appoint_member(self, ctx: disnake.AppCmdInter, userid: str = commands.Param(description="Укажите id пользователя (используются идентификаторы дискорда)", name="пользователь"), async def appoint_member(self, ctx: disnake.AppCmdInter, userid_str: str = commands.Param(description="Укажите id пользователя (используются идентификаторы дискорда)", name="пользователь"),
roleid: str = commands.Param(description="Укажите id роли (используются идентификаторы дискорда)", name="роль"), roleid_str: str = commands.Param(description="Укажите id роли (используются идентификаторы дискорда)", name="роль"),
description: str = commands.Param(description="Описание", name="описание", default=None)): description: str = commands.Param(description="Описание", name="описание", default=None)):
if isinstance(ctx.author, disnake.User):
await ctx.send(embed=self.client.ErrEmbed(description=f'Невозможно в личных сообщениях'), ephemeral=True)
return
if not self.client.me in ctx.author.roles: if not self.client.me in ctx.author.roles:
await ctx.send(embed = self.client.ErrEmbed(description = f'Недостаточно прав', colour = 0xff9900), ephemeral=True) await ctx.send(embed = self.client.ErrEmbed(description = f'Недостаточно прав', colour = 0xff9900), ephemeral=True)
return 1 return 1
userid = int(userid) userid = int(userid_str)
roleid = int(roleid) roleid = int(roleid_str)
async with self.DataBaseManager.session() as session: async with self.DataBaseManager.session() as session:
async with session.begin(): async with session.begin():

View File

@@ -68,6 +68,7 @@ class ModerModule(commands.Cog):
def __init__(self, title, member): def __init__(self, title, member):
self.member = member self.member = member
self.title = title self.title = title
components = []
if title.split(":")[0] == "textmute" or title.split(":")[0] == "voicemute" or title.split(":")[0] == "ban": if title.split(":")[0] == "textmute" or title.split(":")[0] == "voicemute" or title.split(":")[0] == "ban":
components = [ components = [
disnake.ui.TextInput(label="Время", placeholder="Например: 1д15ч9мин", custom_id="time", style=disnake.TextInputStyle.short, max_length=100), disnake.ui.TextInput(label="Время", placeholder="Например: 1д15ч9мин", custom_id="time", style=disnake.TextInputStyle.short, max_length=100),
@@ -89,10 +90,13 @@ class ModerModule(commands.Cog):
async def callback(self, interaction: disnake.Interaction): async def callback(self, interaction: disnake.Interaction):
if interaction.guild is None:
raise TypeError("interaction.guild is None")
async def voicemute(interaction: disnake.MessageInteraction, member: disnake.Member, time, reason): async def voicemute(interaction: disnake.MessageInteraction, member: disnake.Member, time, reason):
role = self.client.voice_mute role = self.client.voice_mute
await member.add_roles(role) await member.add_roles(role)
await member.move_to(None) await member.move_to(None) # type: ignore
async with DataBaseManager.session() as session: async with DataBaseManager.session() as session:
async with session.begin(): async with session.begin():
new_punishment = models['punishment_mutes_voice'](user_id = member.id, reason = reason, time_end = time, time_warn = None, moderator_id = interaction.author.id) new_punishment = models['punishment_mutes_voice'](user_id = member.id, reason = reason, time_end = time, time_warn = None, moderator_id = interaction.author.id)
@@ -106,7 +110,7 @@ class ModerModule(commands.Cog):
session.add(new_punishment) session.add(new_punishment)
async def ban(interaction: disnake.MessageInteraction, member: disnake.Member, time, reason): async def ban(interaction: disnake.MessageInteraction, member: disnake.Member, time, reason):
role = self.client.ban_role role = self.client.ban_role
await member.move_to(None) await member.move_to(None) # type: ignore
if time-datetime.datetime.timestamp(datetime.datetime.now())>0: if time-datetime.datetime.timestamp(datetime.datetime.now())>0:
await member.add_roles(role) await member.add_roles(role)
async with DataBaseManager.session() as session: async with DataBaseManager.session() as session:
@@ -119,6 +123,9 @@ class ModerModule(commands.Cog):
async with session.begin(): async with session.begin():
new_punishment = models['punishment_perms'](user_id = member.id, reason = reason, moderator_id = interaction.author.id) new_punishment = models['punishment_perms'](user_id = member.id, reason = reason, moderator_id = interaction.author.id)
session.add(new_punishment) session.add(new_punishment)
if interaction.guild is None:
raise TypeError("interaction.guild is None")
for channel in interaction.guild.channels: for channel in interaction.guild.channels:
if isinstance(channel, disnake.TextChannel): if isinstance(channel, disnake.TextChannel):
await channel.purge(limit=10, check=lambda m: m.author==member) await channel.purge(limit=10, check=lambda m: m.author==member)
@@ -147,6 +154,10 @@ class ModerModule(commands.Cog):
newnick = "" newnick = ""
if self.title.split(':')[0] == "reprimand": if self.title.split(':')[0] == "reprimand":
embed.add_field(name = 'Ветка', value = self.title.split(':')[1], inline = False) embed.add_field(name = 'Ветка', value = self.title.split(':')[1], inline = False)
if isinstance(interaction, disnake.Interaction):
raise TypeError("modal interaction is interaction")
for key, value in interaction.text_values.items(): for key, value in interaction.text_values.items():
if key == "time": if key == "time":
formated_time = self.client.TimeFormater(value) formated_time = self.client.TimeFormater(value)
@@ -295,6 +306,8 @@ class ModerModule(commands.Cog):
return self return self
async def callback(self, interaction:disnake.MessageInteraction): async def callback(self, interaction:disnake.MessageInteraction):
if interaction.values is None or interaction.guild is None:
raise TypeError("interaction.values is None or interaction.guild is None")
values = interaction.values[0] values = interaction.values[0]
try: try:
pentype, member, penaltid = values.split(":") pentype, member, penaltid = values.split(":")
@@ -302,6 +315,8 @@ class ModerModule(commands.Cog):
return return
if values: if values:
logs_channel = disnake.utils.get(interaction.guild.channels, id = 490730651629387776) logs_channel = disnake.utils.get(interaction.guild.channels, id = 490730651629387776)
if not isinstance(logs_channel, disnake.TextChannel):
raise ValueError("logs_channel is None")
async with DataBaseManager.session() as session: async with DataBaseManager.session() as session:
async with session.begin(): async with session.begin():
@@ -471,9 +486,9 @@ class ModerModule(commands.Cog):
@commands.slash_command(description="Позволяет повысить пользователя в указанной ветке", name="повысить", administrator=True) @commands.slash_command(description="Позволяет повысить пользователя в указанной ветке", name="повысить", administrator=True)
async def promote(self, ctx: disnake.AppCmdInter, branchid: int = commands.Param(description="Укажите id ветви", name="ветвь", default = None), async def promote(self, ctx: disnake.AppCmdInter, branchid: int = commands.Param(description="Укажите id ветви", name="ветвь", default = None),
userid: str = commands.Param(description="Укажите id пользователя (используются идентификаторы дискорда)", name="пользователь")): userid_str: str = commands.Param(description="Укажите id пользователя (используются идентификаторы дискорда)", name="пользователь")):
userid = int(userid) userid = int(userid_str)
async with self.DataBaseManager.session() as session: async with self.DataBaseManager.session() as session:
async with session.begin(): async with session.begin():
@@ -544,6 +559,8 @@ class ModerModule(commands.Cog):
if member_role is not None: if member_role is not None:
member_role_index = next((i for i, role in enumerate(branch_roles) if role.id == member_role.role.id), None) member_role_index = next((i for i, role in enumerate(branch_roles) if role.id == member_role.role.id), None)
if member_role_index is None:
raise ValueError("member_role_index is None")
if member_role_index + 1 >= len(branch_roles): if member_role_index + 1 >= len(branch_roles):
await ctx.send(embed = self.client.ErrEmbed(description = f'Этот пользователь уже находится на самой высокой должности в данной ветви')) await ctx.send(embed = self.client.ErrEmbed(description = f'Этот пользователь уже находится на самой высокой должности в данной ветви'))
@@ -584,9 +601,9 @@ class ModerModule(commands.Cog):
@commands.slash_command(description="Позволяет понизить пользователя в указанной ветке", name="понизить", administrator=True) @commands.slash_command(description="Позволяет понизить пользователя в указанной ветке", name="понизить", administrator=True)
async def demote(self, ctx: disnake.AppCmdInter, branchid: int = commands.Param(description="Укажите id ветви", name="ветвь", default = None), async def demote(self, ctx: disnake.AppCmdInter, branchid: int = commands.Param(description="Укажите id ветви", name="ветвь", default = None),
userid: str = commands.Param(description="Укажите id пользователя (используются идентификаторы дискорда)", name="пользователь")): userid_str: str = commands.Param(description="Укажите id пользователя (используются идентификаторы дискорда)", name="пользователь")):
userid = int(userid) userid = int(userid_str)
async with self.DataBaseManager.session() as session: async with self.DataBaseManager.session() as session:
async with session.begin(): async with session.begin():
@@ -657,6 +674,8 @@ class ModerModule(commands.Cog):
if member_role is not None: if member_role is not None:
member_role_index = next((i for i, role in enumerate(branch_roles) if role.id == member_role.role.id), None) member_role_index = next((i for i, role in enumerate(branch_roles) if role.id == member_role.role.id), None)
if member_role_index is None:
raise ValueError("member_role_index is None")
if member_role_index == 0: if member_role_index == 0:
stmt = ( stmt = (

View File

@@ -27,10 +27,12 @@ class UIModule(commands.Cog):
print(f'KrekModBot UI module activated') print(f'KrekModBot UI module activated')
@commands.slash_command(description="Показывает действительные наказания пользователя", name="наказания") @commands.slash_command(description="Показывает действительные наказания пользователя", name="наказания")
async def penalties(self, ctx: disnake.AppCmdInter, member: disnake.Member = None): async def penalties(self, ctx: disnake.AppCmdInter, input_member: disnake.Member | None= None):
models = self.client.DataBaseManager.model_classes models = self.client.DataBaseManager.model_classes
if not member: if input_member is None:
member = ctx.author member = ctx.author
else:
member = input_member
embed = self.client.AnswEmbed(title="Наказания", description = f"{member.mention}") embed = self.client.AnswEmbed(title="Наказания", description = f"{member.mention}")
embed.set_thumbnail(url=member.avatar) embed.set_thumbnail(url=member.avatar)
@@ -181,7 +183,13 @@ class UIModule(commands.Cog):
return return
mentions = [] mentions = []
if ctx.guild is None:
await ctx.send(embed = client.ErrEmbed(description = f'Нельзя подать жалобу в личных сообщениях!', colour = 0xFF4500), ephemeral=True)
return
report_channel = disnake.utils.get(ctx.guild.channels, id = 1219644036378394746) report_channel = disnake.utils.get(ctx.guild.channels, id = 1219644036378394746)
if not isinstance(report_channel, disnake.TextChannel):
raise ValueError("not isinstance(report_channel, disnake.TextChannel)")
highest = [i for i in client.hierarchy if i in member.roles][0] highest = [i for i in client.hierarchy if i in member.roles][0]
for i in range(0, client.hierarchy.index(highest)): for i in range(0, client.hierarchy.index(highest)):

View File

@@ -14,7 +14,7 @@ class Base(DeclarativeBase):
def get_table_name(self): def get_table_name(self):
return self.__tablename__ return self.__tablename__
def to_dict(self, exclude: list[str] = None): def to_dict(self, exclude: list[str] | None = None):
"""Конвертирует модель в словарь, исключая указанные поля.""" """Конвертирует модель в словарь, исключая указанные поля."""
if exclude is None: if exclude is None:
exclude = [] exclude = []

View File

@@ -100,12 +100,12 @@ class DatabaseManager:
return backup_file return backup_file
async def pg_restore(self, echo = False, backup_file = 'backups/backup_file.backup'): async def pg_restore(self, echo = False, backup_file = 'backups/backup_file.backup'):
conn = await self.DataBaseManager.engine.connect() conn = await self.engine.connect()
db_name = self.DataBaseManager.engine.url.database db_name = self.engine.url.database
user = self.DataBaseManager.engine.url.username user = self.engine.url.username
host = self.DataBaseManager.engine.url.host host = self.engine.url.host
port = self.DataBaseManager.engine.url.port port = self.engine.url.port
password = self.DataBaseManager.engine.url.password password = self.engine.url.password
os.environ['PGPASSWORD'] = password # Установка пароля для подключения os.environ['PGPASSWORD'] = password # Установка пароля для подключения
command = [ command = [