Compare commits

..

1 Commits

Author SHA1 Message Date
166e310f96 feat (webhook): Support threaded webhooks.
Extend discord.Webhook to accept a persistent thread_id.
2025-08-13 15:32:31 +10:00

View File

@@ -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",