feat(bots/discord): add replyToReplied option in response config

This commit is contained in:
PalmDevs
2024-07-26 01:08:23 +07:00
parent d0acab1915
commit 27662ed91a
3 changed files with 28 additions and 30 deletions

View File

@@ -60,6 +60,7 @@ export type ConfigMessageScanResponse = {
}
filterOverride?: NonNullable<Config['messageScan']>['filter']
response: ConfigMessageScanResponseMessage | null
replyToReplied?: boolean
}
export type ConfigMessageScanResponseLabelConfig = {

View File

@@ -21,12 +21,13 @@ withContext(on, 'messageCreate', async (context, msg) => {
try {
logger.debug(`Classifying message ${msg.id}`)
const { response, label } = await getResponseFromText(msg.content, filteredResponses, context)
const { response, label, replyToReplied } = await getResponseFromText(msg.content, filteredResponses, context)
if (response) {
logger.debug('Response found')
const reply = await msg.reply({
const toReply = replyToReplied ? await msg.fetchReference() : msg
const reply = await toReply.reply({
...response,
embeds: response.embeds?.map(it => createMessageScanResponseEmbed(it, label ? 'nlp' : 'match')),
})

View File

@@ -2,8 +2,7 @@ import { type Response, responses } from '$/database/schemas'
import type {
Config,
ConfigMessageScanResponse,
ConfigMessageScanResponseLabelConfig,
ConfigMessageScanResponseMessage,
ConfigMessageScanResponseLabelConfig
} from 'config.schema'
import type { Message, PartialUser, User } from 'discord.js'
import { eq } from 'drizzle-orm'
@@ -15,9 +14,12 @@ export const getResponseFromText = async (
// Just to be safe that we will never use data from the context parameter
{ api, logger }: Omit<typeof import('src/context'), 'config'>,
ocrMode = false,
) => {
let label: string | undefined
let response: ConfigMessageScanResponseMessage | undefined | null
): Promise<ConfigMessageScanResponse & { label?: string }> => {
let responseConfig: Awaited<ReturnType<typeof getResponseFromText>> = {
triggers: {},
response: null
}
const firstLabelIndexes: number[] = []
// Test if all regexes before a label trigger is matched
@@ -25,29 +27,28 @@ export const getResponseFromText = async (
const trigger = responses[i]!
// Filter override check is not neccessary here, we are already passing responses that match the filter
// from the messageCreate handler
// from the messageCreate handler, see line 17 of messageCreate handler
const {
triggers: { text: textTriggers, image: imageTriggers },
response: resp,
triggers: { text: textTriggers, image: imageTriggers }
} = trigger
if (response) break
if (responseConfig) break
if (ocrMode) {
if (imageTriggers)
for (const regex of imageTriggers)
if (regex.test(content)) {
logger.debug(`Message matched regex (OCR mode): ${regex.source}`)
response = resp
responseConfig = trigger
break
}
} else
for (let j = 0; j < textTriggers!.length; j++) {
const trigger = textTriggers![j]!
const regex = textTriggers![j]!
if (trigger instanceof RegExp) {
if (trigger.test(content)) {
logger.debug(`Message matched regex (before mode): ${trigger.source}`)
response = resp
if (regex instanceof RegExp) {
if (regex.test(content)) {
logger.debug(`Message matched regex (before mode): ${regex.source}`)
responseConfig = trigger
break
}
} else {
@@ -58,7 +59,7 @@ export const getResponseFromText = async (
}
// If none of the regexes match, we can search for labels immediately
if (!response && !ocrMode) {
if (!responseConfig && !ocrMode) {
logger.debug('No match from before regexes, doing NLP')
const scan = await api.client.parseText(content)
if (scan.labels.length) {
@@ -76,24 +77,22 @@ export const getResponseFromText = async (
if (!labelConfig) {
logger.warn(`No label config found for label ${matchedLabel.name}`)
return { response: null, label: undefined }
return responseConfig
}
if (matchedLabel.confidence >= triggerConfig!.threshold) {
logger.debug('Label confidence is enough')
label = matchedLabel.name
response = labelConfig.response
responseConfig = labelConfig
}
}
}
// If we still don't have a label, we can match all regexes after the initial label trigger
if (!response) {
// If we still don't have a response config, we can match all regexes after the initial label trigger
if (!responseConfig) {
logger.debug('No match from NLP, doing after regexes')
for (let i = 0; i < responses.length; i++) {
const {
triggers: { text: textTriggers },
response: resp,
triggers: { text: textTriggers }
} = responses[i]!
const firstLabelIndex = firstLabelIndexes[i] ?? -1
@@ -103,7 +102,7 @@ export const getResponseFromText = async (
if (trigger instanceof RegExp) {
if (trigger.test(content)) {
logger.debug(`Message matched regex (after mode): ${trigger.source}`)
response = resp
responseConfig = responses[i]!
break
}
}
@@ -111,10 +110,7 @@ export const getResponseFromText = async (
}
}
return {
response,
label,
}
return responseConfig
}
export const shouldScanMessage = (