Skip to content

Commit cadafe1

Browse files
authored
1 parent dc3057f commit cadafe1

File tree

1 file changed

+90
-93
lines changed

1 file changed

+90
-93
lines changed

src/structures/ClientUser.ts

Lines changed: 90 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ActivityType, GatewayActivityButton } from "discord-api-types/v10";
1+
import { ActivityType, GatewayActivityButton } from "discord-api-types/v10";
22
import type { CertifiedDevice } from "./CertifiedDevice";
33
import { VoiceSettings } from "./VoiceSettings";
44
import { Channel } from "./Channel";
@@ -17,63 +17,45 @@ export enum ActivityPartyPrivacy {
1717
}
1818

1919
export 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+
7759
export 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

Comments
 (0)