From 46ee34332d04c946329f9c274aad4d58d1acc839 Mon Sep 17 00:00:00 2001 From: nex Date: Mon, 6 Nov 2023 22:40:35 +0000 Subject: [PATCH] Add compatibility for the new bridge system --- .idea/dataSources.local.xml | 2 +- cogs/events.py | 69 ++++++++++++++++++++++++++----------- web/server.py | 2 +- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/.idea/dataSources.local.xml b/.idea/dataSources.local.xml index 5718b24..392ac75 100644 --- a/.idea/dataSources.local.xml +++ b/.idea/dataSources.local.xml @@ -1,6 +1,6 @@ - + " diff --git a/cogs/events.py b/cogs/events.py index c1fc879..a50b79c 100644 --- a/cogs/events.py +++ b/cogs/events.py @@ -10,6 +10,7 @@ import re import subprocess import textwrap import traceback +import pydantic import warnings from datetime import datetime, timedelta, timezone from pathlib import Path @@ -47,6 +48,26 @@ LTR = "\N{black rightwards arrow}\U0000fe0f" RTL = "\N{leftwards black arrow}\U0000fe0f" +class MessagePayload(pydantic.BaseModel): + class MessageAttachmentPayload(pydantic.BaseModel): + url: str + proxy_url: str + filename: str + size: int + width: int + height: int + content_type: str + + message_id: int + author: str + avatar: str + content: str + clean_content: str + at: float + attachments: list[MessageAttachmentPayload] = [] + reply_to: Optional["MessagePayload"] = None + + async def _dc(client: discord.VoiceClient | None): if client is None: return @@ -321,27 +342,33 @@ class Events(commands.Cog): return if message.channel.name == "femboy-hole": - payload = { - "author": message.author.name, - "avatar": message.author.display_avatar.with_format("png").with_size(512).url, - "content": message.content, - "at": message.created_at.timestamp(), - "attachments": [ - { - "url": a.url, - "filename": a.filename, - "size": a.size, - "width": a.width, - "height": a.height, - "content_type": a.content_type, - } - for a in message.attachments - ], - } - if message.author.discriminator != "0": - payload["author"] += "#%s" % message.author.discriminator - if message.author != self.bot.user and (payload["content"] or payload["attachments"]): - await self.bot.bridge_queue.put(payload) + def generate_payload(_message: discord.Message) -> MessagePayload: + _payload = MessagePayload( + message_id=_message.id, + author=_message.author.name, + avatar=_message.author.display_avatar.with_static_format("webp").with_size(512).url, + content=_message.content or '', + clean_content=str(_message.clean_content or ''), + at=_message.created_at.timestamp() + ) + for attachment in _message.attachments: + _payload.attachments.append( + MessagePayload.MessageAttachmentPayload( + url=attachment.url, + proxy_url=attachment.proxy_url, + size=attachment.size, + width=attachment.width, + height=attachment.height, + content_type=attachment.content_type + ) + ) + if _message.reference is not None and _message.reference.cached_message: + _payload.reply_to = generate_payload(_message) + return _payload + + payload = generate_payload(message) + if message.author != self.bot.user and (payload.content or payload.attachments): + await self.bot.bridge_queue.put(payload.model_dump()) if message.channel.name == "pinboard" and not message.content.startswith(("#", "//", ";", "h!")): if message.type == discord.MessageType.pins_add: diff --git a/web/server.py b/web/server.py index f96bc9c..b6e6daf 100644 --- a/web/server.py +++ b/web/server.py @@ -254,7 +254,7 @@ async def bridge(req: Request): if not channel: raise HTTPException(status_code=404, detail="Channel does not exist.") - if len(body["message"]) > 6000: + if len(body["message"]) > 4000: raise HTTPException(status_code=400, detail="Message too long.") paginator = Paginator(prefix="", suffix="", max_size=1990) for line in body["message"].splitlines():