diff --git a/template/bigbot/src/bot/types/command.ts b/template/bigbot/src/bot/types/command.ts index 6a15f5d90..8d498a2e8 100644 --- a/template/bigbot/src/bot/types/command.ts +++ b/template/bigbot/src/bot/types/command.ts @@ -190,41 +190,41 @@ export type ConvertArgumentDefinitionsToArgs< [P in keyof T]: T[P] extends StringOptionalArgumentDefinition // STRING ? { [_ in getName]?: T[P]["choices"] extends readonly { name: string; value: string }[] ? // @ts-ignore ts being dumb - T[P]["choices"][number]["value"] + T[P]["choices"][number]["value"] : string; } : T[P] extends StringArgumentDefinition ? { - [_ in getName]: T[P]["choices"] extends readonly { name: string; value: string }[] ? // @ts-ignore ts being dumb - T[P]["choices"][number]["value"] - : string; - } + [_ in getName]: T[P]["choices"] extends readonly { name: string; value: string }[] ? // @ts-ignore ts being dumb + T[P]["choices"][number]["value"] + : string; + } : // INTEGER T[P] extends IntegerOptionalArgumentDefinition ? { - [_ in getName]?: T[P]["choices"] extends readonly { name: string; value: number }[] ? // @ts-ignore ts being dumb - T[P]["choices"][number]["value"] - : number; - } + [_ in getName]?: T[P]["choices"] extends readonly { name: string; value: number }[] ? // @ts-ignore ts being dumb + T[P]["choices"][number]["value"] + : number; + } : T[P] extends IntegerArgumentDefinition ? { - [_ in getName]: T[P]["choices"] extends readonly { name: string; value: number }[] ? // @ts-ignore ts being dumb - T[P]["choices"][number]["value"] - : number; - } + [_ in getName]: T[P]["choices"] extends readonly { name: string; value: number }[] ? // @ts-ignore ts being dumb + T[P]["choices"][number]["value"] + : number; + } : // BOOLEAN T[P] extends BooleanOptionalArgumentDefinition ? { [_ in getName]?: boolean } : T[P] extends BooleanArgumentDefinition ? { [_ in getName]: boolean } : // USER T[P] extends UserOptionalArgumentDefinition ? { - [_ in getName]?: { - user: User; - member: Member; - }; - } + [_ in getName]?: { + user: User; + member: Member; + }; + } : T[P] extends UserArgumentDefinition ? { - [_ in getName]: { - user: User; - member: Member; - }; - } + [_ in getName]: { + user: User; + member: Member; + }; + } : // CHANNEL T[P] extends ChannelOptionalArgumentDefinition ? { [_ in getName]?: Channel } : T[P] extends ChannelArgumentDefinition ? { [_ in getName]: Channel } @@ -233,30 +233,30 @@ export type ConvertArgumentDefinitionsToArgs< : T[P] extends RoleArgumentDefinition ? { [_ in getName]: Role } : // MENTIONABLE T[P] extends MentionableOptionalArgumentDefinition ? { - [_ in getName]?: Role | { - user: User; - member: Member; - }; - } + [_ in getName]?: Role | { + user: User; + member: Member; + }; + } : T[P] extends MentionableArgumentDefinition ? { - [_ in getName]: Role | { - user: User; - member: Member; - }; - } + [_ in getName]: Role | { + user: User; + member: Member; + }; + } : // SUBCOMMAND T[P] extends SubcommandArgumentDefinition ? { - [_ in getName]?: T[P]["options"] extends readonly ArgumentDefinition[] ? // @ts-ignore ignore this for a bit - ConvertArgumentDefinitionsToArgs - : // deno-lint-ignore ban-types - {}; - } + [_ in getName]?: T[P]["options"] extends readonly ArgumentDefinition[] ? // @ts-ignore ignore this for a bit + ConvertArgumentDefinitionsToArgs + : // deno-lint-ignore ban-types + {}; + } : // SUBCOMMAND GROUP T[P] extends SubcommandGroupArgumentDefinition ? { - [_ in getName]?: ConvertArgumentDefinitionsToArgs< - T[P]["options"] - >; - } + [_ in getName]?: ConvertArgumentDefinitionsToArgs< + T[P]["options"] + >; + } : never; }[number] > diff --git a/transformers/reverse/applicationCommand.ts b/transformers/reverse/applicationCommand.ts new file mode 100644 index 000000000..593b7afa6 --- /dev/null +++ b/transformers/reverse/applicationCommand.ts @@ -0,0 +1,26 @@ +import { Bot } from "../../bot.ts"; +import { DiscordApplicationCommand } from "../../deps.ts"; +import { ApplicationCommand } from "../applicationCommand.ts"; + +export function transformApplicationCommandToDiscordApplicationCommand( + bot: Bot, + payload: ApplicationCommand, +): DiscordApplicationCommand { + return { + id: bot.transformers.reverse.snowflake(payload.id), + application_id: bot.transformers.reverse.snowflake(payload.applicationId), + guild_id: payload.guildId ? bot.transformers.reverse.snowflake(payload.guildId) : undefined, + name: payload.name, + name_localizations: payload.nameLocalizations, + description: payload.description, + description_localizations: payload.descriptionLocalizations, + default_member_permissions: payload.defaultMemberPermissions + ? bot.transformers.reverse.snowflake(payload.defaultMemberPermissions) + : null, + dm_permission: payload.dmPermission, + type: payload.type, + version: payload.version, + + options: payload.options?.map((option) => bot.transformers.applicationCommandOption(bot, option)), + }; +} diff --git a/transformers/reverse/applicationCommandOption.ts b/transformers/reverse/applicationCommandOption.ts new file mode 100644 index 000000000..4954b163e --- /dev/null +++ b/transformers/reverse/applicationCommandOption.ts @@ -0,0 +1,24 @@ +import { Bot } from "../../bot.ts"; +import { ApplicationCommandOption } from "../applicationCommandOption.ts"; +import { DiscordApplicationCommandOption } from "../../deps.ts"; + +export function transformApplicationCommandOptionToDiscordApplicationCommandOption( + bot: Bot, + 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) => bot.transformers.reverse.applicationCommandOptionChoice(bot, choice)), + autocomplete: payload.autocomplete, + channel_types: payload.channelTypes, + min_value: payload.minValue, + max_value: payload.maxValue, + + options: payload.options?.map((option) => bot.transformers.reverse.applicationCommandOption(bot, option)), + }; +} diff --git a/transformers/reverse/applicationCommandOptionChoice.ts b/transformers/reverse/applicationCommandOptionChoice.ts new file mode 100644 index 000000000..1a0bed084 --- /dev/null +++ b/transformers/reverse/applicationCommandOptionChoice.ts @@ -0,0 +1,14 @@ +import { Bot } from "../../bot.ts"; +import { DiscordApplicationCommandOptionChoice } from "../../deps.ts"; +import { ApplicationCommandOptionChoice } from "../applicationCommandOptionChoice.ts"; + +export function transformApplicationCommandOptionChoiceToDiscordApplicationCommandOptionChoice( + bot: Bot, + payload: ApplicationCommandOptionChoice, +): DiscordApplicationCommandOptionChoice { + return { + name: payload.name, + name_localizations: payload.nameLocalizations, + value: payload.value, + }; +} diff --git a/transformers/reverse/applicationCommandPermission.ts b/transformers/reverse/applicationCommandPermission.ts new file mode 100644 index 000000000..8629939cd --- /dev/null +++ b/transformers/reverse/applicationCommandPermission.ts @@ -0,0 +1,19 @@ +import { Bot } from "../../bot.ts"; +import { DiscordGuildApplicationCommandPermissions } from "../../deps.ts"; +import { ApplicationCommandPermission } from "../applicationCommandPermission.ts"; + +export function transformApplicationCommandPermissionToDiscordApplicationCommandPermission( + bot: Bot, + payload: ApplicationCommandPermission, +): DiscordGuildApplicationCommandPermissions { + return { + id: bot.transformers.reverse.snowflake(payload.id), + application_id: bot.transformers.reverse.snowflake(payload.applicationId), + guild_id: bot.transformers.reverse.snowflake(payload.guildId), + permissions: payload.permissions.map((perm) => ({ + id: bot.transformers.reverse.snowflake(perm.id), + type: perm.type, + permission: perm.permission, + })), + }; +} diff --git a/transformers/reverse/attachment.ts b/transformers/reverse/attachment.ts new file mode 100644 index 000000000..782004285 --- /dev/null +++ b/transformers/reverse/attachment.ts @@ -0,0 +1,17 @@ +import { Bot } from "../../bot.ts"; +import { DiscordAttachment } from "../../deps.ts"; +import { Attachment } from "../attachment.ts"; + +export function transformAttachmentToDiscordAttachment(bot: Bot, payload: Attachment): DiscordAttachment { + return { + id: bot.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, + }; +} diff --git a/transformers/reverse/auditLogEntry.ts b/transformers/reverse/auditLogEntry.ts new file mode 100644 index 000000000..3a6f5a9dd --- /dev/null +++ b/transformers/reverse/auditLogEntry.ts @@ -0,0 +1,139 @@ +import { Bot } from "../../bot.ts"; +import { DiscordAuditLogEntry } from "../../deps.ts"; +import { AuditLogEntry } from "../auditLogEntry.ts"; + +export function transformAuditLogEntryToDiscordAuditLogEntry(bot: Bot, payload: AuditLogEntry): DiscordAuditLogEntry { + return { + id: bot.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 { + id: bigint | undefined; + name: string | undefined; + }[])?.map((val) => ({ + id: val.id ? bot.transformers.reverse.snowflake(val.id) : undefined, + name: val.name, + })), + old_value: (change.old as { + id: bigint | undefined; + name: string | undefined; + }[] | undefined)?.map((val) => ({ + id: val?.id ? bot.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 ? bot.transformers.reverse.snowflake(change.old as bigint) : "", + new_value: change.new ? bot.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 ? bot.transformers.reverse.snowflake(payload.userId) : null, + target_id: payload.targetId ? bot.transformers.reverse.snowflake(payload.targetId) : null, + action_type: payload.actionType, + options: payload.options + ? { + // respect transformer as reference than type + 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 ? bot.transformers.reverse.snowflake(payload.options.channelId) : "", + message_id: payload.options.messageId ? bot.transformers.reverse.snowflake(payload.options.messageId) : "", + count: payload.options.count === 0 ? payload.options.count.toString() : "", + id: payload.options.id ? bot.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, + }; +} diff --git a/transformers/reverse/emoji.ts b/transformers/reverse/emoji.ts new file mode 100644 index 000000000..d5a70b38d --- /dev/null +++ b/transformers/reverse/emoji.ts @@ -0,0 +1,16 @@ +import { Bot } from "../../bot.ts"; +import { DiscordEmoji } from "../../deps.ts"; +import { Emoji } from "../emoji.ts"; + +export function transformEmojiToDiscordEmoji(bot: Bot, payload: Emoji): DiscordEmoji { + return { + id: payload.id ? bot.transformers.reverse.snowflake(payload.id) : undefined, + name: payload.name || undefined, + roles: payload.roles?.map((id) => bot.transformers.reverse.snowflake(id)), + user: payload.user ? bot.transformers.reverse.user(bot, payload.user) : undefined, + require_colons: payload.toggles.requireColons, + managed: payload.toggles.managed, + animated: payload.toggles.animated, + available: payload.toggles.available, + }; +} diff --git a/transformers/reverse/gatewayBot.ts b/transformers/reverse/gatewayBot.ts new file mode 100644 index 000000000..991764cb2 --- /dev/null +++ b/transformers/reverse/gatewayBot.ts @@ -0,0 +1,15 @@ +import { DiscordGetGatewayBot } from "../../deps.ts"; +import { GetGatewayBot } from "../gatewayBot.ts"; + +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, + }, + }; +} diff --git a/transformers/reverse/mod.ts b/transformers/reverse/mod.ts index 01b32d0f1..33bdbf4d9 100644 --- a/transformers/reverse/mod.ts +++ b/transformers/reverse/mod.ts @@ -1,6 +1,16 @@ export * from "./activity.ts"; export * from "./application.ts"; +export * from "./applicationCommand.ts"; +export * from "./applicationCommandOption.ts"; +export * from "./applicationCommandOptionChoice.ts"; +export * from "./applicationCommandPermission.ts"; +export * from "./attachment.ts"; +export * from "./auditLogEntry.ts"; export * from "./component.ts"; export * from "./embed.ts"; +export * from "./emoji.ts"; +export * from "./gatewayBot.ts"; export * from "./member.ts"; +export * from "./presence.ts"; export * from "./team.ts"; +export * from "./widgetSettings.ts"; diff --git a/transformers/reverse/presence.ts b/transformers/reverse/presence.ts new file mode 100644 index 000000000..4a92e9d8f --- /dev/null +++ b/transformers/reverse/presence.ts @@ -0,0 +1,26 @@ +import { Bot } from "../../bot.ts"; +import { DiscordPresenceUpdate } from "../../deps.ts"; +import { PresenceUpdate } from "../presence.ts"; + +export const reverseStatusTypes = Object.freeze( + { + 0: "online", + 1: "dnd", + 2: "idle", + 4: "offline", + } as const, +); + +export function transformPresenceToDiscordPresence(bot: Bot, payload: PresenceUpdate): DiscordPresenceUpdate { + return { + user: bot.transformers.reverse.user(bot, payload.user), + guild_id: bot.transformers.reverse.snowflake(payload.guildId), + status: reverseStatusTypes[payload.status] ?? "offline", + activities: payload.activities.map((activity) => bot.transformers.reverse.activity(bot, activity)), + client_status: { + desktop: payload.desktop, + mobile: payload.mobile, + web: payload.web, + }, + }; +} diff --git a/transformers/reverse/widgetSettings.ts b/transformers/reverse/widgetSettings.ts new file mode 100644 index 000000000..44348088a --- /dev/null +++ b/transformers/reverse/widgetSettings.ts @@ -0,0 +1,13 @@ +import { Bot } from "../../bot.ts"; +import { DiscordGuildWidgetSettings } from "../../deps.ts"; +import { GuildWidgetSettings } from "../widgetSettings.ts"; + +export function transformWidgetSettingsToDiscordWidgetSettings( + bot: Bot, + payload: GuildWidgetSettings, +): DiscordGuildWidgetSettings { + return { + enabled: payload.enabled, + channel_id: payload.channelId ?? null, + }; +} diff --git a/types/shared.ts b/types/shared.ts index af5b7c5fc..7d4c20d92 100644 --- a/types/shared.ts +++ b/types/shared.ts @@ -1388,7 +1388,7 @@ export type CamelCase = S extends `${infer P1}_${infer P2}${in : Lowercase; export type Camelize = { [K in keyof T as CamelCase]: T[K] extends Array ? U extends {} ? Array> - : T[K] + : T[K] : T[K] extends {} ? Camelize : never; }; @@ -1443,8 +1443,8 @@ export type AnythingBut = Exclude< * object identity type */ export type Id = T extends infer U ? { - [K in keyof U]: U[K]; - } + [K in keyof U]: U[K]; +} : never; export type KeysWithUndefined = { @@ -1468,8 +1468,8 @@ type OptionalizeAux = Id< */ export type Optionalize = T extends object ? T extends Array ? number extends T["length"] ? T[number] extends object ? Array> - : T - : Partial + : T + : Partial : OptionalizeAux : T;