diff --git a/packages/biscuit/Actions.ts b/packages/biscuit/Actions.ts index b709299..db5b49d 100644 --- a/packages/biscuit/Actions.ts +++ b/packages/biscuit/Actions.ts @@ -25,6 +25,7 @@ import type { DiscordMessageReactionRemove, DiscordMessageReactionRemoveAll, DiscordMessageReactionRemoveEmoji, + DiscordPresenceUpdate, DiscordReady, DiscordRole, DiscordScheduledEvent, @@ -47,6 +48,7 @@ import { AutoModerationExecution } from "./structures/AutoModerationExecution.ts import { type Channel, ChannelFactory, GuildChannel, ThreadChannel } from "./structures/channels.ts"; import { type DiscordStageInstance, StageInstance } from "./structures/StageInstance.ts"; import { ScheduledEvent } from "./structures/GuildScheduledEvent.ts"; +import { Presence } from "./structures/Presence.ts"; import ThreadMember from "./structures/ThreadMember.ts"; import Member from "./structures/Member.ts"; @@ -210,6 +212,10 @@ export const USER_UPDATE: RawHandler = (session, _shardId, payload) session.emit("userUpdate", new User(session, payload)); }; +export const PRESENCE_UPDATE: RawHandler = (session, _shardId, payload) => { + session.emit("presenceUpdate", new Presence(session, payload)); +}; + export const WEBHOOKS_UPDATE: RawHandler = (session, _shardId, webhook) => { session.emit("webhooksUpdate", { guildId: webhook.guild_id, channelId: webhook.channel_id }); }; @@ -400,4 +406,5 @@ export interface Events { "raw": Handler<[unknown, number]>; "webhooksUpdate": Handler<[{ guildId: Snowflake, channelId: Snowflake }]>; "userUpdate": Handler<[User]>; + "presenceUpdate": Handler<[Presence]>; } diff --git a/packages/biscuit/structures/Presence.ts b/packages/biscuit/structures/Presence.ts new file mode 100644 index 0000000..df9fa62 --- /dev/null +++ b/packages/biscuit/structures/Presence.ts @@ -0,0 +1,84 @@ +import type { + ActivityTypes, + DiscordActivityButton, + DiscordActivitySecrets, + DiscordClientStatus, + DiscordPresenceUpdate, +} from "../../discordeno/mod.ts"; +import type { Session } from "../Session.ts"; +import { User } from "./User.ts"; +import { Snowflake } from "../Snowflake.ts"; +import type { ComponentEmoji } from "../Util.ts"; + +export interface ActivityAssets { + largeImage?: string; + largeText?: string; + smallImage?: string; + smallText?: string; +} + +export interface Activities { + name: string; + type: ActivityTypes; + url?: string; + createdAt: number; + timestamps?: { + start?: number; + end?: number; + }; + applicationId: Snowflake; + details?: string; + state?: string; + emoji?: ComponentEmoji; + party?: { + id?: string; + size?: number[]; + }; + assets?: ActivityAssets; + secrets?: DiscordActivitySecrets; + instance?: boolean; + flags?: number; + buttons?: DiscordActivityButton; +} + +export class Presence { + constructor(session: Session, data: DiscordPresenceUpdate) { + this.session = session; + this.user = new User(this.session, data.user); + this.guildId = data.guild_id; + this.status = data.status; + this.activities = data.activities.map((activity) => + Object.create({ + name: activity.name, + type: activity.type, + url: activity.url ? activity.url : undefined, + createdAt: activity.created_at, + timestamps: activity.timestamps, + applicationId: activity.application_id, + details: activity.details ? activity.details : undefined, + state: activity.state, + emoji: activity.emoji ? activity.emoji : undefined, + party: activity.party ? activity.party : undefined, + assets: activity.assets + ? { + largeImage: activity.assets.large_image, + largeText: activity.assets.large_text, + smallImage: activity.assets.small_image, + smallText: activity.assets.small_text, + } + : null, + secrets: activity.secrets ? activity.secrets : undefined, + instance: !!activity.instance, + flags: activity.flags, + buttons: activity.buttons, + }) + ); + this.clientStatus = data.client_status; + } + session: Session; + user: User; + guildId: Snowflake; + status: string; + activities: Activities[]; + clientStatus: DiscordClientStatus; +}