From c1bce2833412374c31096834514a4538ccb5302a Mon Sep 17 00:00:00 2001 From: DjDeveloperr Date: Wed, 25 Nov 2020 18:11:51 +0530 Subject: [PATCH] feat(integrations|application): implementation --- mod.ts | 124 +++++---- src/models/client.ts | 4 + src/structures/application.ts | 24 ++ src/structures/guild.ts | 494 +++++++++++++++++++--------------- src/types/application.ts | 10 + src/types/guild.ts | 257 ++++++++++-------- 6 files changed, 518 insertions(+), 395 deletions(-) create mode 100644 src/structures/application.ts create mode 100644 src/types/application.ts diff --git a/mod.ts b/mod.ts index 9edcc67..dfeee02 100644 --- a/mod.ts +++ b/mod.ts @@ -1,57 +1,67 @@ -export * from './src/gateway/index.ts' -export * from './src/models/client.ts' -export * from './src/models/rest.ts' -export * from './src/models/cacheAdapter.ts' -export * from './src/models/shard.ts' -export * from './src/models/command.ts' -export * from './src/models/commandClient.ts' -export * from './src/managers/base.ts' -export * from './src/managers/baseChild.ts' -export * from './src/managers/channels.ts' -export * from './src/managers/emojis.ts' -export * from './src/managers/gatewayCache.ts' -export * from './src/managers/guildChannels.ts' -export * from './src/managers/guilds.ts' -export * from './src/managers/members.ts' -export * from './src/managers/messages.ts' -export * from './src/managers/roles.ts' -export * from './src/managers/users.ts' -export * from './src/structures/base.ts' -export * from './src/structures/cdn.ts' -export * from './src/structures/channel.ts' -export * from './src/structures/dmChannel.ts' -export * from './src/structures/embed.ts' -export * from './src/structures/emoji.ts' -export * from './src/structures/groupChannel.ts' -export * from './src/structures/guild.ts' -export * from './src/structures/guildCategoryChannel.ts' -export * from './src/structures/guildNewsChannel.ts' -export * from './src/structures/guildVoiceChannel.ts' -export * from './src/structures/invite.ts' -export * from './src/structures/member.ts' -export * from './src/structures/message.ts' -export * from './src/structures/messageMentions.ts' -export * from './src/structures/presence.ts' -export * from './src/structures/role.ts' -export * from './src/structures/snowflake.ts' -export * from './src/structures/textChannel.ts' -export * from './src/structures/user.ts' -export * from './src/structures/webhook.ts' -export * from './src/types/cdn.ts' -export * from './src/types/channel.ts' -export * from './src/types/emoji.ts' -export * from './src/types/endpoint.ts' -export * from './src/types/gateway.ts' -export * from './src/types/gatewayBot.ts' -export * from './src/types/gatewayResponse.ts' -export * from './src/types/guild.ts' -export * from './src/types/invite.ts' -export * from './src/types/permissionFlags.ts' -export * from './src/types/presence.ts' -export * from './src/types/role.ts' -export * from './src/types/template.ts' -export * from './src/types/user.ts' -export * from './src/types/voice.ts' -export * from './src/types/webhook.ts' -export * from './src/utils/collection.ts' -export * from './src/utils/intents.ts' \ No newline at end of file +export * from './src/gateway/index.ts' +export * from './src/models/client.ts' +export * from './src/models/rest.ts' +export * from './src/models/cacheAdapter.ts' +export * from './src/models/shard.ts' +export * from './src/models/command.ts' +export * from './src/models/extensions.ts' +export * from './src/models/commandClient.ts' +export * from './src/managers/base.ts' +export * from './src/managers/baseChild.ts' +export * from './src/managers/channels.ts' +export * from './src/managers/emojis.ts' +export * from './src/managers/gatewayCache.ts' +export * from './src/managers/guildChannels.ts' +export * from './src/managers/guilds.ts' +export * from './src/managers/guildChannels.ts' +export * from './src/managers/guildEmojis.ts' +export * from './src/managers/members.ts' +export * from './src/managers/messages.ts' +export * from './src/managers/roles.ts' +export * from './src/managers/users.ts' +export * from './src/structures/application.ts' +export * from './src/structures/base.ts' +export * from './src/structures/cdn.ts' +export * from './src/structures/channel.ts' +export * from './src/structures/dmChannel.ts' +export * from './src/structures/embed.ts' +export * from './src/structures/emoji.ts' +export * from './src/structures/groupChannel.ts' +export * from './src/structures/guild.ts' +export * from './src/structures/guildCategoryChannel.ts' +export * from './src/structures/guildNewsChannel.ts' +export * from './src/structures/guildVoiceChannel.ts' +export * from './src/structures/invite.ts' +export * from './src/structures/member.ts' +export * from './src/structures/message.ts' +export * from './src/structures/messageMentions.ts' +export * from './src/structures/presence.ts' +export * from './src/structures/role.ts' +export * from './src/structures/snowflake.ts' +export * from './src/structures/textChannel.ts' +export * from './src/structures/user.ts' +export * from './src/structures/webhook.ts' +export * from './src/types/application.ts' +export * from './src/types/cdn.ts' +export * from './src/types/channel.ts' +export * from './src/types/emoji.ts' +export * from './src/types/endpoint.ts' +export * from './src/types/gateway.ts' +export * from './src/types/gatewayBot.ts' +export * from './src/types/gatewayResponse.ts' +export * from './src/types/guild.ts' +export * from './src/types/invite.ts' +export * from './src/types/permissionFlags.ts' +export * from './src/types/presence.ts' +export * from './src/types/role.ts' +export * from './src/types/template.ts' +export * from './src/types/user.ts' +export * from './src/types/voice.ts' +export * from './src/types/webhook.ts' +export * from './src/utils/collection.ts' +export * from './src/utils/intents.ts' +export * from './src/utils/buildInfo.ts' +export * from './src/utils/permissions.ts' +export * from './src/utils/userFlags.ts' +export * from './src/utils/bitfield.ts' +export * from './src/utils/getChannelByType.ts' \ No newline at end of file diff --git a/src/models/client.ts b/src/models/client.ts index 56e7949..cf5aaa8 100644 --- a/src/models/client.ts +++ b/src/models/client.ts @@ -12,6 +12,7 @@ import { } from '../structures/presence.ts' import { EmojisManager } from '../managers/emojis.ts' import { ActivityGame, ClientActivity } from "../types/presence.ts" +// import { Application } from "../../mod.ts" /** Some Client Options to modify behaviour */ export interface ClientOptions { @@ -103,6 +104,9 @@ export class Client extends EventEmitter { this.emit('debug', `[${tag}] ${msg}`) } + // TODO(DjDeveloperr): Implement this + // fetchApplication(): Promise + /** * This function is used for connect to discord. * @param token Your token. This is required. diff --git a/src/structures/application.ts b/src/structures/application.ts new file mode 100644 index 0000000..c4d5cf1 --- /dev/null +++ b/src/structures/application.ts @@ -0,0 +1,24 @@ +import { Client } from "../models/client.ts"; +import { ApplicationPayload } from "../types/application.ts"; +import { Base } from "./base.ts"; +import { User } from "./user.ts"; + +export class Application extends Base { + id: string + name: string + icon: string + description: string + summary: string + bot?: User + + constructor(client: Client, data: ApplicationPayload) { + super(client, data) + + this.id = data.id + this.name = data.name + this.icon = data.icon + this.description = data.description + this.summary = data.summary + this.bot = data.bot !== undefined ? new User(client, data.bot) : undefined + } +} \ No newline at end of file diff --git a/src/structures/guild.ts b/src/structures/guild.ts index 19dab5a..395d3cb 100644 --- a/src/structures/guild.ts +++ b/src/structures/guild.ts @@ -1,224 +1,270 @@ -import { Client } from '../models/client.ts' -import { GuildFeatures, GuildPayload } from '../types/guild.ts' -import { PresenceUpdatePayload } from '../types/gateway.ts' -import { Base } from './base.ts' -import { VoiceState } from './voiceState.ts' -import { RolesManager } from '../managers/roles.ts' -import { GuildChannelsManager } from '../managers/guildChannels.ts' -import { MembersManager } from '../managers/members.ts' -import { Role } from './role.ts' -import { GuildEmojisManager } from '../managers/guildEmojis.ts' -import { Member } from "./member.ts" - -export class Guild extends Base { - id: string - name?: string - icon?: string - iconHash?: string - splash?: string - discoverySplash?: string - owner?: boolean - ownerID?: string - permissions?: string - region?: string - afkChannelID?: string - afkTimeout?: number - widgetEnabled?: boolean - widgetChannelID?: string - verificationLevel?: string - defaultMessageNotifications?: string - explicitContentFilter?: string - roles: RolesManager - emojis: GuildEmojisManager - features?: GuildFeatures[] - mfaLevel?: string - applicationID?: string - systemChannelID?: string - systemChannelFlags?: string - rulesChannelID?: string - joinedAt?: string - large?: boolean - unavailable: boolean - memberCount?: number - voiceStates?: VoiceState[] - members: MembersManager - channels: GuildChannelsManager - 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, data) - this.id = data.id - this.unavailable = data.unavailable - this.members = new MembersManager(this.client, this) - this.channels = new GuildChannelsManager( - this.client, - this.client.channels, - this - ) - this.roles = new RolesManager(this.client, this) - this.emojis = new GuildEmojisManager(this.client, this.client.emojis, this) - - if (!this.unavailable) { - this.name = data.name - this.icon = data.icon - this.iconHash = data.icon_hash - this.splash = data.splash - this.discoverySplash = data.discovery_splash - this.owner = data.owner - this.ownerID = data.owner_id - this.permissions = data.permissions - this.region = data.region - this.afkTimeout = data.afk_timeout - this.afkChannelID = data.afk_channel_id - this.widgetEnabled = data.widget_enabled - this.widgetChannelID = data.widget_channel_id - this.verificationLevel = data.verification_level - this.defaultMessageNotifications = data.default_message_notifications - this.explicitContentFilter = data.explicit_content_filter - // this.roles = data.roles.map( - // v => cache.get('role', v.id) ?? new Role(client, v) - // ) - // data.roles.forEach(role => { - // this.roles.set(role.id, new Role(client, role)) - // }) - // this.emojis = data.emojis.map( - // v => cache.get('emoji', v.id) ?? new Emoji(client, v) - // ) - this.features = data.features - 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.memberCount = data.member_count - // TODO: Cache in Gateway Event code - // this.voiceStates = data.voice_states?.map( - // v => - // cache.get('voiceState', `${v.guild_id}:${v.user_id}`) ?? - // new VoiceState(client, v) - // ) - // this.members = data.members?.map( - // v => - // cache.get('member', `${this.id}:${v.user.id}`) ?? - // new Member(client, v) - // ) - // this.channels = data.channels?.map( - // v => cache.get('channel', v.id) ?? getChannelByType(this.client, v) - // ) - this.presences = data.presences - 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.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 - } - } - - protected readFromData (data: GuildPayload): void { - super.readFromData(data) - this.id = data.id ?? this.id - this.unavailable = data.unavailable ?? this.unavailable - - if (!this.unavailable) { - this.name = data.name ?? this.name - this.icon = data.icon ?? this.icon - this.iconHash = data.icon_hash ?? this.iconHash - this.splash = data.splash ?? this.splash - this.discoverySplash = data.discovery_splash ?? this.discoverySplash - this.owner = data.owner ?? this.owner - this.ownerID = data.owner_id ?? this.ownerID - this.permissions = data.permissions ?? this.permissions - this.region = data.region ?? this.region - this.afkTimeout = data.afk_timeout ?? this.afkTimeout - this.afkChannelID = data.afk_channel_id ?? this.afkChannelID - this.widgetEnabled = data.widget_enabled ?? this.widgetEnabled - this.widgetChannelID = data.widget_channel_id ?? this.widgetChannelID - this.verificationLevel = data.verification_level ?? this.verificationLevel - this.defaultMessageNotifications = - data.default_message_notifications ?? this.defaultMessageNotifications - this.explicitContentFilter = - data.explicit_content_filter ?? this.explicitContentFilter - // this.roles = - // data.roles.map( - // v => cache.get('role', v.id) ?? new Role(this.client, v) - // ) ?? this.roles - // this.emojis = - // data.emojis.map( - // v => cache.get('emoji', v.id) ?? new Emoji(this.client, v) - // ) ?? this.emojis - this.features = data.features ?? this.features - this.mfaLevel = data.mfa_level ?? this.mfaLevel - this.systemChannelID = data.system_channel_id ?? this.systemChannelID - this.systemChannelFlags = - data.system_channel_flags ?? this.systemChannelFlags - this.rulesChannelID = data.rules_channel_id ?? this.rulesChannelID - this.joinedAt = data.joined_at ?? this.joinedAt - this.large = data.large ?? this.large - this.memberCount = data.member_count ?? this.memberCount - // this.voiceStates = - // data.voice_states?.map( - // v => - // cache.get('voiceState', `${v.guild_id}:${v.user_id}`) ?? - // new VoiceState(this.client, v) - // ) ?? this.voiceStates - // this.members = - // data.members?.map( - // v => - // cache.get('member', `${this.id}:${v.user.id}`) ?? - // new Member(this.client, v) - // ) ?? this.members - // this.channels = - // data.channels?.map( - // v => cache.get('channel', v.id) ?? getChannelByType(this.client, v, this) - // ) ?? this.members - this.presences = data.presences ?? this.presences - this.maxPresences = data.max_presences ?? this.maxPresences - this.maxMembers = data.max_members ?? this.maxMembers - this.vanityURLCode = data.vanity_url_code ?? this.vanityURLCode - this.description = data.description ?? this.description - this.banner = data.banner ?? this.banner - this.premiumTier = data.premium_tier ?? this.premiumTier - this.premiumSubscriptionCount = - data.premium_subscription_count ?? this.premiumSubscriptionCount - this.preferredLocale = data.preferred_locale ?? this.preferredLocale - this.publicUpdatesChannelID = - data.public_updates_channel_id ?? this.publicUpdatesChannelID - this.maxVideoChannelUsers = - data.max_video_channel_users ?? this.maxVideoChannelUsers - this.approximateNumberCount = - data.approximate_number_count ?? this.approximateNumberCount - this.approximatePresenceCount = - data.approximate_presence_count ?? this.approximatePresenceCount - } - } - - async getEveryoneRole (): Promise { - return (await this.roles.array().then(arr => arr?.sort((b, a) => a.position - b.position)[0]) as any) as Role - } - - async me(): Promise { - const get = await this.members.get(this.client.user?.id as string) - if (get === undefined) throw new Error('Guild#me is not cached') - return get - } -} +import { Client } from '../models/client.ts' +import { GuildFeatures, GuildIntegrationPayload, GuildPayload, IntegrationAccountPayload, IntegrationExpireBehavior } from '../types/guild.ts' +import { PresenceUpdatePayload } from '../types/gateway.ts' +import { Base } from './base.ts' +import { VoiceState } from './voiceState.ts' +import { RolesManager } from '../managers/roles.ts' +import { GuildChannelsManager } from '../managers/guildChannels.ts' +import { MembersManager } from '../managers/members.ts' +import { Role } from './role.ts' +import { GuildEmojisManager } from '../managers/guildEmojis.ts' +import { Member } from "./member.ts" +import { User } from "./user.ts" +import { Application } from "./application.ts" +import { GUILD_INTEGRATIONS } from "../types/endpoint.ts" + +export class Guild extends Base { + id: string + name?: string + icon?: string + iconHash?: string + splash?: string + discoverySplash?: string + owner?: boolean + ownerID?: string + permissions?: string + region?: string + afkChannelID?: string + afkTimeout?: number + widgetEnabled?: boolean + widgetChannelID?: string + verificationLevel?: string + defaultMessageNotifications?: string + explicitContentFilter?: string + roles: RolesManager + emojis: GuildEmojisManager + features?: GuildFeatures[] + mfaLevel?: string + applicationID?: string + systemChannelID?: string + systemChannelFlags?: string + rulesChannelID?: string + joinedAt?: string + large?: boolean + unavailable: boolean + memberCount?: number + voiceStates?: VoiceState[] + members: MembersManager + channels: GuildChannelsManager + 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, data) + this.id = data.id + this.unavailable = data.unavailable + this.members = new MembersManager(this.client, this) + this.channels = new GuildChannelsManager( + this.client, + this.client.channels, + this + ) + this.roles = new RolesManager(this.client, this) + this.emojis = new GuildEmojisManager(this.client, this.client.emojis, this) + + if (!this.unavailable) { + this.name = data.name + this.icon = data.icon + this.iconHash = data.icon_hash + this.splash = data.splash + this.discoverySplash = data.discovery_splash + this.owner = data.owner + this.ownerID = data.owner_id + this.permissions = data.permissions + this.region = data.region + this.afkTimeout = data.afk_timeout + this.afkChannelID = data.afk_channel_id + this.widgetEnabled = data.widget_enabled + this.widgetChannelID = data.widget_channel_id + this.verificationLevel = data.verification_level + this.defaultMessageNotifications = data.default_message_notifications + this.explicitContentFilter = data.explicit_content_filter + // this.roles = data.roles.map( + // v => cache.get('role', v.id) ?? new Role(client, v) + // ) + // data.roles.forEach(role => { + // this.roles.set(role.id, new Role(client, role)) + // }) + // this.emojis = data.emojis.map( + // v => cache.get('emoji', v.id) ?? new Emoji(client, v) + // ) + this.features = data.features + 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.memberCount = data.member_count + // TODO: Cache in Gateway Event code + // this.voiceStates = data.voice_states?.map( + // v => + // cache.get('voiceState', `${v.guild_id}:${v.user_id}`) ?? + // new VoiceState(client, v) + // ) + // this.members = data.members?.map( + // v => + // cache.get('member', `${this.id}:${v.user.id}`) ?? + // new Member(client, v) + // ) + // this.channels = data.channels?.map( + // v => cache.get('channel', v.id) ?? getChannelByType(this.client, v) + // ) + this.presences = data.presences + 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.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 + } + } + + protected readFromData (data: GuildPayload): void { + super.readFromData(data) + this.id = data.id ?? this.id + this.unavailable = data.unavailable ?? this.unavailable + + if (!this.unavailable) { + this.name = data.name ?? this.name + this.icon = data.icon ?? this.icon + this.iconHash = data.icon_hash ?? this.iconHash + this.splash = data.splash ?? this.splash + this.discoverySplash = data.discovery_splash ?? this.discoverySplash + this.owner = data.owner ?? this.owner + this.ownerID = data.owner_id ?? this.ownerID + this.permissions = data.permissions ?? this.permissions + this.region = data.region ?? this.region + this.afkTimeout = data.afk_timeout ?? this.afkTimeout + this.afkChannelID = data.afk_channel_id ?? this.afkChannelID + this.widgetEnabled = data.widget_enabled ?? this.widgetEnabled + this.widgetChannelID = data.widget_channel_id ?? this.widgetChannelID + this.verificationLevel = data.verification_level ?? this.verificationLevel + this.defaultMessageNotifications = + data.default_message_notifications ?? this.defaultMessageNotifications + this.explicitContentFilter = + data.explicit_content_filter ?? this.explicitContentFilter + // this.roles = + // data.roles.map( + // v => cache.get('role', v.id) ?? new Role(this.client, v) + // ) ?? this.roles + // this.emojis = + // data.emojis.map( + // v => cache.get('emoji', v.id) ?? new Emoji(this.client, v) + // ) ?? this.emojis + this.features = data.features ?? this.features + this.mfaLevel = data.mfa_level ?? this.mfaLevel + this.systemChannelID = data.system_channel_id ?? this.systemChannelID + this.systemChannelFlags = + data.system_channel_flags ?? this.systemChannelFlags + this.rulesChannelID = data.rules_channel_id ?? this.rulesChannelID + this.joinedAt = data.joined_at ?? this.joinedAt + this.large = data.large ?? this.large + this.memberCount = data.member_count ?? this.memberCount + // this.voiceStates = + // data.voice_states?.map( + // v => + // cache.get('voiceState', `${v.guild_id}:${v.user_id}`) ?? + // new VoiceState(this.client, v) + // ) ?? this.voiceStates + // this.members = + // data.members?.map( + // v => + // cache.get('member', `${this.id}:${v.user.id}`) ?? + // new Member(this.client, v) + // ) ?? this.members + // this.channels = + // data.channels?.map( + // v => cache.get('channel', v.id) ?? getChannelByType(this.client, v, this) + // ) ?? this.members + this.presences = data.presences ?? this.presences + this.maxPresences = data.max_presences ?? this.maxPresences + this.maxMembers = data.max_members ?? this.maxMembers + this.vanityURLCode = data.vanity_url_code ?? this.vanityURLCode + this.description = data.description ?? this.description + this.banner = data.banner ?? this.banner + this.premiumTier = data.premium_tier ?? this.premiumTier + this.premiumSubscriptionCount = + data.premium_subscription_count ?? this.premiumSubscriptionCount + this.preferredLocale = data.preferred_locale ?? this.preferredLocale + this.publicUpdatesChannelID = + data.public_updates_channel_id ?? this.publicUpdatesChannelID + this.maxVideoChannelUsers = + data.max_video_channel_users ?? this.maxVideoChannelUsers + this.approximateNumberCount = + data.approximate_number_count ?? this.approximateNumberCount + this.approximatePresenceCount = + data.approximate_presence_count ?? this.approximatePresenceCount + } + } + + async getEveryoneRole (): Promise { + return (await this.roles.get(this.id) as unknown) as Role + } + + async me(): Promise { + const get = await this.members.get(this.client.user?.id as string) + if (get === undefined) throw new Error('Guild#me is not cached') + return get + } + + async fetchIntegrations(): Promise { + const raw = await this.client.rest.get(GUILD_INTEGRATIONS(this.id)) as GuildIntegrationPayload[] + return raw.map(e => new GuildIntegration(this.client, e)) + } +} + +export class GuildIntegration extends Base { + id: string + name: string + type: string + enabled: boolean + syncing?: boolean + roleID?: string + enableEmoticons?: boolean + expireBehaviour?: IntegrationExpireBehavior + expireGracePeriod?: number + user?: User + account: IntegrationAccountPayload + syncedAt?: string // Actually a ISO Timestamp, but we parse in constructor' + subscriberCount?: number + revoked?: boolean + application?: Application + + constructor(client: Client, data: GuildIntegrationPayload) { + super(client, data) + + this.id = data.id + this.name= data.name + this.type = data.type + this.enabled = data.enabled + this.syncing = data.syncing + this.roleID = data.role_id + this.enableEmoticons = data.enable_emoticons + this.expireBehaviour = data.expire_behaviour + this.expireGracePeriod = data.expire_grace_period + this.user = data.user !== undefined ? new User(client, data.user) : undefined + this.account = data.account + this.syncedAt = data.synced_at + this.subscriberCount = data.subscriber_count + this.revoked = data.revoked + this.application = data.application !== undefined ? new Application(client, data.application) : undefined + } +} \ No newline at end of file diff --git a/src/types/application.ts b/src/types/application.ts new file mode 100644 index 0000000..888de73 --- /dev/null +++ b/src/types/application.ts @@ -0,0 +1,10 @@ +import { UserPayload } from "./user.ts"; + +export interface ApplicationPayload { + id: string + name: string + icon: string + description: string + summary: string + bot?: UserPayload +} \ No newline at end of file diff --git a/src/types/guild.ts b/src/types/guild.ts index d8438d6..1f92a00 100644 --- a/src/types/guild.ts +++ b/src/types/guild.ts @@ -1,114 +1,143 @@ -import { ChannelPayload } from './channel.ts' -import { EmojiPayload } from './emoji.ts' -import { PresenceUpdatePayload } from './gateway.ts' -import { RolePayload } from './role.ts' -import { UserPayload } from './user.ts' -import { VoiceStatePayload } from './voice.ts' - -export interface GuildPayload { - id: string - name: string - icon?: string - icon_hash?: string - splash?: string - discovery_splash?: string - owner?: boolean - owner_id: string - permissions?: string - region: string - afk_channel_id?: string - afk_timeout: number - widget_enabled?: boolean - widget_channel_id?: string - verification_level: string - default_message_notifications: string - explicit_content_filter: string - roles: RolePayload[] - emojis: EmojiPayload[] - features: GuildFeatures[] - mfa_level: string - application_id?: string - system_channel_id?: string - system_channel_flags: string - rules_channel_id?: string - joined_at?: string - large?: boolean - unavailable: boolean - member_count?: number - voice_states?: VoiceStatePayload[] - members?: MemberPayload[] - channels?: ChannelPayload[] - presences?: PresenceUpdatePayload[] - max_presences?: number - max_members?: number - vanity_url_code?: string - description?: string - banner?: string - premium_tier: number - premium_subscription_count?: number - preferred_locale: string - public_updates_channel_id?: string - max_video_channel_users?: number - approximate_number_count?: number - approximate_presence_count?: number -} - -export interface MemberPayload { - user: UserPayload - nick?: string - roles: string[] - joined_at: string - premium_since?: string - deaf: boolean - mute: boolean -} - -export enum MessageNotification { - ALL_MESSAGES = 0, - ONLY_MENTIONS = 1 -} - -export enum ContentFilter { - DISABLED = 0, - MEMBERS_WITHOUT_ROLES = 1, - ALL_MEMBERS = 3 -} - -export enum MFA { - NONE = 0, - ELEVATED = 1 -} - -export enum Verification { - NONE = 0, - LOW = 1, - MEDIUM = 2, - HIGH = 3, - VERY_HIGH = 4 -} - -export enum PremiumTier { - NONE = 0, - TIER_1 = 1, - TIER_2 = 2, - TIER_3 = 3 -} - -export enum SystemChannelFlags { - SUPPRESS_JOIN_NOTIFICATIONS = 1 << 0, - SUPPRESS_PREMIUM_SUBSCRIPTIONS = 1 << 1 -} - -export type GuildFeatures = - | 'INVITE_SPLASH' - | 'VIP_REGIONS' - | 'VANITY_URL' - | 'VERIFIED' - | 'PARTNERED' - | 'PUBLIC' - | 'COMMERCE' - | 'NEWS' - | 'DISCOVERABLE' - | 'FEATURABLE' - | 'ANIMATED_ICON' - | 'BANNER' +import { ApplicationPayload } from "./application.ts" +import { ChannelPayload } from './channel.ts' +import { EmojiPayload } from './emoji.ts' +import { PresenceUpdatePayload } from './gateway.ts' +import { RolePayload } from './role.ts' +import { UserPayload } from './user.ts' +import { VoiceStatePayload } from './voice.ts' + +export interface GuildPayload { + id: string + name: string + icon?: string + icon_hash?: string + splash?: string + discovery_splash?: string + owner?: boolean + owner_id: string + permissions?: string + region: string + afk_channel_id?: string + afk_timeout: number + widget_enabled?: boolean + widget_channel_id?: string + verification_level: string + default_message_notifications: string + explicit_content_filter: string + roles: RolePayload[] + emojis: EmojiPayload[] + features: GuildFeatures[] + mfa_level: string + application_id?: string + system_channel_id?: string + system_channel_flags: string + rules_channel_id?: string + joined_at?: string + large?: boolean + unavailable: boolean + member_count?: number + voice_states?: VoiceStatePayload[] + members?: MemberPayload[] + channels?: ChannelPayload[] + presences?: PresenceUpdatePayload[] + max_presences?: number + max_members?: number + vanity_url_code?: string + description?: string + banner?: string + premium_tier: number + premium_subscription_count?: number + preferred_locale: string + public_updates_channel_id?: string + max_video_channel_users?: number + approximate_number_count?: number + approximate_presence_count?: number +} + +export interface MemberPayload { + user: UserPayload + nick?: string + roles: string[] + joined_at: string + premium_since?: string + deaf: boolean + mute: boolean +} + +export enum MessageNotification { + ALL_MESSAGES = 0, + ONLY_MENTIONS = 1 +} + +export enum ContentFilter { + DISABLED = 0, + MEMBERS_WITHOUT_ROLES = 1, + ALL_MEMBERS = 3 +} + +export enum MFA { + NONE = 0, + ELEVATED = 1 +} + +export enum Verification { + NONE = 0, + LOW = 1, + MEDIUM = 2, + HIGH = 3, + VERY_HIGH = 4 +} + +export enum PremiumTier { + NONE = 0, + TIER_1 = 1, + TIER_2 = 2, + TIER_3 = 3 +} + +export enum SystemChannelFlags { + SUPPRESS_JOIN_NOTIFICATIONS = 1 << 0, + SUPPRESS_PREMIUM_SUBSCRIPTIONS = 1 << 1 +} + +export type GuildFeatures = + | 'INVITE_SPLASH' + | 'VIP_REGIONS' + | 'VANITY_URL' + | 'VERIFIED' + | 'PARTNERED' + | 'PUBLIC' + | 'COMMERCE' + | 'NEWS' + | 'DISCOVERABLE' + | 'FEATURABLE' + | 'ANIMATED_ICON' + | 'BANNER' + +export enum IntegrationExpireBehavior { + REMOVE_ROLE = 0, + KICK = 1 +} + +export interface IntegrationAccountPayload { + id: string + name: string +} + +export interface GuildIntegrationPayload { + id: string + name: string + type: string + enabled: boolean + syncing?: boolean + role_id?: string + enable_emoticons?: boolean + expire_behaviour?: IntegrationExpireBehavior + expire_grace_period?: number + user?: UserPayload + account: IntegrationAccountPayload + synced_at?: string // Actually a ISO Timestamp, but we parse in constructor' + subscriber_count?: number + revoked?: boolean + application?: ApplicationPayload +} \ No newline at end of file