1- import type { ActivityType , GatewayActivityButton } from "discord-api-types/v10" ;
1+ import { ActivityType , GatewayActivityButton } from "discord-api-types/v10" ;
22import type { CertifiedDevice } from "./CertifiedDevice" ;
33import { VoiceSettings } from "./VoiceSettings" ;
44import { Channel } from "./Channel" ;
@@ -17,63 +17,45 @@ export enum ActivityPartyPrivacy {
1717}
1818
1919export type SetActivity = {
20- /**
21- * Minimum of 2 characters and maximum of 128 characters
22- */
20+ name ?: string ;
21+ type ?: ActivityType ;
22+ url ?: string ;
23+
2324 state ?: string ;
24- /**
25- * Minimum of 2 characters and maximum of 128 characters
26- */
2725 details ?: string ;
26+
2827 startTimestamp ?: number | Date ;
2928 endTimestamp ?: number | Date ;
30- /**
31- * Minimum of 1 characters and maximum of 128 characters
32- */
29+
3330 largeImageKey ?: string ;
34- /**
35- * Minimum of 1 characters and maximum of 128 characters
36- */
3731 smallImageKey ?: string ;
38- /**
39- * Minimum of 2 characters and maximum of 128 characters
40- */
4132 largeImageText ?: string ;
42- /**
43- * Minimum of 2 characters and maximum of 128 characters
44- */
4533 smallImageText ?: string ;
46- /**
47- * Minimum of 2 characters and maximum of 128 characters
48- */
34+
4935 partyId ?: string ;
50- /**
51- * Default: ActivityPartyPrivacy.PRIVATE
52- */
5336 partyPrivacy ?: ActivityPartyPrivacy ;
5437 partySize ?: number ;
5538 partyMax ?: number ;
56- /**
57- * Minimum of 2 characters and maximum of 128 characters
58- */
39+
5940 matchSecret ?: string ;
60- /**
61- * Minimum of 2 characters and maximum of 128 characters
62- */
6341 joinSecret ?: string ;
64- /**
65- * Minimum of 2 characters and maximum of 128 characters
66- */
6742 spectateSecret ?: string ;
43+
6844 instance ?: boolean ;
69- buttons ?: Array < GatewayActivityButton > ;
45+ buttons ?: GatewayActivityButton [ ] ;
7046 supportedPlatforms ?: ( ActivitySupportedPlatform | `${ActivitySupportedPlatform } `) [ ] ;
71- /**
72- * Default: ActivityTypes.PLAYING
73- */
74- type ?: ActivityType . Playing | ActivityType . Listening | ActivityType . Watching | ActivityType . Competing ;
47+
48+ applicationId ?: string ;
49+ flags ?: number ;
50+
51+ emoji ?: {
52+ name : string ;
53+ id ?: string ;
54+ animated ?: boolean ;
55+ } ;
7556} ;
7657
58+
7759export type SetActivityResponse = {
7860 state ?: string ;
7961 buttons ?: string [ ] ;
@@ -249,69 +231,84 @@ export class ClientUser extends User {
249231 * @returns The activity that have been set
250232 */
251233 async setActivity ( activity : SetActivity , pid ?: number ) : Promise < SetActivityResponse > {
252- const formattedAcitivity : any = {
253- ...activity ,
254- assets : { } ,
255- timestamps : { } ,
256- party : { } ,
257- secrets : { }
234+ const formattedActivity : any = {
235+ name : activity . name ,
236+ type : activity . type ?? ActivityType . Playing ,
237+ created_at : Date . now ( ) ,
238+ instance : ! ! activity . instance ,
258239 } ;
259240
260- if ( activity . startTimestamp instanceof Date ) {
261- formattedAcitivity . timestamps . start = Math . round ( activity . startTimestamp . getTime ( ) ) ;
262- } else if ( typeof activity . startTimestamp === "number" ) {
263- formattedAcitivity . timestamps . start = activity . startTimestamp ;
241+ // URL only for Streaming activity
242+ if ( activity . type === ActivityType . Streaming && activity . url ) {
243+ formattedActivity . url = activity . url ;
244+ }
245+
246+ // Details & state
247+ if ( activity . details ) formattedActivity . details = activity . details ;
248+ if ( activity . state ) formattedActivity . state = activity . state ;
249+
250+ // Timestamps (only if any defined)
251+ if ( activity . startTimestamp || activity . endTimestamp ) {
252+ formattedActivity . timestamps = { } ;
253+ if ( activity . startTimestamp instanceof Date ) {
254+ formattedActivity . timestamps . start = activity . startTimestamp . getTime ( ) ;
255+ } else if ( typeof activity . startTimestamp === 'number' ) {
256+ formattedActivity . timestamps . start = activity . startTimestamp ;
257+ }
258+
259+ if ( activity . endTimestamp instanceof Date ) {
260+ formattedActivity . timestamps . end = activity . endTimestamp . getTime ( ) ;
261+ } else if ( typeof activity . endTimestamp === 'number' ) {
262+ formattedActivity . timestamps . end = activity . endTimestamp ;
263+ }
264+ }
265+
266+ // Assets (only if any defined)
267+ if (
268+ activity . largeImageKey ||
269+ activity . smallImageKey ||
270+ activity . largeImageText ||
271+ activity . smallImageText
272+ ) {
273+ formattedActivity . assets = { } ;
274+ if ( activity . largeImageKey ) formattedActivity . assets . large_image = activity . largeImageKey ;
275+ if ( activity . smallImageKey ) formattedActivity . assets . small_image = activity . smallImageKey ;
276+ if ( activity . largeImageText ) formattedActivity . assets . large_text = activity . largeImageText ;
277+ if ( activity . smallImageText ) formattedActivity . assets . small_text = activity . smallImageText ;
264278 }
265279
266- if ( activity . endTimestamp instanceof Date ) {
267- formattedAcitivity . timestamps . end = Math . round ( activity . endTimestamp . getTime ( ) ) ;
268- } else if ( typeof activity . endTimestamp === "number" ) {
269- formattedAcitivity . timestamps . end = activity . endTimestamp ;
280+ // Party (only if any defined)
281+ if ( activity . partyId || activity . partySize || activity . partyMax || activity . partyPrivacy ) {
282+ formattedActivity . party = { } ;
283+ if ( activity . partyId ) formattedActivity . party . id = activity . partyId ;
284+ if ( activity . partyPrivacy ) formattedActivity . party . privacy = activity . partyPrivacy ;
285+ if ( activity . partySize !== undefined && activity . partyMax !== undefined ) {
286+ formattedActivity . party . size = [ activity . partySize , activity . partyMax ] ;
287+ }
270288 }
271289
272- if ( activity . largeImageKey ) formattedAcitivity . assets . large_image = activity . largeImageKey ;
273- if ( activity . smallImageKey ) formattedAcitivity . assets . small_image = activity . smallImageKey ;
274- if ( activity . largeImageText ) formattedAcitivity . assets . large_text = activity . largeImageText ;
275- if ( activity . smallImageText ) formattedAcitivity . assets . small_text = activity . smallImageText ;
276-
277- if ( activity . partyId ) formattedAcitivity . party . id = activity . partyId ;
278- if ( activity . partyPrivacy ) formattedAcitivity . party . privacy = activity . partyPrivacy ;
279- if ( activity . partySize && activity . partyMax )
280- formattedAcitivity . party . size = [ activity . partySize , activity . partyMax ] ;
281-
282- if ( activity . joinSecret ) formattedAcitivity . secrets . join = activity . joinSecret ;
283- if ( activity . spectateSecret ) formattedAcitivity . secrets . spectate = activity . spectateSecret ;
284- if ( activity . matchSecret ) formattedAcitivity . secrets . match = activity . matchSecret ;
285-
286- if ( activity . supportedPlatforms ) formattedAcitivity . supported_platforms = activity . supportedPlatforms ;
287-
288- if ( Object . keys ( formattedAcitivity . assets ) . length === 0 ) delete formattedAcitivity [ "assets" ] ;
289- if ( Object . keys ( formattedAcitivity . timestamps ) . length === 0 ) delete formattedAcitivity [ "timestamps" ] ;
290- if ( Object . keys ( formattedAcitivity . party ) . length === 0 ) delete formattedAcitivity [ "party" ] ;
291- if ( Object . keys ( formattedAcitivity . secrets ) . length === 0 ) delete formattedAcitivity [ "secrets" ] ;
292-
293- formattedAcitivity . instance = ! ! activity . instance ;
294-
295- // Clean-up
296- delete formattedAcitivity [ "startTimestamp" ] ;
297- delete formattedAcitivity [ "endTimestamp" ] ;
298- delete formattedAcitivity [ "largeImageKey" ] ;
299- delete formattedAcitivity [ "smallImageKey" ] ;
300- delete formattedAcitivity [ "largeImageText" ] ;
301- delete formattedAcitivity [ "smallImageText" ] ;
302- delete formattedAcitivity [ "partyId" ] ;
303- delete formattedAcitivity [ "partyPrivacy" ] ;
304- delete formattedAcitivity [ "partySize" ] ;
305- delete formattedAcitivity [ "partyMax" ] ;
306- delete formattedAcitivity [ "joinSecret" ] ;
307- delete formattedAcitivity [ "spectateSecret" ] ;
308- delete formattedAcitivity [ "matchSecret" ] ;
309- delete formattedAcitivity [ "supportedPlatforms" ] ;
290+ // Secrets (only if any defined)
291+ if ( activity . joinSecret || activity . spectateSecret || activity . matchSecret ) {
292+ formattedActivity . secrets = { } ;
293+ if ( activity . joinSecret ) formattedActivity . secrets . join = activity . joinSecret ;
294+ if ( activity . spectateSecret ) formattedActivity . secrets . spectate = activity . spectateSecret ;
295+ if ( activity . matchSecret ) formattedActivity . secrets . match = activity . matchSecret ;
296+ }
297+
298+ // Buttons
299+ if ( activity . buttons ?. length ) {
300+ formattedActivity . buttons = activity . buttons ;
301+ }
302+
303+ // Supported platforms
304+ if ( activity . supportedPlatforms ?. length ) {
305+ formattedActivity . supported_platforms = activity . supportedPlatforms ;
306+ }
310307
311308 return (
312309 await this . client . request ( "SET_ACTIVITY" , {
313- pid : ( pid ?? process ) ? ( process . pid ?? 0 ) : 0 ,
314- activity : formattedAcitivity
310+ pid : ( pid ?? process ? .pid ?? 0 ) ,
311+ activity : formattedActivity
315312 } )
316313 ) . data ;
317314 }
0 commit comments