import type { ActivityType, GatewayActivityButton } from "../../deps.ts";import { CertifiedDevice } from "./CertifiedDevice.ts";import { VoiceSettings } from "./VoiceSettings.ts";import { Lobby, type LobbyType } from "./Lobby.ts";import { Channel } from "./Channel.ts";import { Guild } from "./Guild.ts";import { User } from "./User.ts";
export enum ActivitySupportedPlatform { IOS = "ios", ANDROID = "android", WEB = "web",}
export enum ActivityPartyPrivacy { PRIVATE = 0, PUBLIC = 1,}
export type SetActivity = { state?: string; details?: string; startTimestamp?: number | Date; endTimestamp?: number | Date; largeImageKey?: string; smallImageKey?: string; largeImageText?: string; smallImageText?: string; partyId?: string; partyPrivacy?: ActivityPartyPrivacy; partySize?: number; partyMax?: number; matchSecret?: string; joinSecret?: string; spectateSecret?: string; instance?: boolean; buttons?: Array<GatewayActivityButton>; supportedPlatforms?: ( | ActivitySupportedPlatform | `${ActivitySupportedPlatform}` )[]; type?: | ActivityType.Playing | ActivityType.Listening | ActivityType.Watching;};
export type SetActivityResponse = { state?: string; buttons?: string[]; name: string; application_id: string; type: number; metadata: { button_urls?: string[]; };};
export class ClientUser extends User {
async fetchUser(userId: string): Promise<User> { return new User( this.client, (await this.client.request("GET_USER", { id: userId })).data, ); }
async fetchGuild(guildId: string, timeout?: number): Promise<Guild> { return new Guild( this.client, ( await this.client.request("GET_GUILD", { guild_id: guildId, timeout, }) ).data, ); }
async fetchGuilds(): Promise<Guild[]> { return (await this.client.request("GET_GUILDS")).data.guilds.map( (guildData: any) => new Guild(this.client, guildData), ); }
async fetchChannel(channelId: string): Promise<Channel> { return new Channel( this.client, ( await this.client.request("GET_CHANNEL", { channel_id: channelId, }) ).data, ); }
async fetchChannels(guildId: string): Promise<Channel> { return ( await this.client.request("GET_CHANNELS", { guild_id: guildId }) ).data.channels.map( (channelData: any) => new Channel(this.client, channelData), ); }
async getSelectedVoiceChannel(): Promise<Channel | null> { const response = await this.client.request("GET_SELECTED_VOICE_CHANNEL"); return response.data !== null ? new Channel(this.client, response.data) : null; }
async selectVoiceChannel( channelId: string, timeout?: number, force?: boolean, ): Promise<Channel> { return new Channel( this.client, ( await this.client.request("SELECT_VOICE_CHANNEL", { channel_id: channelId, timeout, force, }) ).data, ); }
async leaveVoiceChannel(timeout?: number, force?: boolean): Promise<void> { await this.client.request("SELECT_VOICE_CHANNEL", { channel_id: null, timeout, force, }); }
async getVoiceSettings(): Promise<VoiceSettings> { return new VoiceSettings( this.client, (await this.client.request("GET_VOICE_SETTINGS")).data, ); }
async setVoiceSettings( voiceSettings: Partial<VoiceSettings>, ): Promise<VoiceSettings> { return new VoiceSettings( this.client, (await this.client.request("SET_VOICE_SETTINGS", voiceSettings)).data, ); }
async setCeritfiedDevices(devices: CertifiedDevice[]): Promise<void> { await this.client.request("SET_CERTIFIED_DEVICES", { devices }); }
async sendJoinInvite(userId: string): Promise<void> { await this.client.request("SEND_ACTIVITY_JOIN_INVITE", { user_id: userId, }); }
async closeJoinRequest(userId: string): Promise<void> { await this.client.request("CLOSE_ACTIVITY_JOIN_REQUEST", { user_id: userId, }); }
async selectTextChannel( channelId: string, timeout?: number, ): Promise<Channel | null> { return new Channel( this.client, ( await this.client.request("SELECT_TEXT_CHANNEL", { channel_id: channelId, timeout, }) ).data, ); }
async leaveTextChannel(timeout?: number): Promise<void> { await this.client.request("SELECT_TEXT_CHANNEL", { channel_id: null, timeout, }); }
async getRelationships(): Promise<Array<User>> { return ( await this.client.request("GET_RELATIONSHIPS") ).data.relationships.map((data: any) => { return new User(this.client, { ...data.user, presence: data.presence }); }); }
async setActivity( activity: SetActivity, pid?: number, ): Promise<SetActivityResponse> { const formattedAcitivity: any = { ...activity, assets: {}, timestamps: {}, party: {}, secrets: {}, };
if (activity.startTimestamp instanceof Date) { formattedAcitivity.timestamps.start = Math.round( activity.startTimestamp.getTime(), ); } else if (typeof activity.startTimestamp === "number") { formattedAcitivity.timestamps.start = activity.startTimestamp; }
if (activity.endTimestamp instanceof Date) { formattedAcitivity.timestamps.end = Math.round( activity.endTimestamp.getTime(), ); } else if (typeof activity.endTimestamp === "number") { formattedAcitivity.timestamps.end = activity.endTimestamp; }
if (activity.largeImageKey) { formattedAcitivity.assets.large_image = activity.largeImageKey; } if (activity.smallImageKey) { formattedAcitivity.assets.small_image = activity.smallImageKey; } if (activity.largeImageText) { formattedAcitivity.assets.large_text = activity.largeImageText; } if (activity.smallImageText) { formattedAcitivity.assets.small_text = activity.smallImageText; }
if (activity.partyId) formattedAcitivity.party.id = activity.partyId; if (activity.partyPrivacy) { formattedAcitivity.party.privacy = activity.partyPrivacy; } if (activity.partySize && activity.partyMax) { formattedAcitivity.party.size = [activity.partySize, activity.partyMax]; }
if (activity.joinSecret) { formattedAcitivity.secrets.join = activity.joinSecret; } if (activity.spectateSecret) { formattedAcitivity.secrets.spectate = activity.spectateSecret; } if (activity.matchSecret) { formattedAcitivity.secrets.match = activity.matchSecret; }
if (activity.supportedPlatforms) { formattedAcitivity.supported_platforms = activity.supportedPlatforms; }
if (Object.keys(formattedAcitivity.assets).length === 0) { delete formattedAcitivity["assets"]; } if (Object.keys(formattedAcitivity.timestamps).length === 0) { delete formattedAcitivity["timestamps"]; } if (Object.keys(formattedAcitivity.party).length === 0) { delete formattedAcitivity["party"]; } if (Object.keys(formattedAcitivity.secrets).length === 0) { delete formattedAcitivity["secrets"]; }
formattedAcitivity.instance = !!activity.instance;
delete formattedAcitivity["startTimestamp"]; delete formattedAcitivity["endTimestamp"]; delete formattedAcitivity["largeImageKey"]; delete formattedAcitivity["smallImageKey"]; delete formattedAcitivity["largeImageText"]; delete formattedAcitivity["smallImageText"]; delete formattedAcitivity["partyId"]; delete formattedAcitivity["partyPrivacy"]; delete formattedAcitivity["partySize"]; delete formattedAcitivity["partyMax"]; delete formattedAcitivity["joinSecret"]; delete formattedAcitivity["spectateSecret"]; delete formattedAcitivity["matchSecret"]; delete formattedAcitivity["supportedPlatforms"];
return ( await this.client.request("SET_ACTIVITY", { pid: pid ?? process ? process.pid ?? 0 : 0, activity: formattedAcitivity, }) ).data; }
async clearActivity(pid?: number): Promise<void> { await this.client.request("SET_ACTIVITY", { pid: pid ?? Deno.pid, }); }
async createLobby( type: LobbyType, capacity?: number, locked?: boolean, metadata?: any, ): Promise<Lobby> { return new Lobby( this.client, ( await this.client.request("CREATE_LOBBY", { type, capacity, locked, metadata, }) ).data, ); }
async connectToLobby(lobbyId: string, secret: string): Promise<Lobby> { return new Lobby( this.client, ( await this.client.request("CONNECT_TO_LOBBY", { id: lobbyId, secret, }) ).data, ); }
async sendToLobby(lobbyId: string, data: string): Promise<Lobby> { return new Lobby( this.client, ( await this.client.request("SEND_TO_LOBBY", { lobby_id: lobbyId, data, }) ).data, ); }
async getImage( userId: string, format: "png" | "webp" | "jpg" = "png", size: 16 | 32 | 64 | 128 | 256 | 512 | 1024 = 1024, ): Promise<string> { return ( await this.client.request("GET_IMAGE", { type: "user", id: userId, format, size, }) ).data.data_url; }
}