fix: automode rule helpers and test

This commit is contained in:
H01001000
2022-12-25 20:45:58 +08:00
parent 9826ce1fa5
commit 7ebec080af
6 changed files with 307 additions and 23 deletions

View File

@@ -1,16 +1,17 @@
import { routes } from '@discordeno/constant'
import TRANSFORMERS from '@discordeno/transformer'
import type {
AutoModerationActionType,
AutoModerationEventTypes,
AutoModerationTriggerTypes,
BigString,
Camelize,
DiscordAutoModerationRule,
DiscordAutoModerationRuleTriggerMetadataPresets,
DiscordCreateAutomoderationRule,
WithReason
} from '@discordeno/types'
import type { RestManager } from '../../../restManager.js'
import type { AutoModerationRule } from '../../../transformers/automodRule.js'
/**
* Creates an automod rule in a guild.
@@ -18,7 +19,7 @@ import type { AutoModerationRule } from '../../../transformers/automodRule.js'
* @param rest - The rest manager to use to make the request.
* @param guildId - The ID of the guild to create the rule in.
* @param options - The parameters for the creation of the rule.
* @returns An instance of the created {@link AutoModerationRule}.
* @returns An instance of the created {@link DiscordAutoModerationRule}.
*
* @remarks
* Requires the `MANAGE_GUILD` permission.
@@ -31,9 +32,8 @@ export async function createAutomodRule (
rest: RestManager,
guildId: BigString,
options: CreateAutoModerationRuleOptions
): Promise<AutoModerationRule> {
): Promise<Camelize<DiscordAutoModerationRule>> {
const result = await rest.runMethod<DiscordAutoModerationRule>(
'POST',
routes.AUTOMOD_RULES(guildId),
{
@@ -62,7 +62,7 @@ export async function createAutomodRule (
} as DiscordCreateAutomoderationRule
)
return rest.transformers.automodRule(rest, result)
return TRANSFORMERS.automodRule(result)
}
export interface CreateAutoModerationRuleOptions extends WithReason {

View File

@@ -23,7 +23,6 @@ export async function deleteAutomodRule (
reason?: string
): Promise<void> {
return await rest.runMethod<void>(
'DELETE',
routes.AUTOMOD_RULE(guildId, ruleId),
{ reason }

View File

@@ -1,15 +1,16 @@
import { routes } from '@discordeno/constant'
import TRANSFORMERS from '@discordeno/transformer'
import type {
AutoModerationActionType,
AutoModerationEventTypes,
BigString,
Camelize,
DiscordAutoModerationRule,
DiscordAutoModerationRuleTriggerMetadataPresets,
DiscordModifyAutomoderationRule,
WithReason
} from '@discordeno/types'
import type { RestManager } from '../../../restManager.js'
import type { AutoModerationRule } from '../../../transformers/automodRule.js'
/**
* Edits an automod rule.
@@ -18,7 +19,7 @@ import type { AutoModerationRule } from '../../../transformers/automodRule.js'
* @param guildId - The ID of the guild to edit the rule in.
* @param ruleId - The ID of the rule to edit.
* @param options - The parameters for the edit of the rule.
* @returns An instance of the edited {@link AutoModerationRule}.
* @returns An instance of the edited {@link DiscordAutoModerationRule}.
*
* @remarks
* Requires the `MANAGE_GUILD` permission.
@@ -32,9 +33,8 @@ export async function editAutomodRule (
guildId: BigString,
ruleId: BigString,
options: Partial<EditAutoModerationRuleOptions>
): Promise<AutoModerationRule> {
): Promise<Camelize<DiscordAutoModerationRule>> {
const result = await rest.runMethod<DiscordAutoModerationRule>(
'PATCH',
routes.AUTOMOD_RULE(guildId, ruleId),
{
@@ -62,7 +62,7 @@ export async function editAutomodRule (
} as DiscordModifyAutomoderationRule
)
return rest.transformers.automodRule(rest, result)
return TRANSFORMERS.automodRule(result)
}
export interface EditAutoModerationRuleOptions extends WithReason {

View File

@@ -1,7 +1,11 @@
import { routes } from '@discordeno/constant'
import type { BigString, DiscordAutoModerationRule } from '@discordeno/types'
import TRANSFORMERS from '@discordeno/transformer'
import type {
BigString,
Camelize,
DiscordAutoModerationRule
} from '@discordeno/types'
import type { RestManager } from '../../../restManager.js'
import type { AutoModerationRule } from '../../../transformers/automodRule.js'
/**
* Gets an automod rule by its ID.
@@ -9,7 +13,7 @@ import type { AutoModerationRule } from '../../../transformers/automodRule.js'
* @param rest - The rest manager to use to make the request.
* @param guildId - The ID of the guild to get the rule of.
* @param ruleId - The ID of the rule to get.
* @returns An instance of {@link AutoModerationRule}.
* @returns An instance of {@link DiscordAutoModerationRule}.
*
* @remarks
* Requires the `MANAGE_GUILD` permission.
@@ -20,12 +24,11 @@ export async function getAutomodRule (
rest: RestManager,
guildId: BigString,
ruleId: BigString
): Promise<AutoModerationRule> {
): Promise<Camelize<DiscordAutoModerationRule>> {
const result = await rest.runMethod<DiscordAutoModerationRule>(
'GET',
routes.AUTOMOD_RULE(guildId, ruleId)
)
return rest.transformers.automodRule(rest, result)
return TRANSFORMERS.automodRule(result)
}

View File

@@ -1,15 +1,19 @@
import { routes } from '@discordeno/constant'
import type { BigString, DiscordAutoModerationRule } from '@discordeno/types'
import TRANSFORMERS from '@discordeno/transformer'
import type {
BigString,
Camelize,
DiscordAutoModerationRule
} from '@discordeno/types'
import { Collection } from '@discordeno/utils'
import type { RestManager } from '../../../restManager.js'
import type { AutoModerationRule } from '../../../transformers/automodRule.js'
/**
* Gets the list of automod rules for a guild.
*
* @param rest - The rest manager to use to make the request.
* @param guildId - The ID of the guild to get the rules from.
* @returns A collection of {@link AutoModerationRule} objects assorted by rule ID.
* @returns A collection of {@link DiscordAutoModerationRule} objects assorted by rule ID.
*
* @remarks
* Requires the `MANAGE_GUILD` permission.
@@ -19,16 +23,15 @@ import type { AutoModerationRule } from '../../../transformers/automodRule.js'
export async function getAutomodRules (
rest: RestManager,
guildId: BigString
): Promise<Collection<bigint, AutoModerationRule>> {
): Promise<Collection<string, Camelize<DiscordAutoModerationRule>>> {
const results = await rest.runMethod<DiscordAutoModerationRule[]>(
'GET',
routes.AUTOMOD_RULES(guildId)
)
return new Collection(
results.map((result) => {
const rule = rest.transformers.automodRule(rest, result)
const rule = TRANSFORMERS.automodRule(result)
return [rule.id, rule]
})
)

View File

@@ -0,0 +1,279 @@
import {
AutoModerationActionType,
AutoModerationEventTypes,
AutoModerationTriggerTypes
} from '@discordeno/types'
import { expect } from 'chai'
import { CACHED_COMMUNITY_GUILD_ID, rest } from './utils.js'
describe('[automod] Run automod tests', async () => {
it('[automod] Create a MessageSend rule for Keyword with BlockMessage action.', async () => {
const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
triggerMetadata: {
keywordFilter: ['iblamewolf']
},
actions: [
{
type: AutoModerationActionType.BlockMessage
}
]
})
expect(rule.id).to.be.exist
const fetchedRule = await rest.getAutomodRule(
CACHED_COMMUNITY_GUILD_ID,
rule.id
)
expect(fetchedRule.id).to.be.exist
expect(fetchedRule.name).to.equal(rule.name)
expect(fetchedRule.eventType).to.equal(
AutoModerationEventTypes.MessageSend
)
expect(fetchedRule.triggerType).to.equal(
AutoModerationTriggerTypes.Keyword
)
expect(fetchedRule.triggerMetadata?.keywordFilter?.[0]).to.equal(
'iblamewolf'
)
expect(fetchedRule.actions).to.be.exist
expect(fetchedRule.actions[0]).to.be.exist
expect(fetchedRule.actions[0].type).to.equal(
AutoModerationActionType.BlockMessage
)
await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id)
})
it('[automod] Create a MessageSend rule for Keyword with SendAlertMessage action.', async () => {
const channel = await rest.createChannel(CACHED_COMMUNITY_GUILD_ID, {
name: 'test'
})
expect(channel.id).to.be.exist
const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
triggerMetadata: {
keywordFilter: ['iblamewolf']
},
actions: [
{
type: AutoModerationActionType.SendAlertMessage,
metadata: {
channelId: channel.id
}
}
]
})
expect(rule.id).to.be.exist
const fetchedRule = await rest.getAutomodRule(
CACHED_COMMUNITY_GUILD_ID,
rule.id
)
expect(fetchedRule.id).to.be.exist
expect(fetchedRule.name).to.equal(rule.name)
expect(fetchedRule.eventType).to.equal(
AutoModerationEventTypes.MessageSend
)
expect(fetchedRule.triggerType).to.equal(
AutoModerationTriggerTypes.Keyword
)
expect(fetchedRule.triggerMetadata?.keywordFilter?.[0]).to.equal(
'iblamewolf'
)
expect(fetchedRule.actions).to.be.exist
expect(fetchedRule.actions[0]).to.be.exist
expect(fetchedRule.actions[0].type).to.equal(
AutoModerationActionType.SendAlertMessage
)
expect(fetchedRule.actions[0].metadata?.channelId).to.equal(channel.id)
await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id)
await rest.deleteChannel(channel.id)
})
it('[automod] Create a MessageSend rule for Keyword with Timeout action.', async () => {
const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
triggerMetadata: {
keywordFilter: ['iblamewolf']
},
actions: [
{
type: AutoModerationActionType.Timeout,
metadata: {
durationSeconds: 10
}
}
]
})
expect(rule.id).to.be.exist
const fetchedRule = await rest.getAutomodRule(
CACHED_COMMUNITY_GUILD_ID,
rule.id
)
expect(fetchedRule.id).to.be.exist
expect(fetchedRule.name).to.equal(rule.name)
expect(fetchedRule.eventType).to.equal(
AutoModerationEventTypes.MessageSend
)
expect(fetchedRule.triggerType).to.equal(
AutoModerationTriggerTypes.Keyword
)
expect(fetchedRule.triggerMetadata?.keywordFilter?.[0]).to.equal(
'iblamewolf'
)
expect(fetchedRule.actions).to.be.exist
expect(fetchedRule.actions[0]).to.be.exist
expect(fetchedRule.actions[0].type).to.equal(
AutoModerationActionType.Timeout
)
expect(fetchedRule.actions[0].metadata?.durationSeconds).to.equal(10)
await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id)
})
it('[automod] Create a MessageSend rule for Keyword with BlockMessage & Timeout action.', async () => {
const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
triggerMetadata: {
keywordFilter: ['iblamewolf']
},
actions: [
{
type: AutoModerationActionType.BlockMessage
},
{
type: AutoModerationActionType.Timeout,
metadata: {
durationSeconds: 10
}
}
]
})
expect(rule.id).to.be.exist
await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id)
})
it('[automod] Create a MessageSend rule for Keyword with SendAlertMessage & Timeout action.', async () => {
const channel = await rest.createChannel(CACHED_COMMUNITY_GUILD_ID, {
name: 'test'
})
expect(channel.id).to.be.exist
const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
triggerMetadata: {
keywordFilter: ['iblamewolf']
},
actions: [
{
type: AutoModerationActionType.SendAlertMessage,
metadata: {
channelId: channel.id
}
},
{
type: AutoModerationActionType.Timeout,
metadata: {
durationSeconds: 10
}
}
]
})
expect(rule.id).to.be.exist
await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id)
await rest.deleteChannel(channel.id)
})
it('[automod] Create a MessageSend rule for Keyword with BlockMessage & SendAlertMessage & Timeout action.', async () => {
const channel = await rest.createChannel(CACHED_COMMUNITY_GUILD_ID, {
name: 'test'
})
const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
triggerMetadata: {
keywordFilter: ['iblamewolf']
},
actions: [
{
type: AutoModerationActionType.BlockMessage
},
{
type: AutoModerationActionType.SendAlertMessage,
metadata: {
channelId: channel.id
}
},
{
type: AutoModerationActionType.Timeout,
metadata: {
durationSeconds: 10
}
}
]
})
expect(rule.id).to.be.exist
// Get the rule again to make sure it was created correctly
const fetchedRule = await rest.getAutomodRule(
CACHED_COMMUNITY_GUILD_ID,
rule.id
)
expect(fetchedRule.id).to.be.exist
expect(fetchedRule.name).to.equal(rule.name)
expect(fetchedRule.eventType).to.equal(
AutoModerationEventTypes.MessageSend
)
expect(fetchedRule.triggerType).to.equal(
AutoModerationTriggerTypes.Keyword
)
expect(fetchedRule.triggerMetadata?.keywordFilter?.[0]).to.equal(
'iblamewolf'
)
expect(fetchedRule.actions).to.be.exist
expect(fetchedRule.actions[0]).to.be.exist
expect(fetchedRule.actions[1].metadata).to.be.exist
expect(fetchedRule.actions[2].metadata).to.be.exist
expect(fetchedRule.actions[1].metadata.channelId).to.equal(channel.id)
expect(fetchedRule.actions[2].metadata.durationSeconds).to.equal(10)
expect(fetchedRule.actions[0].type).to.equal(
AutoModerationActionType.BlockMessage
)
expect(fetchedRule.actions[1].type).to.equal(
AutoModerationActionType.SendAlertMessage
)
expect(fetchedRule.actions[2].type).to.equal(
AutoModerationActionType.Timeout
)
await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id)
await rest.deleteChannel(channel.id)
})
})