Skip to content

Commit 11d9c35

Browse files
committed
feat: onboarding mode, edit method, audit log events
1 parent eb176bb commit 11d9c35

File tree

5 files changed

+146
-2
lines changed

5 files changed

+146
-2
lines changed

packages/discord.js/src/structures/Guild.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,70 @@ class Guild extends AnonymousGuild {
871871
return this.client.actions.GuildUpdate.handle(data).updated;
872872
}
873873

874+
/**
875+
* Options used to edit the guild onboarding.
876+
* @typedef {Object} GuildOnboardingEditOptions
877+
* @property {GuildOnboardingPromptData[]} prompts The prompts shown during onboarding
878+
* and in customize community
879+
* @property {ChannelResolvable[]} defaultChannels The channels that new members get opted into automatically
880+
* @property {boolean} enabled Whether the onboarding is enabled
881+
* @property {GuildOnboardingMode} mode The mode to edit the guild onboarding with
882+
* @property {string} [reason] The reason for editing the guild onboarding
883+
*/
884+
885+
/**
886+
* Data for editing a guild onboarding prompt.
887+
* @typedef {Object} GuildOnboardingPromptData
888+
* @property {string} title The title for the prompt
889+
* @property {boolean} singleSelect Whether users are limited to selecting one option for the prompt
890+
* @property {boolean} required Whether the prompt is required before a user completes the onboarding flow
891+
* @property {boolean} inOnboarding Whether the prompt is present in the onboarding flow
892+
* @property {GuildOnboardingPromptType} type The type of the prompt
893+
* @property {GuildOnboardingPromptOptionData[]} options The options available within the prompt
894+
*/
895+
896+
/**
897+
* Data for editing a guild onboarding prompt option.
898+
* @typedef {Object} GuildOnboardingPromptOptionData
899+
* @property {ChannelResolvable[]} channels The channels a member is added to when the option is selected
900+
* @property {RoleResolvable[]} roles The roles assigned to a member when the option is selected
901+
* @property {string} title The title of the option
902+
* @property {string} description The description of the option
903+
* @property {EmojiIdentifierResolvable} emoji The emoji of the option
904+
*/
905+
906+
/**
907+
* Edits the guild onboarding data for this guild.
908+
* @param {GuildOnboardingEditOptions} options The options to provide
909+
* @returns {Promise<GuildOnboarding>}
910+
*/
911+
async editOnboarding(options) {
912+
const newData = await this.client.rest.put(`/guilds/${this.id}/onboarding`, {
913+
body: {
914+
prompts: options.prompts.map(prompt => ({
915+
title: prompt.title,
916+
single_select: prompt.singleSelect,
917+
required: prompt.required,
918+
in_onboarding: prompt.inOnboarding,
919+
type: prompt.type,
920+
options: prompt.options.map(option => ({
921+
channel_ids: option.channels.map(c => this.channels.resolveId(c)),
922+
role_ids: option.roles.map(r => this.roles.resolveId(r)),
923+
title: option.title,
924+
description: option.description,
925+
emoji: this.emojis.resolveIdentifier(option.emoji),
926+
})),
927+
})),
928+
default_channel_ids: options.defaultChannels.map(c => this.channels.resolveId(c)),
929+
enabled: options.enabled,
930+
mode: options.mode,
931+
},
932+
reason: options.reason,
933+
});
934+
935+
return new GuildOnboarding(this.client, newData);
936+
}
937+
874938
/**
875939
* Welcome channel data
876940
* @typedef {Object} WelcomeChannelData

packages/discord.js/src/structures/GuildAuditLogsEntry.js

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const { DiscordSnowflake } = require('@sapphire/snowflake');
44
const { AuditLogOptionsType, AuditLogEvent } = require('discord-api-types/v10');
55
const AutoModerationRule = require('./AutoModerationRule');
6+
const { GuildOnboardingPrompt } = require('./GuildOnboardingPrompt.js');
67
const { GuildScheduledEvent } = require('./GuildScheduledEvent');
78
const Integration = require('./Integration');
89
const Invite = require('./Invite');
@@ -29,6 +30,8 @@ const Targets = {
2930
Thread: 'Thread',
3031
ApplicationCommand: 'ApplicationCommand',
3132
AutoModeration: 'AutoModeration',
33+
GuildOnboarding: 'GuildOnboarding',
34+
GuildOnboardingPrompt: 'GuildOnboardingPrompt',
3235
Unknown: 'Unknown',
3336
};
3437

@@ -49,10 +52,11 @@ const Targets = {
4952
* * A thread
5053
* * An application command
5154
* * An auto moderation rule
55+
* * A guild onboarding prompt
5256
* * An object with an id key if target was deleted or fake entity
5357
* * An object where the keys represent either the new value or the old value
5458
* @typedef {?(Object|Guild|BaseChannel|User|Role|Invite|Webhook|GuildEmoji|Message|Integration|StageInstance|Sticker|
55-
* GuildScheduledEvent|ApplicationCommand|AutoModerationRule)} AuditLogEntryTarget
59+
* GuildScheduledEvent|ApplicationCommand|AutoModerationRule|GuildOnboarding|GuildOnboardingPrompt)} AuditLogEntryTarget
5660
*/
5761

