Merge branch 'node-migration' of https://github.com/discordeno/discordeno into node-migration

This commit is contained in:
H01001000
2022-12-21 11:54:06 +08:00
71 changed files with 10 additions and 2750 deletions

View File

@@ -2,8 +2,8 @@
import type { BigString, DiscordGuild } from '@discordeno/types'
import { calculateShardId } from '@discordeno/utils'
import type { RestManager } from '../../restManager.js'
import type { Guild } from '../../transformers/guild.js'
import type { Guild } from '../../../../bot/transformers/guild.js'
import type { RestManager } from '../../../../rest/src/restManager.js'
/**
* Gets a guild by its ID.

View File

@@ -4,7 +4,7 @@
import type { AtLeastOne, BigString } from '@discordeno/types'
import { GatewayOpcodes } from '@discordeno/types'
import { calculateShardId } from '@discordeno/utils'
import type { RestManager } from '../../../restManager.js'
import type { RestManager } from '../../../../../rest/src/restManager.js'
/**
* Connects the bot user to a voice or stage channel.

View File

@@ -4,7 +4,7 @@
import type { BigString } from '@discordeno/types'
import { GatewayOpcodes } from '@discordeno/types'
import { calculateShardId } from '@discordeno/utils'
import type { RestManager } from '../../../restManager.js'
import type { RestManager } from '../../../../../rest/src/restManager.js'
/**
* Leaves the voice channel the bot user is currently in.
*

View File

@@ -4,7 +4,7 @@
import type { BigString } from '@discordeno/types'
import { GatewayOpcodes } from '@discordeno/types'
import { calculateShardId } from '@discordeno/utils'
import type { RestManager } from '../../restManager.js'
import type { RestManager } from '../../../../rest/src/restManager.js'
/**
* Fetches the list of members for a guild over the gateway.

View File

@@ -1,6 +1,6 @@
// @ts-nocheck
import type { RestManager } from '../../restManager.js'
import type { RestManager } from '../../../../rest/src/restManager.js'
import type { StatusUpdate } from './editShardStatus.js'
export async function editBotStatus (

View File

@@ -2,8 +2,8 @@
import type { PresenceStatus } from '@discordeno/types'
import { GatewayOpcodes } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { Activity } from '../../transformers/activity.js'
import type { Activity } from '../../../../bot/transformers/activity.js'
import type { RestManager } from '../../../../rest/src/restManager.js'
export async function editShardStatus (
rest: RestManager,
shardId: number,

View File

@@ -1,8 +1,8 @@
import { routes } from '@discordeno/constant'
import type { DiscordGuild } from '@discordeno/types'
import { calculateShardId } from '@discordeno/utils'
import type { RestManager } from '../../restManager.js'
import type { Guild } from '../../transformers/guild.js'
import type { Guild } from '../../../../bot/transformers/guild.js'
import type { RestManager } from '../../../../rest/src/restManager.js'
/**
* Creates a guild from a template.

View File

@@ -1,45 +0,0 @@
import type { DiscordActivity, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformActivity (rest: RestManager, payload: DiscordActivity) {
const activity = {
name: payload.name,
type: payload.type,
url: payload.url ?? undefined,
createdAt: payload.created_at,
startedAt: payload.timestamps?.start,
endedAt: payload.timestamps?.end,
applicationId: payload.application_id
? rest.transformers.snowflake(payload.application_id)
: undefined,
details: payload.details ?? undefined,
state: payload.state ?? undefined,
emoji: payload.emoji
? {
name: payload.emoji.name,
animated: payload.emoji.animated,
id: payload.emoji.id
? rest.transformers.snowflake(payload.emoji.id)
: undefined
}
: undefined,
partyId: payload.party?.id,
partyCurrentSize: payload.party?.size?.[0],
partyMaxSize: payload.party?.size?.[1],
largeImage: payload.assets?.large_image,
largeText: payload.assets?.large_text,
smallImage: payload.assets?.small_image,
smallText: payload.assets?.small_text,
join: payload.secrets?.join,
spectate: payload.secrets?.spectate,
match: payload.secrets?.match,
instance: payload.instance,
flags: payload.flags,
buttons: payload.buttons
}
return activity as Optionalize<typeof activity>
}
export interface Activity extends ReturnType<typeof transformActivity> {}

View File

@@ -1,44 +0,0 @@
import type {
DiscordApplication,
DiscordUser,
Optionalize
} from '@discordeno/types'
import { iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformApplication (
rest: RestManager,
payload: DiscordApplication
) {
const application = {
name: payload.name,
description: payload.description,
rpcOrigins: payload.rpc_origins,
botPublic: payload.bot_public,
botRequireCodeGrant: payload.bot_require_code_grant,
termsOfServiceUrl: payload.terms_of_service_url,
privacyPolicyUrl: payload.privacy_policy_url,
verifyKey: payload.verify_key,
primarySkuId: payload.primary_sku_id,
slug: payload.slug,
coverImage: payload.cover_image
? iconHashToBigInt(payload.cover_image)
: undefined,
flags: payload.flags,
id: rest.transformers.snowflake(payload.id),
icon: payload.icon ? iconHashToBigInt(payload.icon) : undefined,
owner: payload.owner
? rest.transformers.user(rest, payload.owner as DiscordUser)
: undefined,
team: payload.team ? rest.transformers.team(rest, payload.team) : undefined,
guildId: payload.guild_id
? rest.transformers.snowflake(payload.guild_id)
: undefined
}
return application as Optionalize<typeof application>
}
export interface Application extends ReturnType<typeof transformApplication> {}

View File

@@ -1,35 +0,0 @@
import type { DiscordApplicationCommand, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformApplicationCommand (
rest: RestManager,
payload: DiscordApplicationCommand
) {
const applicationCommand = {
id: rest.transformers.snowflake(payload.id),
applicationId: rest.transformers.snowflake(payload.application_id),
guildId: payload.guild_id
? rest.transformers.snowflake(payload.guild_id)
: undefined,
name: payload.name,
nameLocalizations: payload.name_localizations ?? undefined,
description: payload.description,
descriptionLocalizations: payload.description_localizations ?? undefined,
defaultMemberPermissions: payload.default_member_permissions
? rest.transformers.snowflake(payload.default_member_permissions)
: undefined,
dmPermission: payload.dm_permission ?? false,
type: payload.type,
version: payload.version,
options: payload.options?.map((option) =>
rest.transformers.applicationCommandOption(rest, option)
)
}
return applicationCommand as Optionalize<typeof applicationCommand>
}
export interface ApplicationCommand
extends ReturnType<typeof transformApplicationCommand> {}

View File

@@ -1,67 +0,0 @@
import type {
ApplicationCommandOptionTypes,
ChannelTypes,
DiscordApplicationCommandOption,
Localization
} from '@discordeno/types'
import type { RestManager } from '../restManager.js'
import type { ApplicationCommandOptionChoice } from './applicationCommandOptionChoice.js'
export function transformApplicationCommandOption (
rest: RestManager,
payload: DiscordApplicationCommandOption
): ApplicationCommandOption {
return {
type: payload.type,
name: payload.name,
nameLocalizations: payload.name_localizations ?? undefined,
description: payload.description,
descriptionLocalizations: payload.description_localizations ?? undefined,
required: payload.required ?? false,
choices: payload.choices?.map((choice) =>
rest.transformers.applicationCommandOptionChoice(rest, choice)
),
autocomplete: payload.autocomplete,
channelTypes: payload.channel_types,
minValue: payload.min_value,
maxValue: payload.max_value,
minLength: payload.min_length,
maxLength: payload.max_length,
options: payload.options?.map((option) =>
rest.transformers.applicationCommandOption(rest, option)
)
}
}
// THIS TRANSFORMER HAS A CIRCULAR REFERENCE TO CALL ITSELF FOR OPTIONS SO AN AUTOMATED TYPE CAN NOT BE CREATED!
export interface ApplicationCommandOption {
/** Value of Application Command Option Type */
type: ApplicationCommandOptionTypes
/** 1-32 character name matching lowercase `^[\w-]{1,32}$` */
name: string
/** Localization object for the `name` field. Values follow the same restrictions as `name` */
nameLocalizations?: Localization
/** 1-100 character description */
description: string
/** Localization object for the `description` field. Values follow the same restrictions as `description` */
descriptionLocalizations?: Localization
/** If the parameter is required or optional--default `false` */
required?: boolean
/** Choices for `string` and `int` types for the user to pick from */
choices?: ApplicationCommandOptionChoice[]
/** If the option is a subcommand or subcommand group type, this nested options will be the parameters */
options?: ApplicationCommandOption[]
/** If the option is a channel type, the channels shown will be restricted to these types */
channelTypes?: ChannelTypes[]
/** Minimum number desired. */
minValue?: number
/** Maximum number desired. */
maxValue?: number
/** Minimum length desired. */
minLength?: number
/** Maximum length desired. */
maxLength?: number
/** if autocomplete interactions are enabled for this `String`, `Integer`, or `Number` type option */
autocomplete?: boolean
}

View File

@@ -1,24 +0,0 @@
import type {
DiscordApplicationCommandOptionChoice,
Optionalize
} from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformApplicationCommandOptionChoice (
rest: RestManager,
payload: DiscordApplicationCommandOptionChoice
) {
const applicationCommandChoice = {
name: payload.name,
nameLocalizations: payload.name_localizations ?? undefined,
value: payload.value
}
return applicationCommandChoice as Optionalize<
typeof applicationCommandChoice
>
}
export interface ApplicationCommandOptionChoice
extends ReturnType<typeof transformApplicationCommandOptionChoice> {}

View File

@@ -1,29 +0,0 @@
import type {
DiscordGuildApplicationCommandPermissions,
Optionalize
} from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformApplicationCommandPermission (
rest: RestManager,
payload: DiscordGuildApplicationCommandPermissions
) {
const applicationCommandPermission = {
id: rest.transformers.snowflake(payload.id),
applicationId: rest.transformers.snowflake(payload.application_id),
guildId: rest.transformers.snowflake(payload.guild_id),
permissions: payload.permissions.map((perm) => ({
id: rest.transformers.snowflake(perm.id),
type: perm.type,
permission: perm.permission
}))
}
return applicationCommandPermission as Optionalize<
typeof applicationCommandPermission
>
}
export interface ApplicationCommandPermission
extends ReturnType<typeof transformApplicationCommandPermission> {}

