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,44 @@ export enum ActivityPartyPrivacy {
1717}
1818
1919export type SetActivity = {
20- /**
21- * Minimum of 2 characters and maximum of 128 characters
22- */
23- state ?: string ;
24- /**
25- * Minimum of 2 characters and maximum of 128 characters
26- */
27- details ?: string ;
28- startTimestamp ?: number | Date ;
29- endTimestamp ?: number | Date ;
30- /**
31- * Minimum of 1 characters and maximum of 128 characters
32- */
33- largeImageKey ?: string ;
34- /**
35- * Minimum of 1 characters and maximum of 128 characters
36- */
37- smallImageKey ?: string ;
38- /**
39- * Minimum of 2 characters and maximum of 128 characters
40- */
41- largeImageText ?: string ;
42- /**
43- * Minimum of 2 characters and maximum of 128 characters
44- */
45- smallImageText ?: string ;
46- /**
47- * Minimum of 2 characters and maximum of 128 characters
48- */
49- partyId ?: string ;
50- /**
51- * Default: ActivityPartyPrivacy.PRIVATE
52- */
53- partyPrivacy ?: ActivityPartyPrivacy ;
54- partySize ?: number ;
55- partyMax ?: number ;
56- /**
57- * Minimum of 2 characters and maximum of 128 characters
58- */
59- matchSecret ?: string ;
60- /**
61- * Minimum of 2 characters and maximum of 128 characters
62- */
63- joinSecret ?: string ;
64- /**
65- * Minimum of 2 characters and maximum of 128 characters
66- */
67- spectateSecret ?: string ;
68- instance ?: boolean ;
69- buttons ?: Array < GatewayActivityButton > ;
70- supportedPlatforms ?: ( ActivitySupportedPlatform | `${ActivitySupportedPlatform } `) [ ] ;
71- /**
72- * Default: ActivityTypes.PLAYING
73- */
74- type ?: ActivityType . Playing | ActivityType . Listening | ActivityType . Watching | ActivityType . Competing ;
20+ name ?: string ;
21+ type ?: ActivityType ;
22+ url ?: string ;
23+
24+ state ?: string ;
25+ details ?: string ;
26+
27+ startTimestamp ?: number | Date ;
28+ endTimestamp ?: number | Date ;
29+
30+ largeImageKey ?: string ;
31+ smallImageKey ?: string ;
32+ largeImageText ?: string ;
33+ smallImageText ?: string ;
34+
35+ partyId ?: string ;
36+ partySize ?: number ;
37+ partyMax ?: number ;
38+
39+ matchSecret ?: string ;
40+ joinSecret ?: string ;
41+ spectateSecret ?: string ;
42+
43+ instance ?: boolean ;
44+ buttons ?: GatewayActivityButton [ ] ;
45+ supportedPlatforms ?: ( ActivitySupportedPlatform | `${ActivitySupportedPlatform } `) [ ] ;
46+
47+ applicationId ?: string ;
48+ flags ?: number ;
49+
50+ emoji ?: {
51+ name : string ;
52+ id ?: string ;
53+ animated ?: boolean ;
54+ } ;
7555} ;
7656
57+
7758export type SetActivityResponse = {
7859 state ?: string ;
7960 buttons ?: string [ ] ;
@@ -249,69 +230,83 @@ export class ClientUser extends User {
249230 * @returns The activity that have been set
250231 */
251232 async setActivity ( activity : SetActivity , pid ?: number ) : Promise < SetActivityResponse > {
252- const formattedAcitivity : any = {
253- ...activity ,
254- assets : { } ,
255- timestamps : { } ,
256- party : { } ,
257- secrets : { }
233+ const formattedActivity : any = {
234+ name : activity . name ,
235+ type : activity . type ?? ActivityType . Playing ,
236+ created_at : Date . now ( ) ,
237+ instance : ! ! activity . instance ,
258238 } ;
259239
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 ;
240+ // URL only for Streaming activity
241+ if ( activity . type === ActivityType . Streaming && activity . url ) {
242+ formattedActivity . url = activity . url ;
243+ }
244+
245+ // Details & state
246+ if ( activity . details ) formattedActivity . details = activity . details ;
247+ if ( activity . state ) formattedActivity . state = activity . state ;
248+
249+ // Timestamps (only if any defined)
250+ if ( activity . startTimestamp || activity . endTimestamp ) {
251+ formattedActivity . timestamps = { } ;
252+ if ( activity . startTimestamp instanceof Date ) {
253+ formattedActivity . timestamps . start = activity . startTimestamp . getTime ( ) ;
254+ } else if ( typeof activity . startTimestamp === 'number' ) {
255+ formattedActivity . timestamps . start = activity . startTimestamp ;
256+ }
257+
258+ if ( activity . endTimestamp instanceof Date ) {
259+ formattedActivity . timestamps . end = activity . endTimestamp . getTime ( ) ;
260+ } else if ( typeof activity . endTimestamp === 'number' ) {
261+ formattedActivity . timestamps . end = activity . endTimestamp ;
262+ }
263+ }
264+
265+ // Assets (only if any defined)
266+ if (
267+ activity . largeImageKey ||
268+ activity . smallImageKey ||
269+ activity . largeImageText ||
270+ activity . smallImageText
271+ ) {
272+ formattedActivity . assets = { } ;
273+ if ( activity . largeImageKey ) formattedActivity . assets . large_image = activity . largeImageKey ;
274+ if ( activity . smallImageKey ) formattedActivity . assets . small_image = activity . smallImageKey ;
275+ if ( activity . largeImageText ) formattedActivity . assets . large_text = activity . largeImageText ;
276+ if ( activity . smallImageText ) formattedActivity . assets . small_text = activity . smallImageText ;
264277 }
265278
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 ;
279+ // Party (only if any defined)
280+ if ( activity . partyId || activity . partySize || activity . partyMax ) {
281+ formattedActivity . party = { } ;
282+ if ( activity . partyId ) formattedActivity . party . id = activity . partyId ;
283+ if ( activity . partySize !== undefined && activity . partyMax !== undefined ) {
284+ formattedActivity . party . size = [ activity . partySize , activity . partyMax ] ;
285+ }
270286 }
271287
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" ] ;
288+ // Secrets (only if any defined)
289+ if ( activity . joinSecret || activity . spectateSecret || activity . matchSecret ) {
290+ formattedActivity . secrets = { } ;
291+ if ( activity . joinSecret ) formattedActivity . secrets . join = activity . joinSecret ;
292+ if ( activity . spectateSecret ) formattedActivity . secrets . spectate = activity . spectateSecret ;
293+ if ( activity . matchSecret ) formattedActivity . secrets . match = activity . matchSecret ;
294+ }
295+
296+ // Buttons
297+ if ( activity . buttons ?. length ) {
298+ formattedActivity . buttons = activity . buttons ;
299+ }
300+
301+ // Supported platforms
302+ if ( activity . supportedPlatforms ?. length ) {
303+ formattedActivity . supported_platforms = activity . supportedPlatforms ;
304+ }
310305
311306 return (
312307 await this . client . request ( "SET_ACTIVITY" , {
313- pid : ( pid ?? process ) ? ( process . pid ?? 0 ) : 0 ,
314- activity : formattedAcitivity
308+ pid : ( pid ?? process ? .pid ?? 0 ) ,
309+ activity : formattedActivity
315310 } )
316311 ) . data ;
317312 }
0 commit comments