From 73b906fd9bd6c6ab0ce84f4fd88c247376879c74 Mon Sep 17 00:00:00 2001 From: louhane delforge Date: Thu, 20 Nov 2025 17:41:00 +0100 Subject: [PATCH] initiated detector --- README.md | 6 ++- detectors/detector.js | 90 +++++++++++++++++++++++++++++++++++++++ detectors/pingDetector.js | 29 +++++++++++++ package-lock.json | 6 +-- 4 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 detectors/detector.js create mode 100644 detectors/pingDetector.js diff --git a/README.md b/README.md index 466f483..28ec762 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # genius-troll réponses troll et fun facts +# dépendances +bun add fr-compromise conjugation-fr discord.js + # version -1.O : initialisation et création du code \ No newline at end of file +0.1.1 : initialisation et création du code +0.2.1 : ajout de modules de détection \ No newline at end of file diff --git a/detectors/detector.js b/detectors/detector.js new file mode 100644 index 0000000..b720dcd --- /dev/null +++ b/detectors/detector.js @@ -0,0 +1,90 @@ +import { getSetting } from "../db.js"; + +export const TriggerState = { + untriggered: 0, + replied: 1, + canReply: 2, + cannotReply: 3, +}; + +export function createTriggersChecklist() { + return { + 'quoi': TriggerState.untriggered, + 'feur': TriggerState.untriggered, + 'mention': TriggerState.untriggered, + 'quoicoubeh': TriggerState.untriggered, + }; +} + +/** + * Base class for all detectors + * Using a Chain of Responsibility pattern + */ +export default class Detector { + nextDetector = null; + triggerName = 'quoi'; // Valeur par défaut + + /** + * @param nextDetector The detector that will be checked if this one doesn't detect anything + * @returns The next detector + */ + setNextDetector(nextDetector) { + this.nextDetector = nextDetector; + return nextDetector; + } + + createSpecificReply(message) { + return Promise.resolve(null); + } + + getChanceToReply(message) { + if (message.guildId == null) { + return 0; + } + return getSetting(message.guildId, `${this.triggerName}AnswerPercentage`); + } + + async createReply(message, triggersChecklist) { + if (message.guildId == null) { + return Promise.reject(new Error('No guild ID')); + } + + const ignoredRoleId = getSetting(message.guildId, 'ignoredRoleId'); + if (ignoredRoleId !== null && message.member?.roles.cache.has(ignoredRoleId)) { + return Promise.resolve(''); + } + + const forcedRoleId = getSetting(message.guildId, 'forcedAnswerRoleId'); + + // Si l'utilisateur a le rôle forcé, on ignore le pourcentage (100%) + const threshold = (forcedRoleId != null && message.member?.roles.cache.has(forcedRoleId)) + ? 100 + : this.getChanceToReply(message); + + triggersChecklist = triggersChecklist ?? createTriggersChecklist(); + + switch (triggersChecklist[this.triggerName]) { + case TriggerState.replied: + return Promise.resolve(''); + case TriggerState.untriggered: + if (Math.floor(Math.random() * 100) < threshold) { + triggersChecklist[this.triggerName] = TriggerState.canReply; + } else { + triggersChecklist[this.triggerName] = TriggerState.cannotReply; + } + break; + } + + if (triggersChecklist[this.triggerName] === TriggerState.canReply) { + const detected = await this.createSpecificReply(message); + if (detected !== null) { + triggersChecklist[this.triggerName] = TriggerState.replied; + return detected; + } + } + if (this.nextDetector) { + return this.nextDetector.createReply(message, triggersChecklist); + } + return Promise.resolve(''); + } +} \ No newline at end of file diff --git a/detectors/pingDetector.js b/detectors/pingDetector.js new file mode 100644 index 0000000..5f2f4d1 --- /dev/null +++ b/detectors/pingDetector.js @@ -0,0 +1,29 @@ +import Detector from "./Detector.js"; +import { cleanMessageContent } from "../utils/strings.js"; + +const answers = [ + 'Oui ? (stiti)', + "On m'a appelé ?", + 'https://tenor.com/view/bonjour-hello-oss117-jean-dujardin-hubert-bonisseur-de-la-bath-gif-13920747', + 'https://tenor.com/fr/view/hello-there-gif-5677380953331354485', + 'https://tenor.com/view/casse-fracasse-chabal-destroy-mur-gif-21656168' +]; + +export default class PingDetector extends Detector { + triggerName = 'mention'; + + async detect(message) { + if (/(^|\b)(feur|quoicoubeh)(\b|$)/i.test(cleanMessageContent(message))) { + return false; + } + + return message.mentions.parsedUsers.has(message.client.user.id); + } + + async createSpecificReply(message) { + if (await this.detect(message)) { + return Promise.resolve(answers[Math.floor(Math.random() * answers.length)]); + } + return Promise.resolve(null); + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 76f841d..789202a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,10 @@ { - "name": "troll-bot-lou", - "version": "1.0.0", + "name": "genius-troll", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "troll-bot-lou", - "version": "1.0.0", + "name": "genius-troll", "license": "ISC", "dependencies": { "discord.js": "^14.25.0"