View File

@@ -1,25 +0,0 @@
import type { DiscordAttachment, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformAttachment (
rest: RestManager,
payload: DiscordAttachment
) {
const attachment = {
id: rest.transformers.snowflake(payload.id),
filename: payload.filename,
contentType: payload.content_type,
size: payload.size,
url: payload.url,
proxyUrl: payload.proxy_url,
height: payload.height ?? undefined,
width: payload.width ?? undefined,
ephemeral: payload.ephemeral,
description: payload.description
}
return attachment as Optionalize<typeof attachment>
}
export interface Attachment extends ReturnType<typeof transformAttachment> {}

View File

@@ -1,158 +0,0 @@
import type { DiscordAuditLogEntry, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformAuditLogEntry (
rest: RestManager,
payload: DiscordAuditLogEntry
) {
const auditLogEntry = {
id: rest.transformers.snowflake(payload.id),
changes: payload.changes?.map((change) => {
switch (change.key) {
case '$add':
case '$remove':
return {
key: change.key,
new: change.new_value?.map((val) => ({
id: val.id ? rest.transformers.snowflake(val.id) : undefined,
name: val.name
})),
old: change.old_value?.map((val) => ({
id: val?.id ? rest.transformers.snowflake(val.id) : undefined,
name: val?.name
}))
}
case 'discovery_splash_hash':
case 'banner_hash':
case 'rules_channel_id':
case 'public_updates_channel_id':
case 'icon_hash':
case 'image_hash':
case 'splash_hash':
case 'owner_id':
case 'widget_channel_id':
case 'system_channel_id':
case 'application_id':
case 'permissions':
case 'allow':
case 'deny':
case 'channel_id':
case 'inviter_id':
case 'avatar_hash':
case 'id':
return {
key: change.key,
old: change.old_value
? rest.transformers.snowflake(change.old_value)
: undefined,
new: change.new_value
? rest.transformers.snowflake(change.new_value)
: undefined
}
case 'name':
case 'description':
case 'preferred_locale':
case 'region':
case 'afk_channel_id':
case 'vanity_url_code':
case 'topic':
case 'code':
case 'nick':
case 'location':
return {
key: change.key,
old: change.old_value,
new: change.new_value
}
case 'afk_timeout':
case 'mfa_level':
case 'verification_level':
case 'explicit_content_filter':
case 'default_message_notifications':
case 'prune_delete_days':
case 'position':
case 'bitrate':
case 'rate_limit_per_user':
case 'color':
case 'max_uses':
case 'uses':
case 'max_age':
case 'expire_behavior':
case 'expire_grace_period':
case 'user_limit':
case 'privacy_level':
case 'entity_type':
case 'status':
return {
key: change.key,
old: change.old_value ? Number(change.old_value) : undefined,
new: change.new_value ? Number(change.new_value) : undefined
}
case 'widget_enabled':
case 'nsfw':
case 'hoist':
case 'mentionable':
case 'temporary':
case 'deaf':
case 'mute':
case 'enable_emoticons':
return {
key: change.key,
old: change.old_value ?? false,
new: change.new_value ?? false
}
case 'permission_overwrites':
return {
key: change.key,
old: change.old_value,
new: change.new_value
}
default:
return {
key: change.key,
old: change.old_value,
new: change.new_value
}
}
}),
userId: payload.user_id
? rest.transformers.snowflake(payload.user_id)
: undefined,
targetId: payload.target_id
? rest.transformers.snowflake(payload.target_id)
: undefined,
actionType: payload.action_type,
options: payload.options
? {
autoModerationRuleName: payload.options.auto_moderation_rule_name,
autoModerationRuleTriggerType:
payload.options.auto_moderation_rule_trigger_type,
deleteMemberDays: payload.options.delete_member_days
? Number(payload.options.delete_member_days)
: 0,
membersRemoved: payload.options.members_removed
? Number(payload.options.members_removed)
: 0,
channelId: payload.options.channel_id
? rest.transformers.snowflake(payload.options.channel_id)
: undefined,
messageId: payload.options.message_id
? rest.transformers.snowflake(payload.options.message_id)
: undefined,
count: payload.options.count ? Number(payload.options.count) : 0,
id: payload.options.id
? rest.transformers.snowflake(payload.options.id)
: undefined,
type: Number(payload.options.type),
roleName: payload.options.role_name
}
: undefined,
reason: payload.reason
}
return auditLogEntry as Optionalize<typeof auditLogEntry>
}
export interface AuditLogEntry
extends ReturnType<typeof transformAuditLogEntry> {}

View File

@@ -1,44 +0,0 @@
import type {
DiscordAutoModerationActionExecution,
Optionalize
} from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformAutoModerationActionExecution (
rest: RestManager,
payload: DiscordAutoModerationActionExecution
) {
const rule = {
content: payload.content,
ruleTriggerType: payload.rule_trigger_type,
guildId: rest.transformers.snowflake(payload.guild_id),
ruleId: rest.transformers.snowflake(payload.rule_id),
userId: rest.transformers.snowflake(payload.user_id),
channelId: payload.channel_id
? rest.transformers.snowflake(payload.channel_id)
: undefined,
messageId: payload.message_id
? rest.transformers.snowflake(payload.message_id)
: undefined,
alertSystemMessageId: payload.alert_system_message_id
? rest.transformers.snowflake(payload.alert_system_message_id)
: undefined,
matchedKeyword: payload.matched_keyword ?? '',
matchedContent: payload.matched_content ?? '',
action: {
type: payload.action.type,
metadata: {
durationSeconds: payload.action.metadata.duration_seconds,
channelId: payload.action.metadata.channel_id
? rest.transformers.snowflake(payload.action.metadata.channel_id)
: undefined
}
}
}
return rule as Optionalize<typeof rule>
}
export interface AutoModerationActionExecution
extends ReturnType<typeof transformAutoModerationActionExecution> {}

View File

@@ -1,48 +0,0 @@
import type { DiscordAutoModerationRule, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformAutoModerationRule (
rest: RestManager,
payload: DiscordAutoModerationRule
) {
const rule = {
name: payload.name,
eventType: payload.event_type,
triggerType: payload.trigger_type,
enabled: payload.enabled,
id: rest.transformers.snowflake(payload.id),
guildId: rest.transformers.snowflake(payload.guild_id),
creatorId: rest.transformers.snowflake(payload.creator_id),
exemptRoles: payload.exempt_roles.map((id) =>
rest.transformers.snowflake(id)
),
exemptChannels: payload.exempt_channels.map((id) =>
rest.transformers.snowflake(id)
),
triggerMetadata: payload.trigger_metadata
? {
keywordFilter: payload.trigger_metadata.keyword_filter,
presets: payload.trigger_metadata.presets,
allowList: payload.trigger_metadata.allow_list,
mentionTotalLimit: payload.trigger_metadata.mention_total_limit
}
: undefined,
actions: payload.actions.map((action) => ({
type: action.type,
metadata: action.metadata
? {
channelId: action.metadata.channel_id
? rest.transformers.snowflake(action.metadata.channel_id)
: undefined,
durationSeconds: action.metadata.duration_seconds
}
: undefined
}))
}
return rule as Optionalize<typeof rule>
}
export interface AutoModerationRule
extends ReturnType<typeof transformAutoModerationRule> {}

View File

@@ -1,103 +0,0 @@
import type { DiscordChannel, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
const Mask = (1n << 64n) - 1n
export function packOverwrites (
allow: string,
deny: string,
id: string,
type: number
): bigint {
return pack64(allow, 0) | pack64(deny, 1) | pack64(id, 2) | pack64(type, 3)
}
function unpack64 (v: bigint, shift: number): bigint {
return (v >> BigInt(shift * 64)) & Mask
}
function pack64 (v: string | number, shift: number): bigint {
const b = BigInt(v)
if (b < 0 || b > Mask) {
throw new Error(`should have been a 64 bit unsigned integer: ${v}`)
}
return b << BigInt(shift * 64)
}
export function separateOverwrites (
v: bigint
): [number, bigint, bigint, bigint] {
return [
Number(unpack64(v, 3)),
unpack64(v, 2),
unpack64(v, 0),
unpack64(v, 1)
] as [number, bigint, bigint, bigint]
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformChannel (
rest: RestManager,
payload: { channel: DiscordChannel } & { guildId?: bigint }
) {
const channel = {
// UNTRANSFORMED STUFF HERE
type: payload.channel.type,
position: payload.channel.position,
name: payload.channel.name,
topic: payload.channel.topic ?? undefined,
nsfw: payload.channel.nsfw,
bitrate: payload.channel.bitrate,
userLimit: payload.channel.user_limit,
rateLimitPerUser: payload.channel.rate_limit_per_user,
// recipients: payload.channel.recipients?.map((r) => rest.transformers.user(rest, r)),
rtcRegion: payload.channel.rtc_region ?? undefined,
videoQualityMode: payload.channel.video_quality_mode,
guildId:
payload.guildId ??
(payload.channel.guild_id
? rest.transformers.snowflake(payload.channel.guild_id)
: 0n),
lastPinTimestamp: payload.channel.last_pin_timestamp
? Date.parse(payload.channel.last_pin_timestamp)
: undefined,
permissionOverwrites: payload.channel.permission_overwrites
? payload.channel.permission_overwrites.map((o) =>
packOverwrites(o.allow ?? '0', o.deny ?? '0', o.id, o.type)
)
: [],
id: rest.transformers.snowflake(payload.channel.id),
permissions: payload.channel.permissions
? rest.transformers.snowflake(payload.channel.permissions)
: undefined,
lastMessageId: payload.channel.last_message_id
? rest.transformers.snowflake(payload.channel.last_message_id)
: undefined,
ownerId: payload.channel.owner_id
? rest.transformers.snowflake(payload.channel.owner_id)
: undefined,
applicationId: payload.channel.application_id
? rest.transformers.snowflake(payload.channel.application_id)
: undefined,
parentId: payload.channel.parent_id
? rest.transformers.snowflake(payload.channel.parent_id)
: undefined,
memberCount: payload.channel.member_count,
messageCount: payload.channel.message_count,
archiveTimestamp: payload.channel.thread_metadata?.archive_timestamp
? Date.parse(payload.channel.thread_metadata.archive_timestamp)
: undefined,
autoArchiveDuration: payload.channel.thread_metadata?.auto_archive_duration,
botIsMember: Boolean(payload.channel.member),
archived: payload.channel.thread_metadata?.archived,
locked: payload.channel.thread_metadata?.locked,
invitable: payload.channel.thread_metadata?.invitable,
createTimestamp: payload.channel.thread_metadata?.create_timestamp
? Date.parse(payload.channel.thread_metadata.create_timestamp)
: undefined,
newlyCreated: payload.channel.newly_created,
flags: payload.channel.flags
}
return channel as Optionalize<typeof channel>
}
export interface Channel extends ReturnType<typeof transformChannel> {}

View File

@@ -1,99 +0,0 @@
import type {
ButtonStyles,
DiscordComponent,
MessageComponentTypes,
SelectOption,
TextStyles
} from '@discordeno/types'
import type { RestManager } from '../restManager.js'
export function transformComponent (
rest: RestManager,
payload: DiscordComponent
): Component {
return {
type: payload.type,
customId: payload.custom_id,
disabled: payload.disabled,
style: payload.style,
label: payload.label,
emoji: payload.emoji
? {
id: payload.emoji.id
? rest.transformers.snowflake(payload.emoji.id)
: undefined,
name: payload.emoji.name,
animated: payload.emoji.animated
}
: undefined,
url: payload.url,
options: payload.options?.map((option) => ({
label: option.label,
value: option.value,
description: option.description,
emoji: option.emoji
? {
id: option.emoji.id
? rest.transformers.snowflake(option.emoji.id)
: undefined,
name: option.emoji.name,
animated: option.emoji.animated
}
: undefined,
default: option.default
})),
placeholder: payload.placeholder,
minValues: payload.min_values,
maxValues: payload.max_values,
minLength: payload.min_length,
maxLength: payload.max_length,
value: payload.value,
components: payload.components?.map((component) =>
rest.transformers.component(rest, component)
)
}
}
// THIS TRANSFORMER HAS A CIRCULAR REFERENCE TO CALL ITSELF FOR COMPONENTS SO AN AUTOMATED TYPE CAN NOT BE CREATED!
export interface Component {
/** component type */
type: MessageComponentTypes
/** a developer-defined identifier for the component, max 100 characters */
customId?: string
/** whether this component is required to be filled, default true */
required?: boolean
/** whether the component is disabled, default false */
disabled?: boolean
/** For different styles/colors of the buttons */
style?: ButtonStyles | TextStyles
/** text that appears on the button (max 80 characters) */
label?: string
/** the dev-define value of the option, max 100 characters for select or 4000 for input. */
value?: string
/** Emoji object that includes fields of name, id, and animated supporting unicode and custom emojis. */
emoji?: {
/** Emoji id */
id?: bigint
/** Emoji name */
name?: string
/** Whether this emoji is animated */
animated?: boolean
}
/** optional url for link-style buttons that can navigate a user to the web. Only type 5 Link buttons can have a url */
url?: string
/** The choices! Maximum of 25 items. */
options?: SelectOption[]
/** A custom placeholder text if nothing is selected. Maximum 150 characters. */
placeholder?: string
/** The minimum number of items that must be selected. Default 1. Between 1-25. */
minValues?: number
/** The maximum number of items that can be selected. Default 1. Between 1-25. */
maxValues?: number
/** The minimum input length for a text input. Between 0-4000. */
minLength?: number
/** The maximum input length for a text input. Between 1-4000. */
maxLength?: number
/** a list of child components */
components?: Component[]
}

View File

@@ -1,59 +0,0 @@
import type { DiscordEmbed, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformEmbed (rest: RestManager, payload: DiscordEmbed) {
const embed = {
title: payload.title,
type: payload.type,
description: payload.description,
url: payload.url,
timestamp: payload.timestamp ? Date.parse(payload.timestamp) : undefined,
color: payload.color,
footer: payload.footer
? {
text: payload.footer.text,
iconUrl: payload.footer.icon_url,
proxyIconUrl: payload.footer.proxy_icon_url
}
: undefined,
image: payload.image
? {
url: payload.image.url,
proxyUrl: payload.image.proxy_url,
height: payload.image.height,
width: payload.image.width
}
: undefined,
thumbnail: payload.thumbnail
? {
url: payload.thumbnail.url,
proxyUrl: payload.thumbnail.proxy_url,
height: payload.thumbnail.height,
width: payload.thumbnail.width
}
: undefined,
video: payload.video
? {
url: payload.video.url,
proxyUrl: payload.video.proxy_url,
height: payload.video.height,
width: payload.video.width
}
: undefined,
provider: payload.provider,
author: payload.author
? {
name: payload.author.name,
url: payload.author.url,
iconUrl: payload.author.icon_url,
proxyIconUrl: payload.author.proxy_icon_url
}
: undefined,
fields: payload.fields
}
return embed as Optionalize<typeof embed>
}
export interface Embed extends ReturnType<typeof transformEmbed> {}

View File

@@ -1,18 +0,0 @@
import type { DiscordEmoji, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
import { EmojiToggles } from './toggles/emoji.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformEmoji (rest: RestManager, payload: DiscordEmoji) {
const emoji = {
id: payload.id ? rest.transformers.snowflake(payload.id) : undefined,
name: payload.name,
roles: payload.roles?.map((id) => rest.transformers.snowflake(id)),
user: payload.user ? rest.transformers.user(rest, payload.user) : undefined,
toggles: new EmojiToggles(payload)
}
return emoji as Optionalize<typeof emoji>
}
export interface Emoji extends ReturnType<typeof transformEmoji> {}

View File

@@ -1,22 +0,0 @@
import type {
DiscordGetGatewayBot,
GetGatewayBot,
Optionalize
} from '@discordeno/types'
export function transformGatewayBot (
payload: DiscordGetGatewayBot
): GetGatewayBot {
const gatewayBot = {
url: payload.url,
shards: payload.shards,
sessionStartLimit: {
total: payload.session_start_limit.total,
remaining: payload.session_start_limit.remaining,
resetAfter: payload.session_start_limit.reset_after,
maxConcurrency: payload.session_start_limit.max_concurrency
}
}
return gatewayBot as Optionalize<typeof gatewayBot>
}

View File

@@ -1,144 +0,0 @@
import type { DiscordGuild, Optionalize } from '@discordeno/types'
import { Collection, iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
import type { Emoji } from '../transformers/emoji.js'
import { GuildToggles } from './toggles/guild.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformGuild (
rest: RestManager,
payload: { guild: DiscordGuild } & { shardId: number }
) {
const guildId = rest.transformers.snowflake(payload.guild.id)
const guild = {
afkTimeout: payload.guild.afk_timeout,
approximateMemberCount: payload.guild.approximate_member_count,
approximatePresenceCount: payload.guild.approximate_presence_count,
defaultMessageNotifications: payload.guild.default_message_notifications,
description: payload.guild.description,
explicitContentFilter: payload.guild.explicit_content_filter,
toggles: new GuildToggles(payload.guild),
maxMembers: payload.guild.max_members,
maxPresences: payload.guild.max_presences ?? undefined,
maxVideoChannelUsers: payload.guild.max_video_channel_users,
mfaLevel: payload.guild.mfa_level,
name: payload.guild.name,
nsfwLevel: payload.guild.nsfw_level,
preferredLocale: payload.guild.preferred_locale,
premiumSubscriptionCount: payload.guild.premium_subscription_count,
premiumTier: payload.guild.premium_tier,
stageInstances: payload.guild.stage_instances?.map((si) => ({
/** The id of this Stage instance */
id: rest.transformers.snowflake(si.id),
/** The guild id of the associated Stage channel */
guildId,
/** The id of the associated Stage channel */
channelId: rest.transformers.snowflake(si.channel_id),
/** The topic of the Stage instance (1-120 characters) */
topic: si.topic
})),
systemChannelFlags: payload.guild.system_channel_flags,
vanityUrlCode: payload.guild.vanity_url_code,
verificationLevel: payload.guild.verification_level,
welcomeScreen: payload.guild.welcome_screen
? {
description: payload.guild.welcome_screen.description ?? undefined,
welcomeChannels: payload.guild.welcome_screen.welcome_channels.map(
(wc) => ({
channelId: rest.transformers.snowflake(wc.channel_id),
description: wc.description,
emojiId: wc.emoji_id
? rest.transformers.snowflake(wc.emoji_id)
: undefined,
emojiName: wc.emoji_name ?? undefined
})
)
}
: undefined,
discoverySplash: payload.guild.discovery_splash
? iconHashToBigInt(payload.guild.discovery_splash)
: undefined,
joinedAt: payload.guild.joined_at
? Date.parse(payload.guild.joined_at)
: undefined,
memberCount: payload.guild.member_count ?? 0,
shardId: payload.shardId,
icon: payload.guild.icon ? iconHashToBigInt(payload.guild.icon) : undefined,
banner: payload.guild.banner
? iconHashToBigInt(payload.guild.banner)
: undefined,
splash: payload.guild.splash
? iconHashToBigInt(payload.guild.splash)
: undefined,
channels: new Collection(
payload.guild.channels?.map((channel) => {
const result = rest.transformers.channel(rest, { channel, guildId })
return [result.id, result]
})
),
members: new Collection(
payload.guild.members?.map((member) => {
const result = rest.transformers.member(
rest,
member,
guildId,
rest.transformers.snowflake(member.user!.id)
)
return [result.id, result]
})
),
roles: new Collection(
payload.guild.roles?.map((role) => {
const result = rest.transformers.role(rest, { role, guildId })
return [result.id, result]
})
),
emojis: new Collection(
(payload.guild.emojis ?? []).map((emoji) => {
const em: Emoji = rest.transformers.emoji(rest, emoji)
return [em.id!, em]
})
),
voiceStates: new Collection(
(payload.guild.voice_states ?? [])
.map((vs) =>
rest.transformers.voiceState(rest, { voiceState: vs, guildId })
)
.map((vs) => [vs.userId, vs])
),
id: guildId,
// WEIRD EDGE CASE WITH BOT CREATED SERVERS
ownerId: payload.guild.owner_id
? rest.transformers.snowflake(payload.guild.owner_id)
: 0n,
permissions: payload.guild.permissions
? rest.transformers.snowflake(payload.guild.permissions)
: 0n,
afkChannelId: payload.guild.afk_channel_id
? rest.transformers.snowflake(payload.guild.afk_channel_id)
: undefined,
widgetChannelId: payload.guild.widget_channel_id
? rest.transformers.snowflake(payload.guild.widget_channel_id)
: undefined,
applicationId: payload.guild.application_id
? rest.transformers.snowflake(payload.guild.application_id)
: undefined,
systemChannelId: payload.guild.system_channel_id
? rest.transformers.snowflake(payload.guild.system_channel_id)
: undefined,
rulesChannelId: payload.guild.rules_channel_id
? rest.transformers.snowflake(payload.guild.rules_channel_id)
: undefined,
publicUpdatesChannelId: payload.guild.public_updates_channel_id
? rest.transformers.snowflake(payload.guild.public_updates_channel_id)
: undefined,
premiumProgressBarEnabled: payload.guild.premium_progress_bar_enabled
}
return guild as Optionalize<typeof guild>
}
export interface Guild extends ReturnType<typeof transformGuild> {}

View File

@@ -1,37 +0,0 @@
export * from './activity.js'
export * from './application.js'
export * from './applicationCommand.js'
export * from './applicationCommandOption.js'
export * from './applicationCommandOptionChoice.js'
export * from './applicationCommandPermission.js'
export * from './attachment.js'
export * from './auditLogEntry.js'
export * from './automodActionExecution.js'
export * from './automodRule.js'
export * from './channel.js'
export * from './component.js'
export * from './embed.js'
export * from './emoji.js'
export * from './gatewayBot.js'
export * from './guild.js'
export * from './integration.js'
export * from './interaction.js'
export * from './invite.js'
export * from './member.js'
export * from './message.js'
export * from './presence.js'
export * from './reverse/index.js'
export * from './role.js'
export * from './scheduledEvent.js'
export * from './stageInstance.js'
export * from './sticker.js'
export * from './team.js'
export * from './template.js'
export * from './threadMember.js'
export * from './toggles/index.js'
export * from './voiceRegion.js'
export * from './voiceState.js'
export * from './webhook.js'
export * from './welcomeScreen.js'
export * from './widget.js'
export * from './widgetSettings.js'

View File

@@ -1,53 +0,0 @@
import type {
DiscordIntegrationCreateUpdate,
Optionalize
} from '@discordeno/types'
import { iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformIntegration (
rest: RestManager,
payload: DiscordIntegrationCreateUpdate
) {
const integration = {
guildId: rest.transformers.snowflake(payload.guild_id),
id: rest.transformers.snowflake(payload.id),
name: payload.name,
type: payload.type,
enabled: payload.enabled,
syncing: payload.syncing,
roleId: payload.role_id
? rest.transformers.snowflake(payload.role_id)
: undefined,
enableEmoticons: payload.enable_emoticons,
expireBehavior: payload.expire_behavior,
expireGracePeriod: payload.expire_grace_period,
user: payload.user ? rest.transformers.user(rest, payload.user) : undefined,
account: {
id: rest.transformers.snowflake(payload.account.id),
name: payload.account.name
},
syncedAt: payload.synced_at ? Date.parse(payload.synced_at) : undefined,
subscriberCount: payload.subscriber_count,
revoked: payload.revoked,
application: payload.application
? {
id: rest.transformers.snowflake(payload.application.id),
name: payload.application.name,
icon: payload.application.icon
? iconHashToBigInt(payload.application.icon)
: undefined,
description: payload.application.description,
bot: payload.application.bot
? rest.transformers.user(rest, payload.application.bot)
: undefined
}
: undefined,
scopes: payload.scopes
}
return integration as Optionalize<typeof integration>
}
export interface Integration extends ReturnType<typeof transformIntegration> {}

View File

@@ -1,204 +0,0 @@
import type {
ChannelTypes,
DiscordInteraction,
DiscordInteractionDataOption,
DiscordInteractionDataResolved,
Optionalize
} from '@discordeno/types'
import { Collection } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
import type { Attachment } from './attachment.js'
import type { Member, User } from './member.js'
import type { Message } from './message.js'
import type { Role } from './role.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformInteraction (
rest: RestManager,
payload: DiscordInteraction
) {
const guildId = payload.guild_id
? rest.transformers.snowflake(payload.guild_id)
: undefined
const user = rest.transformers.user(
rest,
payload.member?.user ?? payload.user!
)
const interaction = {
// UNTRANSFORMED STUFF HERE
type: payload.type,
token: payload.token,
version: payload.version,
locale: payload.locale,
guildLocale: payload.guild_locale,
// TRANSFORMED STUFF BELOW
guildId,
user,
id: rest.transformers.snowflake(payload.id),
applicationId: rest.transformers.snowflake(payload.application_id),
appPermissions: payload.app_permissions
? rest.transformers.snowflake(payload.app_permissions)
: undefined,
message: payload.message
? rest.transformers.message(rest, payload.message)
: undefined,
channelId: payload.channel_id
? rest.transformers.snowflake(payload.channel_id)
: undefined,
member:
payload.member && guildId
? rest.transformers.member(rest, payload.member, guildId, user.id)
: undefined,
data: payload.data
? {
componentType: payload.data.component_type,
customId: payload.data.custom_id,
components: payload.data.components?.map((component) =>
rest.transformers.component(rest, component)
),
values: payload.data.values,
id: payload.data.id
? rest.transformers.snowflake(payload.data.id)
: undefined,
name: payload.data.name,
resolved: payload.data.resolved
? transformInteractionDataResolved(
rest,
payload.data.resolved,
guildId
)
: undefined,
options: payload.data.options?.map((opt) =>
rest.transformers.interactionDataOptions(rest, opt)
),
targetId: payload.data.target_id
? rest.transformers.snowflake(payload.data.target_id)
: undefined,
guildId: payload.data.guild_id
? rest.transformers.snowflake(payload.data.guild_id)
: undefined
}
: undefined
}
return interaction
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformInteractionDataOption (
rest: RestManager,
option: DiscordInteractionDataOption
) {
const opt = {
name: option.name,
type: option.type,
value: option.value,
options: option.options,
focused: option.focused
}
return opt as Optionalize<typeof opt>
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformInteractionDataResolved (
rest: RestManager,
resolved: DiscordInteractionDataResolved,
guildId?: bigint
) {
const transformed: {
messages?: Collection<bigint, Message>
users?: Collection<bigint, User>
members?: Collection<bigint, Member>
roles?: Collection<bigint, Role>
channels?: Collection<
bigint,
{ id: bigint, name: string, type: ChannelTypes, permissions: bigint }
>
attachments?: Collection<bigint, Attachment>
} = {}
if (resolved.messages) {
transformed.messages = new Collection(
Object.entries(resolved.messages).map(([id, value]) => {
const message: Message = rest.transformers.message(rest, value)
return [message.id, message]
})
)
}
if (resolved.users) {
transformed.users = new Collection(
Object.entries(resolved.users).map(([id, value]) => {
const user = rest.transformers.user(rest, value)
return [user.id, user]
})
)
}
if (guildId && resolved.members) {
transformed.members = new Collection(
Object.entries(resolved.members).map(([id, value]) => {
const member: Member = rest.transformers.member(
rest,
value,
guildId,
rest.transformers.snowflake(id)
)
return [member.id, member]
})
)
}
if (guildId && resolved.roles) {
transformed.roles = new Collection(
Object.entries(resolved.roles).map(([id, value]) => {
const role = rest.transformers.role(rest, { role: value, guildId })
return [role.id, role]
})
)
}
if (resolved.channels) {
transformed.channels = new Collection(
Object.entries(resolved.channels).map(([key, value]) => {
const id = rest.transformers.snowflake(key)
const channel = value as {
id: string
name: string
type: ChannelTypes
permissions: string
}
return [
id,
{
id,
name: channel.name,
type: channel.type,
permissions: rest.transformers.snowflake(channel.permissions)
}
]
})
)
}
if (resolved.attachments) {
transformed.attachments = new Collection(
Object.entries(resolved.attachments).map(([key, value]) => {
const id = rest.transformers.snowflake(key)
return [id, rest.transformers.attachment(rest, value)]
})
)
}
return transformed
}
export interface Interaction extends ReturnType<typeof transformInteraction> {}
export interface InteractionDataResolved
extends ReturnType<typeof transformInteractionDataResolved> {}
export interface InteractionDataOption
extends ReturnType<typeof transformInteractionDataOption> {}

View File

@@ -1,51 +0,0 @@
import type { DiscordInviteCreate, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformInvite (
rest: RestManager,
invite: DiscordInviteCreate
) {
const transformedInvite = {
/** The channel the invite is for */
channelId: rest.transformers.snowflake(invite.channel_id),
/** The unique invite code */
code: invite.code,
/** The time at which the invite was created */
createdAt: Date.parse(invite.created_at),
/** The guild of the invite */
guildId: invite.guild_id
? rest.transformers.snowflake(invite.guild_id)
: undefined,
/** The user that created the invite */
inviter: invite.inviter
? rest.transformers.user(rest, invite.inviter)
: undefined,
/** How long the invite is valid for (in seconds) */
maxAge: invite.max_age,
/** The maximum number of times the invite can be used */
maxUses: invite.max_uses,
/** The type of target for this voice channel invite */
targetType: invite.target_type,
/** The target user for this invite */
targetUser: invite.target_user
? rest.transformers.user(rest, invite.target_user)
: undefined,
/** The embedded application to open for this voice channel embedded application invite */
targetApplication: invite.target_application
? rest.transformers.application(
rest,
// @ts-expect-error should not break anything even though its partial. if it does blame wolf :)
invite.target_application
)
: undefined,
/** Whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) */
temporary: invite.temporary,
/** How many times the invite has been used (always will be 0) */
uses: invite.uses
}
return transformedInvite as Optionalize<typeof transformedInvite>
}
export interface Invite extends ReturnType<typeof transformInvite> {}

View File

@@ -1,60 +0,0 @@
import type {
DiscordMember,
DiscordUser,
Optionalize
} from '@discordeno/types'
import { iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
import { MemberToggles } from './toggles/member.js'
import { UserToggles } from './toggles/user.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformUser (rest: RestManager, payload: DiscordUser) {
const user = {
id: rest.transformers.snowflake(payload.id || ''),
username: payload.username,
discriminator: payload.discriminator,
avatar: payload.avatar ? iconHashToBigInt(payload.avatar) : undefined,
locale: payload.locale,
email: payload.email ?? undefined,
flags: payload.flags,
premiumType: payload.premium_type,
publicFlags: payload.public_flags,
toggles: new UserToggles(payload)
}
return user as Optionalize<typeof user>
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformMember (
rest: RestManager,
payload: DiscordMember,
guildId: bigint,
userId: bigint
) {
const member = {
id: userId,
guildId,
user: payload.user ? rest.transformers.user(rest, payload.user) : undefined,
nick: payload.nick ?? undefined,
roles: payload.roles.map((id) => rest.transformers.snowflake(id)),
joinedAt: Date.parse(payload.joined_at),
premiumSince: payload.premium_since
? Date.parse(payload.premium_since)
: undefined,
avatar: payload.avatar ? iconHashToBigInt(payload.avatar) : undefined,
permissions: payload.permissions
? rest.transformers.snowflake(payload.permissions)
: undefined,
communicationDisabledUntil: payload.communication_disabled_until
? Date.parse(payload.communication_disabled_until)
: undefined,
toggles: new MemberToggles(payload)
}
return member as Optionalize<typeof member>
}
export interface Member extends ReturnType<typeof transformMember> {}
export interface User extends ReturnType<typeof transformUser> {}

View File

@@ -1,148 +0,0 @@
import type { DiscordMessage, Optionalize } from '@discordeno/types'
import { CHANNEL_MENTION_REGEX, iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
import { MemberToggles } from './toggles/member.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformMessage (rest: RestManager, payload: DiscordMessage) {
const guildId = payload.guild_id
? rest.transformers.snowflake(payload.guild_id)
: undefined
const userId = rest.transformers.snowflake(payload.author.id)
const message = {
// UNTRANSFORMED STUFF HERE
content: payload.content ?? '',
isFromBot: payload.author.bot ?? false,
tag: `${payload.author.username}#${payload.author.discriminator}`,
timestamp: Date.parse(payload.timestamp),
editedTimestamp: payload.edited_timestamp
? Date.parse(payload.edited_timestamp)
: undefined,
bitfield:
(payload.tts ? 1n : 0n) |
(payload.mention_everyone ? 2n : 0n) |
(payload.pinned ? 4n : 0n),
attachments: payload.attachments?.map((attachment) =>
rest.transformers.attachment(rest, attachment)
),
embeds: payload.embeds?.map((embed) =>
rest.transformers.embed(rest, embed)
),
reactions: payload.reactions?.map((reaction) => ({
me: reaction.me,
count: reaction.count,
emoji: rest.transformers.emoji(rest, reaction.emoji)
})),
type: payload.type,
activity: payload.activity
? {
type: payload.activity.type,
partyId: payload.activity.party_id
}
: undefined,
application: payload.application,
flags: payload.flags,
interaction: payload.interaction
? {
id: rest.transformers.snowflake(payload.interaction.id),
type: payload.interaction.type,
name: payload.interaction.name,
user: rest.transformers.user(rest, payload.interaction.user),
member: payload.interaction.member
? {
id: userId,
guildId,
nick: payload.interaction.member.nick ?? undefined,
roles: payload.interaction.member.roles?.map((id) =>
rest.transformers.snowflake(id)
),
joinedAt: payload.interaction.member.joined_at
? Date.parse(payload.interaction.member.joined_at)
: undefined,
premiumSince: payload.interaction.member.premium_since
? Date.parse(payload.interaction.member.premium_since)
: undefined,
toggles: new MemberToggles(payload.interaction.member),
avatar: payload.interaction.member.avatar
? iconHashToBigInt(payload.interaction.member.avatar)
: undefined,
permissions: payload.interaction.member.permissions
? rest.transformers.snowflake(
payload.interaction.member.permissions
)
: undefined,
communicationDisabledUntil: payload.interaction.member
.communication_disabled_until
? Date.parse(
payload.interaction.member.communication_disabled_until
)
: undefined
}
: undefined
}
: undefined,
thread: payload.thread
? rest.transformers.channel(rest, { channel: payload.thread, guildId })
: undefined,
components: payload.components?.map((component) =>
rest.transformers.component(rest, component)
),
stickerItems: payload.sticker_items?.map((sticker) => ({
id: rest.transformers.snowflake(sticker.id),
name: sticker.name,
formatType: sticker.format_type
})),
// TRANSFORMED STUFF BELOW
id: rest.transformers.snowflake(payload.id),
guildId,
channelId: rest.transformers.snowflake(payload.channel_id),
webhookId: payload.webhook_id
? rest.transformers.snowflake(payload.webhook_id)
: undefined,
authorId: userId,
applicationId: payload.application_id
? rest.transformers.snowflake(payload.application_id)
: undefined,
messageReference: payload.message_reference
? {
messageId: payload.message_reference.message_id
? rest.transformers.snowflake(payload.message_reference.message_id)
: undefined,
channelId: payload.message_reference.channel_id
? rest.transformers.snowflake(payload.message_reference.channel_id)
: undefined,
guildId: payload.message_reference.guild_id
? rest.transformers.snowflake(payload.message_reference.guild_id)
: undefined
}
: undefined,
mentionedUserIds: payload.mentions
? payload.mentions.map((m) => rest.transformers.snowflake(m.id))
: [],
mentionedRoleIds: payload.mention_roles
? payload.mention_roles.map((id) => rest.transformers.snowflake(id))
: [],
mentionedChannelIds: [
// Keep any ids tht discord sends
...(payload.mention_channels ?? []).map((m) =>
rest.transformers.snowflake(m.id)
),
// Add any other ids that can be validated in a channel mention format
...(payload.content?.match(CHANNEL_MENTION_REGEX) ?? []).map((text) =>
// converts the <#123> into 123
rest.transformers.snowflake(text.substring(2, text.length - 1))
)
],
member:
payload.member && guildId
? rest.transformers.member(rest, payload.member, guildId, userId)
: undefined,
nonce: payload.nonce
}
return message as Optionalize<typeof message>
}
export interface Message extends ReturnType<typeof transformMessage> {}

View File

@@ -1,40 +0,0 @@
import type { DiscordPresenceUpdate, Optionalize } from '@discordeno/types'
import { PresenceStatus } from '@discordeno/types'
import { iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
import { UserToggles } from './toggles/user.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformPresence (
rest: RestManager,
payload: DiscordPresenceUpdate
) {
const presence = {
user: {
id: rest.transformers.snowflake(payload.user.id || ''),
username: payload.user.username ?? undefined,
discriminator: payload.user.discriminator ?? undefined,
avatar: payload.user.avatar
? iconHashToBigInt(payload.user.avatar)
: undefined,
locale: payload.user.locale ?? undefined,
email: payload.user.email ?? undefined,
flags: payload.user.flags ?? undefined,
premiumType: payload.user.premium_type ?? undefined,
publicFlags: payload.user.public_flags ?? undefined,
toggles: new UserToggles(payload.user)
},
guildId: rest.transformers.snowflake(payload.guild_id),
status: PresenceStatus[payload.status],
activities: payload.activities.map((activity) =>
rest.transformers.activity(rest, activity)
),
desktop: payload.client_status.desktop,
mobile: payload.client_status.mobile,
web: payload.client_status.web
}
return presence as Optionalize<typeof presence>
}
export interface PresenceUpdate extends ReturnType<typeof transformPresence> {}

View File

@@ -1,55 +0,0 @@
import type { DiscordActivity } from '@discordeno/types'
import { bigintToSnowflake } from '@discordeno/utils'
import type { RestManager } from '../../restManager.js'
import type { Activity } from '../activity.js'
export function transformActivityToDiscordActivity (
rest: RestManager,
payload: Activity
): DiscordActivity {
return {
name: payload.name,
type: payload.type,
url: payload.url ?? undefined,
created_at: payload.createdAt,
timestamps: {
start: payload.startedAt,
end: payload.endedAt
},
application_id: payload.applicationId
? bigintToSnowflake(payload.applicationId)
: undefined,
details: payload.details ?? undefined,
state: payload.state ?? undefined,
emoji: payload.emoji
? {
name: payload.emoji.name,
animated: payload.emoji.animated,
id: payload.emoji.id
? bigintToSnowflake(payload.emoji.id)
: undefined
}
: undefined,
party: {
id: payload.partyId,
size:
payload.partyCurrentSize && payload.partyMaxSize
? [payload.partyCurrentSize, payload.partyMaxSize]
: undefined
},
assets: {
large_image: payload.largeImage,
large_text: payload.largeText,
small_image: payload.largeImage,
small_text: payload.largeText
},
secrets: {
join: payload.join,
spectate: payload.spectate,
match: payload.match
},
instance: payload.instance,
flags: payload.flags,
buttons: payload.buttons
}
}

View File

@@ -1,17 +0,0 @@
import type {
AllowedMentions,
DiscordAllowedMentions
} from '@discordeno/types'
import type { RestManager } from '../../restManager'
export function transformAllowedMentionsToDiscordAllowedMentions (
rest: RestManager,
mentions: AllowedMentions
): DiscordAllowedMentions {
return {
parse: mentions.parse,
replied_user: mentions.repliedUser,
users: mentions.users?.map((id) => id.toString()),
roles: mentions.roles?.map((id) => id.toString())
}
}

View File

@@ -1,36 +0,0 @@
import type { DiscordApplication } from '@discordeno/types'
import { bigintToSnowflake, iconBigintToHash } from '@discordeno/utils'
import type { RestManager } from '../../restManager.js'
import type { Application } from '../application.js'
export function transformApplicationToDiscordApplication (
rest: RestManager,
payload: Application
): DiscordApplication {
return {
name: payload.name,
description: payload.description,
rpc_origins: payload.rpcOrigins,
bot_public: payload.botPublic,
bot_require_code_grant: payload.botRequireCodeGrant,
terms_of_service_url: payload.termsOfServiceUrl,
privacy_policy_url: payload.privacyPolicyUrl,
verify_key: payload.verifyKey,
primary_sku_id: payload.primarySkuId,
slug: payload.slug,
cover_image: payload.coverImage
? iconBigintToHash(payload.coverImage)
: undefined,
flags: payload.flags,
id: bigintToSnowflake(payload.id),
icon: payload.icon ? iconBigintToHash(payload.icon) : null,
owner: payload.owner
? rest.transformers.reverse.user(rest, payload.owner)
: undefined,
team: payload.team
? rest.transformers.reverse.team(rest, payload.team)
: null,
guild_id: payload.guildId ? bigintToSnowflake(payload.guildId) : undefined
}
}

View File

@@ -1,29 +0,0 @@
import type { DiscordApplicationCommand } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { ApplicationCommand } from '../applicationCommand.js'
export function transformApplicationCommandToDiscordApplicationCommand (
rest: RestManager,
payload: ApplicationCommand
): DiscordApplicationCommand {
return {
id: rest.transformers.reverse.snowflake(payload.id),
type: payload.type,
application_id: rest.transformers.reverse.snowflake(payload.applicationId),
guild_id: payload.guildId
? rest.transformers.reverse.snowflake(payload.guildId)
: undefined,
name: payload.name,
name_localizations: payload.nameLocalizations,
description: payload.description,
description_localizations: payload.descriptionLocalizations,
options: payload.options?.map((option) =>
rest.transformers.applicationCommandOption(rest, option)
),
default_member_permissions: payload.defaultMemberPermissions
? rest.transformers.reverse.snowflake(payload.defaultMemberPermissions)
: null,
dm_permission: payload.dmPermission,
version: payload.version
}
}

View File

@@ -1,29 +0,0 @@
import type { DiscordApplicationCommandOption } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { ApplicationCommandOption } from '../applicationCommandOption.js'
export function transformApplicationCommandOptionToDiscordApplicationCommandOption (
rest: RestManager,
payload: ApplicationCommandOption
): DiscordApplicationCommandOption {
return {
type: payload.type,
name: payload.name,
name_localizations: payload.nameLocalizations,
description: payload.description,
description_localizations: payload.descriptionLocalizations,
required: payload.required,
choices: payload.choices?.map((choice) =>
rest.transformers.reverse.applicationCommandOptionChoice(rest, choice)
),
options: payload.options?.map((option) =>
rest.transformers.reverse.applicationCommandOption(rest, option)
),
channel_types: payload.channelTypes,
min_value: payload.minValue,
max_value: payload.maxValue,
min_length: payload.minLength,
max_length: payload.maxLength,
autocomplete: payload.autocomplete
}
}

View File

@@ -1,14 +0,0 @@
import type { DiscordApplicationCommandOptionChoice } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { ApplicationCommandOptionChoice } from '../applicationCommandOptionChoice.js'
export function transformApplicationCommandOptionChoiceToDiscordApplicationCommandOptionChoice (
rest: RestManager,
payload: ApplicationCommandOptionChoice
): DiscordApplicationCommandOptionChoice {
return {
name: payload.name,
name_localizations: payload.nameLocalizations,
value: payload.value
}
}

View File

@@ -1,19 +0,0 @@
import type { DiscordGuildApplicationCommandPermissions } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { ApplicationCommandPermission } from '../applicationCommandPermission.js'
export function transformApplicationCommandPermissionToDiscordApplicationCommandPermission (
rest: RestManager,
payload: ApplicationCommandPermission
): DiscordGuildApplicationCommandPermissions {
return {
id: rest.transformers.reverse.snowflake(payload.id),
application_id: rest.transformers.reverse.snowflake(payload.applicationId),
guild_id: rest.transformers.reverse.snowflake(payload.guildId),
permissions: payload.permissions.map((perm) => ({
id: rest.transformers.reverse.snowflake(perm.id),
type: perm.type,
permission: perm.permission
}))
}
}

View File

@@ -1,21 +0,0 @@
import type { DiscordAttachment } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { Attachment } from '../attachment.js'
export function transformAttachmentToDiscordAttachment (
rest: RestManager,
payload: Attachment
): DiscordAttachment {
return {
id: rest.transformers.reverse.snowflake(payload.id),
filename: payload.filename,
content_type: payload.contentType,
size: payload.size,
url: payload.url,
proxy_url: payload.proxyUrl,
height: payload.height,
width: payload.width,
ephemeral: payload.ephemeral,
description: payload.description
}
}

View File

@@ -1,176 +0,0 @@
import type { DiscordAuditLogEntry } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { AuditLogEntry } from '../auditLogEntry.js'
export function transformAuditLogEntryToDiscordAuditLogEntry (
rest: RestManager,
payload: AuditLogEntry
): DiscordAuditLogEntry {
return {
id: rest.transformers.reverse.snowflake(payload.id),
// @ts-expect-error: ts can't identify return type of switch case
changes: payload.changes?.map((change) => {
switch (change.key) {
case '$add':
case '$remove':
return {
key: change.key,
new_value: (
change.new as Array<{
id: bigint | undefined
name: string | undefined
}>
)?.map((val) => ({
id: val.id
? rest.transformers.reverse.snowflake(val.id)
: undefined,
name: val.name
})),
old_value: (
change.old as
| Array<{
id: bigint | undefined
name: string | undefined
}>
| undefined
)?.map((val) => ({
id: val?.id
? rest.transformers.reverse.snowflake(val.id)
: undefined,
name: val?.name
}))
}
case 'discovery_splash_hash':
case 'banner_hash':
case 'rules_channel_id':
case 'public_updates_channel_id':
case 'icon_hash':
case 'image_hash':
case 'splash_hash':
case 'owner_id':
case 'widget_channel_id':
case 'system_channel_id':
case 'application_id':
case 'permissions':
case 'allow':
case 'deny':
case 'channel_id':
case 'inviter_id':
case 'avatar_hash':
case 'id':
return {
key: change.key,
old_value: change.old
? rest.transformers.reverse.snowflake(change.old as bigint)
: '',
new_value: change.new
? rest.transformers.reverse.snowflake(change.new as bigint)
: ''
}
case 'name':
case 'description':
case 'preferred_locale':
case 'region':
case 'afk_channel_id':
case 'vanity_url_code':
case 'topic':
case 'code':
case 'nick':
case 'location':
return {
key: change.key,
old_value: change.old,
new_value: change.new
}
case 'afk_timeout':
case 'mfa_level':
case 'verification_level':
case 'explicit_content_filter':
case 'default_message_notifications':
case 'prune_delete_days':
case 'position':
case 'bitrate':
case 'rate_limit_per_user':
case 'color':
case 'max_uses':
case 'uses':
case 'max_age':
case 'expire_behavior':
case 'expire_grace_period':
case 'user_limit':
case 'privacy_level':
case 'entity_type':
case 'status':
return {
key: change.key,
old_value: change.old ? Number(change.old) : '',
new_value: change.new ? Number(change.new) : ''
}
case 'widget_enabled':
case 'nsfw':
case 'hoist':
case 'mentionable':
case 'temporary':
case 'deaf':
case 'mute':
case 'enable_emoticons':
return {
key: change.key,
old_value: change.old,
new_value: change.new
}
case 'permission_overwrites':
return {
key: change.key,
old_value: change.old,
new_value: change.new
}
default:
return {
key: change.key,
old_value: change.old,
new_value: change.new
}
}
}),
user_id: payload.userId
? rest.transformers.reverse.snowflake(payload.userId)
: null,
target_id: payload.targetId
? rest.transformers.reverse.snowflake(payload.targetId)
: null,
action_type: payload.actionType,
options: payload.options
? {
// respect transformer as reference than type
auto_moderation_rule_name: payload.options.autoModerationRuleName,
auto_moderation_rule_trigger_type:
payload.options.autoModerationRuleTriggerType,
delete_member_days:
payload.options.deleteMemberDays === 0
? payload.options.deleteMemberDays.toString()
: '',
members_removed:
payload.options.membersRemoved === 0
? payload.options.membersRemoved.toString()
: '',
channel_id: payload.options.channelId
? rest.transformers.reverse.snowflake(payload.options.channelId)
: '',
message_id: payload.options.messageId
? rest.transformers.reverse.snowflake(payload.options.messageId)
: '',
count:
payload.options.count === 0 ? payload.options.count.toString() : '',
id: payload.options.id
? rest.transformers.reverse.snowflake(payload.options.id)
: '',
type: payload.options.type.toString(),
role_name: payload.options.roleName,
// make up value to make ts shut up, the orginal value do not persevere in transformer
application_id: ''
}
: undefined,
reason: payload.reason
}
}

View File

@@ -1,47 +0,0 @@
import type { DiscordComponent } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { Component } from '../component.js'
export function transformComponentToDiscordComponent (
rest: RestManager,
payload: Component
): DiscordComponent {
return {
type: payload.type,
custom_id: payload.customId,
disabled: payload.disabled,
required: payload.required,
style: payload.style,
label: payload.label,
emoji: payload.emoji
? {
id: payload.emoji.id?.toString(),
name: payload.emoji.name,
animated: payload.emoji.animated
}
: undefined,
url: payload.url,
options: payload.options?.map((option) => ({
label: option.label,
value: option.value,
description: option.description,
emoji: option.emoji
? {
id: option.emoji.id?.toString(),
name: option.emoji.name,
animated: option.emoji.animated
}
: undefined,
default: option.default
})),
placeholder: payload.placeholder,
min_values: payload.minValues,
max_values: payload.maxValues,
min_length: payload.minLength,
max_length: payload.maxLength,
value: payload.value,
components: payload.components?.map((component) =>
rest.transformers.reverse.component(rest, component)
)
}
}

View File

@@ -1,39 +0,0 @@
import type { DiscordCreateApplicationCommand } from '@discordeno/types'
import { calculateBits } from '@discordeno/utils'
import type { RestManager } from '../../restManager.js'
import type { CreateApplicationCommand } from '../../types.js'
import { isContextApplicationCommand } from '../../types.js'
export function transformCreateApplicationCommandToDiscordCreateApplicationCommand (
rest: RestManager,
payload: CreateApplicationCommand
): DiscordCreateApplicationCommand {
if (isContextApplicationCommand(payload)) {
return {
name: payload.name,
name_localizations: payload.nameLocalizations,
description: '',
description_localizations: {},
type: payload.type,
default_member_permissions: payload.defaultMemberPermissions
? calculateBits(payload.defaultMemberPermissions)
: null,
dm_permission: payload.dmPermission
}
}
return {
name: payload.name,
name_localizations: payload.nameLocalizations,
description: payload.description,
description_localizations: payload.descriptionLocalizations,
type: payload.type,
options: payload.options?.map((option) =>
rest.transformers.reverse.applicationCommandOption(rest, option)
),
default_member_permissions: payload.defaultMemberPermissions
? calculateBits(payload.defaultMemberPermissions)
: null,
dm_permission: payload.dmPermission
}
}

View File

@@ -1,60 +0,0 @@
import type { DiscordEmbed } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { Embed } from '../embed.js'
export function transformEmbedToDiscordEmbed (
rest: RestManager,
payload: Embed
): DiscordEmbed {
return {
title: payload.title,
type: payload.type,
description: payload.description,
url: payload.url,
timestamp: payload.timestamp
? new Date(payload.timestamp).toISOString()
: undefined,
color: payload.color,
footer: payload.footer
? {
text: payload.footer.text,
icon_url: payload.footer.iconUrl,
proxy_icon_url: payload.footer.proxyIconUrl
}
: undefined,
image: payload.image
? {
url: payload.image.url,
proxy_url: payload.image.proxyUrl,
height: payload.image.height,
width: payload.image.width
}
: undefined,
thumbnail: payload.thumbnail
? {
url: payload.thumbnail.url,
proxy_url: payload.thumbnail.proxyUrl,
height: payload.thumbnail.height,
width: payload.thumbnail.width
}
: undefined,
video: payload.video
? {
url: payload.video.url,
proxy_url: payload.video.proxyUrl,
height: payload.video.height,
width: payload.video.width
}
: undefined,
provider: payload.provider,
author: payload.author
? {
name: payload.author.name,
url: payload.author.url,
icon_url: payload.author.iconUrl,
proxy_icon_url: payload.author.proxyIconUrl
}
: undefined,
fields: payload.fields
}
}

View File

@@ -1,23 +0,0 @@
import type { DiscordEmoji } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { Emoji } from '../emoji.js'
export function transformEmojiToDiscordEmoji (
rest: RestManager,
payload: Emoji
): DiscordEmoji {
return {
id: payload.id
? rest.transformers.reverse.snowflake(payload.id)
: undefined,
name: payload.name,
roles: payload.roles?.map((id) => rest.transformers.reverse.snowflake(id)),
user: payload.user
? rest.transformers.reverse.user(rest, payload.user)
: undefined,
require_colons: payload.toggles.requireColons,
managed: payload.toggles.managed,
animated: payload.toggles.animated,
available: payload.toggles.available
}
}

View File

@@ -1,16 +0,0 @@
import type { DiscordGetGatewayBot, GetGatewayBot } from '@discordeno/types'
export function transformGatewayBotToDiscordGatewayBot (
payload: GetGatewayBot
): DiscordGetGatewayBot {
return {
url: payload.url,
shards: payload.shards,
session_start_limit: {
total: payload.sessionStartLimit.total,
remaining: payload.sessionStartLimit.remaining,
reset_after: payload.sessionStartLimit.resetAfter,
max_concurrency: payload.sessionStartLimit.maxConcurrency
}
}
}

View File

@@ -1,19 +0,0 @@
export * from './activity.js'
export * from './allowedMentions.js'
export * from './application.js'
export * from './applicationCommand.js'
export * from './applicationCommandOption.js'
export * from './applicationCommandOptionChoice.js'
export * from './applicationCommandPermission.js'
export * from './attachment.js'
export * from './auditLogEntry.js'
export * from './component.js'
export * from './createApplicationCommand.js'
export * from './embed.js'
export * from './emoji.js'
export * from './gatewayBot.js'
export * from './interactionResponse.js'
export * from './member.js'
export * from './presence.js'
export * from './team.js'
export * from './widgetSettings.js'

View File

@@ -1,42 +0,0 @@
import type { DiscordInteractionResponse } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { InteractionResponse } from '../../types'
export function transformInteractionResponseToDiscordInteractionResponse (
rest: RestManager,
payload: InteractionResponse
): DiscordInteractionResponse {
// If no mentions are provided, force disable mentions
if (payload.data && payload.data?.allowedMentions == null) {
payload.data.allowedMentions = { parse: [] }
}
return {
type: payload.type,
data: payload.data
? {
tts: payload.data.tts,
title: payload.data.title,
flags: payload.data.flags,
content: payload.data.content,
choices: payload.data.choices?.map((choice) =>
rest.transformers.reverse.applicationCommandOptionChoice(
rest,
choice
)
),
custom_id: payload.data.customId,
embeds: payload.data.embeds?.map((embed) =>
rest.transformers.reverse.embed(rest, embed)
),
allowed_mentions: rest.transformers.reverse.allowedMentions(
rest,
payload.data.allowedMentions!
),
components: payload.data.components?.map((component) =>
rest.transformers.reverse.component(rest, component)
)
}
: undefined
}
}

View File

@@ -1,49 +0,0 @@
import type { DiscordMember, DiscordUser } from '@discordeno/types'
import { bigintToSnowflake, iconBigintToHash } from '@discordeno/utils'
import type { RestManager } from '../../restManager.js'
import type { Member, User } from '../member.js'
export function transformUserToDiscordUser (
rest: RestManager,
payload: User
): DiscordUser {
return {
id: bigintToSnowflake(payload.id),
username: payload.username,
discriminator: payload.discriminator,
avatar: payload.avatar ? iconBigintToHash(payload.avatar) : null,
locale: payload.locale,
email: payload.email ?? undefined,
flags: payload.flags,
premium_type: payload.premiumType,
public_flags: payload.publicFlags,
bot: payload.toggles.bot,
system: payload.toggles.system,
mfa_enabled: payload.toggles.mfaEnabled,
verified: payload.toggles.verified
}
}
export function transformMemberToDiscordMember (
rest: RestManager,
payload: Member
): DiscordMember {
return {
nick: payload.nick ?? undefined,
roles: payload.roles.map((id) => bigintToSnowflake(id)),
joined_at: new Date(payload.joinedAt).toISOString(),
premium_since: payload.premiumSince
? new Date(payload.premiumSince).toISOString()
: undefined,
avatar: payload.avatar ? iconBigintToHash(payload.avatar) : undefined,
permissions: payload.permissions
? bigintToSnowflake(payload.permissions)
: undefined,
communication_disabled_until: payload.communicationDisabledUntil
? new Date(payload.communicationDisabledUntil).toISOString()
: undefined,
deaf: payload.toggles.deaf,
mute: payload.toggles.mute,
pending: payload.toggles.pending
}
}

View File

@@ -1,31 +0,0 @@
import type { DiscordPresenceUpdate } from '@discordeno/types'
import { PresenceStatus } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { PresenceUpdate } from '../presence.js'
export const reverseStatusTypes = Object.freeze({
0: 'online',
1: 'dnd',
2: 'idle',
4: 'offline'
} as const)
export function transformPresenceToDiscordPresence (
rest: RestManager,
payload: PresenceUpdate
): DiscordPresenceUpdate {
return {
user: rest.transformers.reverse.user(rest, payload.user),
guild_id: rest.transformers.reverse.snowflake(payload.guildId),
// TODO: find better way
status: (PresenceStatus[payload.status] ?? 'offline') as 'offline',
activities: payload.activities.map((activity) =>
rest.transformers.reverse.activity(rest, activity)
),
client_status: {
desktop: payload.desktop,
mobile: payload.mobile,
web: payload.web
}
}
}

View File

@@ -1,25 +0,0 @@
import type { DiscordTeam } from '@discordeno/types'
import { bigintToSnowflake, iconBigintToHash } from '@discordeno/utils'
import type { RestManager } from '../../restManager.js'
import type { Team } from '../team.js'
export function transformTeamToDiscordTeam (
rest: RestManager,
payload: Team
): DiscordTeam {
const id = bigintToSnowflake(payload.id)
return {
name: payload.name,
id,
icon: payload.icon ? iconBigintToHash(payload.icon) : null,
owner_user_id: bigintToSnowflake(payload.ownerUserId),
members: payload.members.map((member) => ({
membership_state: member.membershipState,
permissions: member.permissions,
team_id: id,
user: rest.transformers.reverse.user(rest, member.user)
}))
}
}

View File

@@ -1,13 +0,0 @@
import type { DiscordGuildWidgetSettings } from '@discordeno/types'
import type { RestManager } from '../../restManager.js'
import type { GuildWidgetSettings } from '../widgetSettings.js'
export function transformWidgetSettingsToDiscordWidgetSettings (
bot: RestManager,
payload: GuildWidgetSettings
): DiscordGuildWidgetSettings {
return {
enabled: payload.enabled,
channel_id: payload.channelId ?? null
}
}

View File

@@ -1,33 +0,0 @@
import type { DiscordRole, Optionalize } from '@discordeno/types'
import { iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
import { RoleToggles } from './toggles/role.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformRole (
rest: RestManager,
payload: { role: DiscordRole } & { guildId: bigint }
) {
const role = {
name: payload.role.name,
guildId: payload.guildId,
position: payload.role.position,
color: payload.role.color,
toggles: new RoleToggles(payload.role),
id: rest.transformers.snowflake(payload.role.id),
botId: payload.role.tags?.bot_id
? rest.transformers.snowflake(payload.role.tags.bot_id)
: undefined,
integrationId: payload.role.tags?.integration_id
? rest.transformers.snowflake(payload.role.tags.integration_id)
: undefined,
permissions: rest.transformers.snowflake(payload.role.permissions),
icon: payload.role.icon ? iconHashToBigInt(payload.role.icon) : undefined,
unicodeEmoji: payload.role.unicode_emoji
}
return role as Optionalize<typeof role>
}
export interface Role extends ReturnType<typeof transformRole> {}

View File

@@ -1,44 +0,0 @@
import type { DiscordScheduledEvent, Optionalize } from '@discordeno/types'
import { iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformScheduledEvent (
rest: RestManager,
payload: DiscordScheduledEvent
) {
const scheduledEvent = {
id: rest.transformers.snowflake(payload.id),
guildId: rest.transformers.snowflake(payload.guild_id),
channelId: payload.channel_id
? rest.transformers.snowflake(payload.channel_id)
: undefined,
creatorId: payload.creator_id
? rest.transformers.snowflake(payload.creator_id)
: 0n,
scheduledStartTime: Date.parse(payload.scheduled_start_time),
scheduledEndTime: payload.scheduled_end_time
? Date.parse(payload.scheduled_end_time)
: undefined,
entityId: payload.entity_id
? rest.transformers.snowflake(payload.entity_id)
: undefined,
creator: payload.creator
? rest.transformers.user(rest, payload.creator)
: undefined,
name: payload.name,
description: payload.description,
privacyLevel: payload.privacy_level,
status: payload.status,
entityType: payload.entity_type,
userCount: payload.user_count ?? 0,
location: payload.entity_metadata?.location,
image: payload.image ? iconHashToBigInt(payload.image) : undefined
}
return scheduledEvent as Optionalize<typeof scheduledEvent>
}
export interface ScheduledEvent
extends ReturnType<typeof transformScheduledEvent> {}

View File

@@ -1,23 +0,0 @@
import type { DiscordStageInstance, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformStageInstance (
rest: RestManager,
payload: DiscordStageInstance
) {
const stageInstance = {
id: rest.transformers.snowflake(payload.id),
guildId: rest.transformers.snowflake(payload.guild_id),
channelId: rest.transformers.snowflake(payload.channel_id),
topic: payload.topic,
guildScheduledEventId: payload.guild_scheduled_event_id
? rest.transformers.snowflake(payload.guild_scheduled_event_id)
: undefined
}
return stageInstance as Optionalize<typeof stageInstance>
}
export interface StageInstance
extends ReturnType<typeof transformStageInstance> {}

View File

@@ -1,53 +0,0 @@
import type {
DiscordSticker,
DiscordStickerPack,
Optionalize
} from '@discordeno/types'
import { snowflakeToBigint } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformSticker (rest: RestManager, payload: DiscordSticker) {
const sticker = {
id: snowflakeToBigint(payload.id),
packId: payload.pack_id ? snowflakeToBigint(payload.pack_id) : undefined,
name: payload.name,
description: payload.description,
tags: payload.tags,
type: payload.type,
formatType: payload.format_type,
available: payload.available,
guildId: payload.guild_id ? snowflakeToBigint(payload.guild_id) : undefined,
user: payload.user ? rest.transformers.user(rest, payload.user) : undefined,
sortValue: payload.sort_value
}
return sticker as Optionalize<typeof sticker>
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformStickerPack (
rest: RestManager,
payload: DiscordStickerPack
) {
const pack = {
id: rest.transformers.snowflake(payload.id),
stickers: payload.stickers.map((sticker) =>
rest.transformers.sticker(rest, sticker)
),
name: payload.name,
skuId: rest.transformers.snowflake(payload.sku_id),
coverStickerId: payload.cover_sticker_id
? rest.transformers.snowflake(payload.cover_sticker_id)
: undefined,
description: payload.description,
bannerAssetId: payload.banner_asset_id
? rest.transformers.snowflake(payload.banner_asset_id)
: undefined
}
return pack as Optionalize<typeof pack>
}
export interface Sticker extends ReturnType<typeof transformSticker> {}
export interface StickerPack extends ReturnType<typeof transformStickerPack> {}

View File

@@ -1,26 +0,0 @@
import type { DiscordTeam, Optionalize } from '@discordeno/types'
import { iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformTeam (rest: RestManager, payload: DiscordTeam) {
const id = rest.transformers.snowflake(payload.id)
const team = {
name: payload.name,
id,
icon: payload.icon ? iconHashToBigInt(payload.icon) : undefined,
ownerUserId: rest.transformers.snowflake(payload.owner_user_id),
members: payload.members.map((member) => ({
membershipState: member.membership_state,
permissions: member.permissions,
teamId: id,
user: rest.transformers.user(rest, member.user)
}))
}
return team as Optionalize<typeof team>
}
export interface Team extends ReturnType<typeof transformTeam> {}

View File

@@ -1,23 +0,0 @@
import type { DiscordTemplate, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformTemplate (rest: RestManager, payload: DiscordTemplate) {
const template = {
code: payload.code,
name: payload.name,
description: payload.description,
usageCount: payload.usage_count,
creatorId: rest.transformers.snowflake(payload.creator_id),
creator: rest.transformers.user(rest, payload.creator),
createdAt: Date.parse(payload.created_at),
updatedAt: Date.parse(payload.updated_at),
sourceGuildId: rest.transformers.snowflake(payload.source_guild_id),
serializedSourceGuild: payload.serialized_source_guild,
isDirty: payload.is_dirty ?? undefined
}
return template as Optionalize<typeof template>
}
export interface Template extends ReturnType<typeof transformTemplate> {}

View File

@@ -1,40 +0,0 @@
import type {
DiscordThreadMember,
DiscordThreadMemberGuildCreate,
Optionalize
} from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformThreadMember (
rest: RestManager,
payload: DiscordThreadMember
) {
const threadMember = {
id: payload.id ? rest.transformers.snowflake(payload.id) : undefined,
userId: payload.user_id
? rest.transformers.snowflake(payload.user_id)
: undefined,
joinTimestamp: Date.parse(payload.join_timestamp),
flags: payload.flags
}
return threadMember as Optionalize<typeof threadMember>
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformThreadMemberGuildCreate (
rest: RestManager,
payload: DiscordThreadMemberGuildCreate
) {
const threadMember = {
joinTimestamp: Date.parse(payload.join_timestamp)
}
return threadMember as Optionalize<typeof threadMember>
}
export interface ThreadMember
extends ReturnType<typeof transformThreadMember> {}
export interface ThreadMemberGuildCreate
extends ReturnType<typeof transformThreadMemberGuildCreate> {}

View File

@@ -1,22 +0,0 @@
import type { DiscordVoiceRegion, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// TODO: Rename `VoiceRegions` to `VoiceRegion`.
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformVoiceRegion (
rest: RestManager,
payload: DiscordVoiceRegion
) {
const voiceRegion = {
id: payload.id,
name: payload.name,
optimal: payload.optimal,
deprecated: payload.deprecated,
custom: payload.custom
}
return voiceRegion as Optionalize<typeof voiceRegion>
}
export interface VoiceRegions extends ReturnType<typeof transformVoiceRegion> {}

View File

@@ -1,34 +0,0 @@
import type { DiscordVoiceState, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
import { VoiceStateToggles } from './toggles/voice.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformVoiceState (
rest: RestManager,
payload: { voiceState: DiscordVoiceState } & { guildId: bigint }
) {
const voiceState = {
toggles: new VoiceStateToggles(payload.voiceState),
requestToSpeakTimestamp: payload.voiceState.request_to_speak_timestamp
? Date.parse(payload.voiceState.request_to_speak_timestamp)
: undefined,
sessionId: payload.voiceState.session_id,
channelId: payload.voiceState.channel_id
? rest.transformers.snowflake(payload.voiceState.channel_id)
: undefined,
guildId:
payload.guildId ||
(payload.voiceState.guild_id
? rest.transformers.snowflake(payload.voiceState.guild_id)
: 0n),
userId: payload.voiceState.user_id
? rest.transformers.snowflake(payload.voiceState.user_id)
: 0n
}
return voiceState as Optionalize<typeof voiceState>
}
export interface VoiceState extends ReturnType<typeof transformVoiceState> {}

View File

@@ -1,46 +0,0 @@
import type { DiscordWebhook, Optionalize } from '@discordeno/types'
import { iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformWebhook (rest: RestManager, payload: DiscordWebhook) {
const webhook = {
id: rest.transformers.snowflake(payload.id),
type: payload.type,
guildId: payload.guild_id
? rest.transformers.snowflake(payload.guild_id)
: undefined,
channelId: payload.channel_id
? rest.transformers.snowflake(payload.channel_id)
: undefined,
user: payload.user ? rest.transformers.user(rest, payload.user) : undefined,
name: payload.name ?? '',
avatar: payload.avatar ? iconHashToBigInt(payload.avatar) : undefined,
token: payload.token,
applicationId: payload.application_id
? rest.transformers.snowflake(payload.application_id)
: undefined,
sourceGuild: payload.source_guild
? {
id: rest.transformers.snowflake(payload.source_guild.id!),
name: payload.source_guild.name!,
icon: payload.source_guild.icon
? iconHashToBigInt(payload.source_guild.icon)
: undefined
}
: undefined,
/** The channel that this webhook is following (returned for Channel Follower Webhooks) */
sourceChannel: payload.source_channel
? {
id: rest.transformers.snowflake(payload.source_channel.id!),
name: payload.source_channel.name ?? ''
}
: undefined,
/** The url used for executing the webhook (returned by the webhooks OAuth2 flow) */
url: payload.url
}
return webhook as Optionalize<typeof webhook>
}
export interface Webhook extends ReturnType<typeof transformWebhook> {}

View File

@@ -1,25 +0,0 @@
import type { DiscordWelcomeScreen, Optionalize } from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformWelcomeScreen (
rest: RestManager,
payload: DiscordWelcomeScreen
) {
const welcomeScreen = {
description: payload.description ?? undefined,
welcomeChannels: payload.welcome_channels.map((channel) => ({
channelId: rest.transformers.snowflake(channel.channel_id),
description: channel.description,
emojiId: channel.emoji_id
? rest.transformers.snowflake(channel.emoji_id)
: undefined,
emojiName: channel.emoji_name ?? undefined
}))
}
return welcomeScreen as Optionalize<typeof welcomeScreen>
}
export interface WelcomeScreen
extends ReturnType<typeof transformWelcomeScreen> {}

View File

@@ -1,33 +0,0 @@
import type { DiscordGuildWidget, Optionalize } from '@discordeno/types'
import { iconHashToBigInt } from '@discordeno/utils'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformWidget (
rest: RestManager,
payload: DiscordGuildWidget
) {
const widget = {
id: rest.transformers.snowflake(payload.id),
name: payload.name,
instant_invite: payload.instant_invite,
channels: payload.channels.map((channel) => ({
id: rest.transformers.snowflake(channel.id),
name: channel.name,
position: channel.position
})),
members: payload.members.map((member) => ({
id: rest.transformers.snowflake(member.id),
username: member.username,
discriminator: member.discriminator,
avatar: member.avatar ? iconHashToBigInt(member.avatar) : undefined,
status: member.status,
avatarUrl: member.avatar_url
})),
presenceCount: payload.presence_count
}
return widget as Optionalize<typeof widget>
}
export interface GuildWidget extends ReturnType<typeof transformWidget> {}

View File

@@ -1,21 +0,0 @@
import type {
DiscordGuildWidgetSettings,
Optionalize
} from '@discordeno/types'
import type { RestManager } from '../restManager.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transformWidgetSettings (
rest: RestManager,
payload: DiscordGuildWidgetSettings
) {
const widget = {
enabled: payload.enabled,
channelId: payload.channel_id ?? undefined
}
return widget as Optionalize<typeof widget>
}
export interface GuildWidgetSettings
extends ReturnType<typeof transformWidgetSettings> {}