mirror of
https://github.com/ReVanced/revanced-bots.git
synced 2026-01-18 00:33:59 +00:00
feat(bots/discord): add ocrTriggers resp config, embed footer scan mode
This commit is contained in:
@@ -4,6 +4,12 @@ export const MessageScanLabeledResponseReactions = {
|
|||||||
delete: '❌',
|
delete: '❌',
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
|
export const MessageScanHumanizedMode = {
|
||||||
|
ocr: 'image recognition',
|
||||||
|
nlp: 'text analysis',
|
||||||
|
match: 'pattern matching',
|
||||||
|
} as const
|
||||||
|
|
||||||
export const DefaultEmbedColor = '#4E98F0'
|
export const DefaultEmbedColor = '#4E98F0'
|
||||||
export const ReVancedLogoURL =
|
export const ReVancedLogoURL =
|
||||||
'https://media.discordapp.net/attachments/1095487869923119144/1115436493050224660/revanced-logo.png'
|
'https://media.discordapp.net/attachments/1095487869923119144/1115436493050224660/revanced-logo.png'
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ on('messageCreate', async (ctx, msg) => {
|
|||||||
logger.debug('Response found')
|
logger.debug('Response found')
|
||||||
|
|
||||||
const reply = await msg.reply({
|
const reply = await msg.reply({
|
||||||
embeds: [createMessageScanResponseEmbed(response)],
|
embeds: [createMessageScanResponseEmbed(response, label ? 'nlp' : 'match')],
|
||||||
})
|
})
|
||||||
|
|
||||||
if (label)
|
if (label)
|
||||||
@@ -52,12 +52,12 @@ on('messageCreate', async (ctx, msg) => {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const { text: content } = await api.client.parseImage(attachment.url)
|
const { text: content } = await api.client.parseImage(attachment.url)
|
||||||
const { response } = await getResponseFromContent(content, ctx)
|
const { response } = await getResponseFromContent(content, ctx, true)
|
||||||
|
|
||||||
if (response) {
|
if (response) {
|
||||||
logger.debug(`Response found for attachment: ${attachment.url}`)
|
logger.debug(`Response found for attachment: ${attachment.url}`)
|
||||||
await msg.reply({
|
await msg.reply({
|
||||||
embeds: [createMessageScanResponseEmbed(response)],
|
embeds: [createMessageScanResponseEmbed(response, 'ocr')],
|
||||||
})
|
})
|
||||||
|
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { DefaultEmbedColor, ReVancedLogoURL } from '$/constants'
|
import { DefaultEmbedColor, MessageScanHumanizedMode, ReVancedLogoURL } from '$/constants'
|
||||||
import { EmbedBuilder } from 'discord.js'
|
import { EmbedBuilder } from 'discord.js'
|
||||||
import type { ConfigMessageScanResponseMessage } from '../../../config.example'
|
import type { ConfigMessageScanResponseMessage } from '../../../config.example'
|
||||||
|
|
||||||
@@ -26,12 +26,20 @@ export const createSuccessEmbed = (title: string, description?: string) =>
|
|||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
export const createMessageScanResponseEmbed = (response: ConfigMessageScanResponseMessage) => {
|
export const createMessageScanResponseEmbed = (
|
||||||
|
response: ConfigMessageScanResponseMessage,
|
||||||
|
mode: 'ocr' | 'nlp' | 'match',
|
||||||
|
) => {
|
||||||
const embed = new EmbedBuilder().setTitle(response.title)
|
const embed = new EmbedBuilder().setTitle(response.title)
|
||||||
|
|
||||||
if (response.description) embed.setDescription(response.description)
|
if (response.description) embed.setDescription(response.description)
|
||||||
if (response.fields) embed.addFields(response.fields)
|
if (response.fields) embed.addFields(response.fields)
|
||||||
|
|
||||||
|
embed.setFooter({
|
||||||
|
text: `ReVanced • Done via ${MessageScanHumanizedMode[mode]}`,
|
||||||
|
iconURL: ReVancedLogoURL,
|
||||||
|
})
|
||||||
|
|
||||||
return applyCommonStyles(embed)
|
return applyCommonStyles(embed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { createMessageScanResponseEmbed } from './embeds'
|
|||||||
export const getResponseFromContent = async (
|
export const getResponseFromContent = async (
|
||||||
content: string,
|
content: string,
|
||||||
{ api, logger, config: { messageScan: config } }: typeof import('src/context'),
|
{ api, logger, config: { messageScan: config } }: typeof import('src/context'),
|
||||||
|
ocrMode = false,
|
||||||
) => {
|
) => {
|
||||||
if (!config || !config.responses) {
|
if (!config || !config.responses) {
|
||||||
logger.warn('No message scan config found')
|
logger.warn('No message scan config found')
|
||||||
@@ -21,12 +22,22 @@ export const getResponseFromContent = async (
|
|||||||
const firstLabelIndexes: number[] = []
|
const firstLabelIndexes: number[] = []
|
||||||
|
|
||||||
// Test if all regexes before a label trigger is matched
|
// Test if all regexes before a label trigger is matched
|
||||||
for (const trigger of config.responses) {
|
for (let i = 0; i < config.responses.length; i++) {
|
||||||
const { triggers, response: resp } = trigger
|
const trigger = config.responses[i]!
|
||||||
|
|
||||||
|
const { triggers, ocrTriggers, response: resp } = trigger
|
||||||
if (response) break
|
if (response) break
|
||||||
|
|
||||||
for (let i = 0; i < triggers.length; i++) {
|
if (ocrMode && ocrTriggers)
|
||||||
const trigger = triggers[i]!
|
for (const regex of ocrTriggers)
|
||||||
|
if (regex.test(content)) {
|
||||||
|
logger.debug(`Message matched regex (OCR mode): ${regex.source}`)
|
||||||
|
response = resp
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < triggers.length; j++) {
|
||||||
|
const trigger = triggers[j]!
|
||||||
|
|
||||||
if (trigger instanceof RegExp) {
|
if (trigger instanceof RegExp) {
|
||||||
if (trigger.test(content)) {
|
if (trigger.test(content)) {
|
||||||
@@ -35,14 +46,14 @@ export const getResponseFromContent = async (
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
firstLabelIndexes.push(i)
|
firstLabelIndexes[i] = j
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If none of the regexes match, we can search for labels immediately
|
// If none of the regexes match, we can search for labels immediately
|
||||||
if (!response) {
|
if (!response && !ocrMode) {
|
||||||
const scan = await api.client.parseText(content)
|
const scan = await api.client.parseText(content)
|
||||||
if (scan.labels.length) {
|
if (scan.labels.length) {
|
||||||
const matchedLabel = scan.labels[0]!
|
const matchedLabel = scan.labels[0]!
|
||||||
@@ -129,7 +140,7 @@ export const handleUserResponseCorrection = async (
|
|||||||
if (response.label !== label) {
|
if (response.label !== label) {
|
||||||
db.labeledResponses.edit(response.reply, { label, correctedBy: user.id })
|
db.labeledResponses.edit(response.reply, { label, correctedBy: user.id })
|
||||||
await reply.edit({
|
await reply.edit({
|
||||||
embeds: [createMessageScanResponseEmbed(correctLabelResponse.response)],
|
embeds: [createMessageScanResponseEmbed(correctLabelResponse.response, 'nlp')],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user