Исправлены все ошибки PyLance
This commit is contained in:
@@ -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)
|
||||||
|
if isinstance(log_reports, disnake.TextChannel):
|
||||||
files=[]
|
files=[]
|
||||||
for att in msg.attachments:
|
for att in message.attachments:
|
||||||
files = files + [await att.to_file()]
|
files = files + [await att.to_file()]
|
||||||
log_mess = await log_reports.send(f"Чат: `{msg.channel.name}`({msg.channel.id}).\n"
|
log_mess = await log_reports.send(f"Чат: `{message.channel.name}`({message.channel.id}).\n"
|
||||||
f"Автор: `{msg.author.name} ({msg.author.id})`\n" +
|
f"Автор: `{message.author.name} ({message.author.id})`\n" +
|
||||||
(f"Сообщение: ```{msg.content}```\n" if msg.content else ""),
|
(f"Сообщение: ```{message.content}```\n" if message.content else ""),
|
||||||
files = files)
|
files = files)
|
||||||
return 0
|
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,12 +688,14 @@ async def main():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Произошла критическая ошибка: {e}")
|
print(f"Произошла критическая ошибка: {e}")
|
||||||
finally:
|
finally:
|
||||||
|
if bot is not None:
|
||||||
await bot.BotOff()
|
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()
|
||||||
|
|
||||||
|
if DataBase is not None:
|
||||||
await DataBase.close()
|
await DataBase.close()
|
||||||
|
|
||||||
current_task = asyncio.current_task()
|
current_task = asyncio.current_task()
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
@@ -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 = (
|
||||||
|
|||||||
@@ -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)):
|
||||||
|
|||||||
@@ -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 = []
|
||||||
|
|||||||
@@ -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 = [
|
||||||
|
|||||||
Reference in New Issue
Block a user