Улучшена система отложенных сообщений, добавлены вложения

This commit is contained in:
2025-08-07 20:38:08 +03:00
parent 618b2b7fbc
commit bea6859b15
3 changed files with 28 additions and 6 deletions

View File

@@ -285,9 +285,11 @@ class MainBot(AnyBots):
if self.task_start: if self.task_start:
self.CheckDataBases.cancel() self.CheckDataBases.cancel()
self.MakeBackups.cancel() self.MakeBackups.cancel()
self.SendingDeferredMessages.cancel()
self.MakeBackups.start() self.MakeBackups.start()
self.CheckDataBases.start() self.CheckDataBases.start()
self.SendingDeferredMessages.start()
else: else:
self.SendingDeferredMessages.start() self.SendingDeferredMessages.start()
@@ -295,6 +297,7 @@ class MainBot(AnyBots):
if self.task_start: if self.task_start:
self.CheckDataBases.cancel() self.CheckDataBases.cancel()
self.MakeBackups.cancel() self.MakeBackups.cancel()
self.SendingDeferredMessages.cancel()
self.stop_event.set() self.stop_event.set()
@@ -317,7 +320,7 @@ class MainBot(AnyBots):
for message in messages: for message in messages:
webhook = await self.fetch_webhook(message.webhook_id) 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) await session.delete(message)

View File

@@ -213,7 +213,7 @@ class AdminModule(commands.Cog):
@commands.slash_command(name="запланировать_сообщение", description="Позволяет запланировать отправку анонсов и других сообщений") @commands.slash_command(name="запланировать_сообщение", description="Позволяет запланировать отправку анонсов и других сообщений")
async def schedule_message(self, ctx: disnake.AppCmdInter, async def schedule_message(self, ctx: disnake.AppCmdInter,
message_id: str = commands.Param(description="Укажите id сообщения, которое будет отложено", name="сообщение"), 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)): timestamp: int = commands.Param(description="Временная метка для отправки сообщения", name="таймстамп", default=None)):
await ctx.response.defer() 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) 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) 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'Сообщение будет отправлено <t:{timestamp}:F>! Текст сообщения:', colour = 0xff9900))
mgs_parsed = await message.parse_message(self.client, preview=True)
await ctx.send(**mgs_parsed)
return 0 return 0

View File

@@ -1,3 +1,5 @@
import io
import disnake
from sqlalchemy import Column, Integer, BigInteger, Text, Float, ForeignKey, UniqueConstraint, MetaData, Boolean from sqlalchemy import Column, Integer, BigInteger, Text, Float, ForeignKey, UniqueConstraint, MetaData, Boolean
from sqlalchemy.orm import declarative_base, relationship, Mapped, mapped_column from sqlalchemy.orm import declarative_base, relationship, Mapped, mapped_column
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession 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) webhook_id: Mapped[int | None] = mapped_column(BigInteger, nullable=True, index=True)
timestamp: Mapped[float | None] = mapped_column(Float, 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) krekchat = await client.fetch_guild(client.krekchat.id)
source_channel = await krekchat.fetch_channel(self.source_channel_id) source_channel = await krekchat.fetch_channel(self.source_channel_id)
source_message = await source_channel.fetch_message(self.source_message_id) source_message = await source_channel.fetch_message(self.source_message_id)
content = source_message.content files = []
return content 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 = { all_data = {
'base': Base 'base': Base