From 5de23ffe58c77f99fad04d8bc7c0d976f4efd83d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Susa=C3=B1a?= Date: Fri, 23 May 2025 14:53:50 -0400 Subject: [PATCH] fix: Error with ThreadChannel#webhooks for bad patchClass interaction (#341) --- src/structures/channels.ts | 6 +- src/websocket/discord/heartbeater.ts | 86 ++++++++++++++-------------- 2 files changed, 47 insertions(+), 45 deletions(-) diff --git a/src/structures/channels.ts b/src/structures/channels.ts index 1284aa0..fd93c3b 100644 --- a/src/structures/channels.ts +++ b/src/structures/channels.ts @@ -581,13 +581,15 @@ export class ForumChannel extends BaseGuildChannel { export interface ThreadChannel extends ObjectToLower>, - Omit {} + Omit { + parentId: string; +} @mix(TextBaseGuildChannel) export class ThreadChannel extends BaseChannel< ChannelType.PublicThread | ChannelType.AnnouncementThread | ChannelType.PrivateThread > { - parentId!: string; declare type: ChannelType.PublicThread | ChannelType.AnnouncementThread | ChannelType.PrivateThread; + webhooks = WebhookChannelMethods.channel({ client: this.client, channelId: this.parentId, diff --git a/src/websocket/discord/heartbeater.ts b/src/websocket/discord/heartbeater.ts index 9ba0257..67bd90c 100644 --- a/src/websocket/discord/heartbeater.ts +++ b/src/websocket/discord/heartbeater.ts @@ -1,43 +1,43 @@ -import type { Awaitable } from '../../common'; - -export type WorkerHeartbeaterMessages = SendHeartbeat; - -export type CreateHeartbeaterMessage = { type: T } & D; - -export type SendHeartbeat = CreateHeartbeaterMessage<'HEARTBEAT'>; - -export class Heartbeater { - store = new Map< - number, - { - ack: boolean; - interval: NodeJS.Timeout; - } - >(); - constructor( - public sendMethod: (workerId: number, data: WorkerHeartbeaterMessages) => Awaitable, - public interval: number, - ) {} - - register(workerId: number, recreate: (workerId: number) => Awaitable) { - if (this.interval <= 0) return; - this.store.set(workerId, { - ack: true, - interval: setInterval(() => { - const heartbeat = this.store.get(workerId)!; - if (!heartbeat.ack) { - heartbeat.ack = true; - return recreate(workerId); - } - heartbeat.ack = false; - this.sendMethod(workerId, { type: 'HEARTBEAT' }); - }, this.interval), - }); - } - - acknowledge(workerId: number) { - const heartbeat = this.store.get(workerId); - if (!heartbeat) return; - heartbeat.ack = true; - } -} +import type { Awaitable } from '../../common'; + +export type WorkerHeartbeaterMessages = SendHeartbeat; + +export type CreateHeartbeaterMessage = { type: T } & D; + +export type SendHeartbeat = CreateHeartbeaterMessage<'HEARTBEAT'>; + +export class Heartbeater { + store = new Map< + number, + { + ack: boolean; + interval: NodeJS.Timeout; + } + >(); + constructor( + public sendMethod: (workerId: number, data: WorkerHeartbeaterMessages) => Awaitable, + public interval: number, + ) {} + + register(workerId: number, recreate: (workerId: number) => Awaitable) { + if (this.interval <= 0) return; + this.store.set(workerId, { + ack: true, + interval: setInterval(() => { + const heartbeat = this.store.get(workerId)!; + if (!heartbeat.ack) { + heartbeat.ack = true; + return recreate(workerId); + } + heartbeat.ack = false; + this.sendMethod(workerId, { type: 'HEARTBEAT' }); + }, this.interval), + }); + } + + acknowledge(workerId: number) { + const heartbeat = this.store.get(workerId); + if (!heartbeat) return; + heartbeat.ack = true; + } +}