Skip to content

Commit 0eff61a

Browse files
authored
Merge pull request #118 from Mathu-lmn/main
Rework set activity payload types
2 parents dc3057f + a40ab21 commit 0eff61a

File tree

1 file changed

+105
-110
lines changed

1 file changed

+105
-110
lines changed

src/structures/ClientUser.ts

Lines changed: 105 additions & 110 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,44 @@ export enum ActivityPartyPrivacy {
1717
}
1818

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

Comments
 (0)