diff --git a/handlers/Actions.ts b/handlers/Actions.ts index e9ec833..1e1fa36 100644 --- a/handlers/Actions.ts +++ b/handlers/Actions.ts @@ -1,39 +1,64 @@ -import type { DiscordMessage, DiscordReady } from "../vendor/external.ts"; +import type { + DiscordGuildMemberAdd, + DiscordGuildMemberRemove, + DiscordGuildMemberUpdate, + DiscordMessage, + DiscordMessageDelete, + DiscordReady, +} from "../vendor/external.ts"; import type { Snowflake } from "../util/Snowflake.ts"; import type { Session } from "../session/Session.ts"; +import Member from "../structures/Member.ts"; import Message from "../structures/Message.ts"; +import User from "../structures/User.ts"; -export type RawHandler = (...args: [Session, number, ...T]) => void; +export type RawHandler = (...args: [Session, number, T]) => void; export type Handler = (...args: T) => unknown; -export type Ready = [DiscordReady]; -export const READY: RawHandler = (session, shardId, payload) => { - session.emit("ready", payload, shardId); +export const READY: RawHandler = (session, shardId, payload) => { + session.emit("ready", { ...payload, user: new User(session, payload.user) }, shardId); }; -export type MessageCreate = [DiscordMessage]; -export const MESSAGE_CREATE: RawHandler = (session, _shardId, message) => { +export const MESSAGE_CREATE: RawHandler = (session, _shardId, message) => { session.emit("messageCreate", new Message(session, message)); }; -export type MessageUpdate = [DiscordMessage]; -export const MESSAGE_UPDATE: RawHandler = (session, _shardId, new_message) => { +export const MESSAGE_UPDATE: RawHandler = (session, _shardId, new_message) => { session.emit("messageUpdate", new Message(session, new_message)); }; -export type MessageDelete = [Snowflake]; -export const MESSAGE_DELETE: RawHandler = (session, _shardId, deleted_message_id) => { - session.emit("messageDelete", deleted_message_id); +export const MESSAGE_DELETE: RawHandler = (session, _shardId, { id, channel_id, guild_id }) => { + session.emit("messageDelete", { id, channelId: channel_id, guildId: guild_id }); }; -export const raw: RawHandler<[unknown]> = (session, shardId, data) => { +export const GUILD_MEMBER_ADD: RawHandler = (session, _shardId, member) => { + session.emit("guildMemberAdd", new Member(session, member, member.guild_id)); +}; + +export const GUILD_MEMBER_UPDATE: RawHandler = (session, _shardId, member) => { + session.emit("guildMemberUpdate", new Member(session, member, member.guild_id)); +}; + +export const GUILD_MEMBER_REMOVE: RawHandler = (session, _shardId, member) => { + session.emit("guildMemberRemove", new User(session, member.user), member.guild_id); +}; + +export const raw: RawHandler = (session, shardId, data) => { session.emit("raw", data, shardId); }; -export interface Events { - "ready": Handler<[DiscordReady, number]>; - "messageCreate": Handler<[Message]>; - "messageUpdate": Handler<[Message]>; - "messageDelete": Handler<[Snowflake]>; - "raw": Handler<[unknown]>; +export interface Ready extends Omit { + user: User; +} + +// deno-fmt-ignore-file +export interface Events { + "ready": Handler<[Ready, number]>; + "messageCreate": Handler<[Message]>; + "messageUpdate": Handler<[Message]>; + "messageDelete": Handler<[{ id: Snowflake, channelId: Snowflake, guildId?: Snowflake }]>; + "guildMemberAdd": Handler<[Member]>; + "guildMemberUpdate": Handler<[Member]>; + "guildMemberRemove": Handler<[User, Snowflake]>; + "raw": Handler<[unknown, number]>; } diff --git a/session/Session.ts b/session/Session.ts index 31263fb..fe7a188 100644 --- a/session/Session.ts +++ b/session/Session.ts @@ -89,6 +89,11 @@ export class Session extends EventEmitter { return super.once(event, func); } + override emit(event: K, ...params: Parameters): boolean; + override emit(event: K, ...params: unknown[]): boolean { + return super.emit(event, ...params); + } + async start() { const getGatewayBot = () => this.rest.runMethod(this.rest, "GET", Routes.GATEWAY_BOT()); diff --git a/structures/Member.ts b/structures/Member.ts index 355d9d4..e3d302e 100644 --- a/structures/Member.ts +++ b/structures/Member.ts @@ -1,7 +1,7 @@ import type { Model } from "./Base.ts"; import type { Snowflake } from "../util/Snowflake.ts"; import type { Session } from "../session/Session.ts"; -import type { DiscordMember, MakeRequired } from "../vendor/external.ts"; +import type { DiscordMemberWithUser } from "../vendor/external.ts"; import type { ImageFormat, ImageSize } from "../util/shared/images.ts"; import { iconBigintToHash, iconHashToBigInt } from "../util/hash.ts"; import User from "./User.ts"; @@ -23,9 +23,10 @@ export interface CreateGuildBan { * @link https://discord.com/developers/docs/resources/guild#guild-member-object */ export class Member implements Model { - constructor(session: Session, data: MakeRequired) { + constructor(session: Session, data: DiscordMemberWithUser, guildId: Snowflake) { this.session = session; this.user = new User(session, data.user); + this.guildId = guildId; this.avatarHash = data.avatar ? iconHashToBigInt(data.avatar) : undefined; this.nickname = data.nick ? data.nick : undefined; this.joinedTimestamp = Number.parseInt(data.joined_at); @@ -39,8 +40,8 @@ export class Member implements Model { } readonly session: Session; - user: User; + guildId: Snowflake; avatarHash?: bigint; nickname?: string; joinedTimestamp: number; @@ -66,11 +67,11 @@ export class Member implements Model { /** * Bans the member */ - async ban(guildId: Snowflake, options: CreateGuildBan): Promise { + async ban(options: CreateGuildBan): Promise { await this.session.rest.runMethod( this.session.rest, "PUT", - Routes.GUILD_BAN(guildId, this.id), + Routes.GUILD_BAN(this.guildId, this.id), options ? { delete_message_days: options.deleteMessageDays, @@ -85,11 +86,11 @@ export class Member implements Model { /** * Kicks the member */ - async kick(guildId: Snowflake, { reason }: { reason?: string }): Promise { + async kick({ reason }: { reason?: string }): Promise { await this.session.rest.runMethod( this.session.rest, "DELETE", - Routes.GUILD_MEMBER(guildId, this.id), + Routes.GUILD_MEMBER(this.guildId, this.id), { reason }, );