Skip to content

Commit fd4ba5e

Browse files
JiraliteaxisiscoolMateo-temGoldenAngel2kyranet
authored
feat: Auto Moderation (#7938)
* feat: initial AutoMod commit * types: Typo in class name Co-authored-by: Jonathan <54381371+axisiscool@users.noreply.github.com> * refactor: move things around * refactor: remove undocumented property * chore: add new intents to issue form * feat: add initial basic manager * feat(AutoModRule): add new properties * feat: add events * feat(GuildAuditLog): cache rules * refactor: move JSDoc to where it is actually used * refactor(AutoModRule): add `_patch()` method * feat(AutoModRuleManager): add resolvers * feat(Sweepers): add new manager * types: nullify first parameter of `autoModerationRuleUpdate` * types: add manager to `Caches` * docs(AutoModRule): update `metadata` docstring * feat: add execution event * fix(AutoModActionExecution): export class * refactor(AutoModRule): `triggerType` is not modifiable * docs(AutoModRule): link class * feat: add trigger metadata definitions * docs(AutoModRule): typos * feat(AutoModRule): action metadata * types: Proper casing of name Co-authored-by: MateoDeveloper <79017590+Mateo-tem@users.noreply.github.com> * refactor: only patch data if exists * types: `preset` is an array * types(AutoModRuleActionMetadata): nullify all * feat(AutoModRuleManager): add `fetch()` * docs(AutoModRule): tweak some wording * docs(AutoModRule): use "array" over "list" * docs(AutoModRuleResolvable): fix union * types: adjust some names * feat(AutoModRuleManager): add `create()` * feat(AutoModRuleManager): add `delete()` * refactor: prefer full auto moderation name * docs(AutoModerationRuleManager): fix a fetch example * refactor(Sweepers): alphabetise methods * chore: remove testing * fix(AutoModerationRuleCreateOptions): add `reason` * fix: typo for `presets` * fix(AutoModerationRuleCreateOptions): `actions` is required * fix(AutoModerationRuleManager): handle properties that are unrequired * feat(AutoModerationRuleManager): add `edit()` * feat(GuildAuditLogsEntry): add auto moderation rules * refactor: prefer "AutoModerationActionExecutionAction" * refactor: annotate todos and doc fixes * feat(AutoModerationRule): add guild getter * docs(AutoModerationRule): rule -> auto moderation rule * docs(AutoModerationRuleEditOptions): `eventType` is optional * feat(AutoModerationRule): add helpers * docs: random string updates * chore: add TODOs * feat(AutoModerationActionExecution): add helpers * feat: support role and channel resolvables * chore: high priority todo to keep me in solitary * refactor(AutoModerationActionMetadataOptions): allow resolvables * chore: tidy up from merge * docs(AutoModerationRule): document extension * feat: export `AutoModerationRuleManager` * chore(ActionsManager): add new actions * chore: add to websocket index * refactor(AutoModerationActionExecution): send the guild across * docs(AutoModerationActionExecution): typo * docs(AutoModerationRule): deduplicate a word * docs(Guild): dot * test: add some basic tests * docs(AutoModerationRuleManager): fetch is optional * docs(AutoModerationActionExecution): prefer non-links * types: `presets` is an array of numbers * docs(AutoModerationRuleEditOptions): `name` is optional * docs(AutoModerationRule): fix type for `exemptChannels` * docs(AutoModerationRuleUpdateAction): remove "object" * feat: add `allow_list` * fix(GuildAuditLogsEntry): pass guild * docs(AutoModerationRuleManager): correct fetch example * chore: prettier * refactor: remove unneeded optional chaining operator * feat: add mention limit * docs(AutoModerationRuleManager): document new requirement * refactor: conform to message content intent * docs: document permission for event * docs: refactor intent message * docs: dot * docs: remove string in link * refactor: document upstream changes * fix(AutoModerationRuleDelete): Correct event fire Co-authored-by: GoldenAngel <50855202+GoldenAngel2@users.noreply.github.com> * feat(AutoModerationRule): Add `setMentionTotalLimit()` helper method * feat(AuditLogEntries): add new extra fields * types: add `guild` in constructors * types: update typings * refactor(AutoModerationRuleManager): `&&` shorthand * types: remove leftover type * chore: types * docs: update API types * docs: Tweak guild wording Co-authored-by: Aura Román <kyradiscord@gmail.com> * feat: add regular expression matching * docs: update `allowList` wording * refactor: deduplicate `guildId` Co-authored-by: Jonathan <54381371+axisiscool@users.noreply.github.com> Co-authored-by: MateoDeveloper <79017590+Mateo-tem@users.noreply.github.com> Co-authored-by: GoldenAngel <50855202+GoldenAngel2@users.noreply.github.com> Co-authored-by: Aura Román <kyradiscord@gmail.com>
1 parent 153d240 commit fd4ba5e

24 files changed

+1072
-3
lines changed

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ body:
132132
- DirectMessageTyping
133133
- MessageContent
134134
- GuildScheduledEvents
135+
- AutoModerationConfiguration
136+
- AutoModerationExecution
135137
multiple: true
136138
validations:
137139
required: true

packages/discord.js/src/client/actions/ActionsManager.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ class ActionsManager {
55
this.client = client;
66

77
this.register(require('./ApplicationCommandPermissionsUpdate'));
8+
this.register(require('./AutoModerationActionExecution'));
9+
this.register(require('./AutoModerationRuleCreate'));
10+
this.register(require('./AutoModerationRuleDelete'));
11+
this.register(require('./AutoModerationRuleUpdate'));
812
this.register(require('./ChannelCreate'));
913
this.register(require('./ChannelDelete'));
1014
this.register(require('./ChannelUpdate'));
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'use strict';
2+
3+
const Action = require('./Action');
4+
const AutoModerationActionExecution = require('../../structures/AutoModerationActionExecution');
5+
const Events = require('../../util/Events');
6+
7+
class AutoModerationActionExecutionAction extends Action {
8+
handle(data) {
9+
const { client } = this;
10+
const guild = client.guilds.cache.get(data.guild_id);
11+
12+
if (guild) {
13+
/**
14+
* Emitted whenever an auto moderation rule is triggered.
15+
* <info>This event requires the {@link PermissionFlagsBits.ManageGuild} permission.</info>
16+
* @event Client#autoModerationActionExecution
17+
* @param {AutoModerationActionExecution} autoModerationActionExecution The data of the execution
18+
*/
19+
client.emit(Events.AutoModerationActionExecution, new AutoModerationActionExecution(data, guild));
20+
}
21+
22+
return {};
23+
}
24+
}
25+
26+
module.exports = AutoModerationActionExecutionAction;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
'use strict';
2+
3+
const Action = require('./Action');
4+
const Events = require('../../util/Events');
5+
6+
class AutoModerationRuleCreateAction extends Action {
7+
handle(data) {
8+
const { client } = this;
9+
const guild = client.guilds.cache.get(data.guild_id);
10+
11+
if (guild) {
12+
const autoModerationRule = guild.autoModerationRules._add(data);
13+
14+
/**
15+
* Emitted whenever an auto moderation rule is created.
16+
* <info>This event requires the {@link PermissionFlagsBits.ManageGuild} permission.</info>
17+
* @event Client#autoModerationRuleCreate
18+
* @param {AutoModerationRule} autoModerationRule The created auto moderation rule
19+
*/
20+
client.emit(Events.AutoModerationRuleCreate, autoModerationRule);
21+
}
22+
23+
return {};
24+
}
25+
}
26+
27+
module.exports = AutoModerationRuleCreateAction;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
'use strict';
2+
3+
const Action = require('./Action');
4+
const Events = require('../../util/Events');
5+
6+
class AutoModerationRuleDeleteAction extends Action {
7+
handle(data) {
8+
const { client } = this;
9+
const guild = client.guilds.cache.get(data.guild_id);
10+
11+
if (guild) {
12+
const autoModerationRule = guild.autoModerationRules.cache.get(data.id);
13+
14+
if (autoModerationRule) {
15+
guild.autoModerationRules.cache.delete(autoModerationRule.id);
16+
17+
/**
18+
* Emitted whenever an auto moderation rule is deleted.
19+
* <info>This event requires the {@link PermissionFlagsBits.ManageGuild} permission.</info>
20+
* @event Client#autoModerationRuleDelete
21+
* @param {AutoModerationRule} autoModerationRule The deleted auto moderation rule
22+
*/
23+
client.emit(Events.AutoModerationRuleDelete, autoModerationRule);
24+
}
25+
}
26+
27+
return {};
28+
}
29+
}
30+
31+
module.exports = AutoModerationRuleDeleteAction;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use strict';
2+
3+
const Action = require('./Action');
4+
const Events = require('../../util/Events');
5+
6+
class AutoModerationRuleUpdateAction extends Action {
7+
handle(data) {
8+
const { client } = this;
9+
const guild = client.guilds.cache.get(data.guild_id);
10+
11+
if (guild) {
12+
const oldAutoModerationRule = guild.autoModerationRules.cache.get(data.id)?._clone() ?? null;
13+
const newAutoModerationRule = guild.autoModerationRules._add(data);
14+
15+
/**
16+
* Emitted whenever an auto moderation rule gets updated.
17+
* <info>This event requires the {@link PermissionFlagsBits.ManageGuild} permission.</info>
18+
* @event Client#autoModerationRuleUpdate
19+
* @param {?AutoModerationRule} oldAutoModerationRule The auto moderation rule before the update
20+
* @param {AutoModerationRule} newAutoModerationRule The auto moderation rule after the update
21+
*/
22+
client.emit(Events.AutoModerationRuleUpdate, oldAutoModerationRule, newAutoModerationRule);
23+
}
24+
25+
return {};
26+
}
27+
}
28+
29+
module.exports = AutoModerationRuleUpdateAction;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict';
2+
3+
module.exports = (client, packet) => {
4+
client.actions.AutoModerationActionExecution.handle(packet.d);
5+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict';
2+
3+
module.exports = (client, packet) => {
4+
client.actions.AutoModerationRuleCreate.handle(packet.d);
5+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict';
2+
3+
module.exports = (client, packet) => {
4+
client.actions.AutoModerationRuleDelete.handle(packet.d);
5+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict';
2+
3+
module.exports = (client, packet) => {
4+
client.actions.AutoModerationRuleUpdate.handle(packet.d);
5+
};

0 commit comments

Comments
 (0)