From bea6859b15ec16a36dc894e056c1361aa5ca6768 Mon Sep 17 00:00:00 2001 From: HypoxiE Date: Thu, 7 Aug 2025 20:38:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=B0=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9,=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B2=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/CoreMod.py | 5 ++++- src/cogs/administrators.py | 6 ++++-- src/database/db_classes.py | 23 ++++++++++++++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/CoreMod.py b/src/CoreMod.py index b7dd291..ec230cb 100644 --- a/src/CoreMod.py +++ b/src/CoreMod.py @@ -285,9 +285,11 @@ class MainBot(AnyBots): if self.task_start: self.CheckDataBases.cancel() self.MakeBackups.cancel() + self.SendingDeferredMessages.cancel() self.MakeBackups.start() self.CheckDataBases.start() + self.SendingDeferredMessages.start() else: self.SendingDeferredMessages.start() @@ -295,6 +297,7 @@ class MainBot(AnyBots): if self.task_start: self.CheckDataBases.cancel() self.MakeBackups.cancel() + self.SendingDeferredMessages.cancel() self.stop_event.set() @@ -317,7 +320,7 @@ class MainBot(AnyBots): for message in messages: webhook = await self.fetch_webhook(message.webhook_id) - await webhook.send(await message.parse_message(self)) + await webhook.send(**(await message.parse_message(self))) await session.delete(message) diff --git a/src/cogs/administrators.py b/src/cogs/administrators.py index 44e1486..62bf150 100644 --- a/src/cogs/administrators.py +++ b/src/cogs/administrators.py @@ -213,7 +213,7 @@ class AdminModule(commands.Cog): @commands.slash_command(name="запланировать_сообщение", description="Позволяет запланировать отправку анонсов и других сообщений") async def schedule_message(self, ctx: disnake.AppCmdInter, message_id: str = commands.Param(description="Укажите id сообщения, которое будет отложено", name="сообщение"), - webhook_link: str = commands.Param(description="Укажите ссылку на вебхук, от которого будет отправлено сообщение(по умолчанию от лица бота)", name="вебхук", default=None), + webhook_link: str = commands.Param(description="Укажите ссылку на вебхук, от которого будет отправлено сообщение", name="вебхук"), timestamp: int = commands.Param(description="Временная метка для отправки сообщения", name="таймстамп", default=None)): await ctx.response.defer() @@ -243,5 +243,7 @@ class AdminModule(commands.Cog): message = scheduled_message_model(source_channel_id=ctx.channel.id, source_message_id=int(message_id), webhook_id=webhook_id, timestamp=timestamp) session.add(message) - await ctx.edit_original_response(embed = self.client.SuccessEmbed(description = f'Успешно! Текст сообщения:\n {await message.parse_message(self.client)}', colour = 0xff9900)) + await ctx.edit_original_response(embed = self.client.SuccessEmbed(description = f'Сообщение будет отправлено ! Текст сообщения:', colour = 0xff9900)) + mgs_parsed = await message.parse_message(self.client, preview=True) + await ctx.send(**mgs_parsed) return 0 diff --git a/src/database/db_classes.py b/src/database/db_classes.py index 93f4f27..3e822d6 100644 --- a/src/database/db_classes.py +++ b/src/database/db_classes.py @@ -1,3 +1,5 @@ +import io +import disnake from sqlalchemy import Column, Integer, BigInteger, Text, Float, ForeignKey, UniqueConstraint, MetaData, Boolean from sqlalchemy.orm import declarative_base, relationship, Mapped, mapped_column from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession @@ -238,13 +240,28 @@ class ScheduledMessage(Base): webhook_id: Mapped[int | None] = mapped_column(BigInteger, nullable=True, index=True) timestamp: Mapped[float | None] = mapped_column(Float, nullable=True, index=True) - async def parse_message(self, client): + async def parse_message(self, client, *, preview=False): krekchat = await client.fetch_guild(client.krekchat.id) source_channel = await krekchat.fetch_channel(self.source_channel_id) source_message = await source_channel.fetch_message(self.source_message_id) - content = source_message.content - return content + files = [] + for attachment in source_message.attachments: + file_bytes = await attachment.read() + files.append(disnake.File(io.BytesIO(file_bytes), filename=attachment.filename)) + + content = source_message.content if not preview else source_message.clean_content + + def make_dict(**kwargs): + return kwargs + + args = make_dict(content=content, + embeds=source_message.embeds, + components=source_message.components, + files=files if files else None + ) + + return args all_data = { 'base': Base