mirror of
https://github.com/discordeno/discordeno.git
synced 2026-06-03 09:20:08 +00:00
953 lines
34 KiB
TypeScript
953 lines
34 KiB
TypeScript
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
/* eslint-disable no-useless-call */
|
|
import {
|
|
BitwisePermissionFlags,
|
|
ChannelTypes,
|
|
type ApplicationCommandTypes,
|
|
type BigString,
|
|
type DefaultMessageNotificationLevels,
|
|
type DiscordEmoji,
|
|
type DiscordGuild,
|
|
type DiscordMemberWithUser,
|
|
type DiscordSticker,
|
|
type ExplicitContentFilterLevels,
|
|
type GuildFeatures,
|
|
type GuildNsfwLevel,
|
|
type MfaLevels,
|
|
type PremiumTiers,
|
|
type RequestGuildMembers,
|
|
type SystemChannelFlags,
|
|
type VerificationLevels,
|
|
} from '@discordeno/types'
|
|
import Base from '../../Base.js'
|
|
import type Client from '../../Client.js'
|
|
import type { ImageFormat, ImageSize } from '../../Client.js'
|
|
import Collection from '../../Collection.js'
|
|
import { BANNER, GUILD_DISCOVERY_SPLASH, GUILD_ICON, GUILD_SPLASH } from '../../Endpoints.js'
|
|
import type Shard from '../../gateway/Shard.js'
|
|
import type {
|
|
AnyGuildChannel,
|
|
AnyThreadChannel,
|
|
ApplicationCommand,
|
|
ApplicationCommandPermissions,
|
|
ApplicationCommandStructure,
|
|
ChannelPosition,
|
|
CreateChannelOptions,
|
|
CreateStickerOptions,
|
|
DiscoveryMetadata,
|
|
DiscoveryOptions,
|
|
DiscoverySubcategoryResponse,
|
|
EditStickerOptions,
|
|
Emoji,
|
|
EmojiOptions,
|
|
GetGuildAuditLogOptions,
|
|
GetGuildBansOptions,
|
|
GetPruneOptions,
|
|
GetRESTGuildMembersOptions,
|
|
GuildApplicationCommandPermissions,
|
|
GuildAuditLog,
|
|
GuildBan,
|
|
GuildOptions,
|
|
GuildTemplateOptions,
|
|
GuildVanity,
|
|
IntegrationOptions,
|
|
ListedGuildThreads,
|
|
MemberOptions,
|
|
PruneMemberOptions,
|
|
RoleOptions,
|
|
Sticker,
|
|
VoiceRegion,
|
|
VoiceStateOptions,
|
|
Webhook,
|
|
WelcomeScreen,
|
|
WelcomeScreenOptions,
|
|
Widget,
|
|
WidgetData,
|
|
} from '../../typings.js'
|
|
import { generateChannelFrom } from '../../utils/generate.js'
|
|
import type CategoryChannel from '../channels/Category.js'
|
|
import type GuildChannel from '../channels/Guild.js'
|
|
import type StageChannel from '../channels/Stage.js'
|
|
import type TextChannel from '../channels/Text.js'
|
|
import type TextVoiceChannel from '../channels/TextVoice.js'
|
|
import type ThreadChannel from '../channels/threads/Thread.js'
|
|
import type VoiceChannel from '../channels/Voice.js'
|
|
import type Invite from '../Invite.js'
|
|
import Permission from '../Permission.js'
|
|
import User from '../users/User.js'
|
|
import type GuildIntegration from './Integration.js'
|
|
import Member from './Member.js'
|
|
import Role from './Role.js'
|
|
import StageInstance from './StageInstance.js'
|
|
import type GuildTemplate from './Template.js'
|
|
import type { VoiceState } from './VoiceState.js'
|
|
|
|
export class Guild extends Base {
|
|
/** The client object */
|
|
client: Client
|
|
/** The id of the guild owner. */
|
|
ownerID: string
|
|
/** The id of the application. */
|
|
applicationID?: string | null
|
|
/** The id of the widget channel. */
|
|
widgetChannelID?: string | null
|
|
/** The afk channel id if one is set. */
|
|
afkChannelID?: string | null
|
|
/** The system channel id if one is set. */
|
|
systemChannelID?: string | null
|
|
/** The public updates channel id if one is set. */
|
|
publicUpdatesChannelID?: string | null
|
|
/** The rules channel id if one is set. */
|
|
rulesChannelID?: string | null
|
|
/** The name of the guild. */
|
|
name?: string
|
|
/** The description of the guild. */
|
|
description?: string | null
|
|
/** The vanity url if one is set. */
|
|
vanityURL?: string | null
|
|
/** The preferred locale of the server. */
|
|
preferredLocale?: string
|
|
/** The system channel flags. */
|
|
systemChannelFlags?: SystemChannelFlags
|
|
/** The verification level of the guild. */
|
|
verificationLevel?: VerificationLevels
|
|
/** The default notification level. */
|
|
defaultNotifications?: DefaultMessageNotificationLevels
|
|
/** The explicit content filter setting for this guild. */
|
|
explicitContentFilter?: ExplicitContentFilterLevels
|
|
/** Array of guild features */
|
|
features: GuildFeatures[] = []
|
|
/** The premium tier of the guild. */
|
|
premiumTier?: PremiumTiers
|
|
/** The MFA level of the guild. */
|
|
mfaLevel?: MfaLevels
|
|
/** The NSFW level of the guild. */
|
|
nsfwLevel?: GuildNsfwLevel
|
|
/** The compressed form of the guild splash image. */
|
|
_splash?: bigint
|
|
/** The compressed form of the guild's discovery splash image. */
|
|
_discoverySplash?: bigint
|
|
/** The compressed form of the guild's banner image. */
|
|
_banner?: bigint
|
|
/** The compressed form of the guild's icon image. */
|
|
_icon?: bigint
|
|
/** The cached emojis in the guild. */
|
|
emojis?: DiscordEmoji[]
|
|
/** The cached stickers in the guild. */
|
|
stickers?: DiscordSticker[]
|
|
/** The afk timeout in seconds. */
|
|
afkTimeout?: number
|
|
/** When this guild was joined at. */
|
|
joinedAt: number
|
|
/** The amount of members in the guild. */
|
|
memberCount: number
|
|
/** The approximate member count in the guild. */
|
|
approximateMemberCount?: number
|
|
/** The approximate presence count in the guild. */
|
|
approximatePresenceCount?: number
|
|
/** The amount of subscribers to the server. */
|
|
premiumSubscriptionCount?: number
|
|
/** The maximum amount of presences that can be in a guild. */
|
|
maxPresences?: number | null
|
|
/** The maximum amount of members that can be in the guild. */
|
|
maxMembers?: number
|
|
/** The maximum amount of members that can be in a video channel. */
|
|
maxVideoChannelUsers?: number | null
|
|
/** Whether or not this guild is unavailable. */
|
|
unavailable: boolean
|
|
/** Whether or not the widget is enabled in this guild. */
|
|
widgetEnabled: boolean
|
|
/** Whether or not this guild is considered large. */
|
|
large?: boolean
|
|
/** Whether or not the premium progress bar is enabled. */
|
|
premiumProgressBarEnabled?: boolean
|
|
/** Whether or not this server is nsfw. */
|
|
nsfw?: boolean
|
|
/** The welcome screen settings. */
|
|
welcomeScreen?: {
|
|
description: string | null
|
|
welcomeChannels?: Array<{
|
|
channelID: string
|
|
description: string
|
|
emojiID: string | null
|
|
emojiName: string | null
|
|
}>
|
|
}
|
|
|
|
/** The cached members in this guild. */
|
|
members = new Collection<BigString, Member>()
|
|
/** The cached roles in this guild. */
|
|
roles = new Collection<BigString, Role>()
|
|
/** The cached channels in this guild. */
|
|
channels = new Collection<BigString, GuildChannel>()
|
|
/** The cached threads in this guild. */
|
|
threads = new Collection<BigString, ThreadChannel>()
|
|
/** The cached voice states in this guild. */
|
|
voiceStates = new Collection<BigString, VoiceState>()
|
|
/** The cached stage instances in this guild. */
|
|
stageInstances = new Collection<BigString, StageInstance>()
|
|
/** The shard that manages this guild. */
|
|
shard: Shard;
|
|
|
|
constructor(data: DiscordGuild, client: Client) {
|
|
super(data.id)
|
|
this.client = client
|
|
this.shard = client.shards.get(client.guildShardMap[this.id] || (Base.getDiscordEpoch(data.id) % (client.options.maxShards as number)) || 0)!;
|
|
|
|
this.ownerID = data.owner_id
|
|
|
|
this.unavailable = !!data.unavailable
|
|
this.joinedAt = Date.parse(data.joined_at!)
|
|
this.memberCount = data.member_count ?? 0
|
|
this.applicationID = data.application_id
|
|
this.widgetEnabled = !!data.widget_enabled
|
|
|
|
if (data.widget_channel_id !== undefined) {
|
|
this.widgetChannelID = data.widget_channel_id
|
|
}
|
|
|
|
if (data.approximate_member_count !== undefined) {
|
|
this.approximateMemberCount = data.approximate_member_count
|
|
}
|
|
if (data.approximate_presence_count !== undefined) {
|
|
this.approximatePresenceCount = data.approximate_presence_count
|
|
}
|
|
|
|
if (data.roles) {
|
|
for (const r of data.roles) {
|
|
const role = new Role(r, this)
|
|
this.roles.set(role.id, role)
|
|
}
|
|
}
|
|
|
|
if (data.channels) {
|
|
for (const channelData of data.channels) {
|
|
channelData.guild_id = this.id.toString()
|
|
const channel = generateChannelFrom(channelData, client) as GuildChannel
|
|
this.channels.set(channel.id, channel)
|
|
client._channelGuildMap.set(channel.id, this.id)
|
|
}
|
|
}
|
|
|
|
if (data.threads) {
|
|
for (const threadData of data.threads) {
|
|
threadData.guild_id = this.id.toString()
|
|
const thread = generateChannelFrom(threadData, client) as unknown as ThreadChannel
|
|
this.threads.set(thread.id, thread)
|
|
client._threadGuildMap.set(thread.id, this.id)
|
|
}
|
|
}
|
|
|
|
if (data.members) {
|
|
for (const m of data.members) {
|
|
const member = new Member(m as DiscordMemberWithUser, this, client)
|
|
this.members.set(member.id, member)
|
|
}
|
|
}
|
|
|
|
if (data.stage_instances) {
|
|
for (const stageInstance of data.stage_instances) {
|
|
stageInstance.guild_id = this.id
|
|
|
|
const instance = new StageInstance(stageInstance, client)
|
|
this.stageInstances.set(instance.id, instance)
|
|
}
|
|
}
|
|
|
|
if (data.presences) {
|
|
for (const presence of data.presences) {
|
|
if (presence.user?.id) {
|
|
const cached = this.client.users.get(presence.user.id)
|
|
if (cached) cached.update(presence.user)
|
|
else {
|
|
const user = new User(presence.user, this.client)
|
|
this.client.users.set(user.id, user)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (data.voice_states) {
|
|
for (const voiceState of data.voice_states) {
|
|
if (!this.members.get(voiceState.user_id)) continue
|
|
|
|
if (voiceState.member) {
|
|
const member = new Member(voiceState.member, this, client)
|
|
this.members.set(member.id, member)
|
|
const user = new User(voiceState.member.user, client)
|
|
this.client.users.set(user.id, user)
|
|
|
|
// TODO: check channel type maybe voice channel?
|
|
;(this.channels.get(voiceState.channel_id!) as VoiceChannel)?.voiceMembers.set(member.id, member)
|
|
}
|
|
|
|
// TODO: voice support
|
|
// if (
|
|
// client.options.seedVoiceConnections &&
|
|
// voiceState.user_id === client.id &&
|
|
// !client.voiceConnections.get(this.id)
|
|
// ) {
|
|
// process.nextTick(() =>
|
|
// this.client.joinVoiceChannel(voiceState.channel_id)
|
|
// );
|
|
// }
|
|
}
|
|
}
|
|
this.update(data)
|
|
}
|
|
|
|
/**
|
|
* @deprecated - please use .client
|
|
*/
|
|
get _client() {
|
|
return this.client
|
|
}
|
|
|
|
update(data: DiscordGuild) {
|
|
if (data.name !== undefined) {
|
|
this.name = data.name
|
|
}
|
|
if (data.verification_level !== undefined) {
|
|
this.verificationLevel = data.verification_level
|
|
}
|
|
if (data.splash !== undefined) {
|
|
this._splash = data.splash ? this.client.iconHashToBigInt(data.splash) : undefined
|
|
}
|
|
|
|
if (data.discovery_splash !== undefined) {
|
|
this._discoverySplash = data.discovery_splash ? this.client.iconHashToBigInt(data.discovery_splash) : undefined
|
|
}
|
|
|
|
if (data.banner !== undefined) {
|
|
this._banner = data.banner ? this.client.iconHashToBigInt(data.banner) : undefined
|
|
}
|
|
|
|
if (data.owner_id !== undefined) {
|
|
this.ownerID = data.owner_id
|
|
}
|
|
|
|
if (data.icon !== undefined) {
|
|
this._icon = data.icon ? this.client.iconHashToBigInt(data.icon) : undefined
|
|
}
|
|
|
|
// TODO: compress features.
|
|
if (data.features !== undefined) {
|
|
this.features = data.features
|
|
}
|
|
|
|
if (data.emojis !== undefined) {
|
|
this.emojis = data.emojis
|
|
}
|
|
|
|
if (data.stickers !== undefined) {
|
|
this.stickers = data.stickers
|
|
}
|
|
|
|
if (data.afk_channel_id !== undefined) {
|
|
this.afkChannelID = data.afk_channel_id
|
|
}
|
|
|
|
if (data.afk_timeout !== undefined) {
|
|
this.afkTimeout = data.afk_timeout
|
|
}
|
|
|
|
if (data.default_message_notifications !== undefined) {
|
|
this.defaultNotifications = data.default_message_notifications
|
|
}
|
|
|
|
if (data.mfa_level !== undefined) {
|
|
this.mfaLevel = data.mfa_level
|
|
}
|
|
|
|
if (data.large !== undefined) {
|
|
this.large = data.large
|
|
}
|
|
|
|
if (data.max_presences !== undefined) {
|
|
this.maxPresences = data.max_presences
|
|
}
|
|
|
|
if (data.explicit_content_filter !== undefined) {
|
|
this.explicitContentFilter = data.explicit_content_filter
|
|
}
|
|
|
|
if (data.system_channel_id !== undefined) {
|
|
this.systemChannelID = data.system_channel_id
|
|
}
|
|
|
|
if (data.system_channel_flags !== undefined) {
|
|
this.systemChannelFlags = data.system_channel_flags
|
|
}
|
|
if (data.premium_progress_bar_enabled !== undefined) {
|
|
this.premiumProgressBarEnabled = data.premium_progress_bar_enabled
|
|
}
|
|
if (data.premium_tier !== undefined) {
|
|
this.premiumTier = data.premium_tier
|
|
}
|
|
if (data.premium_subscription_count !== undefined) {
|
|
this.premiumSubscriptionCount = data.premium_subscription_count
|
|
}
|
|
if (data.vanity_url_code !== undefined) {
|
|
this.vanityURL = data.vanity_url_code
|
|
}
|
|
if (data.preferred_locale !== undefined) {
|
|
this.preferredLocale = data.preferred_locale
|
|
}
|
|
if (data.description !== undefined) {
|
|
this.description = data.description
|
|
}
|
|
if (data.max_members !== undefined) {
|
|
this.maxMembers = data.max_members
|
|
}
|
|
if (data.public_updates_channel_id !== undefined) {
|
|
this.publicUpdatesChannelID = data.public_updates_channel_id
|
|
}
|
|
if (data.rules_channel_id !== undefined) {
|
|
this.rulesChannelID = data.rules_channel_id
|
|
}
|
|
if (data.max_video_channel_users !== undefined) {
|
|
this.maxVideoChannelUsers = data.max_video_channel_users
|
|
}
|
|
if (data.welcome_screen !== undefined) {
|
|
this.welcomeScreen = {
|
|
description: data.welcome_screen.description,
|
|
welcomeChannels: data.welcome_screen.welcome_channels?.map((c) => {
|
|
return {
|
|
channelID: c.channel_id,
|
|
description: c.description,
|
|
emojiID: c.emoji_id,
|
|
emojiName: c.emoji_name,
|
|
}
|
|
}),
|
|
}
|
|
}
|
|
// if (data.nsfw !== undefined) {
|
|
// this.nsfw = data.nsfw;
|
|
// }
|
|
if (data.nsfw_level !== undefined) {
|
|
this.nsfwLevel = data.nsfw_level
|
|
}
|
|
}
|
|
|
|
get banner(): string | undefined {
|
|
return this._banner ? this.client.iconBigintToHash(this._banner) : undefined
|
|
}
|
|
|
|
get bannerURL(): string | null {
|
|
return this.banner ? this.client._formatImage(BANNER(this.id, this.banner)) : null
|
|
}
|
|
|
|
get icon(): string | undefined {
|
|
return this._icon ? this.client.iconBigintToHash(this._icon) : undefined
|
|
}
|
|
|
|
get iconURL(): string | null {
|
|
return this.icon ? this.client._formatImage(GUILD_ICON(this.id, this.icon)) : null
|
|
}
|
|
|
|
get splash(): string | undefined {
|
|
return this._splash ? this.client.iconBigintToHash(this._splash) : undefined
|
|
}
|
|
|
|
get splashURL(): string | null {
|
|
return this.splash ? this.client._formatImage(GUILD_SPLASH(this.id, this.splash)) : null
|
|
}
|
|
|
|
get discoverySplash(): string | undefined {
|
|
return this._discoverySplash ? this.client.iconBigintToHash(this._discoverySplash) : undefined
|
|
}
|
|
|
|
get discoverySplashURL(): string | null {
|
|
return this.discoverySplash ? this.client._formatImage(GUILD_DISCOVERY_SPLASH(this.id, this.discoverySplash)) : null
|
|
}
|
|
|
|
/** Add a discovery subcategory */
|
|
async addDiscoverySubcategory(categoryID: BigString, reason?: string): Promise<DiscoverySubcategoryResponse> {
|
|
return await this.client.addGuildDiscoverySubcategory.call(this.client, this.id, categoryID, reason)
|
|
}
|
|
|
|
/** Add a role to a guild member */
|
|
async addMemberRole(memberID: BigString, roleID: BigString, reason?: string): Promise<void> {
|
|
return await this.client.addGuildMemberRole.call(this.client, this.id, memberID, roleID, reason)
|
|
}
|
|
|
|
/** Ban a user from the guild */
|
|
async banMember(userID: BigString, deleteMessageDays = 0, reason?: string): Promise<void> {
|
|
return await this.client.banGuildMember.call(this.client, this.id, userID, deleteMessageDays, reason)
|
|
}
|
|
|
|
/** Bulk create/edit guild application commands */
|
|
async bulkEditCommands(commands: Array<ApplicationCommand<ApplicationCommandTypes>>): Promise<Array<ApplicationCommand<ApplicationCommandTypes>>> {
|
|
return await this.client.bulkEditGuildCommands.call(this.client, this.id, commands)
|
|
}
|
|
|
|
/** Create a channel in the guild */
|
|
async createChannel(
|
|
name: string,
|
|
type = ChannelTypes.GuildText,
|
|
options: CreateChannelOptions,
|
|
): Promise<CategoryChannel | TextChannel | TextVoiceChannel | StageChannel> {
|
|
return await this.client.createChannel.call(this.client, this.id, name, type as number, options)
|
|
}
|
|
|
|
/** Create a guild application command */
|
|
async createCommand(command: ApplicationCommandStructure): Promise<ApplicationCommand<ApplicationCommandTypes>> {
|
|
return await this.client.createGuildCommand.call(this.client, this.id, command)
|
|
}
|
|
|
|
/** Create a emoji in the guild */
|
|
async createEmoji(options: EmojiOptions, reason?: string): Promise<Emoji> {
|
|
return await this.client.createGuildEmoji.call(this.client, this.id, options, reason)
|
|
}
|
|
|
|
/** Create a guild role */
|
|
async createRole(options: Role | RoleOptions, reason?: string): Promise<Role> {
|
|
return await this.client.createRole.call(this.client, this.id, options, reason)
|
|
}
|
|
|
|
/** Create a guild sticker */
|
|
async createSticker(options: CreateStickerOptions, reason?: string): Promise<Sticker> {
|
|
return await this.client.createGuildSticker.call(this.client, this.id, options, reason)
|
|
}
|
|
|
|
/** Create a template for this guild */
|
|
async createTemplate(name: string, description?: string): Promise<GuildTemplate> {
|
|
return await this.client.createGuildTemplate.call(this.client, this.id, name, description)
|
|
}
|
|
|
|
/** Delete the guild (bot user must be owner) */
|
|
async delete(): Promise<void> {
|
|
if (this.ownerID !== this.client.id) throw new Error('To delete a guild, the bot must be the owner of the guild.')
|
|
|
|
return await this.client.deleteGuild.call(this.client, this.id)
|
|
}
|
|
|
|
/** Delete a guild application command */
|
|
async deleteCommand(commandID: BigString): Promise<void> {
|
|
return await this.client.deleteGuildCommand.call(this.client, this.id, commandID)
|
|
}
|
|
|
|
/** Delete a discovery subcategory */
|
|
async deleteDiscoverySubcategory(categoryID: BigString, reason?: string): Promise<void> {
|
|
return await this.client.deleteGuildDiscoverySubcategory.call(this.client, this.id, categoryID, reason)
|
|
}
|
|
|
|
/** Delete a emoji in the guild */
|
|
async deleteEmoji(emojiID: BigString, reason?: string): Promise<void> {
|
|
return await this.client.deleteGuildEmoji.call(this.client, this.id, emojiID, reason)
|
|
}
|
|
|
|
/** Delete a guild integration */
|
|
async deleteIntegration(integrationID: BigString): Promise<void> {
|
|
return await this.client.deleteGuildIntegration.call(this.client, this.id, integrationID)
|
|
}
|
|
|
|
/** Delete a role */
|
|
async deleteRole(roleID: BigString, reason?: string): Promise<void> {
|
|
return await this.client.deleteRole.call(this.client, this.id, roleID, reason)
|
|
}
|
|
|
|
/** Delete a guild sticker */
|
|
async deleteSticker(stickerID: BigString, reason?: string): Promise<void> {
|
|
return await this.client.deleteGuildSticker.call(this.client, this.id, stickerID, reason)
|
|
}
|
|
|
|
/** Delete a guild template */
|
|
async deleteTemplate(code: string): Promise<void> {
|
|
return await this.client.deleteGuildTemplate.call(this.client, this.id, code)
|
|
}
|
|
|
|
/** Get the guild's banner with the given format and size */
|
|
dynamicBannerURL(format?: ImageFormat, size?: ImageSize): string | null {
|
|
return this.banner ? this.client._formatImage(BANNER(this.id, this.banner), format, size) : null
|
|
}
|
|
|
|
/** Get the guild's discovery splash with the given format and size */
|
|
dynamicDiscoverySplashURL(format?: ImageFormat, size?: ImageSize): string | null {
|
|
return this.discoverySplash ? this.client._formatImage(GUILD_DISCOVERY_SPLASH(this.id, this.discoverySplash), format, size) : null
|
|
}
|
|
|
|
/** Get the guild's icon with the given format and size */
|
|
dynamicIconURL(format?: ImageFormat, size?: ImageSize): string | null {
|
|
return this.icon ? this.client._formatImage(GUILD_ICON(this.id, this.icon), format, size) : null
|
|
}
|
|
|
|
/** Get the guild's splash with the given format and size */
|
|
dynamicSplashURL(format?: ImageFormat, size?: ImageSize): string | null {
|
|
return this.splash ? this.client._formatImage(GUILD_SPLASH(this.id, this.splash), format, size) : null
|
|
}
|
|
|
|
/** Edit the guild */
|
|
async edit(options: GuildOptions, reason?: string): Promise<Guild> {
|
|
return await this.client.editGuild.call(this.client, this.id, options, reason)
|
|
}
|
|
|
|
/** Edit multiple channels' positions. Note that channel position numbers are grouped by type (category, text, voice), then sorted in ascending order (lowest number is on top). */
|
|
async editChannelPositions(channelPositions: ChannelPosition[]): Promise<void> {
|
|
return await this.client.editChannelPositions.call(this.client, this.id, channelPositions)
|
|
}
|
|
|
|
/** Edit a guild application command */
|
|
async editCommand(commandID: BigString, commands: ApplicationCommandStructure): Promise<ApplicationCommand<ApplicationCommandTypes>> {
|
|
return await this.client.editGuildCommand.call(this.client, this.id, commandID, commands)
|
|
}
|
|
|
|
/**
|
|
* Edits command permissions for a specific command in a guild.
|
|
* Note: You can only add up to 10 permission overwrites for a command.
|
|
*/
|
|
async editCommandPermissions(commandID: BigString, permissions: ApplicationCommandPermissions[]): Promise<GuildApplicationCommandPermissions> {
|
|
return await this.client.editCommandPermissions.call(this.client, this.id, commandID, permissions)
|
|
}
|
|
|
|
/** Edit the guild's discovery data */
|
|
async editDiscovery(options: DiscoveryOptions): Promise<DiscoveryMetadata> {
|
|
return await this.client.editGuildDiscovery.call(this.client, this.id, options)
|
|
}
|
|
|
|
/**
|
|
* Edit a emoji in the guild
|
|
* @arg {String} emojiID The ID of the emoji you want to modify
|
|
* @arg {Object} options Emoji options
|
|
* @arg {String} [options.name] The name of emoji
|
|
* @arg {Array} [options.roles] An array containing authorized role IDs
|
|
* @arg {String} [reason] The reason to be displayed in audit logs
|
|
* @returns {Promise<Object>} A guild emoji object
|
|
*/
|
|
async editEmoji(
|
|
emojiID: BigString,
|
|
options: {
|
|
name?: string | undefined
|
|
roles?: string[] | undefined
|
|
},
|
|
reason?: string,
|
|
): Promise<Emoji> {
|
|
return await this.client.editGuildEmoji.call(this.client, this.id, emojiID, options, reason)
|
|
}
|
|
|
|
/** Edit a guild integration */
|
|
async editIntegration(integrationID: BigString, options: IntegrationOptions): Promise<void> {
|
|
return await this.client.editGuildIntegration.call(this.client, this.id, integrationID, options)
|
|
}
|
|
|
|
/** Edit a guild member */
|
|
async editMember(memberID: BigString, options: MemberOptions, reason?: string): Promise<Member> {
|
|
return await this.client.editGuildMember.call(this.client, this.id, memberID, options, reason)
|
|
}
|
|
|
|
/** Edit the guild role */
|
|
async editRole(roleID: BigString, options: RoleOptions, reason?: string): Promise<Role> {
|
|
return await this.client.editRole.call(this.client, this.id, roleID, options, reason)
|
|
}
|
|
|
|
/** Edit a guild sticker */
|
|
async editSticker(stickerID: BigString, options: EditStickerOptions, reason?: string): Promise<Sticker> {
|
|
return await this.client.editGuildSticker.call(this.client, this.id, stickerID, options, reason)
|
|
}
|
|
|
|
/** Edit a guild template */
|
|
async editTemplate(code: string, options: GuildTemplateOptions): Promise<GuildTemplate> {
|
|
return await this.client.editGuildTemplate.call(this.client, this.id, code, options)
|
|
}
|
|
|
|
/** Modify the guild's vanity code */
|
|
async editVanity(code: string | null): Promise<unknown> {
|
|
return await this.client.editGuildVanity.call(this.client, this.id, code)
|
|
}
|
|
|
|
/** Update a user's voice state - See [caveats](https://discord.com/developers/docs/resources/guild#modify-user-voice-state-caveats) */
|
|
async editVoiceState(options: VoiceStateOptions, userID: BigString = '@me'): Promise<void> {
|
|
return await this.client.editGuildVoiceState.call(this.client, this.id, options, userID)
|
|
}
|
|
|
|
/** Edit the guild welcome screen */
|
|
async editWelcomeScreen(options: WelcomeScreenOptions): Promise<WelcomeScreen> {
|
|
return await this.client.editGuildWelcomeScreen.call(this.client, this.id, options)
|
|
}
|
|
|
|
/** Modify a guild's widget */
|
|
async editWidget(options: Widget): Promise<Widget> {
|
|
return await this.client.editGuildWidget.call(this.client, this.id, options)
|
|
}
|
|
|
|
/** Request all guild members from Discord */
|
|
async fetchAllMembers(timeout?: number): Promise<number> {
|
|
return await this.fetchMembers({
|
|
guildId: this.id,
|
|
limit: 0,
|
|
}).then((m: any[]) => m.length)
|
|
}
|
|
|
|
/** Request specific guild members through the gateway connection */
|
|
async fetchMembers(options: RequestGuildMembers): Promise<Member[]> {
|
|
// TODO: Use gateway fetch
|
|
return await this.client.getRESTGuildMembers(this.id, options)
|
|
}
|
|
|
|
/** Get all active threads in this guild */
|
|
async getActiveThreads(): Promise<ListedGuildThreads<AnyThreadChannel>> {
|
|
return await this.client.getActiveGuildThreads.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get the audit log for the guild */
|
|
async getAuditLog(options: GetGuildAuditLogOptions): Promise<GuildAuditLog> {
|
|
return await this.client.getGuildAuditLog.call(this.client, this.id, options)
|
|
}
|
|
|
|
/** Get a ban from the ban list of a guild */
|
|
async getBan(userID: BigString): Promise<GuildBan> {
|
|
return await this.client.getGuildBan.call(this.client, this.id, userID)
|
|
}
|
|
|
|
/** Get the ban list of the guild */
|
|
async getBans(options?: GetGuildBansOptions): Promise<GuildBan[]> {
|
|
return await this.client.getGuildBans.call(this.client, this.id, options)
|
|
}
|
|
|
|
/** Get a guild application command */
|
|
async getCommand(commandID: BigString): Promise<ApplicationCommand<ApplicationCommandTypes>> {
|
|
return await this.client.getGuildCommand.call(this.client, this.id, commandID)
|
|
}
|
|
|
|
/** Get the a guild's application command permissions */
|
|
async getCommandPermissions(commandID: BigString): Promise<GuildApplicationCommandPermissions> {
|
|
return await this.client.getCommandPermissions.call(this.client, this.id, commandID)
|
|
}
|
|
|
|
/** Get the guild's application commands */
|
|
async getCommands(): Promise<ApplicationCommand<ApplicationCommandTypes>> {
|
|
return await this.client.getGuildCommands.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get the guild's discovery object */
|
|
async getDiscovery(): Promise<DiscoveryMetadata> {
|
|
return await this.client.getGuildDiscovery.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get the all of a guild's application command permissions */
|
|
async getGuildCommandPermissions(): Promise<GuildApplicationCommandPermissions[]> {
|
|
return await this.client.getGuildCommandPermissions.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get a list of integrations for the guild */
|
|
async getIntegrations(): Promise<GuildIntegration[]> {
|
|
return await this.client.getGuildIntegrations.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get all invites in the guild */
|
|
async getInvites(): Promise<Invite[]> {
|
|
return await this.client.getGuildInvites.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get the prune count for the guild */
|
|
async getPruneCount(options: GetPruneOptions): Promise<number> {
|
|
return await this.client.getPruneCount.call(this.client, this.id, options)
|
|
}
|
|
|
|
/** Get a guild's channels via the REST API. REST mode is required to use this endpoint. */
|
|
async getRESTChannels(): Promise<AnyGuildChannel[]> {
|
|
return await this.client.getRESTGuildChannels.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get a guild emoji via the REST API. REST mode is required to use this endpoint. */
|
|
async getRESTEmoji(emojiID: BigString): Promise<Emoji> {
|
|
return await this.client.getRESTGuildEmoji.call(this.client, this.id, emojiID)
|
|
}
|
|
|
|
/** Get a guild's emojis via the REST API. REST mode is required to use this endpoint. */
|
|
async getRESTEmojis(): Promise<Emoji[]> {
|
|
return await this.client.getRESTGuildEmojis.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get a guild's members via the REST API. REST mode is required to use this endpoint. */
|
|
async getRESTMember(memberID: BigString): Promise<Member> {
|
|
return await this.client.getRESTGuildMember.call(this.client, this.id, memberID)
|
|
}
|
|
|
|
/** Get a guild's members via the REST API. REST mode is required to use this endpoint. */
|
|
async getRESTMembers(options?: GetRESTGuildMembersOptions): Promise<Member[]> {
|
|
return await this.client.getRESTGuildMembers.call(this.client, this.id, options)
|
|
}
|
|
|
|
/** Get a guild's roles via the REST API. REST mode is required to use this endpoint. */
|
|
async getRESTRoles(): Promise<Role[]> {
|
|
return await this.client.getRESTGuildRoles.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get a guild sticker via the REST API. REST mode is required to use this endpoint. */
|
|
async getRESTSticker(stickerID: BigString): Promise<Sticker> {
|
|
return await this.client.getRESTGuildSticker.call(this.client, this.id, stickerID)
|
|
}
|
|
|
|
/** Get a guild's stickers via the REST API. REST mode is required to use this endpoint. */
|
|
async getRESTStickers(): Promise<Sticker[]> {
|
|
return await this.client.getRESTGuildStickers.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get the guild's templates */
|
|
async getTemplates(): Promise<GuildTemplate[]> {
|
|
return await this.client.getGuildTemplates.call(this.client, this.id)
|
|
}
|
|
|
|
/** Returns the vanity url of the guild */
|
|
async getVanity(): Promise<GuildVanity> {
|
|
return await this.client.getGuildVanity.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get possible voice regions for a guild */
|
|
async getVoiceRegions(): Promise<VoiceRegion[]> {
|
|
return await this.client.getVoiceRegions.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get all the webhooks in the guild */
|
|
async getWebhooks(): Promise<Webhook[]> {
|
|
return await this.client.getGuildWebhooks.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get the welcome screen of the Community guild, shown to new members */
|
|
async getWelcomeScreen(): Promise<WelcomeScreen> {
|
|
return await this.client.getGuildWelcomeScreen.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get a guild's widget object */
|
|
async getWidget(): Promise<WidgetData> {
|
|
return await this.client.getGuildWidget.call(this.client, this.id)
|
|
}
|
|
|
|
/** Get a guild's widget settings object */
|
|
async getWidgetSettings(): Promise<Widget> {
|
|
return await this.client.getGuildWidgetSettings.call(this.client, this.id)
|
|
}
|
|
|
|
/** Kick a member from the guild */
|
|
async kickMember(userID: BigString, reason?: string): Promise<void> {
|
|
return await this.client.kickGuildMember.call(this.client, this.id, userID, reason)
|
|
}
|
|
|
|
/** Leave the guild */
|
|
async leave(): Promise<void> {
|
|
return await this.client.leaveGuild.call(this.client, this.id)
|
|
}
|
|
|
|
// TODO: gateway voice
|
|
// /** Leaves the voice channel in this guild */
|
|
// async leaveVoiceChannel(): Promise<void> {
|
|
// return await this.client.closeVoiceConnection.call(this.client, this.id);
|
|
// }
|
|
|
|
/** Get the guild permissions of a member */
|
|
permissionsOf(memberID: BigString | Member): Permission {
|
|
const member = ['string', 'bigint'].includes(typeof memberID) ? this.members.get(memberID as BigString)! : (memberID as Member)
|
|
if (member.id === this.ownerID) {
|
|
return new Permission(BitwisePermissionFlags.ADMINISTRATOR)
|
|
} else {
|
|
let permissions = this.roles.get(this.id)!.permissions.allow
|
|
if (permissions & BigInt(BitwisePermissionFlags.ADMINISTRATOR)) {
|
|
return new Permission(BitwisePermissionFlags.ADMINISTRATOR)
|
|
}
|
|
for (const id of member.roles) {
|
|
const role = this.roles.get(id)
|
|
if (!role) {
|
|
continue
|
|
}
|
|
|
|
const { allow: perm } = role.permissions
|
|
if (perm & BigInt(BitwisePermissionFlags.ADMINISTRATOR)) {
|
|
permissions = BigInt(BitwisePermissionFlags.ADMINISTRATOR)
|
|
break
|
|
} else {
|
|
permissions |= perm
|
|
}
|
|
}
|
|
return new Permission(permissions)
|
|
}
|
|
}
|
|
|
|
/** Begin pruning the guild */
|
|
async pruneMembers(options?: PruneMemberOptions): Promise<number> {
|
|
return await this.client.pruneMembers.call(this.client, this.id, options)
|
|
}
|
|
|
|
/** Remove a role from a guild member */
|
|
async removeMemberRole(memberID: BigString, roleID: BigString, reason?: string): Promise<void> {
|
|
return await this.client.removeGuildMemberRole.call(this.client, this.id, memberID, roleID, reason)
|
|
}
|
|
|
|
/** Search for guild members by partial nickname/username */
|
|
async searchMembers(query: string, limit = 1): Promise<Member[]> {
|
|
return await this.client.searchGuildMembers.call(this.client, this.id, query, limit)
|
|
}
|
|
|
|
/** Force a guild integration to sync */
|
|
async syncIntegration(integrationID: BigString): Promise<void> {
|
|
return await this.client.syncGuildIntegration.call(this.client, this.id, integrationID)
|
|
}
|
|
|
|
/** Force a guild template to sync */
|
|
async syncTemplate(code: string): Promise<GuildTemplate> {
|
|
return await this.client.syncGuildTemplate.call(this.client, this.id, code)
|
|
}
|
|
|
|
/** Unban a user from the guild */
|
|
async unbanMember(userID: BigString, reason?: string): Promise<void> {
|
|
return await this.client.unbanGuildMember.call(this.client, this.id, userID, reason)
|
|
}
|
|
|
|
toJSON(props: string[] = []): Record<string, any> {
|
|
return super.toJSON([
|
|
'afkChannelID',
|
|
'afkTimeout',
|
|
'applicationID',
|
|
'approximateMemberCount',
|
|
'approximatePresenceCount',
|
|
'autoRemoved',
|
|
'banner',
|
|
'categories',
|
|
'channels',
|
|
'defaultNotifications',
|
|
'description',
|
|
'discoverySplash',
|
|
'emojiCount',
|
|
'emojis',
|
|
'explicitContentFilter',
|
|
'features',
|
|
'icon',
|
|
'joinedAt',
|
|
'keywords',
|
|
'large',
|
|
'maxMembers',
|
|
'maxPresences',
|
|
'maxVideoChannelUsers',
|
|
'memberCount',
|
|
'members',
|
|
'mfaLevel',
|
|
'name',
|
|
'ownerID',
|
|
'pendingVoiceStates',
|
|
'preferredLocale',
|
|
'premiumProgressBarEnabled',
|
|
'premiumSubscriptionCount',
|
|
'premiumTier',
|
|
'primaryCategory',
|
|
'primaryCategoryID',
|
|
'publicUpdatesChannelID',
|
|
'roles',
|
|
'rulesChannelID',
|
|
'splash',
|
|
'stickers',
|
|
'systemChannelFlags',
|
|
'systemChannelID',
|
|
'unavailable',
|
|
'vanityURL',
|
|
'verificationLevel',
|
|
'voiceStates',
|
|
'welcomeScreen',
|
|
'widgetChannelID',
|
|
'widgetEnabled',
|
|
...props,
|
|
])
|
|
}
|
|
}
|
|
|
|
export default Guild
|