67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
import discord
|
|
|
|
from tortoise import expressions
|
|
|
|
from payphone.db import models
|
|
from payphone.core import constants, formatting
|
|
|
|
|
|
async def ReplyEmbed(
|
|
reference: discord.MessageReference, call_id: int
|
|
) -> (discord.Embed | None, models.Message | None):
|
|
"""Generates the embed sent on calls to represent replies.
|
|
|
|
Args:
|
|
reference (discord.MessageReference): The message reference.
|
|
call_id (int): The ID of the call the message was sent in.
|
|
|
|
Returns:
|
|
(discord.Embed | None, models.Message | None): The generated embed and the replied message.
|
|
"""
|
|
|
|
message = (
|
|
await models.Message.get_or_none(
|
|
expressions.Q(id=reference.message_id)
|
|
| expressions.Q(propagation_id=reference.message_id),
|
|
call_id=call_id,
|
|
)
|
|
.prefetch_related("contents")
|
|
.select_related("profile", "channel", "propagation_channel")
|
|
)
|
|
|
|
if message is None:
|
|
return None, None
|
|
|
|
is_this_channel = message.id == reference.message_id
|
|
|
|
last_content: models.MessageContent | None = None
|
|
|
|
for content in message.contents:
|
|
if last_content is None:
|
|
last_content = content
|
|
continue
|
|
|
|
if last_content.message_id < content.message_id:
|
|
last_content = content
|
|
|
|
author_name = message.display_name if is_this_channel else message.profile.name
|
|
author_avatar_url = (
|
|
message.display_avatar if is_this_channel else message.profile.avatar_url
|
|
)
|
|
|
|
embed = discord.Embed(
|
|
color=constants.EMBED_COLOR,
|
|
description=(
|
|
formatting.trim(last_content.content)
|
|
if last_content.was_propagated or is_this_channel
|
|
else "*This message was censored.*"
|
|
),
|
|
author=discord.EmbedAuthor(
|
|
name=f"Replied to {author_name}",
|
|
icon_url=author_avatar_url,
|
|
url=message.jump_url(is_this_channel),
|
|
),
|
|
)
|
|
|
|
return embed, message
|