diff --git a/.gitignore b/.gitignore index b028d811f6746d152c1c323e686381568f76feee..638efef098e236b6109b6b4a2927018247a3ecff 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 5b903eb1b1290ec0e26d3110bfabe79c0463a2e4..362ec930d5098a1b92b3bcfff09aa322c9ffac57 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 0000000000000000000000000000000000000000..8e67d2ec73b9e27aeb59f6e0df6a88991c7138cf --- /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 1ed291ebf5dd561e6317aaf078448165e264055b..dab40e45e948a5d07fc1d574cb614956bc09a3bf 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 0000000000000000000000000000000000000000..03375e371c2c2cdf307854946852395ed26b5228 --- /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 04de1aaf2042ef70d48868e04a15970a298df47d..0cab47698eb3d5910fdbd759985161e4d29338b9 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 cc55aca607c56d4da39b4628a3c82b60592a7022..ea09d4ab31c7085526d857c2ede65d0b1a2d320a 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;