From 166e310f96c66f4acbc0096876573394d1088dfe Mon Sep 17 00:00:00 2001 From: Interitio Date: Wed, 13 Aug 2025 15:32:31 +1000 Subject: [PATCH] feat (webhook): Support threaded webhooks. Extend discord.Webhook to accept a persistent thread_id. --- messagelogger/cog.py | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/messagelogger/cog.py b/messagelogger/cog.py index ba1f7a3..fa40c91 100644 --- a/messagelogger/cog.py +++ b/messagelogger/cog.py @@ -1,11 +1,12 @@ import asyncio import json +from urllib.parse import urlparse, parse_qs from typing import Optional from weakref import WeakValueDictionary import discord -from discord.abc import GuildChannel +from discord.abc import GuildChannel, Snowflake from discord.ext import commands as cmds -from discord import app_commands as appcmds +from discord import Object, app_commands as appcmds from discord.utils import utcnow from data.queries import JOINTYPE, ORDER @@ -20,6 +21,29 @@ from .lib import diff_file from .data import LogData, LoggingGuild, LoggedMessage, LogAttachment, MessageState +class ThreadedWebhook(discord.Webhook): + __slots__ = ('thread_id',) + + def __init__(self, *args, thread_id=None, **kwargs): + super().__init__(*args, **kwargs) + self.thread_id = thread_id + + @classmethod + def from_url(cls, url: str, *args, **kwargs): + self = super().from_url(url, *args, **kwargs) + parse = urlparse(url) + if parse.query: + args = parse_qs(parse.query) + if 'thread_id' in args: + self.thread_id = int(args['thread_id'][0]) + return self + + async def send(self, *args, **kwargs): + if self.thread_id is not None: + kwargs.setdefault('thread', Object(self.thread_id)) + return await super().send(*args, **kwargs) + + class LogCog(LionCog): attachment_hook: discord.Webhook @@ -46,7 +70,7 @@ class LogCog(LionCog): ) guilds = {} for row in guildrows: - hook = discord.Webhook.from_url(row.webhook_url, client=self.bot) + hook = ThreadedWebhook.from_url(row.webhook_url, client=self.bot) guilds[row.guildid] = hook self.logging_guilds = guilds @@ -470,7 +494,7 @@ class LogCog(LionCog): if not ctx.author.guild_permissions.manage_guild: return - webhook = discord.Webhook.from_url(webhook_url, client=self.bot) + webhook = ThreadedWebhook.from_url(webhook_url, client=self.bot) try: embed = discord.Embed( title="Testing",