initiated detector
This commit is contained in:
parent
20db4f3192
commit
73b906fd9b
4 changed files with 126 additions and 5 deletions
|
|
@ -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
90
detectors/detector.js
Normal 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
29
detectors/pingDetector.js
Normal 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
6
package-lock.json
generated
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue