From 48ff8817426c95d640d7ff37f59bb0d9745fcdee Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Thu, 17 Jun 2021 16:13:06 +0000 Subject: [PATCH] fix: refactor to DDThreads --- src/util/transformers/channel_to_thread.ts | 88 ++++++++++++++++++---- 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/src/util/transformers/channel_to_thread.ts b/src/util/transformers/channel_to_thread.ts index 5b6dbc8f6..9202b151a 100644 --- a/src/util/transformers/channel_to_thread.ts +++ b/src/util/transformers/channel_to_thread.ts @@ -1,20 +1,80 @@ import { Channel } from "../../types/channels/channel.ts"; import { snowflakeToBigint } from "../bigint.ts"; +import { createNewProp } from "../utils.ts"; + +export const threadToggles = { + /** Whether this thread is archived. */ + archived: 1n, + /** Whether this thread is locked. */ + locked: 2n, +}; + +const baseThread: Partial = { + get archived() { + return Boolean(this.bitfield! & threadToggles.archived); + }, + get locked() { + return Boolean(this.bitfield! & threadToggles.locked); + }, + toJSON() { + return { + id: this.id?.toString(), + channelId: this.channelId?.toString(), + memberCount: this.memberCount, + messageCount: this.messageCount, + archiveTimestamp: new Date(this.archiveTimestamp!).toISOString(), + archiverId: this.archiverId?.toString(), + autoArchiveDuration: this.autoArchiveDuration, + archived: this.archived, + locked: this.locked, + } as Thread; + }, +}; export function channelToThread(channel: Channel) { - return { - id: snowflakeToBigint(channel.id), - channelId: snowflakeToBigint(channel.parentId!), - memberCount: channel.memberCount, - messageCount: channel.messageCount, - archived: channel.threadMetadata?.archived || false, - archiveTimestamp: channel.threadMetadata?.archiveTimestamp - ? Date.parse(channel.threadMetadata.archiveTimestamp) - : undefined, - archiverId: channel.threadMetadata?.archiverId ? snowflakeToBigint(channel.threadMetadata.archiverId) : undefined, - autoArchiveDuration: channel.threadMetadata?.autoArchiveDuration || 0, - locked: channel.threadMetadata?.locked || false, - }; + let bitfield = 0n; + + if (channel.threadMetadata?.archived) bitfield |= threadToggles.archived; + if (channel.threadMetadata?.locked) bitfield |= threadToggles.locked; + + return Object.create(baseThread, { + id: createNewProp(snowflakeToBigint(channel.id)), + channelId: createNewProp(snowflakeToBigint(channel.parentId!)), + memberCount: createNewProp(channel.memberCount), + messageCount: createNewProp(channel.messageCount), + archiveTimestamp: createNewProp( + channel.threadMetadata?.archiveTimestamp ? Date.parse(channel.threadMetadata.archiveTimestamp) : undefined + ), + archiverId: createNewProp( + channel.threadMetadata?.archiverId ? snowflakeToBigint(channel.threadMetadata.archiverId) : undefined + ), + autoArchiveDuration: createNewProp(channel.threadMetadata?.autoArchiveDuration || 0), + bitfield: createNewProp(bitfield), + }); } -export type Thread = ReturnType; +export interface Thread { + id: string; + channelId: string; + memberCount: number; + messageCount: number; + archiveTimestamp: string; + archiverId?: string; + autoArchiveDuration: number; + archived: boolean; + locked: boolean; +} + +export interface DiscordenoThread { + id: bigint; + channelId: bigint; + memberCount: number; + messageCount: number; + archiveTimestamp: number; + archiverId?: bigint; + autoArchiveDuration: number; + archived: boolean; + locked: boolean; + bitfield: bigint; + toJSON(): Thread; +}