initiated detector

This commit is contained in:
louhane delforge 2025-11-20 17:41:00 +01:00
parent 20db4f3192
commit 73b906fd9b
4 changed files with 126 additions and 5 deletions

View file

@ -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
0.1.1 : initialisation et création du code
0.2.1 : ajout de modules de détection

90
detectors/detector.js Normal file
View file

@ -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('');
}
}

29
detectors/pingDetector.js Normal file
View file

@ -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);
}
}

6
package-lock.json generated
View file

@ -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"