mirror of
https://github.com/discordeno/discordeno.git
synced 2026-05-21 02:40:08 +00:00
305 lines
11 KiB
TypeScript
305 lines
11 KiB
TypeScript
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
import { GuildFeatures, type DiscordGuild } from '@discordeno/types'
|
|
import { ToggleBitfieldBigint } from './Toggle.js'
|
|
|
|
const featureNames = [
|
|
'inviteSplash',
|
|
'vipRegions',
|
|
'vanityUrl',
|
|
'verified',
|
|
'partnered',
|
|
'community',
|
|
'developerSupportServer',
|
|
'news',
|
|
'discoverable',
|
|
'featurable',
|
|
'animatedIcon',
|
|
'banner',
|
|
'welcomeScreenEnabled',
|
|
'memberVerificationGateEnabled',
|
|
'previewEnabled',
|
|
'ticketedEventsEnabled',
|
|
'monetizationEnabled',
|
|
'moreStickers',
|
|
'privateThreads',
|
|
'roleIcons',
|
|
'autoModeration',
|
|
'invitesDisabled',
|
|
'animatedBanner',
|
|
]
|
|
|
|
export const GuildToggle = {
|
|
/** Whether the bot is the owner of the guild */
|
|
owner: 1n << 0n,
|
|
/** Whether the server widget is enabled */
|
|
widgetEnabled: 1n << 1n,
|
|
/** Whether this is considered a large guild */
|
|
large: 1n << 2n,
|
|
/** Whether this guild is unavailable due to an outage */
|
|
unavailable: 1n << 3n,
|
|
/** Whether the guild has the boost progress bar enabled */
|
|
premiumProgressBarEnabled: 1n << 4n,
|
|
|
|
// GUILD FEATURES ARE BELOW THIS
|
|
|
|
/** Whether the guild has access to set an invite splash background */
|
|
inviteSplash: 1n << 5n,
|
|
/** Whether the guild has access to set 384 kbps bitrate in voice (previously VIP voice servers) */
|
|
vipRegions: 1n << 6n,
|
|
/** Whether the guild has access to set a vanity URL */
|
|
vanityUrl: 1n << 7n,
|
|
/** Whether the guild is verified */
|
|
verified: 1n << 8n,
|
|
/** Whether the guild is partnered */
|
|
partnered: 1n << 9n,
|
|
/** Whether the guild can enable welcome screen, Membership Screening, stage channels and discovery, and receives community updates */
|
|
community: 1n << 10n,
|
|
/** Whether the guild has access to set an animated guild banner image */
|
|
animatedBanner: 1n << 11n,
|
|
/** Whether the guild has access to create news channels */
|
|
news: 1n << 12n,
|
|
/** Whether the guild is able to be discovered in the directory */
|
|
discoverable: 1n << 13n,
|
|
/** Whether the guild is able to be featured in the directory */
|
|
featurable: 1n << 15n,
|
|
/** Whether the guild has access to set an animated guild icon */
|
|
animatedIcon: 1n << 16n,
|
|
/** Whether the guild has access to set a guild banner image */
|
|
banner: 1n << 17n,
|
|
/** Whether the guild has enabled the welcome screen */
|
|
welcomeScreenEnabled: 1n << 18n,
|
|
/** Whether the guild has enabled [Membership Screening](https://discord.com/developers/docs/resources/guild#membership-screening-object) */
|
|
memberVerificationGateEnabled: 1n << 19n,
|
|
/** Whether the guild can be previewed before joining via Membership Screening or the directory */
|
|
previewEnabled: 1n << 20n,
|
|
/** Whether the guild has enabled ticketed events */
|
|
ticketedEventsEnabled: 1n << 21n,
|
|
/** Whether the guild has enabled monetization */
|
|
monetizationEnabled: 1n << 22n,
|
|
/** Whether the guild has increased custom sticker slots */
|
|
moreStickers: 1n << 23n,
|
|
/** Whether the guild has access to create private threads */
|
|
privateThreads: 1n << 26n,
|
|
/** Whether the guild is able to set role icons */
|
|
roleIcons: 1n << 27n,
|
|
/** Whether the guild has set up auto moderation rules */
|
|
autoModeration: 1n << 28n,
|
|
/** Whether the guild has paused invites, preventing new users from joining */
|
|
invitesDisabled: 1n << 29n,
|
|
/** Whether the guild has been set as a support server on the App Directory */
|
|
developerSupportServer: 1n << 30n,
|
|
}
|
|
|
|
export class GuildToggles extends ToggleBitfieldBigint {
|
|
constructor(guildOrTogglesBigint: DiscordGuild | bigint) {
|
|
super()
|
|
|
|
if (typeof guildOrTogglesBigint === 'bigint') this.bitfield = guildOrTogglesBigint
|
|
else {
|
|
const guild = guildOrTogglesBigint
|
|
|
|
if (guild.owner) this.add(GuildToggle.owner)
|
|
if (guild.widget_enabled) this.add(GuildToggle.widgetEnabled)
|
|
if (guild.large) this.add(GuildToggle.large)
|
|
if (guild.unavailable) this.add(GuildToggle.unavailable)
|
|
if (guild.premium_progress_bar_enabled) this.add(GuildToggle.premiumProgressBarEnabled)
|
|
|
|
if (guild.features.includes(GuildFeatures.InviteSplash)) this.add(GuildToggle.inviteSplash)
|
|
if (guild.features.includes(GuildFeatures.VipRegions)) this.add(GuildToggle.vipRegions)
|
|
if (guild.features.includes(GuildFeatures.VanityUrl)) this.add(GuildToggle.vanityUrl)
|
|
if (guild.features.includes(GuildFeatures.Verified)) this.add(GuildToggle.verified)
|
|
if (guild.features.includes(GuildFeatures.Partnered)) this.add(GuildToggle.partnered)
|
|
if (guild.features.includes(GuildFeatures.Community)) this.add(GuildToggle.community)
|
|
if (guild.features.includes(GuildFeatures.DeveloperSupportServer)) this.add(GuildToggle.developerSupportServer)
|
|
if (guild.features.includes(GuildFeatures.AnimatedBanner)) this.add(GuildToggle.animatedBanner)
|
|
if (guild.features.includes(GuildFeatures.News)) this.add(GuildToggle.news)
|
|
if (guild.features.includes(GuildFeatures.Discoverable)) this.add(GuildToggle.discoverable)
|
|
if (guild.features.includes(GuildFeatures.Featurable)) this.add(GuildToggle.featurable)
|
|
if (guild.features.includes(GuildFeatures.AnimatedIcon)) this.add(GuildToggle.animatedIcon)
|
|
if (guild.features.includes(GuildFeatures.Banner)) this.add(GuildToggle.banner)
|
|
if (guild.features.includes(GuildFeatures.WelcomeScreenEnabled)) this.add(GuildToggle.welcomeScreenEnabled)
|
|
if (guild.features.includes(GuildFeatures.MemberVerificationGateEnabled)) {
|
|
this.add(GuildToggle.memberVerificationGateEnabled)
|
|
}
|
|
if (guild.features.includes(GuildFeatures.PreviewEnabled)) this.add(GuildToggle.previewEnabled)
|
|
if (guild.features.includes(GuildFeatures.TicketedEventsEnabled)) this.add(GuildToggle.ticketedEventsEnabled)
|
|
if (guild.features.includes(GuildFeatures.MoreStickers)) this.add(GuildToggle.moreStickers)
|
|
if (guild.features.includes(GuildFeatures.PrivateThreads)) this.add(GuildToggle.privateThreads)
|
|
if (guild.features.includes(GuildFeatures.RoleIcons)) this.add(GuildToggle.roleIcons)
|
|
if (guild.features.includes(GuildFeatures.AutoModeration)) this.add(GuildToggle.autoModeration)
|
|
if (guild.features.includes(GuildFeatures.InvitesDisabled)) this.add(GuildToggle.invitesDisabled)
|
|
}
|
|
}
|
|
|
|
get features() {
|
|
const features: GuildToggleKeys[] = []
|
|
for (const key of Object.keys(GuildToggle)) {
|
|
if (!featureNames.includes(key)) continue
|
|
if (!super.contains(GuildToggle[key as GuildToggleKeys])) continue
|
|
|
|
features.push(key as GuildToggleKeys)
|
|
}
|
|
|
|
return features
|
|
}
|
|
|
|
/** Whether the bot is the owner of the guild */
|
|
get owner() {
|
|
return this.has('owner')
|
|
}
|
|
|
|
/** Whether the server widget is enabled */
|
|
get widgetEnabled() {
|
|
return this.has('widgetEnabled')
|
|
}
|
|
|
|
/** Whether this is considered a large guild */
|
|
get large() {
|
|
return this.has('large')
|
|
}
|
|
|
|
/** Whether this guild is unavailable due to an outage */
|
|
get unavailable() {
|
|
return this.has('unavailable')
|
|
}
|
|
|
|
/** Whether the guild has the boost progress bar enabled */
|
|
get premiumProgressBarEnabled() {
|
|
return this.has('premiumProgressBarEnabled')
|
|
}
|
|
|
|
/** Whether the guild has access to set an invite splash background */
|
|
get inviteSplash() {
|
|
return this.has('inviteSplash')
|
|
}
|
|
|
|
/** Whether the guild has access to set 384 kbps bitrate in voice (previously VIP voice servers) */
|
|
get vipRegions() {
|
|
return this.has('vipRegions')
|
|
}
|
|
|
|
/** Whether the guild has access to set a vanity URL */
|
|
get vanityUrl() {
|
|
return this.has('vanityUrl')
|
|
}
|
|
|
|
/** Whether the guild is verified */
|
|
get verified() {
|
|
return this.has('verified')
|
|
}
|
|
|
|
/** Whether the guild is partnered */
|
|
get partnered() {
|
|
return this.has('partnered')
|
|
}
|
|
|
|
/** Whether the guild can enable welcome screen, Membership Screening, stage channels and discovery, and receives community updates */
|
|
get community() {
|
|
return this.has('community')
|
|
}
|
|
|
|
/** Whether the Guild has been set as a support server on the App Directory */
|
|
get developerSupportServer() {
|
|
return this.has('developerSupportServer')
|
|
}
|
|
|
|
/** Whether the guild has access to set an animated guild banner image */
|
|
get animatedBanner() {
|
|
return this.has('animatedBanner')
|
|
}
|
|
|
|
/** Whether the guild has access to create news channels */
|
|
get news() {
|
|
return this.has('news')
|
|
}
|
|
|
|
/** Whether the guild is able to be discovered in the directory */
|
|
get discoverable() {
|
|
return this.has('discoverable')
|
|
}
|
|
|
|
/** Whether the guild is able to be featured in the directory */
|
|
get featurable() {
|
|
return this.has('featurable')
|
|
}
|
|
|
|
/** Whether the guild has access to set an animated guild icon */
|
|
get animatedIcon() {
|
|
return this.has('animatedIcon')
|
|
}
|
|
|
|
/** Whether the guild has access to set a guild banner image */
|
|
get banner() {
|
|
return this.has('banner')
|
|
}
|
|
|
|
/** Whether the guild has enabled the welcome screen */
|
|
get welcomeScreenEnabled() {
|
|
return this.has('welcomeScreenEnabled')
|
|
}
|
|
|
|
/** Whether the guild has enabled [Membership Screening](https://discord.com/developers/docs/resources/guild#membership-screening-object) */
|
|
get memberVerificationGateEnabled() {
|
|
return this.has('memberVerificationGateEnabled')
|
|
}
|
|
|
|
/** Whether the guild can be previewed before joining via Membership Screening or the directory */
|
|
get previewEnabled() {
|
|
return this.has('previewEnabled')
|
|
}
|
|
|
|
/** Whether the guild has enabled ticketed events */
|
|
get ticketedEventsEnabled() {
|
|
return this.has('ticketedEventsEnabled')
|
|
}
|
|
|
|
/** Whether the guild has enabled monetization */
|
|
get monetizationEnabled() {
|
|
return this.has('monetizationEnabled')
|
|
}
|
|
|
|
/** Whether the guild has increased custom sticker slots */
|
|
get moreStickers() {
|
|
return this.has('moreStickers')
|
|
}
|
|
|
|
/** Whether the guild has access to create private threads */
|
|
get privateThreads() {
|
|
return this.has('privateThreads')
|
|
}
|
|
|
|
/** Whether the guild is able to set role icons */
|
|
get roleIcons() {
|
|
return this.has('roleIcons')
|
|
}
|
|
|
|
/** Whether the guild has set up auto moderation rules */
|
|
get autoModeration() {
|
|
return this.has('autoModeration')
|
|
}
|
|
|
|
/** Whether the guild has paused invites, preventing new users from joining */
|
|
get invitesDisabled() {
|
|
return this.has('invitesDisabled')
|
|
}
|
|
|
|
/** Checks whether or not the permissions exist in this */
|
|
has(permissions: GuildToggleKeys | GuildToggleKeys[]) {
|
|
if (!Array.isArray(permissions)) return super.contains(GuildToggle[permissions])
|
|
|
|
return super.contains(permissions.reduce((a, b) => (a |= GuildToggle[b]), 0n))
|
|
}
|
|
|
|
/** Lists all the toggles for the role and whether or not each is true or false. */
|
|
list() {
|
|
const json: Record<string, boolean> = {}
|
|
for (const [key, value] of Object.entries(GuildToggle)) {
|
|
json[key] = super.contains(value)
|
|
}
|
|
|
|
return json as Record<GuildToggleKeys, boolean>
|
|
}
|
|
}
|
|
|
|
export type GuildToggleKeys = keyof typeof GuildToggle
|