5862
/**
@@ -80,6 +84,7 @@ const Targets = {
8084
* * Thread
8185
* * GuildScheduledEvent
8286
* * ApplicationCommandPermission
87+
* * GuildOnboardingPrompt
8388
* @typedef {string} AuditLogTargetType
8489
*/
8590

@@ -238,7 +243,6 @@ class GuildAuditLogsEntry {
238243
this.extra = {
239244
autoModerationRuleName: data.options.auto_moderation_rule_name,
240245
autoModerationRuleTriggerType: data.options.auto_moderation_rule_trigger_type,
241-
channel: guild.client.channels.cache.get(data.options?.channel_id) ?? { id: data.options?.channel_id },
242246
};
243247
break;
244248

@@ -391,6 +395,26 @@ class GuildAuditLogsEntry {
391395
),
392396
guild,
393397
);
398+
} else if (targetType === Targets.GuildOnboardingPrompt) {
399+
this.target = new GuildOnboardingPrompt(
400+
guild.client,
401+
this.changes.reduce(
402+
(o, c) => {
403+
o[c.key] = c.new ?? c.old;
404+
return o;
405+
},
406+
{ id: data.target_id },
407+
),
408+
guild.id,
409+
);
410+
} else if (targetType === Targets.GuildOnboarding) {
411+
this.target = this.changes.reduce(
412+
(o, c) => {
413+
o[c.key] = c.new ?? c.old;
414+
return o;
415+
},
416+
{ id: data.target_id },
417+
);
394418
} else if (data.target_id) {
395419
this.target = guild[`${targetType.toLowerCase()}s`]?.cache.get(data.target_id) ?? { id: data.target_id };
396420
}
@@ -417,6 +441,8 @@ class GuildAuditLogsEntry {
417441
if (target < 120) return Targets.Thread;
418442
if (target < 130) return Targets.ApplicationCommand;
419443
if (target >= 140 && target < 150) return Targets.AutoModeration;
444+
if (target >= 163 && target <= 165) return Targets.GuildOnboardingPrompt;
445+
if (target >= 160 && target < 170) return Targets.GuildOnboarding;
420446
return Targets.Unknown;
421447
}
422448

@@ -444,6 +470,10 @@ class GuildAuditLogsEntry {
444470
AuditLogEvent.ThreadCreate,
445471
AuditLogEvent.AutoModerationRuleCreate,
446472
AuditLogEvent.AutoModerationBlockMessage,
473+
// AuditLogEvent.OnboardingQuestionCreate,
474+
// AuditLogEvent.OnboardingCreate,
475+
163,
476+
166,
447477
].includes(action)
448478
) {
449479
return 'Create';
@@ -470,6 +500,8 @@ class GuildAuditLogsEntry {
470500
AuditLogEvent.GuildScheduledEventDelete,
471501
AuditLogEvent.ThreadDelete,
472502
AuditLogEvent.AutoModerationRuleDelete,
503+
// AuditLogEvent.OnboardingQuestionDelete,
504+
165,
473505
].includes(action)
474506
) {
475507
return 'Delete';
@@ -494,6 +526,10 @@ class GuildAuditLogsEntry {
494526
AuditLogEvent.ThreadUpdate,
495527
AuditLogEvent.ApplicationCommandPermissionUpdate,
496528
AuditLogEvent.AutoModerationRuleUpdate,
529+
// AuditLogEvent.OnboardingQuestionUpdate,
530+
// AuditLogEvent.OnboardingUpdate,
531+
164,
532+
167,
497533
].includes(action)
498534
) {
499535
return 'Update';

packages/discord.js/src/structures/GuildOnboarding.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ class GuildOnboarding extends Base {
4343
* @type {boolean}
4444
*/
4545
this.enabled = data.enabled;
46+
47+
/**
48+
* The mode of this onboarding
49+
* @type {GuildOnboardingMode}
50+
*/
51+
this.mode = data.mode;
4652
}
4753

4854
/**

packages/discord.js/src/util/APITypes.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,11 @@
310310
* @see {@link https://discord-api-types.dev/api/discord-api-types-v10/enum/GuildNSFWLevel}
311311
*/
312312

313+
/**
314+
* @external GuildOnboardingMode
315+
* @see {@link https://discord-api-types.dev/api/discord-api-types-v10/enum/GuildOnboardingMode}
316+
*/
317+
313318
/**
314319
* @external GuildOnboardingPromptType
315320
* @see {@link https://discord-api-types.dev/api/discord-api-types-v10/enum/GuildOnboardingPromptType}

packages/discord.js/typings/index.d.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,6 +1350,7 @@ export class Guild extends AnonymousGuild {
13501350
public delete(): Promise<Guild>;
13511351
public discoverySplashURL(options?: ImageURLOptions): string | null;
13521352
public edit(options: GuildEditOptions): Promise<Guild>;
1353+
public editOnboarding(options: GuildOnboardingEditOptions): Promise<GuildOnboarding>;
13531354
public editWelcomeScreen(options: WelcomeScreenEditOptions): Promise<WelcomeScreen>;
13541355
public equals(guild: Guild): boolean;
13551356
public fetchAuditLogs<T extends GuildAuditLogsResolvable = null>(
@@ -1574,6 +1575,7 @@ export class GuildOnboarding extends Base {
15741575
public prompts: Collection<Snowflake, GuildOnboardingPrompt>;
15751576
public defaultChannels: Collection<Snowflake, GuildChannel>;
15761577
public enabled: boolean;
1578+
public mode: any;
15771579
}
15781580

15791581
export class GuildOnboardingPrompt extends Base {
@@ -5349,6 +5351,11 @@ interface GuildAuditLogsTypes {
53495351
[AuditLogEvent.AutoModerationBlockMessage]: ['AutoModerationRule', 'Create'];
53505352
[AuditLogEvent.AutoModerationFlagToChannel]: ['AutoModerationRule', 'Create'];
53515353
[AuditLogEvent.AutoModerationUserCommunicationDisabled]: ['AutoModerationRule', 'Create'];
5354+
[163]: ['GuildOnboardingPrompt', 'Create'];
5355+
[164]: ['GuildOnboardingPrompt', 'Update'];
5356+
[165]: ['GuildOnboardingPrompt', 'Delete'];
5357+
[166]: ['GuildOnboarding', 'Create'];
5358+
[167]: ['GuildOnboarding', 'Update'];
53525359
}
53535360

53545361
export type GuildAuditLogsActionType = GuildAuditLogsTypes[keyof GuildAuditLogsTypes][1] | 'All';
@@ -5411,6 +5418,7 @@ export interface GuildAuditLogsEntryTargetField<TActionType extends GuildAuditLo
54115418
GuildScheduledEvent: GuildScheduledEvent;
54125419
ApplicationCommand: ApplicationCommand | { id: Snowflake };
54135420
AutoModerationRule: AutoModerationRule;
5421+
GuildOnboardingPrompt: GuildOnboardingPrompt;
54145422
}
54155423

54165424
export interface GuildAuditLogsFetchOptions<T extends GuildAuditLogsResolvable> {
@@ -5674,6 +5682,31 @@ export type GuildTemplateResolvable = string;
56745682

56755683
export type GuildVoiceChannelResolvable = VoiceBasedChannel | Snowflake;
56765684

5685+
export interface GuildOnboardingEditOptions {
5686+
prompts: GuildOnboardingPromptData[];
5687+
defaultChannels: ChannelResolvable[];
5688+
enabled: boolean;
5689+
mode: any;
5690+
reason?: string;
5691+
}
5692+
5693+
export interface GuildOnboardingPromptData {
5694+
title: string;
5695+
singleSelect: boolean;
5696+
required: boolean;
5697+
inOnboarding: boolean;
5698+
type: any;
5699+
options: GuildOnboardingPromptOptionData[];
5700+
}
5701+
5702+
export interface GuildOnboardingPromptOptionData {
5703+
channels: ChannelResolvable[];
5704+
roles: RoleResolvable[];
5705+
title: string;
5706+
description: string;
5707+
emoji: EmojiIdentifierResolvable;
5708+
}
5709+
56775710
export interface GuildOnboardingPromptOptionEmoji {
56785711
id: Snowflake | null;
56795712
name: string | null;

0 commit comments

Comments
 (0)