Skip to content

Commit 57e7f69

Browse files
committed
Add a function to fetch the moved WebhookMessage from some Message.
1 parent 68be7d2 commit 57e7f69

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

app/utils/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
dynamic_timestamp,
2222
format_or_file,
2323
get_ghostty_guild,
24+
get_moved_message,
2425
get_moved_message_author_id,
2526
get_or_create_webhook,
2627
message_can_be_moved,
@@ -44,6 +45,7 @@
4445
"escape_special",
4546
"format_or_file",
4647
"get_ghostty_guild",
48+
"get_moved_message",
4749
"get_moved_message_author_id",
4850
"get_or_create_webhook",
4951
"is_dm",

app/utils/webhooks.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import discord
1212
import httpx
1313

14-
from app.setup import bot
14+
from app.setup import bot, config
1515
from app.utils.message_data import MessageData
1616

1717
if TYPE_CHECKING:
@@ -504,6 +504,43 @@ def format_or_file(
504504
return full_message, None
505505

506506

507+
async def get_moved_message(message: discord.Message) -> discord.WebhookMessage | None:
508+
"""
509+
Returns None if it could not be acquired, and discord.utils.MISSING if the
510+
provided message is not a moved message.
511+
"""
512+
if message.webhook_id is None or isinstance(
513+
message.channel,
514+
# These types can't even have a webhook.
515+
discord.DMChannel | discord.GroupChannel | discord.PartialMessageable,
516+
):
517+
return discord.utils.MISSING
518+
519+
if isinstance(message.channel, discord.Thread):
520+
thread = message.channel
521+
if (channel := message.channel.parent) is None:
522+
return None
523+
else:
524+
channel = message.channel
525+
thread = discord.utils.MISSING
526+
527+
for webhook in await channel.webhooks():
528+
if webhook.id == message.webhook_id:
529+
break
530+
else:
531+
return discord.utils.MISSING
532+
if webhook.name != config.BOT_WEBHOOK_NAME:
533+
# More heuristics to determine if a webhook message is a moved message.
534+
return discord.utils.MISSING
535+
536+
try:
537+
return await webhook.fetch_message(message.id, thread=thread)
538+
except discord.Forbidden:
539+
return None
540+
except discord.NotFound:
541+
return discord.utils.MISSING
542+
543+
507544
def _find_snowflake(
508545
content: str, type_: str, *, substring_start: int = 0
509546
) -> tuple[int | None, int | None]:

0 commit comments

Comments
 (0)