feat: shouldUploadCommands

This commit is contained in:
MARCROCK22 2024-05-12 21:40:27 -04:00
parent 52e03c2cb0
commit 9dec8e50eb
25 changed files with 248 additions and 104 deletions

View File

@ -1,11 +1,10 @@
import type { GatewayIntentBits } from 'discord-api-types/v10'; import type { GatewayIntentBits } from 'discord-api-types/v10';
import type { BaseClient } from '../../../client/base';
import type { UsingClient } from '../../../commands'; import type { UsingClient } from '../../../commands';
import { fakePromise } from '../../../common'; import { fakePromise } from '../../../common';
import type { Cache, ReturnCache } from '../../index'; import type { Cache, ReturnCache } from '../../index';
export class BaseResource<T = any> { export class BaseResource<T = any> {
client!: BaseClient; client!: UsingClient;
namespace = 'base'; namespace = 'base';
constructor( constructor(

View File

@ -1,11 +1,10 @@
import type { GatewayIntentBits } from 'discord-api-types/v10'; import type { GatewayIntentBits } from 'discord-api-types/v10';
import type { BaseClient } from '../../../client/base';
import type { UsingClient } from '../../../commands'; import type { UsingClient } from '../../../commands';
import { fakePromise } from '../../../common'; import { fakePromise } from '../../../common';
import type { Cache, ReturnCache } from '../../index'; import type { Cache, ReturnCache } from '../../index';
export class GuildBasedResource<T = any> { export class GuildBasedResource<T = any> {
client!: BaseClient; client!: UsingClient;
namespace = 'base'; namespace = 'base';
constructor( constructor(

View File

@ -39,6 +39,7 @@ import type {
UserCommandInteraction, UserCommandInteraction,
} from '../structures'; } from '../structures';
import type { ComponentCommand, ComponentContext, ModalCommand, ModalContext } from '../components'; import type { ComponentCommand, ComponentContext, ModalCommand, ModalContext } from '../components';
import { promises } from 'node:fs';
export class BaseClient { export class BaseClient {
rest!: ApiHandler; rest!: ApiHandler;
@ -269,6 +270,13 @@ export class BaseClient {
throw new Error('Function not implemented'); throw new Error('Function not implemented');
} }
shouldUploadCommands(cachePath: string) {
return this.commands!.shouldUpload(cachePath).then(async should => {
if (should) await promises.writeFile(cachePath, JSON.stringify(this.commands!.values.map(x => x.toJSON())));
return should;
});
}
async uploadCommands(applicationId?: string) { async uploadCommands(applicationId?: string) {
applicationId ??= await this.getRC().then(x => x.applicationId ?? this.applicationId); applicationId ??= await this.getRC().then(x => x.applicationId ?? this.applicationId);
BaseClient.assertString(applicationId, 'applicationId is not a string'); BaseClient.assertString(applicationId, 'applicationId is not a string');

View File

@ -8,6 +8,7 @@ import {
type Command, type Command,
type ContextMenuCommand, type ContextMenuCommand,
type ContextOptionsResolved, type ContextOptionsResolved,
type UsingClient,
} from '../commands'; } from '../commands';
import type { import type {
ChatInputCommandInteraction, ChatInputCommandInteraction,
@ -18,11 +19,10 @@ import type {
__InternalReplyFunction, __InternalReplyFunction,
} from '../structures'; } from '../structures';
import { AutocompleteInteraction, BaseInteraction } from '../structures'; import { AutocompleteInteraction, BaseInteraction } from '../structures';
import type { BaseClient } from './base';
import { ComponentContext, ModalContext } from '../components'; import { ComponentContext, ModalContext } from '../components';
export async function onInteractionCreate( export async function onInteractionCreate(
self: BaseClient, self: UsingClient,
body: APIInteraction, body: APIInteraction,
shardId: number, shardId: number,
__reply?: __InternalReplyFunction, __reply?: __InternalReplyFunction,

View File

@ -328,6 +328,7 @@ async function parseOptions(
value = args[i.name]; value = args[i.name];
const option = i as SeyfertStringOption; const option = i as SeyfertStringOption;
if (!value) break; if (!value) break;
console.log({ option, value }, value.length);
if (option.min_length) { if (option.min_length) {
if (value.length < option.min_length) { if (value.length < option.min_length) {
value = undefined; value = undefined;
@ -428,6 +429,7 @@ async function parseOptions(
value, value,
} as APIApplicationCommandInteractionDataOption); } as APIApplicationCommandInteractionDataOption);
} else if (i.required) } else if (i.required)
if (!errors.some(x => x.name === i.name))
errors.push({ errors.push({
error: 'Option is required but returned undefined', error: 'Option is required but returned undefined',
name: i.name, name: i.name,

View File

@ -1,10 +1,21 @@
import { Locale, type LocaleString } from 'discord-api-types/v10'; import {
type APIApplicationCommandOption,
Locale,
type LocaleString,
ApplicationCommandOptionType,
type APIApplicationCommandIntegerOption,
type APIApplicationCommandStringOption,
type APIApplicationCommandSubcommandOption,
type APIApplicationCommandSubcommandGroupOption,
type APIApplicationCommandChannelOption,
} from 'discord-api-types/v10';
import { basename, dirname } from 'node:path'; import { basename, dirname } from 'node:path';
import type { Logger } from '../common'; import type { Logger } from '../common';
import { BaseHandler } from '../common'; import { BaseHandler } from '../common';
import { Command, SubCommand } from './applications/chat'; import { Command, SubCommand } from './applications/chat';
import { ContextMenuCommand } from './applications/menu'; import { ContextMenuCommand } from './applications/menu';
import type { UsingClient } from './applications/shared'; import type { UsingClient } from './applications/shared';
import { promises } from 'node:fs';
export class CommandHandler extends BaseHandler { export class CommandHandler extends BaseHandler {
values: (Command | ContextMenuCommand)[] = []; values: (Command | ContextMenuCommand)[] = [];
@ -37,6 +48,127 @@ export class CommandHandler extends BaseHandler {
} }
} }
protected shouldUploadOption(option: APIApplicationCommandOption, cached: APIApplicationCommandOption) {
if (option.description !== cached.description) return true;
if (option.type !== cached.type) return true;
if (option.required !== cached.required) return true;
if (option.name !== cached.name) return true;
//TODO: locales
switch (option.type) {
case ApplicationCommandOptionType.String:
return (
option.min_length !== (cached as APIApplicationCommandStringOption).min_length ||
option.max_length !== (cached as APIApplicationCommandStringOption).max_length
);
case ApplicationCommandOptionType.Channel:
{
if (option.channel_types?.length !== (cached as APIApplicationCommandChannelOption).channel_types?.length)
return true;
if ('channel_types' in option && 'channel_types' in cached) {
if (!option.channel_types || !cached.channel_types) return true;
return option.channel_types.some(ct => !cached.channel_types!.includes(ct));
}
}
return;
case ApplicationCommandOptionType.Subcommand:
case ApplicationCommandOptionType.SubcommandGroup:
if (
option.options?.length !==
(cached as APIApplicationCommandSubcommandOption | APIApplicationCommandSubcommandGroupOption).options?.length
) {
return true;
}
if (
option.options &&
(cached as APIApplicationCommandSubcommandOption | APIApplicationCommandSubcommandGroupOption).options
)
for (const i of option.options) {
const cachedOption = (
cached as APIApplicationCommandSubcommandOption | APIApplicationCommandSubcommandGroupOption
).options!.find(x => x.name === i.name);
if (!cachedOption) return true;
if (this.shouldUploadOption(i, cachedOption)) return true;
}
break;
case ApplicationCommandOptionType.Integer:
case ApplicationCommandOptionType.Number:
return (
option.min_value !== (cached as APIApplicationCommandIntegerOption).min_value ||
option.max_value !== (cached as APIApplicationCommandIntegerOption).max_value
);
case ApplicationCommandOptionType.Attachment:
case ApplicationCommandOptionType.Boolean:
case ApplicationCommandOptionType.Mentionable:
case ApplicationCommandOptionType.Role:
case ApplicationCommandOptionType.User:
break;
}
return false;
}
async shouldUpload(file: string) {
if (
!(await promises.access(file).then(
() => true,
() => false,
))
) {
await promises.writeFile(file, JSON.stringify(this.values.map(x => x.toJSON())));
return true;
}
const cachedCommands: (ReturnType<Command['toJSON']> | ReturnType<ContextMenuCommand['toJSON']>)[] = JSON.parse(
(await promises.readFile(file)).toString(),
);
if (cachedCommands.length !== this.values.length) return true;
for (const command of this.values.map(x => x.toJSON())) {
const cached = cachedCommands.find(x => {
if (x.name !== command.name) return false;
if (command.guild_id) return command.guild_id.every(id => x.guild_id?.includes(id));
return true;
});
if (!cached) return true;
if (cached.description !== command.description) return true;
if (cached.default_member_permissions !== command.default_member_permissions) return true;
if (cached.type !== command.type) return true;
if (cached.nsfw !== command.nsfw) return true;
if (!!('options' in cached) !== !!('options' in command)) return true;
if (!!cached.contexts !== !!command.contexts) return true;
if (!!cached.integration_types !== !!command.integration_types) return true;
//TODO: locales
if ('contexts' in command && 'contexts' in cached) {
if (command.contexts?.length !== cached.contexts?.length) return true;
if (command.contexts && cached.contexts) {
if (command.contexts.some(ctx => !cached.contexts!.includes(ctx))) return true;
}
}
if ('integration_types' in command && 'integration_types' in cached) {
if (command.integration_types?.length !== cached.integration_types?.length) return true;
if (command.integration_types && cached.integration_types) {
if (command.integration_types.some(ctx => !cached.integration_types!.includes(ctx))) return true;
}
}
if ('options' in command && 'options' in cached) {
if (command.options.length !== cached.options.length) return true;
for (const option of command.options) {
const cachedOption = cached.options.find(x => x.name === option.name);
if (!cachedOption) return true;
if (this.shouldUploadOption(option, cachedOption)) return true;
}
}
}
return false;
}
async load(commandsDir: string, client: UsingClient, instances?: { new (): Command | ContextMenuCommand }[]) { async load(commandsDir: string, client: UsingClient, instances?: { new (): Command | ContextMenuCommand }[]) {
const result = const result =
instances?.map(x => { instances?.map(x => {

View File

@ -1,9 +1,9 @@
import type { GatewayApplicationCommandPermissionsUpdateDispatchData } from 'discord-api-types/v10'; import type { GatewayApplicationCommandPermissionsUpdateDispatchData } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import type { UsingClient } from '../../commands';
export const APPLICATION_COMMAND_PERMISSIONS_UPDATE = ( export const APPLICATION_COMMAND_PERMISSIONS_UPDATE = (
_self: BaseClient, _self: UsingClient,
data: GatewayApplicationCommandPermissionsUpdateDispatchData, data: GatewayApplicationCommandPermissionsUpdateDispatchData,
) => { ) => {
return toCamelCase(data); return toCamelCase(data);

View File

@ -4,25 +4,25 @@ import type {
GatewayAutoModerationRuleDeleteDispatchData, GatewayAutoModerationRuleDeleteDispatchData,
GatewayAutoModerationRuleUpdateDispatchData, GatewayAutoModerationRuleUpdateDispatchData,
} from 'discord-api-types/v10'; } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import { AutoModerationRule } from '../../structures'; import { AutoModerationRule } from '../../structures';
import type { UsingClient } from '../../commands';
export const AUTO_MODERATION_ACTION_EXECUTION = ( export const AUTO_MODERATION_ACTION_EXECUTION = (
_self: BaseClient, _self: UsingClient,
data: GatewayAutoModerationActionExecutionDispatchData, data: GatewayAutoModerationActionExecutionDispatchData,
) => { ) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const AUTO_MODERATION_RULE_CREATE = (self: BaseClient, data: GatewayAutoModerationRuleCreateDispatchData) => { export const AUTO_MODERATION_RULE_CREATE = (self: UsingClient, data: GatewayAutoModerationRuleCreateDispatchData) => {
return new AutoModerationRule(self, data); return new AutoModerationRule(self, data);
}; };
export const AUTO_MODERATION_RULE_DELETE = (self: BaseClient, data: GatewayAutoModerationRuleDeleteDispatchData) => { export const AUTO_MODERATION_RULE_DELETE = (self: UsingClient, data: GatewayAutoModerationRuleDeleteDispatchData) => {
return new AutoModerationRule(self, data); return new AutoModerationRule(self, data);
}; };
export const AUTO_MODERATION_RULE_UPDATE = (self: BaseClient, data: GatewayAutoModerationRuleUpdateDispatchData) => { export const AUTO_MODERATION_RULE_UPDATE = (self: UsingClient, data: GatewayAutoModerationRuleUpdateDispatchData) => {
return new AutoModerationRule(self, data); return new AutoModerationRule(self, data);
}; };

View File

@ -5,25 +5,25 @@ import type {
GatewayChannelUpdateDispatchData, GatewayChannelUpdateDispatchData,
} from 'discord-api-types/v10'; } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import type { AllChannels } from '../../structures'; import type { AllChannels } from '../../structures';
import channelFrom from '../../structures/channels'; import channelFrom from '../../structures/channels';
import type { UsingClient } from '../../commands';
export const CHANNEL_CREATE = (self: BaseClient, data: GatewayChannelCreateDispatchData) => { export const CHANNEL_CREATE = (self: UsingClient, data: GatewayChannelCreateDispatchData) => {
return channelFrom(data, self); return channelFrom(data, self);
}; };
export const CHANNEL_DELETE = (self: BaseClient, data: GatewayChannelDeleteDispatchData) => { export const CHANNEL_DELETE = (self: UsingClient, data: GatewayChannelDeleteDispatchData) => {
return channelFrom(data, self); return channelFrom(data, self);
}; };
export const CHANNEL_PINS_UPDATE = (_self: BaseClient, data: GatewayChannelPinsUpdateDispatchData) => { export const CHANNEL_PINS_UPDATE = (_self: UsingClient, data: GatewayChannelPinsUpdateDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const CHANNEL_UPDATE = async ( export const CHANNEL_UPDATE = async (
self: BaseClient, self: UsingClient,
data: GatewayChannelUpdateDispatchData, data: GatewayChannelUpdateDispatchData,
): Promise<[channel: AllChannels, old?: AllChannels]> => { ): Promise<[channel: AllChannels, old?: AllChannels]> => {
return [channelFrom(data, self), await self.cache.channels?.get(data.id)]; return [channelFrom(data, self), await self.cache.channels?.get(data.id)];

View File

@ -1,10 +1,10 @@
import type { BaseClient } from '../../client/base'; import type { UsingClient } from '../../commands';
import type { ClientUser } from '../../structures'; import type { ClientUser } from '../../structures';
export const BOT_READY = (_self: BaseClient, me: ClientUser) => { export const BOT_READY = (_self: UsingClient, me: ClientUser) => {
return me; return me;
}; };
export const WORKER_READY = (_self: BaseClient, me: ClientUser) => { export const WORKER_READY = (_self: UsingClient, me: ClientUser) => {
return me; return me;
}; };

View File

@ -1,15 +1,15 @@
import type { GatewayDispatchPayload, GatewayReadyDispatchData, GatewayResumedDispatch } from 'discord-api-types/v10'; import type { GatewayDispatchPayload, GatewayReadyDispatchData, GatewayResumedDispatch } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { ClientUser } from '../../structures'; import { ClientUser } from '../../structures';
import type { UsingClient } from '../../commands';
export const READY = (self: BaseClient, data: GatewayReadyDispatchData) => { export const READY = (self: UsingClient, data: GatewayReadyDispatchData) => {
return new ClientUser(self, data.user, data.application); return new ClientUser(self, data.user, data.application);
}; };
export const RESUMED = (_self: BaseClient, _data: GatewayResumedDispatch['d']) => { export const RESUMED = (_self: UsingClient, _data: GatewayResumedDispatch['d']) => {
return; return;
}; };
export const RAW = (_self: BaseClient, data: GatewayDispatchPayload) => { export const RAW = (_self: UsingClient, data: GatewayDispatchPayload) => {
return data; return data;
}; };

View File

@ -1,15 +1,15 @@
import type { APIEntitlement } from 'discord-api-types/v10'; import type { APIEntitlement } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import type { UsingClient } from '../../commands';
export const ENTITLEMENT_CREATE = (_: BaseClient, data: APIEntitlement) => { export const ENTITLEMENT_CREATE = (_: UsingClient, data: APIEntitlement) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const ENTITLEMENT_UPDATE = (_: BaseClient, data: APIEntitlement) => { export const ENTITLEMENT_UPDATE = (_: UsingClient, data: APIEntitlement) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const ENTITLEMENT_DELETE = (_: BaseClient, data: APIEntitlement) => { export const ENTITLEMENT_DELETE = (_: UsingClient, data: APIEntitlement) => {
return toCamelCase(data); return toCamelCase(data);
}; };

View File

@ -20,7 +20,6 @@ import type {
GatewayGuildStickersUpdateDispatchData, GatewayGuildStickersUpdateDispatchData,
GatewayGuildUpdateDispatchData, GatewayGuildUpdateDispatchData,
} from 'discord-api-types/v10'; } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import { import {
Guild, Guild,
@ -32,48 +31,49 @@ import {
User, User,
type GatewayGuildMemberAddDispatchDataFixed, type GatewayGuildMemberAddDispatchDataFixed,
} from '../../structures'; } from '../../structures';
import type { UsingClient } from '../../commands';
export const GUILD_AUDIT_LOG_ENTRY_CREATE = (_self: BaseClient, data: GatewayGuildAuditLogEntryCreateDispatchData) => { export const GUILD_AUDIT_LOG_ENTRY_CREATE = (_self: UsingClient, data: GatewayGuildAuditLogEntryCreateDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const GUILD_BAN_ADD = (self: BaseClient, data: GatewayGuildBanAddDispatchData) => { export const GUILD_BAN_ADD = (self: UsingClient, data: GatewayGuildBanAddDispatchData) => {
return { ...toCamelCase(data), user: new User(self, data.user) }; return { ...toCamelCase(data), user: new User(self, data.user) };
}; };
export const GUILD_BAN_REMOVE = (self: BaseClient, data: GatewayGuildBanRemoveDispatchData) => { export const GUILD_BAN_REMOVE = (self: UsingClient, data: GatewayGuildBanRemoveDispatchData) => {
return { ...toCamelCase(data), user: new User(self, data.user) }; return { ...toCamelCase(data), user: new User(self, data.user) };
}; };
export const GUILD_CREATE = (self: BaseClient, data: GatewayGuildCreateDispatchData) => { export const GUILD_CREATE = (self: UsingClient, data: GatewayGuildCreateDispatchData) => {
return new Guild<'create'>(self, data); return new Guild<'create'>(self, data);
}; };
export const GUILD_DELETE = async (self: BaseClient, data: GatewayGuildDeleteDispatchData) => { export const GUILD_DELETE = async (self: UsingClient, data: GatewayGuildDeleteDispatchData) => {
return (await self.cache.guilds?.get(data.id)) ?? data; return (await self.cache.guilds?.get(data.id)) ?? data;
}; };
export const GUILD_EMOJIS_UPDATE = (self: BaseClient, data: GatewayGuildEmojisUpdateDispatchData) => { export const GUILD_EMOJIS_UPDATE = (self: UsingClient, data: GatewayGuildEmojisUpdateDispatchData) => {
return { return {
...toCamelCase(data), ...toCamelCase(data),
emojis: data.emojis.map(x => new GuildEmoji(self, x, data.guild_id)), emojis: data.emojis.map(x => new GuildEmoji(self, x, data.guild_id)),
}; };
}; };
export const GUILD_INTEGRATIONS_UPDATE = (_self: BaseClient, data: GatewayGuildIntegrationsUpdateDispatchData) => { export const GUILD_INTEGRATIONS_UPDATE = (_self: UsingClient, data: GatewayGuildIntegrationsUpdateDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const GUILD_MEMBER_ADD = (self: BaseClient, data: GatewayGuildMemberAddDispatchDataFixed<boolean>) => { export const GUILD_MEMBER_ADD = (self: UsingClient, data: GatewayGuildMemberAddDispatchDataFixed<boolean>) => {
if (!('user' in data)) return new UnavailableMember(self, data, data.id, data.guild_id); if (!('user' in data)) return new UnavailableMember(self, data, data.id, data.guild_id);
return new GuildMember(self, data, data.user, data.guild_id); return new GuildMember(self, data, data.user, data.guild_id);
}; };
export const GUILD_MEMBER_REMOVE = (self: BaseClient, data: GatewayGuildMemberRemoveDispatchData) => { export const GUILD_MEMBER_REMOVE = (self: UsingClient, data: GatewayGuildMemberRemoveDispatchData) => {
return { ...toCamelCase(data), user: new User(self, data.user) }; return { ...toCamelCase(data), user: new User(self, data.user) };
}; };
export const GUILD_MEMBERS_CHUNK = (self: BaseClient, data: GatewayGuildMembersChunkDispatchData) => { export const GUILD_MEMBERS_CHUNK = (self: UsingClient, data: GatewayGuildMembersChunkDispatchData) => {
return { return {
...toCamelCase(data), ...toCamelCase(data),
members: data.members.map(x => new GuildMember(self, x, x.user!, data.guild_id)), members: data.members.map(x => new GuildMember(self, x, x.user!, data.guild_id)),
@ -81,55 +81,64 @@ export const GUILD_MEMBERS_CHUNK = (self: BaseClient, data: GatewayGuildMembersC
}; };
export const GUILD_MEMBER_UPDATE = async ( export const GUILD_MEMBER_UPDATE = async (
self: BaseClient, self: UsingClient,
data: GatewayGuildMemberUpdateDispatchData, data: GatewayGuildMemberUpdateDispatchData,
): Promise<[member: GuildMember, old?: GuildMember]> => { ): Promise<[member: GuildMember, old?: GuildMember]> => {
const oldData = await self.cache.members?.get(data.user.id, data.guild_id); const oldData = await self.cache.members?.get(data.user.id, data.guild_id);
return [new GuildMember(self, data, data.user, data.guild_id), oldData]; return [new GuildMember(self, data, data.user, data.guild_id), oldData];
}; };
export const GUILD_SCHEDULED_EVENT_CREATE = (_self: BaseClient, data: GatewayGuildScheduledEventCreateDispatchData) => { export const GUILD_SCHEDULED_EVENT_CREATE = (
_self: UsingClient,
data: GatewayGuildScheduledEventCreateDispatchData,
) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const GUILD_SCHEDULED_EVENT_UPDATE = (_self: BaseClient, data: GatewayGuildScheduledEventUpdateDispatchData) => { export const GUILD_SCHEDULED_EVENT_UPDATE = (
_self: UsingClient,
data: GatewayGuildScheduledEventUpdateDispatchData,
) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const GUILD_SCHEDULED_EVENT_DELETE = (_self: BaseClient, data: GatewayGuildScheduledEventDeleteDispatchData) => { export const GUILD_SCHEDULED_EVENT_DELETE = (
_self: UsingClient,
data: GatewayGuildScheduledEventDeleteDispatchData,
) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const GUILD_SCHEDULED_EVENT_USER_ADD = ( export const GUILD_SCHEDULED_EVENT_USER_ADD = (
_self: BaseClient, _self: UsingClient,
data: GatewayGuildScheduledEventUserAddDispatchData, data: GatewayGuildScheduledEventUserAddDispatchData,
) => { ) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const GUILD_SCHEDULED_EVENT_USER_REMOVE = ( export const GUILD_SCHEDULED_EVENT_USER_REMOVE = (
_self: BaseClient, _self: UsingClient,
data: GatewayGuildScheduledEventUserRemoveDispatchData, data: GatewayGuildScheduledEventUserRemoveDispatchData,
) => { ) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const GUILD_ROLE_CREATE = (self: BaseClient, data: GatewayGuildRoleCreateDispatchData) => { export const GUILD_ROLE_CREATE = (self: UsingClient, data: GatewayGuildRoleCreateDispatchData) => {
return new GuildRole(self, data.role, data.guild_id); return new GuildRole(self, data.role, data.guild_id);
}; };
export const GUILD_ROLE_DELETE = async (self: BaseClient, data: GatewayGuildRoleDeleteDispatchData) => { export const GUILD_ROLE_DELETE = async (self: UsingClient, data: GatewayGuildRoleDeleteDispatchData) => {
return (await self.cache.roles?.get(data.role_id)) || toCamelCase(data); return (await self.cache.roles?.get(data.role_id)) || toCamelCase(data);
}; };
export const GUILD_ROLE_UPDATE = async ( export const GUILD_ROLE_UPDATE = async (
self: BaseClient, self: UsingClient,
data: GatewayGuildRoleUpdateDispatchData, data: GatewayGuildRoleUpdateDispatchData,
): Promise<[role: GuildRole, old?: GuildRole]> => { ): Promise<[role: GuildRole, old?: GuildRole]> => {
return [new GuildRole(self, data.role, data.guild_id), await self.cache.roles?.get(data.role.id)]; return [new GuildRole(self, data.role, data.guild_id), await self.cache.roles?.get(data.role.id)];
}; };
export const GUILD_STICKERS_UPDATE = (self: BaseClient, data: GatewayGuildStickersUpdateDispatchData) => { export const GUILD_STICKERS_UPDATE = (self: UsingClient, data: GatewayGuildStickersUpdateDispatchData) => {
return { return {
...toCamelCase(data), ...toCamelCase(data),
stickers: data.stickers.map(x => new Sticker(self, x)), stickers: data.stickers.map(x => new Sticker(self, x)),
@ -137,7 +146,7 @@ export const GUILD_STICKERS_UPDATE = (self: BaseClient, data: GatewayGuildSticke
}; };
export const GUILD_UPDATE = async ( export const GUILD_UPDATE = async (
self: BaseClient, self: UsingClient,
data: GatewayGuildUpdateDispatchData, data: GatewayGuildUpdateDispatchData,
): Promise<[guild: Guild, old?: Guild<'cached'>]> => { ): Promise<[guild: Guild, old?: Guild<'cached'>]> => {
return [new Guild(self, data), await self.cache.guilds?.get(data.id)]; return [new Guild(self, data), await self.cache.guilds?.get(data.id)];

View File

@ -3,11 +3,11 @@ import type {
GatewayIntegrationDeleteDispatchData, GatewayIntegrationDeleteDispatchData,
GatewayIntegrationUpdateDispatchData, GatewayIntegrationUpdateDispatchData,
} from 'discord-api-types/v10'; } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import { User } from '../../structures'; import { User } from '../../structures';
import type { UsingClient } from '../../commands';
export const INTEGRATION_CREATE = (self: BaseClient, data: GatewayIntegrationCreateDispatchData) => { export const INTEGRATION_CREATE = (self: UsingClient, data: GatewayIntegrationCreateDispatchData) => {
return data.user return data.user
? { ? {
...toCamelCase(data), ...toCamelCase(data),
@ -16,7 +16,7 @@ export const INTEGRATION_CREATE = (self: BaseClient, data: GatewayIntegrationCre
: toCamelCase(data); : toCamelCase(data);
}; };
export const INTEGRATION_UPDATE = (self: BaseClient, data: GatewayIntegrationUpdateDispatchData) => { export const INTEGRATION_UPDATE = (self: UsingClient, data: GatewayIntegrationUpdateDispatchData) => {
return data.user return data.user
? { ? {
...toCamelCase(data), ...toCamelCase(data),
@ -26,7 +26,7 @@ export const INTEGRATION_UPDATE = (self: BaseClient, data: GatewayIntegrationUpd
}; };
export const INTEGRATION_DELETE = ( export const INTEGRATION_DELETE = (
_self: BaseClient, _self: UsingClient,
data: GatewayIntegrationDeleteDispatchData, data: GatewayIntegrationDeleteDispatchData,
) => { ) => {

View File

@ -1,7 +1,7 @@
import type { GatewayInteractionCreateDispatchData } from 'discord-api-types/v10'; import type { GatewayInteractionCreateDispatchData } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { BaseInteraction } from '../../structures'; import { BaseInteraction } from '../../structures';
import type { UsingClient } from '../../commands';
export const INTERACTION_CREATE = (self: BaseClient, data: GatewayInteractionCreateDispatchData) => { export const INTERACTION_CREATE = (self: UsingClient, data: GatewayInteractionCreateDispatchData) => {
return BaseInteraction.from(self, data); return BaseInteraction.from(self, data);
}; };

View File

@ -1,12 +1,11 @@
import type { GatewayInviteCreateDispatchData, GatewayInviteDeleteDispatchData } from 'discord-api-types/v10'; import type { GatewayInviteCreateDispatchData, GatewayInviteDeleteDispatchData } from 'discord-api-types/v10';
import type { UsingClient } from '../../commands';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
export const INVITE_CREATE = (_self: BaseClient, data: GatewayInviteCreateDispatchData) => { export const INVITE_CREATE = (_self: UsingClient, data: GatewayInviteCreateDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const INVITE_DELETE = (_self: BaseClient, data: GatewayInviteDeleteDispatchData) => { export const INVITE_DELETE = (_self: UsingClient, data: GatewayInviteDeleteDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };

View File

@ -10,46 +10,46 @@ import type {
GatewayMessageReactionRemoveEmojiDispatchData, GatewayMessageReactionRemoveEmojiDispatchData,
GatewayMessageUpdateDispatchData, GatewayMessageUpdateDispatchData,
} from 'discord-api-types/v10'; } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { type MakeRequired, type PartialClass, toCamelCase } from '../../common'; import { type MakeRequired, type PartialClass, toCamelCase } from '../../common';
import { Message } from '../../structures'; import { Message } from '../../structures';
import type { UsingClient } from '../../commands';
export const MESSAGE_CREATE = (self: BaseClient, data: GatewayMessageCreateDispatchData) => { export const MESSAGE_CREATE = (self: UsingClient, data: GatewayMessageCreateDispatchData) => {
return new Message(self, data); return new Message(self, data);
}; };
export const MESSAGE_DELETE = async (self: BaseClient, data: GatewayMessageDeleteDispatchData) => { export const MESSAGE_DELETE = async (self: UsingClient, data: GatewayMessageDeleteDispatchData) => {
return (await self.cache.messages?.get(data.id)) ?? toCamelCase(data); return (await self.cache.messages?.get(data.id)) ?? toCamelCase(data);
}; };
export const MESSAGE_DELETE_BULK = async (self: BaseClient, data: GatewayMessageDeleteBulkDispatchData) => { export const MESSAGE_DELETE_BULK = async (self: UsingClient, data: GatewayMessageDeleteBulkDispatchData) => {
return { return {
...data, ...data,
messages: await Promise.all(data.ids.map(id => self.cache.messages?.get(id))), messages: await Promise.all(data.ids.map(id => self.cache.messages?.get(id))),
}; };
}; };
export const MESSAGE_REACTION_ADD = (_self: BaseClient, data: GatewayMessageReactionAddDispatchData) => { export const MESSAGE_REACTION_ADD = (_self: UsingClient, data: GatewayMessageReactionAddDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const MESSAGE_REACTION_REMOVE = (_self: BaseClient, data: GatewayMessageReactionRemoveDispatchData) => { export const MESSAGE_REACTION_REMOVE = (_self: UsingClient, data: GatewayMessageReactionRemoveDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const MESSAGE_REACTION_REMOVE_ALL = (_self: BaseClient, data: GatewayMessageReactionRemoveAllDispatchData) => { export const MESSAGE_REACTION_REMOVE_ALL = (_self: UsingClient, data: GatewayMessageReactionRemoveAllDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const MESSAGE_REACTION_REMOVE_EMOJI = ( export const MESSAGE_REACTION_REMOVE_EMOJI = (
_self: BaseClient, _self: UsingClient,
data: GatewayMessageReactionRemoveEmojiDispatchData, data: GatewayMessageReactionRemoveEmojiDispatchData,
) => { ) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const MESSAGE_UPDATE = async ( export const MESSAGE_UPDATE = async (
self: BaseClient, self: UsingClient,
data: GatewayMessageUpdateDispatchData, data: GatewayMessageUpdateDispatchData,
): Promise< ): Promise<
[ [
@ -74,10 +74,10 @@ export const MESSAGE_UPDATE = async (
return [new Message(self, data as APIMessage), await self.cache.messages?.get(data.id)]; return [new Message(self, data as APIMessage), await self.cache.messages?.get(data.id)];
}; };
export const MESSAGE_POLL_VOTE_ADD = (_: BaseClient, data: GatewayMessagePollVoteDispatchData) => { export const MESSAGE_POLL_VOTE_ADD = (_: UsingClient, data: GatewayMessagePollVoteDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const MESSAGE_POLL_VOTE_REMOVE = (_: BaseClient, data: GatewayMessagePollVoteDispatchData) => { export const MESSAGE_POLL_VOTE_REMOVE = (_: UsingClient, data: GatewayMessagePollVoteDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };

View File

@ -1,8 +1,7 @@
import type { GatewayPresenceUpdateDispatchData } from 'discord-api-types/v10'; import type { GatewayPresenceUpdateDispatchData } from 'discord-api-types/v10';
import type { UsingClient } from '../../commands';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
export const PRESENCE_UPDATE = async (self: BaseClient, data: GatewayPresenceUpdateDispatchData) => { export const PRESENCE_UPDATE = async (self: UsingClient, data: GatewayPresenceUpdateDispatchData) => {
return [toCamelCase(data), await self.cache.presences?.get(data.user.id)]; return [toCamelCase(data), await self.cache.presences?.get(data.user.id)];
}; };

View File

@ -3,21 +3,20 @@ import type {
GatewayStageInstanceDeleteDispatchData, GatewayStageInstanceDeleteDispatchData,
GatewayStageInstanceUpdateDispatchData, GatewayStageInstanceUpdateDispatchData,
} from 'discord-api-types/v10'; } from 'discord-api-types/v10';
import type { UsingClient } from '../../commands';
import type { BaseClient } from '../../client/base';
import { type ObjectToLower, toCamelCase } from '../../common'; import { type ObjectToLower, toCamelCase } from '../../common';
import type { StageInstances } from '../../cache/resources/stage-instances'; import type { StageInstances } from '../../cache/resources/stage-instances';
export const STAGE_INSTANCE_CREATE = (_self: BaseClient, data: GatewayStageInstanceCreateDispatchData) => { export const STAGE_INSTANCE_CREATE = (_self: UsingClient, data: GatewayStageInstanceCreateDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const STAGE_INSTANCE_DELETE = (_self: BaseClient, data: GatewayStageInstanceDeleteDispatchData) => { export const STAGE_INSTANCE_DELETE = (_self: UsingClient, data: GatewayStageInstanceDeleteDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const STAGE_INSTANCE_UPDATE = async ( export const STAGE_INSTANCE_UPDATE = async (
self: BaseClient, self: UsingClient,
data: GatewayStageInstanceUpdateDispatchData, data: GatewayStageInstanceUpdateDispatchData,
): Promise<[stage: ObjectToLower<GatewayStageInstanceUpdateDispatchData>, old?: ReturnType<StageInstances['get']>]> => { ): Promise<[stage: ObjectToLower<GatewayStageInstanceUpdateDispatchData>, old?: ReturnType<StageInstances['get']>]> => {
return [toCamelCase(data), await self.cache.stageInstances?.get(data.id)]; return [toCamelCase(data), await self.cache.stageInstances?.get(data.id)];

View File

@ -6,32 +6,32 @@ import type {
GatewayThreadMembersUpdateDispatchData, GatewayThreadMembersUpdateDispatchData,
GatewayThreadUpdateDispatchData, GatewayThreadUpdateDispatchData,
} from 'discord-api-types/v10'; } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import { ThreadChannel } from '../../structures'; import { ThreadChannel } from '../../structures';
import type { UsingClient } from '../../commands';
export const THREAD_CREATE = (self: BaseClient, data: GatewayThreadCreateDispatchData) => { export const THREAD_CREATE = (self: UsingClient, data: GatewayThreadCreateDispatchData) => {
return new ThreadChannel(self, data); return new ThreadChannel(self, data);
}; };
export const THREAD_DELETE = (self: BaseClient, data: GatewayThreadDeleteDispatchData) => { export const THREAD_DELETE = (self: UsingClient, data: GatewayThreadDeleteDispatchData) => {
return new ThreadChannel(self, data); return new ThreadChannel(self, data);
}; };
export const THREAD_LIST_SYNC = (_self: BaseClient, data: GatewayThreadListSyncDispatchData) => { export const THREAD_LIST_SYNC = (_self: UsingClient, data: GatewayThreadListSyncDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const THREAD_MEMBER_UPDATE = (_self: BaseClient, data: GatewayThreadMemberUpdateDispatchData) => { export const THREAD_MEMBER_UPDATE = (_self: UsingClient, data: GatewayThreadMemberUpdateDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const THREAD_MEMBERS_UPDATE = (_self: BaseClient, data: GatewayThreadMembersUpdateDispatchData) => { export const THREAD_MEMBERS_UPDATE = (_self: UsingClient, data: GatewayThreadMembersUpdateDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const THREAD_UPDATE = async ( export const THREAD_UPDATE = async (
self: BaseClient, self: UsingClient,
data: GatewayThreadUpdateDispatchData, data: GatewayThreadUpdateDispatchData,
): Promise<[thread: ThreadChannel, old?: ThreadChannel]> => { ): Promise<[thread: ThreadChannel, old?: ThreadChannel]> => {
return [new ThreadChannel(self, data), await self.cache.threads?.get(data.id)]; return [new ThreadChannel(self, data), await self.cache.threads?.get(data.id)];

View File

@ -1,10 +1,9 @@
import type { GatewayTypingStartDispatchData } from 'discord-api-types/v10'; import type { GatewayTypingStartDispatchData } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import { GuildMember } from '../../structures'; import { GuildMember } from '../../structures';
import type { UsingClient } from '../../commands';
export const TYPING_START = (self: BaseClient, data: GatewayTypingStartDispatchData) => { export const TYPING_START = (self: UsingClient, data: GatewayTypingStartDispatchData) => {
return data.member return data.member
? { ? {
...toCamelCase(data), ...toCamelCase(data),

View File

@ -1,9 +1,9 @@
import type { GatewayUserUpdateDispatchData } from 'discord-api-types/v10'; import type { GatewayUserUpdateDispatchData } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { User } from '../../structures'; import { User } from '../../structures';
import type { UsingClient } from '../../commands';
export const USER_UPDATE = async ( export const USER_UPDATE = async (
self: BaseClient, self: UsingClient,
data: GatewayUserUpdateDispatchData, data: GatewayUserUpdateDispatchData,
): Promise<[user: User, old?: User]> => { ): Promise<[user: User, old?: User]> => {
return [new User(self, data), await self.cache.users?.get(data.id)]; return [new User(self, data), await self.cache.users?.get(data.id)];

View File

@ -1,14 +1,14 @@
import type { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from '../../types'; import type { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from '../../types';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import { VoiceState } from '../../structures'; import { VoiceState } from '../../structures';
import type { UsingClient } from '../../commands';
export const VOICE_SERVER_UPDATE = (_self: BaseClient, data: GatewayVoiceServerUpdateDispatchData) => { export const VOICE_SERVER_UPDATE = (_self: UsingClient, data: GatewayVoiceServerUpdateDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };
export const VOICE_STATE_UPDATE = async ( export const VOICE_STATE_UPDATE = async (
self: BaseClient, self: UsingClient,
data: GatewayVoiceStateUpdateDispatchData, data: GatewayVoiceStateUpdateDispatchData,
): Promise<[VoiceState] | [state: VoiceState, old?: VoiceState]> => { ): Promise<[VoiceState] | [state: VoiceState, old?: VoiceState]> => {
if (!data.guild_id) return [new VoiceState(self, data)]; if (!data.guild_id) return [new VoiceState(self, data)];

View File

@ -1,7 +1,7 @@
import type { GatewayWebhooksUpdateDispatchData } from 'discord-api-types/v10'; import type { GatewayWebhooksUpdateDispatchData } from 'discord-api-types/v10';
import type { BaseClient } from '../../client/base';
import { toCamelCase } from '../../common'; import { toCamelCase } from '../../common';
import type { UsingClient } from '../../commands';
export const WEBHOOKS_UPDATE = (_self: BaseClient, data: GatewayWebhooksUpdateDispatchData) => { export const WEBHOOKS_UPDATE = (_self: UsingClient, data: GatewayWebhooksUpdateDispatchData) => {
return toCamelCase(data); return toCamelCase(data);
}; };

View File

@ -57,7 +57,6 @@ import { User } from './User';
import channelFrom from './channels'; import channelFrom from './channels';
import { DiscordBase } from './extra/DiscordBase'; import { DiscordBase } from './extra/DiscordBase';
import { PermissionsBitField } from './extra/Permissions'; import { PermissionsBitField } from './extra/Permissions';
import type { BaseClient } from '../client/base';
export type ReplyInteractionBody = export type ReplyInteractionBody =
| { type: InteractionResponseType.Modal; data: ModalCreateBodyRequest } | { type: InteractionResponseType.Modal; data: ModalCreateBodyRequest }
@ -115,7 +114,7 @@ export class BaseInteraction<
this.user = this.member?.user ?? new User(client, interaction.user!); this.user = this.member?.user ?? new User(client, interaction.user!);
} }
static transformBodyRequest(body: ReplyInteractionBody, self: BaseClient): APIInteractionResponse { static transformBodyRequest(body: ReplyInteractionBody, self: UsingClient): APIInteractionResponse {
switch (body.type) { switch (body.type) {
case InteractionResponseType.ApplicationCommandAutocompleteResult: case InteractionResponseType.ApplicationCommandAutocompleteResult:
case InteractionResponseType.DeferredMessageUpdate: case InteractionResponseType.DeferredMessageUpdate: