From d3bfd95976f1506c6c765876858b7f4c1df5f779 Mon Sep 17 00:00:00 2001 From: PMLefra <pm@lefra.net> Date: Fri, 24 Dec 2021 04:35:18 +0100 Subject: [PATCH] Complobot evolves! See the commit details. - Fixed the #base-du-bot channel - Added "pourquoi... ?" - Added the db to the repo & corrected typos in its entries --- .gitignore | 1 - commands/CommandParser.js | 3 + commands/CommandPourquoi.js | 31 ++++++++++ database/ComplotDB.js | 7 +-- database/complot_db.json | 1 + index.js | 52 ++++++++-------- vote/VoteParser.js | 120 ++++++++++++++++++++++++++++-------- 7 files changed, 158 insertions(+), 57 deletions(-) create mode 100644 commands/CommandPourquoi.js create mode 100644 database/complot_db.json diff --git a/.gitignore b/.gitignore index b028d81..638efef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ config.json /node_modules -/database/complot_db.json diff --git a/commands/CommandParser.js b/commands/CommandParser.js index 5b903eb..362ec93 100644 --- a/commands/CommandParser.js +++ b/commands/CommandParser.js @@ -2,6 +2,7 @@ const InformeMoi = require('./InformeMoi.js'); const DatabaseCommand = require('./DatabaseCommand.js'); const CommandVoteParser = require('./CommandVoteParser.js'); const CommandQui = require('./CommandQui.js'); +const CommandPourquoi = require('./CommandPourquoi.js'); class CommandParser { @@ -12,6 +13,7 @@ class CommandParser { this.databaseCommand = new DatabaseCommand(client); this.commandVoteParser = new CommandVoteParser(voteParser); this.commandQui = new CommandQui(client); + this.commandPourquoi = new CommandPourquoi(client); } parse(message) { @@ -20,6 +22,7 @@ class CommandParser { this.databaseCommand.parse(message); this.commandVoteParser.parse(message); this.commandQui.parse(message); + this.commandPourquoi.parse(message); } } } diff --git a/commands/CommandPourquoi.js b/commands/CommandPourquoi.js new file mode 100644 index 0000000..8e67d2e --- /dev/null +++ b/commands/CommandPourquoi.js @@ -0,0 +1,31 @@ +const complotDB = require('../database/ComplotDB.js'); + +class CommandPourquoi{ + constructor(client){ + this.client = client; + this.sentences = ["Sûrement pour <why>...", "Afin de <why>", "Bah pour <why> !", "J'pense que c'est pour <why> ??", "Sans aucun doute, <why>.", "C'est simplement afin de <why>.", "Bah, pour <why>.", "Bah pour <why> connard", "Mmmh p'tetre pour <why> ?"]; + this.pourquoiRegExp = new RegExp('([^a-z]|^)pourquoi[^a-z]', 'i'); /**'pourquoi' pas dans un mot */ + } + + getRandomPourquoi(){ + const reason = complotDB.getRandomReason(); + + return this.sentences[Math.floor(Math.random()*this.sentences.length)].replace('<why>', reason); + } + + parse(message){ + if(this.shouldRespond(message)){ + message.reply(this.getRandomPourquoi()); + } + } + + shouldRespond(message){ + const resRE = message.content.match(this.pourquoiRegExp); + if(resRE){ + return message.content.slice(resRE.index).includes('?'); /**Contient un '?' après le ' qui ' */ + } + return false; + } +} + +module.exports = CommandPourquoi; \ No newline at end of file diff --git a/database/ComplotDB.js b/database/ComplotDB.js index 1ed291e..dab40e4 100644 --- a/database/ComplotDB.js +++ b/database/ComplotDB.js @@ -91,10 +91,8 @@ class ComplotDB{ } listToString(list, title){ - let content = "```\n"; - content += `======== ${title} =========\n`; + let content = `======== ${title} =========\n`; content += this.#enumListString(list); - content += '```'; return content; } @@ -123,7 +121,7 @@ class ComplotDB{ } readFile(){ - let data = fs.readFile(this.filename, (err, data)=>{ + fs.readFile(this.filename, (err, data)=>{ if (err){ console.log("ERROR READ FILE", err); throw err; @@ -136,7 +134,6 @@ class ComplotDB{ this.sentences = json.sentences ? json.sentences : []; this.welcome = json.welcome ? json.welcome : []; }); - } saveFile(){ diff --git a/database/complot_db.json b/database/complot_db.json new file mode 100644 index 0000000..03375e3 --- /dev/null +++ b/database/complot_db.json @@ -0,0 +1 @@ +{"actors":["Macron","TSP","Le BDE","Les francs-maçons","La CIA","Laurent Prével","Mouilleron","Rioboo","Forest","Jean Lassalle","Sylvain Durif","Rocket","Titi","Nathalie Arthaud","Le fantôme d'Hitler","JeanMarIIE","Le Bar (c)","Le C-19","Michel Drucker","Sardoche","i-TV","Ta mère","Dièse","Le CBDE","Le MEDEF","L'artiste Gaber","Le grand Patronat","Te Deum","Frédéric Chaumont","Didier Raoult","Alain Soral","Cortex 91 des pyramides","Les témoins de Jéhovah","Génération identitaire","Michel","Mark Zuckerberg","La famille Rothschild","Steve de Minecraft","L'élite de la nation","Fisti","Un homme appelé Philippe","Manuel Valls","Un moustachu des années 40","Éric Zemmour","Les FIPAs","Pyjaman","<:raoult:901077882229633084>","L'ANiMALERie","OVERDRIIVE","LabyrIInthE","FIIPALE","ChevalerIIE","IIKEA","HURRIICANE","La Myrliste","Complobot","Hillary Clinton","Michael Jackson, qui faisait semblant d'être mort,","Chuck Norris","Dieudonné","Un vacciné sur dix","Kober","Obsidienne","Anne Hidalgo","Le lobby LGBTQII+ judéo-maçonnique","Toi","Roikoko","Sandrine de l'accueil","Le dalaï-lama","Daenerys du Typhon de la Maison Targaryen, première du nom, Reine des Andals, de Rhoynar et des Premiers Hommes, Suzeraine des Sept Couronnes et Protectrice du Royaume, Dame de Peyredragon, Reine de Meereen, Khaleesi de la Grande Mer herbeuse, l’Imbrûlée, Briseuse de chaînes et Mère des dragons","Henry de Lesquen","NORMAN (le YouTuber à succès)"],"actions":["pirater Arise","vacciner la population","installer des antennes 5G","créer un nouveau variant du coronavirus","détruire Évry","bombarder TSP","faire des TikTok","comprendre les cours de Rioboo","vendre des informations aux Japonais","racheter MyPizza","annexer l'IMT-BS","radier le tout le BdE de l'AEIIE","interdire la vente d'alcool à Le Bar (c)","installer Windows sur les PCs de l'école","enlever les hentai du Baka","mettre Jean MarIIE à la tête du Bde","soudoyer des iiens","payer des petits chinois","lancer une shitstorm par mail","investir dans l'immobilier","débrancher un switch pendant une NJV","spéculer sur l'effondrement de l'économie africaine","organiser un contre-Wei","faire des saloperies à nos mamans","nous infliger du Patrick Sébastien jusqu'à perte de conscience","ne manger que des pâtes sans sauce pendant deux ans","manger nos morts","prendre le contrôle des médias","désinformer les enfants dès l'école","remplacer les oiseaux par des drones","défendre la mémoire du Maréchal Pétain","magnétiser les pôles","acheter le CBDE avec des Bébels","arrondir la terre","marabouter les Français","se soulager dans le grand bain de la piscine publique","tuer les non-vegans","pousser les gens à croire à la théorie de l'évolution","tricher au fil rouge de Labyriinthe","faire disparaître les stickers des listes","grand-remplacer le poste de DSI","regarder sous la calotte du Pape François","remplacer toutes les routes d'Évry par des pistes cyclables","hurler **FIIIIPAAAAAAAAAA**","hurler **DEUS VULT**","\"oublier\" des aliments avariés dans le local CuIsInE 😉","faire venir Rollo en soirée","renommer l'ENSIIE en \"ENSIÉ\""],"reasons":["gagner l'élection 2022","contrôler l'humanité","éradiquer l'humanité","instaurer une dictature","capter la 5G","gagner contre Pignôle au babyfoot","faire fermer l'ENSIIE","déradier Tigriz","dissoudre le Bakaclub","supprimer internet","gagner le carambar d'or","intégrer TSP","éradiquer tous les viieux","gagner la campagne BdE","prendre la place de Tactac","rouvrir l'antenne de Strasbourg","obtenir tous les boucliers verts","passer master sur LoL","faire gagner l'emote fipa","faire arriver le RER D à l'heure","préserver les iiens de souche","imposer un régime communiste","empêcher Pignôle (<@590627154400903228>) de faire des blagues","terminer One Piece","saboter la campagne de ComplotIIstE","gagner des Bébels","devenir seigneur des Sept Couronnes","empêcher le onzième Grand Retour de Manuel Valls","lancer une attaque nucléaire sur la Serbie","prendre le contrôle du marché mondial du pétrole","empêcher de prouver que la terre est plate","nous faire taire, nous les sachants","se faire couronner roi et grand sultan","vider le budget de l'État dans un compte aux Seychelles","neutraliser le laser atomique caché dans l'oeil de verre de Jean-Marie Le Pen","ping <@145976381128441856>","gagner le fil rouge de Labyriinthe","se faire enfin respecter","expulser les extés de l'IIE","rendre à la france sa grandeur","faire annuler une 3ème fois la Bakanim'"],"sources":["QAnon","l'IImondE","une amie qui travaille au gouvernement","Réinfo Covid","FranceSoir","Médiavenir","LesMoutonsRebelles","un poste Facebook","un twittos","Kim Glow","l'AFP","ma maman","Jean-Jacques Bourdin","Stéphane Bern","CNews","Louis Fouché","Didier Raoult","Francis Lalane","Eddy Malou","mon oncle sur Whatsapp","un ami directeur de production à France Télévisions","un prix nobel désavoué par sa profession","Démotivateur","Madmoizelle.com","Buzz feed","l'intuition","Pulko","le Gorafi","RT France","Égalité & Réconciliation","La CTI","le meilleur espion des Japonais","un ancien président du BdE","le porte-parole de Vladimir Poutine","un bout de papier retrouvé dans le S2","le \"\"\"fact checking\"\"\" de BFM","les dernières vidéos d'I-TV","le mail d'un fantôme 28A qui demande à être désabonné d'une ML associative","les décodeurs du monde","l'astrologie moderne","le tardigrade de Jacques Grimault","Sandrine de l'accueil","Konbini","les chuchotements entendus lors de la dernière réu publique du BDE"],"sentences":["<actor> <want> <action> pour <reason> !","Selon <source>, <actor> <want> <action> afin de <reason>.","<actor> <want> <action> rien que pour <reason>.....","Grâce à <source>, je sais que <actor> <want> <action> pour <reason>.","On dit que <actor> <want> <action>, tout ça pour <reason>...","<actor> <want> <action> afin de <reason>, ça fait réfléchir...","Vous verrez que <actor> va <action> pour <reason>, vous l'aurez lu ici en premier...","🚨ALERTE INFO🚨 :\n <actor> <want> <action> pour <reason> \n (Source : <source>)","Je sais par <source> que <actor> <want> <action> pour <reason>!!!","<actor> <want> <reason>, ça dit beaucou au sujé de sociéter","Attention !\n<Source> a découvert que si <actor> fait <action>, ce n'est pas pour <reason> mais bien pour <reason> !!!\nÇa fait réfléchir sur <actor> non ?","Vous ne trouvez pas ça curieux que <actor> n'ait pas encore dit qu'il comptait <action> afin de <reason> ?\nSelon <source>, ça ne saurait tarder !","Bon, moquez-vous de moi si vous voulez, mais vous allez voir que <actor> va <action>. Je vous aurais prévenus !","<actor> et <actor> complotent main dans la main pour <action> !!","Vous pensiez peut-être que <actor> était responsable, mais c'est en vérité <actor> qui a décidé de <action> il y a quelque temps, et ce afin de <reason>, eh oui ! ðŸ§","D'après <source>, <actor>, <actor> et <actor> se sont entendu pour assassiner <actor> et <reason> !!","Nous apprenons par <source> qu'en réalité <actor> a été jusqu'à <action> pour coucher avec <actor> !!!","Choquant : <reason> faisant partie de ses fantasmes, <actor> passe à l'action et commence par <action> !","Selon <source>, <action>, <action> et <action> sont les trois lignes de programme que Jean-Luc Mélenchon hésite à mettre en avant pour sa campagne...","Apparemment, <source> et <source> s'accordent de façon étonnante sur ce que cherche à faire <actor> pour <reason>, mais on va encore me traiter de complotiste ???","Oh, non ! <actor> et <actor> sont en compétition pour être le premier à <reason> !!!","Il paraît que <actor> veut grand-remplacer Complobot par le Masturbot de <actor> 😢","<actor> aime beaucoup trop <action>, et ça en devient gênant...","<actor> et <actor> ont beaucoup été vus ensemble ces derniers temps, on se demande ce qu'ils préparent...","Ça n'étonnera personne si je vous dis que <actor> essaye de nous dire qu'on complote pour <action>. Mais il s'agit en fait d'une diversion pour <reason> 😱😱😱 !!!","Après quelques échanges avec <source> et <source>, il semblerait que <actor> soit innocent 😇 ! Mais alors qui cherche à <action> ?? 👀"],"welcome":["Bienvenue <new_user>, j'espère que tu ne travailles pas pour <actor> 🤔","Le saviez-vous ? <new_user> est en réalité <actor>, eh oui !","<new_user> vient de rejoindre le Discord pour <action>...","Bienvenue <new_user>, j'ai su grace à <source> que tu veux <action> !","Salut à toi jeune <new_user>, nous savons tous déjà que tu viens ici pour <action> avec <source> !","Oh, regardez <new_user> vient de débarquer, méfiez vous de lui....","Bienvenue à toi <new_user>, il paraît que tu connais très bien <actor> ?","Tu es le bienvenue <new_user>, même si tout le monde ici sait que tu bosses pour <actor>.","Bienvenue <new_user>, j'ai entendu dire que tu veux <action> pour <reason>, c'est vrai ?","Oh tiens tiens tiens <new_user> qui rejoint le discord ComplotIIstE ... COMME PAR HASARD ?"]} \ No newline at end of file diff --git a/index.js b/index.js index 04de1aa..0cab476 100644 --- a/index.js +++ b/index.js @@ -1,46 +1,46 @@ -const { Client, Intents } = require('discord.js'); -const { token, clientId } = require('./config.json'); +const {Client, Intents} = require('discord.js'); +const {token, clientId} = require('./config.json'); const CommandParser = require('./commands/CommandParser.js'); -const complotDB = require('./database/ComplotDB.js'); const VoteParser = require('./vote/VoteParser'); -const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS, Intents.FLAGS.GUILD_MEMBERS], - partials: ['MESSAGE', 'CHANNEL', 'REACTION'] }); +const client = new Client({ + intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS, Intents.FLAGS.GUILD_MEMBERS], + partials: ['MESSAGE', 'CHANNEL', 'REACTION'] +}); let parser = null; let voteParser = null; client.once('ready', () => { - voteParser = new VoteParser(client); - parser = new CommandParser(client, voteParser); - console.log('Ready!'); - -}); + voteParser = new VoteParser(client); + parser = new CommandParser(client, voteParser); + console.log('Ready!'); +}); -client.on("messageCreate", (message)=>{ - if(!parser) return; - if(message.author.id !== clientId){ - parser.parse(message); - } +client.on("messageCreate", (message) => { + if (!parser) return; + if (message.author.id !== clientId) { + parser.parse(message); + } }); -client.on('messageReactionAdd', async (reaction, user) => { - if (reaction.partial) { - try { - await reaction.fetch(); - } catch (error) { - console.error('Something went wrong when fetching the message:', error); - return; - } - } - voteParser.parse(reaction.message); +client.on('messageReactionAdd', async (reaction) => { + if (reaction.partial) { + try { + await reaction.fetch(); + } catch (error) { + console.error('Something went wrong when fetching the message:', error); + return; + } + } + voteParser.parse(reaction.message); }); client.on('guildMemberAdd', member => { - parser.informeMoi.sayWelcome(member.user.id); + parser.informeMoi.sayWelcome(member.user.id); }); client.login(token); diff --git a/vote/VoteParser.js b/vote/VoteParser.js index cc55aca..ea09d4a 100644 --- a/vote/VoteParser.js +++ b/vote/VoteParser.js @@ -23,14 +23,17 @@ class VoteParser{ [channelsID.sentence, CATEGORY.SENTENCE] ]); - this.infoMessageActor = null; - this.infoMessageReason = null; - this.infoMessageAction = null; - this.infoMessageSource = null; - this.infoMessageSentence = null; + this.#resetStoredMessages(); this.channelBase = this.client.channels.cache.get(channelsID.base); + } + #resetStoredMessages() { + this.infoMessagesActor = []; + this.infoMessagesReason = []; + this.infoMessagesAction = []; + this.infoMessagesSource = []; + this.infoMessagesSentence = []; } setScore(score) { @@ -71,34 +74,101 @@ class VoteParser{ this.updateBase(category); } + #splitMessage(text) { + let textLines = text.split("\n"); + let splitArray = []; + let currentTextPart = ""; + + for (let line of textLines) { + if ((currentTextPart + line).length > 1950) { + splitArray.push(currentTextPart); + currentTextPart = line; + } else currentTextPart += ("\n" + line); + } + + splitArray.push(currentTextPart); + return splitArray; + } + async updateBase(category){ - const actor = complotDB.actorToString(); - const action = complotDB.actionToString(); - const reason = complotDB.reasonToString(); - const source = complotDB.sourceToString(); - const sentence = complotDB.sentenceToString(); + // Gosh this fucking code needs to be factored, so many repetitions + + const actor = this.#splitMessage(complotDB.actorToString()).map(el => '```' + el + '```'); + const action = this.#splitMessage(complotDB.actionToString()).map(el => '```' + el + '```'); + const reason = this.#splitMessage(complotDB.reasonToString()).map(el => '```' + el + '```'); + const source = this.#splitMessage(complotDB.sourceToString()).map(el => '```' + el + '```'); + const sentence = this.#splitMessage(complotDB.sentenceToString()).map(el => '```' + el + '```'); - if(!this.infoMessageActor){ + if (!(this.infoMessagesActor instanceof Array) || this.infoMessagesActor.length === 0) { + this.#resetStoredMessages(); await this.deleteAllMessageInfo(); - this.infoMessageActor = await this.channelBase.send(actor); - this.infoMessageAction = await this.channelBase.send(action); - this.infoMessageReason = await this.channelBase.send(reason); - this.infoMessageSource = await this.channelBase.send(source); - this.infoMessageSentence = await this.channelBase.send(sentence); - }else{ - switch(category){ - case CATEGORY.ACTION: this.infoMessageAction.edit(action); break; - case CATEGORY.REASON: this.infoMessageReason.edit(reason); break; - case CATEGORY.SOURCE: this.infoMessageSource.edit(source); break; - case CATEGORY.ACTOR: this.infoMessageActor.edit(actor); break; - case CATEGORY.SENTENCE: this.infoMessageSentence.edit(sentence);break; + + for (let messagePart of actor) + this.infoMessagesActor.push(await this.channelBase.send(messagePart)); + for (let messagePart of action) + this.infoMessagesAction.push(await this.channelBase.send(messagePart)); + for (let messagePart of reason) + this.infoMessagesReason.push(await this.channelBase.send(messagePart)); + for (let messagePart of source) + this.infoMessagesSource.push(await this.channelBase.send(messagePart)); + for (let messagePart of sentence) + this.infoMessagesSentence.push(await this.channelBase.send(messagePart)); + } else { + switch (category) { + case CATEGORY.ACTOR: + // If we had more messages before the update, we get rid of them here + this.infoMessagesActor.splice(actor.length) + // If in the opposite we have more messages now, we re-send everything + if (actor.length > this.infoMessagesAction.length) { + this.#resetStoredMessages(); + return await this.updateBase(category); + } + // Now we edit! + for (let i = 0; i < actor.length; i++) + this.infoMessagesActor[i].edit(actor[i]); + + break; + case CATEGORY.ACTION: + this.infoMessagesAction.splice(action.length) + if (action.length > this.infoMessagesAction.length) { + this.#resetStoredMessages(); + return await this.updateBase(category); + } + for (let i = 0; i < action.length; i++) + this.infoMessagesAction[i].edit(action[i]); + break; + case CATEGORY.REASON: + this.infoMessagesReason.splice(reason.length) + if (reason.length > this.infoMessagesReason.length) { + this.#resetStoredMessages(); + return await this.updateBase(category); + } + for (let i = 0; i < reason.length; i++) + this.infoMessagesReason[i].edit(reason[i]); + break; + case CATEGORY.SOURCE: + this.infoMessagesSource.splice(source.length) + if (source.length > this.infoMessagesSource.length) { + this.#resetStoredMessages(); + return await this.updateBase(category); + } + for (let i = 0; i < source.length; i++) + this.infoMessagesSource[i].edit(source[i]); + break; + case CATEGORY.SENTENCE: + this.infoMessagesSentence.splice(sentence.length) + if (sentence.length > this.infoMessagesSentence.length) { + this.#resetStoredMessages(); + return await this.updateBase(category); + } + for (let i = 0; i < sentence.length; i++) + this.infoMessagesSentence[i].edit(sentence[i]); + break; } } } - - addFormatedString(messageString, category){ switch (category){ case CATEGORY.ACTOR: complotDB.addActor(messageString); break; -- GitLab