diff --git a/src/handlers/interactions/INTERACTION_CREATE.ts b/src/handlers/interactions/INTERACTION_CREATE.ts index 14444c581..de91da7aa 100644 --- a/src/handlers/interactions/INTERACTION_CREATE.ts +++ b/src/handlers/interactions/INTERACTION_CREATE.ts @@ -3,10 +3,10 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { structures } from "../../structures/mod.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { Interaction } from "../../types/mod.ts"; +import { DiscordInteraction } from "../../types/mod.ts"; export async function handleInteractionCreate(data: DiscordGatewayPayload) { - const payload = data.d as Interaction; + const payload = data.d as DiscordInteraction; const discordenoMember = await structures.createDiscordenoMember( payload.member, payload.guild_id, diff --git a/src/handlers/messages/MESSAGE_CREATE.ts b/src/handlers/messages/MESSAGE_CREATE.ts index d9c716b0b..e1d621554 100644 --- a/src/handlers/messages/MESSAGE_CREATE.ts +++ b/src/handlers/messages/MESSAGE_CREATE.ts @@ -2,15 +2,16 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { structures } from "../../structures/mod.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordMessage } from "../../types/messages/message.ts"; +import { DiscordMessage, Message } from "../../types/messages/message.ts"; +import { snakeKeysToCamelCase } from "../../util/utils.ts"; export async function handleMessageCreate(data: DiscordGatewayPayload) { - const payload = data.d as DiscordMessage; - const channel = await cacheHandlers.get("channels", payload.channel_id); + const payload = snakeKeysToCamelCase(data.d as DiscordMessage) as Message; + const channel = await cacheHandlers.get("channels", payload.channelId); if (channel) channel.lastMessageId = payload.id; - const guild = payload.guild_id - ? await cacheHandlers.get("guilds", payload.guild_id) + const guild = payload.guildId + ? await cacheHandlers.get("guilds", payload.guildId) : undefined; if (payload.member && guild) { diff --git a/src/helpers/members/ban_member.ts b/src/helpers/members/ban_member.ts index 7fafc5698..828d7789f 100644 --- a/src/helpers/members/ban_member.ts +++ b/src/helpers/members/ban_member.ts @@ -1,9 +1,10 @@ import { rest } from "../../rest/rest.ts"; +import { Ban } from "../../types/guilds/ban.ts"; import { endpoints } from "../../util/constants.ts"; import { requireBotGuildPermissions } from "../../util/permissions.ts"; /** Ban a user from the guild and optionally delete previous messages sent by the user. Requires the BAN_MEMBERS permission. */ -export async function ban(guildId: string, id: string, options: BanOptions) { +export async function ban(guildId: string, id: string, options: Ban) { await requireBotGuildPermissions(guildId, ["BAN_MEMBERS"]); const result = await rest.runMethod("put", endpoints.GUILD_BAN(guildId, id), { diff --git a/src/helpers/members/edit_member.ts b/src/helpers/members/edit_member.ts index a6a093892..a849b4653 100644 --- a/src/helpers/members/edit_member.ts +++ b/src/helpers/members/edit_member.ts @@ -3,6 +3,7 @@ import { rest } from "../../rest/rest.ts"; import { structures } from "../../structures/mod.ts"; import { DiscordGuildMember } from "../../types/guilds/guild_member.ts"; import { Errors } from "../../types/misc/errors.ts"; +import { PermissionStrings } from "../../types/permissions/permission_strings.ts"; import { endpoints } from "../../util/constants.ts"; import { requireBotChannelPermissions, @@ -13,9 +14,9 @@ import { export async function editMember( guildId: string, memberId: string, - options: EditMemberOptions, + options: EditMember, ) { - const requiredPerms: Set = new Set(); + const requiredPerms: Set = new Set(); if (options.nick) { if (options.nick.length > 32) { @@ -47,7 +48,7 @@ export async function editMember( } if (options.channel_id) { - const requiredVoicePerms: Set = new Set([ + const requiredVoicePerms: Set = new Set([ "CONNECT", "MOVE_MEMBERS", ]); diff --git a/src/structures/role.ts b/src/structures/role.ts index 480c30676..4dbc534a2 100644 --- a/src/structures/role.ts +++ b/src/structures/role.ts @@ -56,7 +56,7 @@ const baseRole: Partial = { const guild = this.guild; if (!guild) throw new Error(Errors.GUILD_NOT_FOUND); - if (this.guild.ownerId === memberId) return false; + if (guild.ownerId === memberId) return false; const memberHighestRole = await highestRole(guild, memberId); return this.higherThanRole!( diff --git a/src/types/gateway/gateway_payload.ts b/src/types/gateway/gateway_payload.ts index 0bb92461c..47694c6af 100644 --- a/src/types/gateway/gateway_payload.ts +++ b/src/types/gateway/gateway_payload.ts @@ -6,7 +6,51 @@ export interface GatewayPayload { /** Sequence number, used for resuming sessions and heartbeats */ s: number | null; /** The event name for this payload */ - t: string | null; + t: + | "READY" + | "RESUMED" + | "CHANNEL_CREATE" + | "CHANNEL_DELETE" + | "CHANNEL_PINS_UPDATE" + | "CHANNEL_UPDATE" + | "APPLICATION_COMMAND_CREATE" + | "APPLICATION_COMMAND_DELETE" + | "APPLICATION_COMMAND_UPDATE" + | "GUILD_BAN_ADD" + | "GUILD_BAN_REMOVE" + | "GUILD_CREATE" + | "GUILD_DELETE" + | "GUILD_EMOJIS_UPDATE" + | "GUILD_INTEGRATIONS_UPDATE" + | "GUILD_MEMBER_ADD" + | "GUILD_MEMBER_REMOVE" + | "GUILD_MEMBER_UPDATE" + | "GUILD_MEMBERS_CHUNK" + | "GUILD_ROLE_CREATE" + | "GUILD_ROLE_DELETE" + | "GUILD_ROLE_UPDATE" + | "GUILD_UPDATE" + | "INTERACTION_CREATE" + | "INVITE_CREATE" + | "INVITE_DELETE" + | "MESSAGE_CREATE" + | "MESSAGE_DELETE_BULK" + | "MESSAGE_DELETE" + | "MESSAGE_REACTION_ADD" + | "MESSAGE_REACTION_REMOVE_ALL" + | "MESSAGE_REACTION_REMOVE_EMOJI" + | "MESSAGE_REACTION_REMOVE" + | "MESSAGE_UPDATE" + | "PRESENCE_UPDATE" + | "TYPING_START" + | "USER_UPDATE" + | "VOICE_SERVER_UPDATE" + | "VOICE_STATE_UPDATE" + | "WEBHOOKS_UPDATE" + | "INTEGRATION_CREATE" + | "INTEGRATION_UPDATE" + | "INTEGRATION_DELETE" + | null; } /** https://discord.com/developers/docs/topics/gateway#payloads-gateway-payload-structure */ diff --git a/src/ws/handle_on_message.ts b/src/ws/handle_on_message.ts index bf3283b17..db44ef591 100644 --- a/src/ws/handle_on_message.ts +++ b/src/ws/handle_on_message.ts @@ -1,6 +1,8 @@ import { eventHandlers } from "../bot.ts"; import { handlers } from "../handlers/mod.ts"; import { DiscordGatewayOpcodes } from "../types/codes/gateway_opcodes.ts"; +import { DiscordGatewayPayload } from "../types/gateway/gateway_payload.ts"; +import { DiscordHello } from "../types/gateway/hello.ts"; import { DiscordReady } from "../types/gateway/ready.ts"; import { decompressWith } from "./deps.ts"; import { identify } from "./identify.ts"; @@ -24,14 +26,14 @@ export async function handleOnMessage(message: any, shardId: number) { if (typeof message !== "string") return; - const messageData = JSON.parse(message); - ws.log("RAW", messageData); + const messageData = JSON.parse(message) as DiscordGatewayPayload; + ws.log("RAW", { shardId, payload: messageData}); switch (messageData.op) { case DiscordGatewayOpcodes.Hello: ws.heartbeat( shardId, - (messageData.d as DiscordHeartbeat).heartbeat_interval, + (messageData.d as DiscordHello).heartbeat_interval, ); break; case DiscordGatewayOpcodes.HeartbeatACK: @@ -99,6 +101,8 @@ export async function handleOnMessage(message: any, shardId: number) { if (messageData.op !== DiscordGatewayOpcodes.Dispatch) return; + if (!messageData.t) return; + return handlers[messageData.t]?.(messageData, shardId); }