From 1e8475456ab909771164f37da46e0e8a315bbea2 Mon Sep 17 00:00:00 2001 From: Helloyunho Date: Sat, 24 Oct 2020 01:11:00 +0900 Subject: [PATCH] Caching, Fetching, and other things - Make the gateway fetches guilds from Discord response - Fetch guilds with only ID and client - Make more types - Fix lint errors Co-Authored-By: Y <8479056+yky4589@users.noreply.github.com> Co-Authored-By: khk4912 <30457148+khk4912@users.noreply.github.com> Co-Authored-By: Aki <71239005+AkiaCode@users.noreply.github.com> Co-Authored-By: Choi Minseo --- src/models/cache.ts | 46 ++++++++ src/models/client.ts | 4 +- src/models/gateway.ts | 17 ++- src/models/rest.ts | 16 +-- src/structures/categoryChannel.ts | 26 +++++ src/structures/channel.ts | 38 ++++++- src/structures/dm.ts | 12 +- src/structures/embed.ts | 2 +- src/structures/emoji.ts | 11 +- src/structures/groupChannel.ts | 17 +++ src/structures/guild.ts | 167 ++++++++++++++++------------ src/structures/guildChannel.ts | 17 ++- src/structures/guildTextChannel.ts | 19 ++++ src/structures/guildVoiceChannel.ts | 28 +++++ src/structures/invite.ts | 30 ++--- src/structures/member.ts | 17 +-- src/structures/message.ts | 44 ++++---- src/structures/role.ts | 2 +- src/structures/textChannel.ts | 42 ++----- src/structures/user.ts | 14 +-- src/structures/voicestate.ts | 63 +++++------ src/structures/webhook.ts | 42 +++---- src/test/index.ts | 8 ++ src/types/channelTypes.ts | 89 ++++++++++----- src/types/emojiTypes.ts | 4 +- src/types/endpoint.ts | 101 ++++++++++++++--- src/types/gatewayTypes.ts | 43 ++++--- src/types/guildTypes.ts | 53 +++++---- src/types/inviteTypes.ts | 14 +-- src/types/presenceTypes.ts | 4 +- src/types/snowflake.ts | 5 - src/types/templateTypes.ts | 8 +- src/types/voiceTypes.ts | 6 +- src/types/webhookTypes.ts | 10 +- tsconfig.json | 6 +- 35 files changed, 667 insertions(+), 358 deletions(-) create mode 100644 src/models/cache.ts create mode 100644 src/structures/categoryChannel.ts create mode 100644 src/structures/groupChannel.ts create mode 100644 src/structures/guildTextChannel.ts create mode 100644 src/structures/guildVoiceChannel.ts diff --git a/src/models/cache.ts b/src/models/cache.ts new file mode 100644 index 0000000..5a2c0c8 --- /dev/null +++ b/src/models/cache.ts @@ -0,0 +1,46 @@ +let caches: any = {} + +const get = (cacheName: string, key: string) => { + const gotCache: Map = caches[cacheName] + if (gotCache === undefined || !(gotCache instanceof Map)) { + return undefined + } + + const gotMap = gotCache.get(key) + return gotMap +} + +const set = (cacheName: string, key: string, value: any) => { + let gotCache: Map = caches[cacheName] + if (gotCache === undefined || !(gotCache instanceof Map)) { + gotCache = caches[cacheName] = new Map() + } + + gotCache.set(key, value) + + return value +} + +const del = (cacheName: string, key: string) => { + const gotCache: Map = caches[cacheName] + if (gotCache === undefined || !(gotCache instanceof Map)) { + return + } + + return gotCache.delete(key) +} + +const deleteCache = (cacheName: string) => { + const gotCache = caches[cacheName] + if (gotCache === undefined) { + return + } + + delete caches[cacheName] +} + +const resetCaches = () => { + caches = {} +} + +export { get, set, del, deleteCache, resetCaches } diff --git a/src/models/client.ts b/src/models/client.ts index c77a9f4..e29c9eb 100644 --- a/src/models/client.ts +++ b/src/models/client.ts @@ -1,7 +1,7 @@ import { User } from '../structures/user.ts' import { GatewayIntents } from '../types/gatewayTypes.ts' import { Gateway } from './gateway.ts' -import { Rest } from "./rest.ts" +import { Rest } from './rest.ts' /** * Discord Client. @@ -11,6 +11,7 @@ export class Client { rest?: Rest user?: User ping = 0 + token?: string constructor () {} @@ -20,6 +21,7 @@ export class Client { * @param intents Gateway intents in array. This is required. */ connect (token: string, intents: GatewayIntents[]) { + this.token = token this.gateway = new Gateway(this, token, intents) } } diff --git a/src/models/gateway.ts b/src/models/gateway.ts index 09fbffe..e85e8aa 100644 --- a/src/models/gateway.ts +++ b/src/models/gateway.ts @@ -10,7 +10,10 @@ import { GatewayIntents, GatewayEvents } from '../types/gatewayTypes.ts' +import { GuildPayload } from '../types/guildTypes.ts' import { User } from '../structures/user.ts' +import * as cache from './cache.ts' +import { Guild } from '../structures/guild.ts' /** * Handles Discord gateway connection. @@ -48,11 +51,11 @@ class Gateway { this.websocket.onerror = this.onerror.bind(this) } - onopen () { + private onopen () { this.connected = true } - onmessage (event: MessageEvent) { + private onmessage (event: MessageEvent) { let data = event.data if (data instanceof ArrayBuffer) { data = new Uint8Array(data) @@ -114,6 +117,7 @@ class Gateway { break case GatewayOpcodes.DISPATCH: + this.heartbeatServerResponded = true if (s !== null) { this.sequenceID = s } @@ -121,6 +125,9 @@ class Gateway { case GatewayEvents.Ready: this.client.user = new User(this.client, d.user) this.sessionID = d.session_id + d.guilds.forEach((guild: GuildPayload) => { + cache.set('guilds', guild.id, new Guild(this.client, guild)) + }) break default: break @@ -131,17 +138,17 @@ class Gateway { } } - onclose (event: CloseEvent) { + private onclose (event: CloseEvent) { // TODO: Handle close event codes. } - onerror (event: Event | ErrorEvent) { + private onerror (event: Event | ErrorEvent) { const eventError = event as ErrorEvent console.log(eventError) } - sendIdentify () { + private sendIdentify () { this.websocket.send( JSON.stringify({ op: GatewayOpcodes.IDENTIFY, diff --git a/src/models/rest.ts b/src/models/rest.ts index 5226e90..ccc18bf 100644 --- a/src/models/rest.ts +++ b/src/models/rest.ts @@ -1,12 +1,12 @@ -import { Client } from "./client.ts"; +import { Client } from './client.ts' -class Rest { - client: Client - constructor(client: Client) { - this.client = client - } +class Rest { + client: Client + constructor (client: Client) { + this.client = client + } - //TODO: make endpoints function + //TODO: make endpoints function } -export { Rest } \ No newline at end of file +export { Rest } diff --git a/src/structures/categoryChannel.ts b/src/structures/categoryChannel.ts new file mode 100644 index 0000000..fa56298 --- /dev/null +++ b/src/structures/categoryChannel.ts @@ -0,0 +1,26 @@ +import { Client } from '../models/client.ts' +import { Channel } from './channel.ts' +import { GuildPayload, GuildFeatures } from '../types/guildTypes.ts' +import { + GuildChannelCategoryPayload, + Overwrite +} from '../types/channelTypes.ts' + +export class categoryChannel extends Channel { + guildID: string + name: string + position: number + permissionOverwrites: Overwrite[] + nsfw: boolean + parentID?: string + + constructor (client: Client, data: GuildChannelCategoryPayload) { + super(client, data) + this.guildID = data.guild_id + this.name = data.name + this.position = data.position + this.permissionOverwrites = data.permission_overwrites + this.nsfw = data.nsfw + this.parentID = data.parent_id + } +} diff --git a/src/structures/channel.ts b/src/structures/channel.ts index 50e5ae7..883786f 100644 --- a/src/structures/channel.ts +++ b/src/structures/channel.ts @@ -1,7 +1,18 @@ import { Client } from '../models/client.ts' -import { ChannelPayload, ChannelTypes } from '../types/channelTypes.ts' +import { + ChannelPayload, + GuildChannelCategoryPayload, + GuildNewsChannelPayload, + GuildTextChannelPayload, + GuildVoiceChannelPayload, + DMChannelPayload, + GroupDMChannelPayload, + ChannelTypes +} from '../types/channelTypes.ts' import { Base } from './base.ts' -import { PrivateChannel } from './dm.ts' +import { DMChannel } from './dm.ts' +import { GroupChannel } from './groupChannel.ts' +import { VoiceChannel } from './guildVoiceChannel.ts' import { TextChannel } from './textChannel.ts' export class Channel extends Base { @@ -18,12 +29,29 @@ export class Channel extends Base { return `<#${this.id}>` } - static from (data: ChannelPayload, client: Client) { + static from ( + data: + | GuildChannelCategoryPayload + | GuildNewsChannelPayload + | GuildTextChannelPayload + | GuildVoiceChannelPayload + | DMChannelPayload + | GroupDMChannelPayload, + client: Client + ) { switch (data.type) { + case ChannelTypes.GUILD_CATEGORY: + return + case ChannelTypes.GUILD_NEWS: + return case ChannelTypes.GUILD_TEXT: - return new TextChannel(client, data) + return new TextChannel(client, data as GuildTextChannelPayload) + case ChannelTypes.GUILD_VOICE: + return new VoiceChannel(client, data as GuildVoiceChannelPayload) case ChannelTypes.DM: - return new PrivateChannel(client, data) + return new DMChannel(client, data as DMChannelPayload) + case ChannelTypes.GROUP_DM: + return new GroupChannel(client, data as GroupDMChannelPayload) } } } diff --git a/src/structures/dm.ts b/src/structures/dm.ts index 3540419..b688b72 100644 --- a/src/structures/dm.ts +++ b/src/structures/dm.ts @@ -1,9 +1,13 @@ import { Client } from '../models/client.ts' -import { ChannelPayload } from '../types/channelTypes.ts' -import { Channel } from './channel.ts' +import { DMChannelPayload } from '../types/channelTypes.ts' +import { UserPayload } from '../types/userTypes.ts' +import { TextChannel } from './textChannel.ts' -export class PrivateChannel extends Channel implements ChannelPayload { - constructor (client: Client, data: ChannelPayload) { +export class DMChannel extends TextChannel { + recipients: UserPayload[] + + constructor (client: Client, data: DMChannelPayload) { super(client, data) + this.recipients = data.recipients } } diff --git a/src/structures/embed.ts b/src/structures/embed.ts index 13331ce..36c7109 100644 --- a/src/structures/embed.ts +++ b/src/structures/embed.ts @@ -12,7 +12,7 @@ import { } from '../types/channelTypes.ts' import { Base } from './base.ts' -export class Embed extends Base implements EmbedPayload { +export class Embed extends Base { title?: string type?: EmbedTypes description?: string diff --git a/src/structures/emoji.ts b/src/structures/emoji.ts index a419515..b698de8 100644 --- a/src/structures/emoji.ts +++ b/src/structures/emoji.ts @@ -1,21 +1,22 @@ import { Client } from '../models/client.ts' import { EmojiPayload } from '../types/emojiTypes.ts' +import { UserPayload } from '../types/userTypes.ts' import { Base } from './base.ts' import { User } from './user.ts' -export class Emoji extends Base implements EmojiPayload { +export class Emoji extends Base { id: string name: string roles?: [] - user?: User - require_colons?: boolean + user?: UserPayload + requireColons?: boolean managed?: boolean animated?: boolean available?: boolean get CustomEmoji () { if (this.animated === false) { - return `<:${this.name}:${this.id}>` + return `<:${this.name}:${this.id}>` } else return `` } @@ -25,7 +26,7 @@ export class Emoji extends Base implements EmojiPayload { this.name = data.name this.roles = data.roles this.user = data.user - this.require_colons = data.require_colons + this.requireColons = data.require_colons this.managed = data.managed this.animated = data.animated this.available = data.available diff --git a/src/structures/groupChannel.ts b/src/structures/groupChannel.ts new file mode 100644 index 0000000..38ff8c2 --- /dev/null +++ b/src/structures/groupChannel.ts @@ -0,0 +1,17 @@ +import { Client } from '../models/client.ts' +import { GroupDMChannelPayload } from '../types/channelTypes.ts' +import { Channel } from './channel.ts' + +export class GroupChannel extends Channel { + name: string + icon?: string + ownerID: string + + constructor (client: Client, data: GroupDMChannelPayload) { + super(client, data) + + this.name = data.name + this.icon = data.icon + this.ownerID = data.owner_id + } +} diff --git a/src/structures/guild.ts b/src/structures/guild.ts index bdac283..d3617bc 100644 --- a/src/structures/guild.ts +++ b/src/structures/guild.ts @@ -1,106 +1,129 @@ import { Client } from '../models/client.ts' +import { ChannelPayload } from '../types/channelTypes.ts' import { EmojiPayload } from '../types/emojiTypes.ts' -import { GuildFeatures, GuildPayload } from '../types/guildTypes.ts' +import { GUILD } from '../types/endpoint.ts' +import { + GuildFeatures, + GuildPayload, + MemberPayload +} from '../types/guildTypes.ts' import { PresenceUpdatePayload } from '../types/presenceTypes.ts' +import { RolePayload } from '../types/roleTypes.ts' import { VoiceStatePayload } from '../types/voiceTypes.ts' import { Base } from './base.ts' -import { Channel } from './channel.ts' -import { Emoji } from './emoji.ts' -import { Member } from './member.ts' import { Role } from './role.ts' +import * as cache from '../models/cache.ts' -export class Guild extends Base implements GuildPayload { +export class Guild extends Base { id: string name: string - icon: string | undefined - icon_hash?: string | undefined - splash: string | undefined - discovery_splash: string | undefined - owner?: boolean | undefined - owner_id: string - permissions?: string | undefined + icon?: string + iconHash?: string + splash?: string + discoverySplash?: string + owner?: boolean + ownerID: string + permissions?: string region: string - afk_channel_id: string | undefined - afk_timeout: number - widget_enabled?: boolean | undefined - widge_channel_id?: string | undefined - verification_level: string - default_message_notifications: string - explicit_content_filter: string - roles: Role[] - emojis: Emoji[] + afkChannelID?: string + afkTimeout: number + widgetEnabled?: boolean + widgetChannelID?: string + verificationLevel: string + defaultMessageNotifications: string + explicitContentFilter: string + roles: RolePayload[] + emojis: EmojiPayload[] features: GuildFeatures[] - mfa_level: string - application_id: string | undefined - system_channel_id: string | undefined - system_channel_flags: string - rules_channel_id: string | undefined - joined_at?: string | undefined - large?: boolean | undefined + mfaLevel: string + applicationID?: string + systemChannelID?: string + systemChannelFlags: string + rulesChannelID?: string + joinedAt?: string + large?: boolean unavailable: boolean - member_count?: number | undefined - voice_states?: VoiceStatePayload[] | undefined - members?: Member[] | undefined - channels?: Channel[] | undefined - presences?: PresenceUpdatePayload[] | undefined - max_presences?: number | undefined - max_members?: number | undefined - vanity_url_code: string | undefined - description: string | undefined - banner: string | undefined - premium_tier: number - premium_subscription_count?: number | undefined - preferred_locale: string - public_updates_channel_id: string | undefined - max_video_channel_users?: number | undefined - approximate_number_count?: number | undefined - approximate_presence_count?: number | undefined + memberCount?: number + voiceStates?: VoiceStatePayload[] + members?: MemberPayload[] + channels?: ChannelPayload[] + presences?: PresenceUpdatePayload[] + maxPresences?: number + maxMembers?: number + vanityURLCode?: string + description?: string + banner?: string + premiumTier: number + premiumSubscriptionCount?: number + preferredLocale: string + publicUpdatesChannelID?: string + maxVideoChannelUsers?: number + approximateNumberCount?: number + approximatePresenceCount?: number constructor (client: Client, data: GuildPayload) { super(client) this.id = data.id this.name = data.name this.icon = data.icon - this.icon_hash = data.icon_hash + this.iconHash = data.icon_hash this.splash = data.splash - this.discovery_splash = data.discovery_splash + this.discoverySplash = data.discovery_splash this.owner = data.owner - this.owner_id = data.owner_id + this.ownerID = data.owner_id this.permissions = data.permissions this.region = data.region - this.afk_timeout = data.afk_timeout - this.afk_channel_id = data.afk_channel_id - this.widget_enabled = data.widget_enabled - this.widge_channel_id = data.widge_channel_id - this.verification_level = data.verification_level - this.default_message_notifications = data.default_message_notifications - this.explicit_content_filter = data.explicit_content_filter + this.afkTimeout = data.afk_timeout + this.afkChannelID = data.afk_channel_id + this.widgetEnabled = data.widget_enabled + this.widgetChannelID = data.widge_channel_id + this.verificationLevel = data.verification_level + this.defaultMessageNotifications = data.default_message_notifications + this.explicitContentFilter = data.explicit_content_filter this.roles = data.roles this.emojis = data.emojis this.features = data.features - this.mfa_level = data.mfa_level - this.system_channel_id = data.system_channel_id - this.system_channel_flags = data.system_channel_flags - this.rules_channel_id = data.rules_channel_id - this.joined_at = data.joined_at + this.mfaLevel = data.mfa_level + this.systemChannelID = data.system_channel_id + this.systemChannelFlags = data.system_channel_flags + this.rulesChannelID = data.rules_channel_id + this.joinedAt = data.joined_at this.large = data.large this.unavailable = data.unavailable - this.member_count = data.member_count - this.voice_states = data.voice_states + this.memberCount = data.member_count + this.voiceStates = data.voice_states this.members = data.members this.channels = data.channels this.presences = data.presences - this.max_presences = data.max_presences - this.max_members = data.max_members - this.vanity_url_code = data.vanity_url_code + this.maxPresences = data.max_presences + this.maxMembers = data.max_members + this.vanityURLCode = data.vanity_url_code this.description = data.description this.banner = data.banner - this.premium_tier = data.premium_tier - this.premium_subscription_count = data.premium_subscription_count - this.preferred_locale = data.preferred_locale - this.public_updates_channel_id = data.public_updates_channel_id - this.max_video_channel_users = data.max_video_channel_users - this.approximate_number_count = data.approximate_number_count - this.approximate_presence_count = data.approximate_presence_count + this.premiumTier = data.premium_tier + this.premiumSubscriptionCount = data.premium_subscription_count + this.preferredLocale = data.preferred_locale + this.publicUpdatesChannelID = data.public_updates_channel_id + this.maxVideoChannelUsers = data.max_video_channel_users + this.approximateNumberCount = data.approximate_number_count + this.approximatePresenceCount = data.approximate_presence_count + } + + static async autoInit (client: Client, guildID: string) { + const cached = cache.get('guilds', guildID) + if (cached === undefined || !(cached instanceof Guild)) { + const resp = await fetch(GUILD(guildID), { + headers: { + Authorization: `Bot ${client.token}` + } + }) + const guildParsed: GuildPayload = await resp.json() + + const newGuild = new Guild(client, guildParsed) + cache.set('guilds', guildID, newGuild) + return newGuild + } else { + return cached + } } } diff --git a/src/structures/guildChannel.ts b/src/structures/guildChannel.ts index 576dfb7..fa39e88 100644 --- a/src/structures/guildChannel.ts +++ b/src/structures/guildChannel.ts @@ -1,9 +1,22 @@ import { Client } from '../models/client.ts' -import { ChannelPayload } from '../types/channelTypes.ts' +import { GuildChannelPayload, Overwrite } from '../types/channelTypes.ts' import { Channel } from './channel.ts' export class GuildChannel extends Channel { - constructor (client: Client, data: ChannelPayload) { + guildID: string + name: string + position: number + permissionOverwrites: Overwrite[] + nsfw: boolean + parentID?: string + + constructor (client: Client, data: GuildChannelPayload) { super(client, data) + this.guildID = data.guild_id + this.name = data.name + this.position = data.position + this.permissionOverwrites = data.permission_overwrites + this.nsfw = data.nsfw + this.parentID = data.parent_id } } diff --git a/src/structures/guildTextChannel.ts b/src/structures/guildTextChannel.ts new file mode 100644 index 0000000..14b3b79 --- /dev/null +++ b/src/structures/guildTextChannel.ts @@ -0,0 +1,19 @@ +import { Client } from '../models/client.ts' +import { GuildChannel } from './guildChannel.ts' +import { GuildTextChannelPayload } from '../types/channelTypes.ts' +import { User } from './user.ts' + +export class GuildTextChannel extends GuildChannel { + rateLimit: number + topic?: string + + get mention () { + return `<#${this.id}>` + } + + constructor (client: Client, data: GuildTextChannelPayload) { + super(client, data) + this.topic = data.topic + this.rateLimit = data.rate_limit_per_user + } +} diff --git a/src/structures/guildVoiceChannel.ts b/src/structures/guildVoiceChannel.ts new file mode 100644 index 0000000..d95a058 --- /dev/null +++ b/src/structures/guildVoiceChannel.ts @@ -0,0 +1,28 @@ +import { Client } from '../models/client.ts' +import { GuildVoiceChannelPayload, Overwrite } from '../types/channelTypes.ts' +import { Base } from './base.ts' +import { Member } from './member.ts' +import { Channel } from './channel.ts' + +export class VoiceChannel extends Channel { + bitrate: string + userLimit: number + guildID: string + name: string + position: number + permissionOverwrites: Overwrite[] + nsfw: boolean + parentID?: string + + constructor (client: Client, data: GuildVoiceChannelPayload) { + super(client, data) + this.bitrate = data.bitrate + this.userLimit = data.user_limit + this.guildID = data.guild_id + this.name = data.name + this.position = data.position + this.permissionOverwrites = data.permission_overwrites + this.nsfw = data.nsfw + this.parentID = data.parent_id + } +} diff --git a/src/structures/invite.ts b/src/structures/invite.ts index 723c2f5..1e69428 100644 --- a/src/structures/invite.ts +++ b/src/structures/invite.ts @@ -2,22 +2,24 @@ import { Client } from '../models/client.ts' import { Channel } from '../structures/channel.ts' import { Guild } from '../structures/guild.ts' import { User } from '../structures/user.ts' +import { ChannelPayload } from '../types/channelTypes.ts' +import { GuildPayload } from '../types/guildTypes.ts' import { InvitePayload } from '../types/inviteTypes.ts' +import { UserPayload } from '../types/userTypes.ts' import { Base } from './base.ts' -export class Invite extends Base implements InvitePayload { +export class Invite extends Base { code: string - guild?: Guild - channel: Channel - inviter?: User - target_user?: User - target_user_type?: number - approximate_presence_count?: number - approximate_member_count?: number - + guild?: GuildPayload + channel: ChannelPayload + inviter?: UserPayload + targetUser?: UserPayload + targetUserType?: number + approximatePresenceCount?: number + approximateMemberCount?: number get link () { - return `discord.gg/${this.code}` + return `https://discord.gg/${this.code}` } constructor (client: Client, data: InvitePayload) { @@ -26,9 +28,9 @@ export class Invite extends Base implements InvitePayload { this.guild = data.guild this.channel = data.channel this.inviter = data.inviter - this.target_user = data.target_user - this.target_user_type = data.target_user_type - this.approximate_member_count = data.approximate_member_count - this.approximate_presence_count = data.approximate_presence_count + this.targetUser = data.target_user + this.targetUserType = data.target_user_type + this.approximateMemberCount = data.approximate_member_count + this.approximatePresenceCount = data.approximate_presence_count } } diff --git a/src/structures/member.ts b/src/structures/member.ts index 7208ea9..6689c1c 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -1,17 +1,18 @@ import { Client } from '../models/client.ts' import { MemberPayload } from '../types/guildTypes.ts' +import { RolePayload } from '../types/roleTypes.ts' import { UserPayload } from '../types/userTypes.ts' import { Base } from './base.ts' import { Guild } from './guild.ts' import { Role } from './role.ts' import { User } from './user.ts' -export class Member extends Base implements MemberPayload { - user: User - nick: string | undefined - roles: Role[] - joined_at: string - premium_since?: string | undefined +export class Member extends Base { + user: UserPayload + nick?: string + roles: RolePayload[] + joinedAt: string + premiumSince?: string deaf: boolean mute: boolean @@ -20,8 +21,8 @@ export class Member extends Base implements MemberPayload { this.user = data.user this.nick = data.nick this.roles = data.roles - this.joined_at = data.joined_at - this.premium_since = data.premium_since + this.joinedAt = data.joined_at + this.premiumSince = data.premium_since this.deaf = data.deaf this.mute = data.mute } diff --git a/src/structures/message.ts b/src/structures/message.ts index a72acee..02670b2 100644 --- a/src/structures/message.ts +++ b/src/structures/message.ts @@ -13,57 +13,59 @@ import { Client } from '../models/client.ts' import { User } from './user.ts' import { Role } from './role.ts' import { Embed } from './embed.ts' +import { UserPayload } from '../types/userTypes.ts' +import { RolePayload } from '../types/roleTypes.ts' -class Message extends Base implements MessagePayload { +class Message extends Base { id: string - channel_id: string - guild_id?: string | undefined - author: User + channelID: string + guildID?: string + author: UserPayload member?: any content: string timestamp: string - edited_timestamp: string | undefined + editedTimestamp?: string tts: boolean - mention_everyone: boolean - mentions: User[] - mention_roles: Role[] - mention_channels?: ChannelMention[] | undefined + mentionEveryone: boolean + mentions: UserPayload[] + mentionRoles: RolePayload[] + mentionChannels?: ChannelMention[] attachments: Attachment[] embeds: EmbedPayload[] - reactions?: Reaction[] | undefined - nonce?: string | number | undefined + reactions?: Reaction[] + nonce?: string | number pinned: boolean - webhook_id?: string | undefined + webhookId?: string type: number activity?: MessageActivity application?: MessageApplication - message_reference?: MessageReference - flags?: number | undefined + messageReference?: MessageReference + flags?: number constructor (client: Client, data: MessagePayload) { super(client) this.id = data.id - this.channel_id = data.channel_id - this.guild_id = data.guild_id + this.channelID = data.channel_id + this.guildID = data.guild_id this.author = data.author this.member = data.member this.content = data.content this.timestamp = data.timestamp - this.edited_timestamp = data.edited_timestamp + this.editedTimestamp = data.edited_timestamp this.tts = data.tts - this.mention_everyone = data.mention_everyone + this.mentionEveryone = data.mention_everyone this.mentions = data.mentions - this.mention_roles = data.mention_roles + this.mentionRoles = data.mention_roles this.attachments = data.attachments this.embeds = data.embeds this.reactions = data.reactions this.nonce = data.nonce this.pinned = data.pinned - this.webhook_id = data.webhook_id + this.webhookId = data.webhook_id this.type = data.type this.activity = data.activity this.application = data.application - this.message_reference = data.message_reference + this.messageReference = data.message_reference this.flags = data.flags } } diff --git a/src/structures/role.ts b/src/structures/role.ts index a286f3d..3f9966b 100644 --- a/src/structures/role.ts +++ b/src/structures/role.ts @@ -2,7 +2,7 @@ import { Client } from '../models/client.ts' import { Base } from './base.ts' import { RolePayload } from '../types/roleTypes.ts' -export class Role extends Base implements RolePayload { +export class Role extends Base { id: string name: string color: number diff --git a/src/structures/textChannel.ts b/src/structures/textChannel.ts index ce8af41..7c04967 100644 --- a/src/structures/textChannel.ts +++ b/src/structures/textChannel.ts @@ -1,36 +1,16 @@ import { Client } from '../models/client.ts' -import { GuildChannel } from './guildChannel.ts' -import { ChannelPayload } from '../types/channelTypes.ts' -import { User } from './user.ts' +import { TextChannelPayload } from '../types/channelTypes.ts' +import { Channel } from './channel.ts' +import { Embed } from './embed.ts' +export class TextChannel extends Channel { + lastMessageId?: string + lastPinTimestamp?: string -export class TextChannel extends GuildChannel implements ChannelPayload { - id: string - type: number - guild_id?: string | undefined - position?: number | undefined - approximate_member_count?: any - name?: string | undefined - topic?: string | undefined - nsfw?: boolean | undefined - last_message_id?: string | undefined - bitrate?: number | undefined - user_limit?: number | undefined - rate_limit_per_user?: number | undefined - recipients?: User - icon?: string | undefined - owner_id?: string | undefined - application_id?: string | undefined - parent_id?: string | undefined - last_pin_timestamp?: string | undefined - - - get mention () { - return `<#${this.id}>` - } - - constructor (client: Client, data: ChannelPayload) { + constructor (client: Client, data: TextChannelPayload) { super(client, data) - this.id = data.id - this.type = data.type + this.lastMessageId = data.last_message_id + this.lastPinTimestamp = data.last_pin_timestamp } + + send (content: string | Embed, option?: {}) {} //TODO: send function } diff --git a/src/structures/user.ts b/src/structures/user.ts index afb64ff..501bd92 100644 --- a/src/structures/user.ts +++ b/src/structures/user.ts @@ -2,20 +2,20 @@ import { Client } from '../models/client.ts' import { UserPayload } from '../types/userTypes.ts' import { Base } from './base.ts' -export class User extends Base implements UserPayload { +export class User extends Base { id: string username: string discriminator: string avatar?: string bot?: boolean system?: boolean - mfa_enabled?: boolean + mfaEnabled?: boolean locale?: string verified?: boolean email?: string flags?: number - premium_type?: 0 | 1 | 2 - public_flags?: number + premiumType?: 0 | 1 | 2 + publicFlags?: number get nickMention () { return `<@!${this.id}>` @@ -33,12 +33,12 @@ export class User extends Base implements UserPayload { this.avatar = data.avatar this.bot = data.bot this.system = data.system - this.mfa_enabled = data.mfa_enabled + this.mfaEnabled = data.mfa_enabled this.locale = data.locale this.verified = data.verified this.email = data.email this.flags = data.flags - this.premium_type = data.premium_type - this.public_flags = data.public_flags + this.premiumType = data.premium_type + this.publicFlags = data.public_flags } } diff --git a/src/structures/voicestate.ts b/src/structures/voicestate.ts index 369e438..8bdfe23 100644 --- a/src/structures/voicestate.ts +++ b/src/structures/voicestate.ts @@ -1,33 +1,34 @@ -import { Client } from "../models/client.ts" -import { VoiceStatePayload } from "../types/voiceTypes.ts" -import { Base } from "./base.ts" -import { Member } from "./member.ts" +import { Client } from '../models/client.ts' +import { MemberPayload } from '../types/guildTypes.ts' +import { VoiceStatePayload } from '../types/voiceTypes.ts' +import { Base } from './base.ts' +import { Member } from './member.ts' -export class VoiceState extends Base implements VoiceStatePayload { - guild_id?: string - channel_id: string | undefined - user_id: string - member?: Member - session_id: string - deaf: boolean - mute: boolean - self_deaf: boolean - self_mute: boolean - self_stream?: boolean - self_video: boolean - suppress: boolean +export class VoiceState extends Base { + guildID?: string + channelID?: string + userID: string + member?: MemberPayload + sessionID: string + deaf: boolean + mute: boolean + selfDeaf: boolean + selfMute: boolean + selfStream?: boolean + selfVideo: boolean + suppress: boolean - constructor (client: Client, data: VoiceStatePayload) { - super(client) - this.channel_id = data.channel_id - this.session_id = data.session_id - this.user_id = data.user_id - this.deaf = data.deaf - this.mute = data.mute - this.self_deaf = data.self_deaf - this.self_mute = data.self_mute - this.self_stream = data.self_stream - this.self_video = data.self_video - this.suppress = data.suppress - } -} \ No newline at end of file + constructor (client: Client, data: VoiceStatePayload) { + super(client) + this.channelID = data.channel_id + this.sessionID = data.session_id + this.userID = data.user_id + this.deaf = data.deaf + this.mute = data.mute + this.selfDeaf = data.self_deaf + this.selfMute = data.self_mute + this.selfStream = data.self_stream + this.selfVideo = data.self_video + this.suppress = data.suppress + } +} diff --git a/src/structures/webhook.ts b/src/structures/webhook.ts index aa9ab2c..83b9a86 100644 --- a/src/structures/webhook.ts +++ b/src/structures/webhook.ts @@ -1,23 +1,23 @@ -import { Client } from "../models/client.ts" -import { WebhookPayload } from "../types/webhookTypes.ts" -import { Base } from "./base.ts" -import { User } from "./user.ts" +import { Client } from '../models/client.ts' +import { UserPayload } from '../types/userTypes.ts' +import { WebhookPayload } from '../types/webhookTypes.ts' +import { Base } from './base.ts' -export class VoiceState extends Base implements WebhookPayload { - id: string - type: 1 | 2 - guild_id?: string - channel_id: string - user?: User - name: string | undefined - avatar: string | undefined - token?: string - application_id: string | undefined +export class Webhook extends Base { + id: string + type: 1 | 2 + guildID?: string + channelID: string + user?: UserPayload + name?: string + avatar?: string + token?: string + applicationID?: string - constructor (client: Client, data: WebhookPayload) { - super(client) - this.id = data.id - this.type = data.type - this.channel_id = data.channel_id - } -} \ No newline at end of file + constructor (client: Client, data: WebhookPayload) { + super(client) + this.id = data.id + this.type = data.type + this.channelID = data.channel_id + } +} diff --git a/src/test/index.ts b/src/test/index.ts index a320599..0d21b9d 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -1,7 +1,15 @@ import { Client } from '../models/client.ts' +import { Guild } from '../structures/guild.ts' import { GatewayIntents } from '../types/gatewayTypes.ts' import { TOKEN } from './config.ts' const bot = new Client() bot.connect(TOKEN, [GatewayIntents.GUILD_MESSAGES]) + +Guild.autoInit(bot, '').then(a => console.log(a)) + +setTimeout(async () => { + const result = Guild.autoInit(bot, '') + console.log(result) +}, 30000) diff --git a/src/types/channelTypes.ts b/src/types/channelTypes.ts index 5b55656..0872ecc 100644 --- a/src/types/channelTypes.ts +++ b/src/types/channelTypes.ts @@ -1,29 +1,59 @@ -import { Member } from '../structures/member.ts' -import { Role } from '../structures/role.ts' -import { User } from '../structures/user.ts' import { EmojiPayload } from './emojiTypes.ts' +import { MemberPayload } from './guildTypes.ts' +import { RolePayload } from './roleTypes.ts' +import { UserPayload } from './userTypes.ts' interface ChannelPayload { id: string type: ChannelTypes - guild_id?: string - position?: number - approximate_member_count?: Overwrite - name?: string - topic?: string - nsfw?: boolean +} + +interface TextChannelPayload extends ChannelPayload { last_message_id?: string - bitrate?: number - user_limit?: number - rate_limit_per_user?: number - recipients?: User - icon?: string - owner_id?: string - application_id?: string - parent_id?: string last_pin_timestamp?: string } +interface GuildChannelPayload extends ChannelPayload { + guild_id: string + name: string + position: number + permission_overwrites: Overwrite[] + nsfw: boolean + parent_id?: string +} + +interface GuildTextChannelPayload + extends TextChannelPayload, + GuildChannelPayload { + rate_limit_per_user: number + topic?: string +} + +interface GuildNewsChannelPayload + extends TextChannelPayload, + GuildChannelPayload { + topic?: string +} + +interface GuildVoiceChannelPayload extends GuildChannelPayload { + bitrate: string + user_limit: number +} + +interface DMChannelPayload extends TextChannelPayload { + recipients: UserPayload[] +} + +interface GroupDMChannelPayload extends DMChannelPayload { + name: string + icon?: string + owner_id: string +} + +interface GuildChannelCategoryPayload + extends ChannelPayload, + GuildChannelPayload {} + interface Overwrite { id: string type: number @@ -45,15 +75,15 @@ interface MessagePayload { id: string channel_id: string guild_id?: string - author: User - member?: Member + author: UserPayload + member?: MemberPayload content: string timestamp: string - edited_timestamp: string | undefined + edited_timestamp?: string tts: boolean mention_everyone: boolean - mentions: User[] - mention_roles: Role[] + mentions: UserPayload[] + mention_roles: RolePayload[] mention_channels?: ChannelMention[] attachments: Attachment[] embeds: EmbedPayload[] @@ -210,12 +240,6 @@ interface FollowedChannel { webhook_id: string } -interface Reaction { - count: number - me: boolean - emoji: EmojiPayload -} - interface Overwrite { id: string type: number @@ -231,6 +255,15 @@ interface ChannelMention { export { ChannelPayload, + TextChannelPayload, + GuildChannelPayload, + GuildNewsChannelPayload, + GuildTextChannelPayload, + GuildVoiceChannelPayload, + GuildChannelCategoryPayload, + DMChannelPayload, + GroupDMChannelPayload, + Overwrite, ChannelTypes, ChannelMention, Attachment, diff --git a/src/types/emojiTypes.ts b/src/types/emojiTypes.ts index 15a5128..e5a1291 100644 --- a/src/types/emojiTypes.ts +++ b/src/types/emojiTypes.ts @@ -1,10 +1,10 @@ -import { User } from '../structures/user.ts' +import { UserPayload } from './userTypes.ts' export interface EmojiPayload { id: string name: string roles?: [] - user?: User + user?: UserPayload require_colons?: boolean managed?: boolean animated?: boolean diff --git a/src/types/endpoint.ts b/src/types/endpoint.ts index c7c68b6..32afb96 100644 --- a/src/types/endpoint.ts +++ b/src/types/endpoint.ts @@ -7,7 +7,7 @@ import { } from '../consts/urlsAndVersions.ts' //Guild Endpoints -const GUILDS = `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds` +const GUILDS = () => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds` const GUILD = (guildID: string) => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}` const GUILD_AUDIT_LOGS = (guildID: string) => @@ -60,10 +60,10 @@ const CHANNEL = (channelID: string) => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}` const CHANNELS = (channelID: string) => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${channelID}/channels` -const CHANNEL_MESSAGES = (channelID: string) => - `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}/messages` const CHANNEL_MESSAGE = (channelID: string, messageID: string) => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}/messages/${messageID}` +const CHANNEL_MESSAGES = (channelID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}/messages` const CHANNEL_CROSSPOST = (channelID: string, messageID: string) => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}/messages/${messageID}/crosspost` const MESSAGE_REACTIONS = (channelID: string, messageID: string) => @@ -105,10 +105,14 @@ const GROUP_RECIPIENT = (channelID: string, userID: string) => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}/recipient/${userID}` //User Endpoints -const CURRENT_USER = `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me` -const CURRENT_USER_GUILDS = `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me/guilds` -const USER_DM = `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me/channels` -const USER_CONNECTIONS = `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me/connections` +const CURRENT_USER = () => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me` +const CURRENT_USER_GUILDS = () => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me/guilds` +const USER_DM = () => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me/channels` +const USER_CONNECTIONS = () => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me/connections` const LEAVE_GUILD = (guildID: string) => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me/guilds/${guildID}` const USER = (userID: string) => @@ -129,12 +133,12 @@ const GITHUB_WEBHOOK = (webhookID: string, webhookTOKEN: string) => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/webhooks/${webhookID}/${webhookTOKEN}/github` //Gateway Endpoints -const GATEWAY = `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/gateway` -const GATEWAY_BOT = `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/gateway/bot` +const GATEWAY = () => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/gateway` +const GATEWAY_BOT = () => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/gateway/bot` //CDN Endpoints -const CUSTOM_EMOJI = (emojiID: string) => - `${DISCORD_CDN_URL}/emojis/${emojiID}` +const CUSTOM_EMOJI = (emojiID: string) => `${DISCORD_CDN_URL}/emojis/${emojiID}` const GUILD_ICON = (guildID: string, iconID: number) => `${DISCORD_CDN_URL}/icons/${guildID}/${iconID}` const GUILD_SPLASH = (guildID: string, guildSPLASH: string) => @@ -142,8 +146,7 @@ const GUILD_SPLASH = (guildID: string, guildSPLASH: string) => const GUILD_DISCOVERY_SPLASH = ( guildID: string, guildDiscoverySplash: string -) => - `${DISCORD_CDN_URL}/discovery-splashes/${guildID}/${guildDiscoverySplash}` +) => `${DISCORD_CDN_URL}/discovery-splashes/${guildID}/${guildDiscoverySplash}` const GUILD_BANNER = (guildID: string, guildBANNER: string) => `${DISCORD_CDN_URL}/banners/${guildID}/${guildBANNER}` const DEFAULT_USER_AVATAR = (iconID: string) => @@ -178,3 +181,75 @@ const INVITE = (inviteCODE: string) => //Voice Endpoint const VOICE_REGIONS = (guildID: string) => `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/regions` + +export { + GUILDS, + GUILD, + GUILD_AUDIT_LOGS, + GUILD_WIDGET, + GUILD_EMOJI, + GUILD_ROLE, + GUILD_ROLES, + GUILD_INTEGRATION, + GUILD_INTEGRATIONS, + GUILD_INTEGARTION_SYNC, + GUILD_BAN, + GUILD_BANS, + GUILD_CHANNEL, + GUILD_CHANNELS, + GUILD_MEMBER, + GUILD_MEMBERS, + GUILD_MEMBER_ROLE, + GUILD_INVITES, + GUILD_LEAVE, + GUILD_PRUNE, + GUILD_VANITY_URL, + GUILD_NICK, + GUILD_PREVIEW, + CHANNEL, + CHANNELS, + CHANNEL_MESSAGE, + CHANNEL_MESSAGES, + CHANNEL_CROSSPOST, + MESSAGE_REACTIONS, + MESSAGE_REACTION, + MESSAGE_REACTION_ME, + MESSAGE_REACTION_USER, + CHANNEL_BULK_DELETE, + CHANNEL_FOLLOW, + CHANNEL_INVITES, + CHANNEL_PIN, + CHANNEL_PINS, + CHANNEL_PERMISSION, + CHANNEL_TYPING, + GROUP_RECIPIENT, + CURRENT_USER, + CURRENT_USER_GUILDS, + USER_DM, + USER_CONNECTIONS, + LEAVE_GUILD, + USER, + CHANNEL_WEBHOOKS, + GUILD_WEBHOOK, + WEBHOOK, + WEBHOOK_WITH_TOKEN, + SLACK_WEBHOOK, + GITHUB_WEBHOOK, + GATEWAY, + GATEWAY_BOT, + CUSTOM_EMOJI, + GUILD_ICON, + GUILD_SPLASH, + GUILD_DISCOVERY_SPLASH, + GUILD_BANNER, + DEFAULT_USER_AVATAR, + USER_AVATAR, + APPLICATION_ASSET, + ACHIEVEMENT_ICON, + TEAM_ICON, + EMOJI, + EMOJIS, + TEMPLATE, + INVITE, + VOICE_REGIONS +} diff --git a/src/types/gatewayTypes.ts b/src/types/gatewayTypes.ts index 59782d5..bd54c00 100644 --- a/src/types/gatewayTypes.ts +++ b/src/types/gatewayTypes.ts @@ -1,11 +1,10 @@ // https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway // https://discord.com/developers/docs/topics/gateway#commands-and-events-gateway-events -import { Emoji } from '../structures/emoji.ts' -import { Member } from '../structures/member.ts' -import { Role } from '../structures/role.ts' -import { User } from '../structures/user.ts' +import { EmojiPayload } from './emojiTypes.ts' import { MemberPayload } from './guildTypes.ts' import { ActivityPayload, PresenceUpdatePayload } from './presenceTypes.ts' +import { RolePayload } from './roleTypes.ts' +import { UserPayload } from './userTypes.ts' /** * Gateway OPcodes from Discord docs. @@ -124,7 +123,7 @@ enum UpdateStatus { } interface IdentityConnection { - $os: 'linux' + $os: 'darwin' | 'windows' | 'linux' | 'custom os' $browser: 'discord.deno' $device: 'discord.deno' } @@ -139,7 +138,7 @@ interface GuildRequestMembers { guild_id: string | string[] query?: string limit: number - presences?: boolean //do you have any problems? tell me! i am so handsome + presences?: boolean user_ids?: string | string[] nonce?: string } @@ -164,7 +163,7 @@ interface Hello { interface ReadyEvent { v: number - user: User + user: UserPayload privateChannels: [] guilds: [] session_id: string @@ -179,12 +178,12 @@ interface ChannelPinsUpdate { interface GuildBanAdd { guild_id: string - user: User + user: UserPayload } interface GuildBanRemove { guild_id: string - user: User + user: UserPayload } interface GuildEmojiUpdate { @@ -202,12 +201,12 @@ interface GuildMemberAddExtra { interface GuildMemberRemove { guild_id: string - user: User + user: UserPayload } interface GuildMemberUpdate { guild_id: string roles: string[] - user: User + user: UserPayload nick?: string | undefined joined_at: string premium_since?: string | undefined @@ -225,12 +224,12 @@ interface GuildMemberChunk { interface GuildRoleCreate { guild_id: string - role: Role + role: RolePayload } interface GuildRoleUpdate { guild_id: string - role: Role + role: RolePayload } interface GuildRoleDelete { @@ -243,10 +242,10 @@ interface InviteCreate { code: string created_at: string guild_id?: string - inviter?: User + inviter?: UserPayload max_age: number max_uses: number - target_user?: User + target_user?: UserPayload target_user_type?: number temporary: boolean uses: number @@ -275,7 +274,7 @@ interface MessageReactionAdd { channel_id: string message_id: string guild_id?: string - emoji: Emoji + emoji: EmojiPayload } interface MessageReactionRemove { @@ -283,25 +282,25 @@ interface MessageReactionRemove { channel_id: string message_id: string guild_id?: string - emoji: Emoji + emoji: EmojiPayload } interface MessageReactionRemoveAll { channel_id: string guild_id?: string message_id: string - emoji: Emoji + emoji: EmojiPayload } interface MessageReactionRemove { channel_id: string guild_id?: string message_id: string - emoji: Emoji + emoji: EmojiPayload } interface PresenceUpdate { - user: User + user: UserPayload guild_id: string status: string activities: ActivityPayload[] @@ -323,7 +322,7 @@ interface Activity { application_id: string details?: string | undefined state?: string | undefined - emoji?: Emoji | undefined + emoji?: EmojiPayload | undefined party?: ActivityParty assets?: ActivityAssets secrets?: ActivitySecrets @@ -382,7 +381,7 @@ interface TypeStart { guild_id?: string user_id: string timestamp: number - member?: Member + member?: MemberPayload } interface VoiceServerUpdate { diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index 31e01f6..3b441b9 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -1,65 +1,64 @@ -import { Channel } from '../structures/channel.ts' -import { Emoji } from '../structures/emoji.ts' -import { Member } from '../structures/member.ts' -import { Role } from '../structures/role.ts' -import { User } from '../structures/user.ts' +import { ChannelPayload } from './channelTypes.ts' +import { EmojiPayload } from './emojiTypes.ts' import { PresenceUpdatePayload } from './presenceTypes.ts' +import { RolePayload } from './roleTypes.ts' +import { UserPayload } from './userTypes.ts' import { VoiceStatePayload } from './voiceTypes.ts' interface GuildPayload { id: string name: string - icon: string | undefined - icon_hash?: string | undefined - splash: string | undefined - discovery_splash: string | undefined + icon?: string + icon_hash?: string + splash?: string + discovery_splash?: string owner?: boolean owner_id: string permissions?: string region: string - afk_channel_id: string | undefined + afk_channel_id?: string afk_timeout: number widget_enabled?: boolean - widge_channel_id?: string | undefined + widge_channel_id?: string verification_level: string default_message_notifications: string explicit_content_filter: string - roles: Role[] - emojis: Emoji[] + roles: RolePayload[] + emojis: EmojiPayload[] features: GuildFeatures[] mfa_level: string - application_id: string | undefined - system_channel_id: string | undefined + application_id?: string + system_channel_id?: string system_channel_flags: string - rules_channel_id: string | undefined + rules_channel_id?: string joined_at?: string large?: boolean unavailable: boolean member_count?: number voice_states?: VoiceStatePayload[] - members?: Member[] - channels?: Channel[] + members?: MemberPayload[] + channels?: ChannelPayload[] presences?: PresenceUpdatePayload[] - max_presences?: number | undefined + max_presences?: number max_members?: number - vanity_url_code: string | undefined - description: string | undefined - banner: string | undefined + vanity_url_code?: string + description?: string + banner?: string premium_tier: number premium_subscription_count?: number preferred_locale: string - public_updates_channel_id: string | undefined + public_updates_channel_id?: string max_video_channel_users?: number approximate_number_count?: number approximate_presence_count?: number } interface MemberPayload { - user: User - nick: string | undefined - roles: Role[] + user: UserPayload + nick?: string + roles: RolePayload[] joined_at: string - premium_since?: string | undefined + premium_since?: string deaf: boolean mute: boolean } diff --git a/src/types/inviteTypes.ts b/src/types/inviteTypes.ts index c53aae5..3e4a677 100644 --- a/src/types/inviteTypes.ts +++ b/src/types/inviteTypes.ts @@ -1,13 +1,13 @@ -import { Channel } from '../structures/channel.ts' -import { Guild } from '../structures/guild.ts' -import { User } from '../structures/user.ts' +import { ChannelPayload } from './channelTypes.ts' +import { GuildPayload } from './guildTypes.ts' +import { UserPayload } from './userTypes.ts' export interface InvitePayload { code: string - guild?: Guild - channel: Channel - inviter?: User - target_user?: User + guild?: GuildPayload + channel: ChannelPayload + inviter?: UserPayload + target_user?: UserPayload target_user_type?: number approximate_presence_count?: number approximate_member_count?: number diff --git a/src/types/presenceTypes.ts b/src/types/presenceTypes.ts index a2aff4a..bb834d4 100644 --- a/src/types/presenceTypes.ts +++ b/src/types/presenceTypes.ts @@ -1,7 +1,7 @@ -import { User } from '../structures/user.ts' +import { UserPayload } from './userTypes.ts' interface PresenceUpdatePayload { - user: User + user: UserPayload guild_id: string status: string activities: ActivityPayload diff --git a/src/types/snowflake.ts b/src/types/snowflake.ts index b9409b8..4fbd6a6 100644 --- a/src/types/snowflake.ts +++ b/src/types/snowflake.ts @@ -15,8 +15,3 @@ export class Snowflake { return res } } - -// BigInt라서 이걸 어케 할까 고심끝에 나온게 toString 읍 -// 엄... - -// deconstruct가 소멸자임? 색 봐서는 아닌거같은데 diff --git a/src/types/templateTypes.ts b/src/types/templateTypes.ts index b303ef1..b80a488 100644 --- a/src/types/templateTypes.ts +++ b/src/types/templateTypes.ts @@ -1,5 +1,5 @@ -import { Guild } from '../structures/guild.ts' -import { User } from '../structures/user.ts' +import { GuildPayload } from './guildTypes.ts' +import { UserPayload } from './userTypes.ts' export interface TemplatePayload { code: string @@ -7,10 +7,10 @@ export interface TemplatePayload { description: string | undefined usage_count: number creator_id: string - creator: User + creator: UserPayload created_at: string updated_at: string source_guild_id: string - serialized_source_guild: Guild + serialized_source_guild: GuildPayload is_dirty: boolean | undefined } diff --git a/src/types/voiceTypes.ts b/src/types/voiceTypes.ts index c098146..3262bda 100644 --- a/src/types/voiceTypes.ts +++ b/src/types/voiceTypes.ts @@ -1,5 +1,5 @@ // https://discord.com/developers/docs/topics/opcodes-and-status-codes#voice -import { Member } from '../structures/member.ts' +import { MemberPayload } from './guildTypes.ts' enum VoiceOpcodes { // VoiceOpcodes 추가 - UnderC - IDENTIFY = 0, @@ -31,9 +31,9 @@ enum VoiceCloseCodes { export interface VoiceStatePayload { guild_id?: string - channel_id: string | undefined + channel_id?: string user_id: string - member?: Member + member?: MemberPayload session_id: string deaf: boolean mute: boolean diff --git a/src/types/webhookTypes.ts b/src/types/webhookTypes.ts index b43c21f..ce8919e 100644 --- a/src/types/webhookTypes.ts +++ b/src/types/webhookTypes.ts @@ -1,13 +1,13 @@ -import { User } from '../structures/user.ts' +import { UserPayload } from './userTypes.ts' export interface WebhookPayload { id: string type: 1 | 2 guild_id?: string channel_id: string - user?: User - name: string | undefined - avatar: string | undefined + user?: UserPayload + name?: string + avatar?: string token?: string - application_id: string | undefined + application_id?: string } diff --git a/tsconfig.json b/tsconfig.json index 964ccf7..a265a0a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,8 +8,8 @@ "module": "ESNext", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ "lib": [ - "esnext", - ], /* Specify library files to be included in the compilation. */ + "esnext" + ] /* Specify library files to be included in the compilation. */, // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ @@ -67,4 +67,4 @@ /* Skip type checking of declaration files. */ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ } -} \ No newline at end of file +}