├── data └── .gitkeep ├── token.js.dist ├── youtubeApiKey.js.dist ├── .gitignore ├── .editorconfig ├── package.json ├── commandes ├── stop.js ├── reload.js ├── update.js ├── utip.js ├── config.js ├── roleAction.js └── youtube.js ├── README.md ├── LICENSE ├── intervals ├── utip.js └── youtube.js ├── models ├── constants.js ├── roleAction.js ├── utip.js └── youtube.js ├── manager └── roleAction.js ├── stupid-econobot.js └── utils.js /data/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /token.js.dist: -------------------------------------------------------------------------------- 1 | var token = 'BOTTOKEN'; 2 | module.exports = token; 3 | -------------------------------------------------------------------------------- /youtubeApiKey.js.dist: -------------------------------------------------------------------------------- 1 | const youtubeApiKey = 'APIKEY'; 2 | 3 | module.exports = youtubeApiKey; 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | data/** 2 | !data/.gitkeep 3 | node_modules 4 | node_modules/** 5 | token.js 6 | youtubeApiKey.js 7 | .DS_Store 8 | .idea/ 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | insert_final_newline = false 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stupid-econobot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "stupid-econobot.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "discord.js": "^11.3.2", 13 | "moment": "^2.20.1", 14 | "request": "^2.87.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /commandes/stop.js: -------------------------------------------------------------------------------- 1 | const Utils = require('../utils'); 2 | var Constants = require('../models/constants'); 3 | 4 | module.exports = { 5 | role: 'SEND_MESSAGES', 6 | helpCat: 'Permet d\'arrêter le bot', 7 | help: function (message) { 8 | Utils.sendEmbed(message, 0x00AFFF, "Utilisation de la commande stop", "", message.author, [{ 9 | title: Constants.prefix + 'stop', 10 | text: "Permet d\'arrêter le bot", 11 | grid: false 12 | }]); 13 | }, 14 | runCommand: (args, message) => { 15 | if (!message.member.hasPermission("MANAGE_GUILD")) { 16 | Utils.reply(message, "Vous n'avez pas les permissions pour arrêter le bot", true); 17 | return; 18 | } 19 | Utils.reply(message, "Arrêt du bot..."); 20 | process.exit(84); 21 | } 22 | } -------------------------------------------------------------------------------- /commandes/reload.js: -------------------------------------------------------------------------------- 1 | const Utils = require('../utils'); 2 | var Constants = require('../models/constants'); 3 | 4 | module.exports = { 5 | role: 'SEND_MESSAGES', 6 | helpCat: 'Permet de restart le bot', 7 | help: function (message) { 8 | Utils.sendEmbed(message, 0x00AFFF, "Utilisation de la commande restart", "", message.author, [{ 9 | title: Constants.prefix + 'restart', 10 | text: "Permet de restart le bot", 11 | grid: false 12 | }]); 13 | }, 14 | runCommand: (args, message) => { 15 | if (!message.member.hasPermission("MANAGE_GUILD")) { 16 | Utils.reply(message, "Vous n'avez pas les permissions pour reload le bot", true); 17 | return; 18 | } 19 | Utils.reply(message, "Restart du bot..."); 20 | process.exit(1); 21 | } 22 | } -------------------------------------------------------------------------------- /commandes/update.js: -------------------------------------------------------------------------------- 1 | const Utils = require('../utils'); 2 | var Constants = require('../models/constants'); 3 | 4 | module.exports = { 5 | role: 'SEND_MESSAGES', 6 | helpCat: 'Permet d\'update puis restart le bot', 7 | help: function (message) { 8 | Utils.sendEmbed(message, 0x00AFFF, "Utilisation de la commande update", "", message.author, [{ 9 | title: Constants.prefix + 'update', 10 | text: "Permet d\'update puis restart le bot", 11 | grid: false 12 | }]); 13 | }, 14 | runCommand: (args, message) => { 15 | if (!message.member.hasPermission("MANAGE_GUILD")) { 16 | Utils.reply(message, "Vous n'avez pas les permissions pour update le bot", true); 17 | return; 18 | } 19 | Utils.reply(message, "Update du bot..."); 20 | process.exit(42); 21 | } 22 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Stupid econobot 2 | ## Prerequisites 3 | 4 | To get your bot to work, the following depencies will be required : 5 | - node v8 6 | - npm 7 | 8 | ## Installation 9 | To configure and run you bot, you will need to: 10 | - Create app & bot discord: https://discordapp.com/developers/applications/me 11 | - Invite him to discord 12 | - Replace `BOT TOKEN` with your bot token int `token.js.dist` 13 | ```js 14 | var token = 'BOT TOKEN' 15 | 16 | module.exports = token; 17 | ``` 18 | - Replace `API KEY` with your YouTube API key in `youtubeApiKey.js.dist` 19 | ```js 20 | var youtubeApiKey = 'API KEY' 21 | 22 | module.exports = youtubeApiKey; 23 | ``` 24 | - Install dependencies: `npm i` 25 | - And finally, run your bot with: `node stupid-econobot.js` 26 | ## Usage 27 | 28 | In the commands bellow, `_` is your prefix and `` are command arguments. 29 | 30 | To view all commands: `_help`. 31 | 32 | If you want more informations about a command just type: `_help ` for more info . 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2018 rushr 2 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 3 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 4 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /intervals/utip.js: -------------------------------------------------------------------------------- 1 | var request = require('request'); 2 | var utip = require('../models/utip'); 3 | var Utils = require('../utils'); 4 | 5 | var utipRequest = function (guild) { 6 | if(!utip.url) { 7 | return; 8 | } 9 | request({ 10 | url: utip.url 11 | }, (error, response, body) => { 12 | if (!body) { 13 | return; 14 | } 15 | try { 16 | let firstSplit = body.split("amountEarned":"); 17 | if (!firstSplit || firstSplit.length < 1) { 18 | return; 19 | } 20 | let secondSplit = firstSplit[1].split(","amountCounter"); 21 | if (!secondSplit || secondSplit.length < 1) { 22 | return; 23 | } 24 | let found = Number(secondSplit[0]); 25 | 26 | firstSplit = body.split("goalAmount":"); 27 | if (!firstSplit || firstSplit.length < 1) { 28 | return; 29 | } 30 | secondSplit = firstSplit[1].split(","goalString"); 31 | if (!secondSplit || secondSplit.length < 1) { 32 | return; 33 | } 34 | let goal = Number(secondSplit[0]); 35 | if (isNaN(found)) { 36 | return; 37 | } 38 | if (isNaN(goal)) { 39 | return; 40 | } 41 | if (found != utip.found) { 42 | utip.found = found; 43 | } 44 | if (goal != utip.goal) { 45 | utip.goal = goal; 46 | } 47 | let percent = Math.floor(100 * utip.found / utip.goal); 48 | if(percent != utip.percent) { 49 | utip.percent = percent 50 | 51 | if(utip.channel && percent%10 === 0) { 52 | Utils.sendUtipMessage(utip, percent, utip.channel); 53 | } 54 | } 55 | } catch(e) { 56 | Utils.log('erreur de parse utip:' + e, true); 57 | } 58 | }); 59 | } 60 | module.exports = utipRequest; 61 | -------------------------------------------------------------------------------- /models/constants.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var Utils = require('../utils'); 3 | var constants = { 4 | prefix: "_", 5 | logChannel: null, 6 | welcomeMessage: "Bienvenue !" 7 | } 8 | 9 | function save() { 10 | fs.writeFile(__dirname + "/../data/constants.json", JSON.stringify(constants), function (err) { 11 | if (err) { 12 | return Utils.log(err, true); 13 | } 14 | Utils.log(`The ${Utils.Color.FgYellow}constants${Utils.Color.Reset} file was saved!`); 15 | }); 16 | } 17 | 18 | function load() { 19 | return new Promise((resolve, reject) => { 20 | 21 | fs.readFile(__dirname + '/../data/constants.json', (err, data) => { 22 | if (err) return; 23 | constants = JSON.parse(data); 24 | resolve(constants); 25 | }); 26 | }) 27 | } 28 | 29 | module.exports = { 30 | init: function () { 31 | return new Promise((resolve, reject) => { 32 | load() 33 | .then(r => resolve(r)) 34 | .catch(e => reject(e)); 35 | }); 36 | }, 37 | get prefix() { 38 | return constants.prefix; 39 | }, 40 | get logChannel() { 41 | return constants.logChannel; 42 | }, 43 | get welcomeMessage() { 44 | return constants.welcomeMessage; 45 | }, 46 | set prefix(prefix) { 47 | constants.prefix = prefix; 48 | save(); 49 | return constants.prefix; 50 | }, 51 | set logChannel(logChannel) { 52 | constants.logChannel = logChannel; 53 | save(); 54 | return constants.logChannel; 55 | }, 56 | set welcomeMessage(welcomeMessage) { 57 | constants.welcomeMessage = welcomeMessage; 58 | save(); 59 | return constants.welcomeMessage; 60 | } 61 | }; -------------------------------------------------------------------------------- /intervals/youtube.js: -------------------------------------------------------------------------------- 1 | var request = require('request'); 2 | var youtubeApiKey = require('../youtubeApiKey'); 3 | var youtube = require('../models/youtube'); 4 | var Utils = require('../utils'); 5 | const channelYoutubeId = 'UCyJDHgrsUKuWLe05GvC2lng'; 6 | 7 | var youtubeRequest = function (guild) { 8 | request({ 9 | url: "https://www.googleapis.com/youtube/v3/channels?part=statistics&id="+channelYoutubeId+"&key="+youtubeApiKey, 10 | }, (error, response, body) => { 11 | let nb = 0; 12 | try { 13 | let result = JSON.parse(body); 14 | nb = result.items[0].statistics.subscriberCount; 15 | } catch (e) { 16 | return; 17 | } 18 | if ( 19 | nb !== youtube.lastNbSubscribers 20 | && Math.floor(youtube.lastNbSubscribers/youtube.interval) < Math.floor(nb/youtube.interval) 21 | && youtube.channel 22 | ) { 23 | oldcap = youtube.getNextCap(youtube.lastNbSubscribers); 24 | cap = youtube.getNextCap(nb); 25 | if (oldcap < cap && youtube.capmessages.length > 0) { 26 | message = youtube.capmessages[Math.floor(Math.random()*youtube.capmessages.length)] 27 | } else { 28 | message = youtube.messages[Math.floor(Math.random()*youtube.messages.length)] 29 | } 30 | message = message.replace(new RegExp('%total%', 'g'), Utils.spacer(nb)); 31 | message = message.replace(new RegExp('%cap%', 'g'), Utils.spacer(cap)); 32 | message = message.replace(new RegExp('%oldcap%', 'g'), Utils.spacer(oldcap)); 33 | message = message.replace(new RegExp('%cap-total%', 'g'), Utils.spacer(cap - nb)); 34 | guild.channels.get(youtube.channel).send(message); 35 | } 36 | if(nb !== youtube.lastNbSubscribers) { 37 | youtube.lastNbSubscribers = nb; 38 | } 39 | }); 40 | } 41 | module.exports = youtubeRequest; 42 | -------------------------------------------------------------------------------- /models/roleAction.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var Utils = require('../utils'); 3 | var roleActions = {}; 4 | 5 | function save() { 6 | fs.writeFile(__dirname + "/../data/roleAction.json", JSON.stringify(roleActions), function (err) { 7 | if (err) { 8 | return Utils.log(err, true); 9 | } 10 | Utils.log(`The ${Utils.Color.FgYellow}roleActions${Utils.Color.Reset} file was saved!`); 11 | }); 12 | } 13 | 14 | function load() { 15 | return new Promise((resolve, reject) => { 16 | 17 | fs.readFile(__dirname + '/../data/roleAction.json', (err, data) => { 18 | if (err) return; 19 | roleActions = JSON.parse(data); 20 | resolve(roleActions); 21 | }); 22 | }) 23 | } 24 | 25 | module.exports = { 26 | init: function () { 27 | return new Promise((resolve, reject) => { 28 | load() 29 | .then(r => resolve(r)) 30 | .catch(e => reject(e)); 31 | }); 32 | }, 33 | setRoleAction(emoji, message, roleId) { 34 | if (!roleActions[message.id]) { 35 | roleActions[message.id] = { 36 | 'channelid': message.channel.id 37 | } 38 | } 39 | let id = emoji; 40 | if(emoji.id) { 41 | id = emoji.id; 42 | } 43 | roleActions[message.id][id] = { 44 | display: emoji.id ? `<:${emoji.name}:${emoji.id}>`: `${emoji}`, 45 | role: roleId 46 | }; 47 | save(); 48 | return roleActions; 49 | }, 50 | removeRoleAction(emojiId, messageId) { 51 | if (!roleActions[messageId] || !roleActions[messageId][emojiId]) { 52 | return; 53 | } 54 | delete roleActions[messageId][emojiId]; 55 | save(); 56 | return roleActions; 57 | }, 58 | getRole(emojiId, messageId) { 59 | if(!roleActions[messageId]) { 60 | return null; 61 | } 62 | return roleActions[messageId][emojiId].role; 63 | }, 64 | get roleActions() { 65 | return roleActions; 66 | } 67 | }; -------------------------------------------------------------------------------- /manager/roleAction.js: -------------------------------------------------------------------------------- 1 | var Utils = require('../utils'); 2 | 3 | const init = (roleActions, bot) => { 4 | bot.on('custommessageReactionAdd', (messageReaction, user) => { 5 | if(roleActions[messageReaction.message.id]) { 6 | let role = null; 7 | if(roleActions[messageReaction.message.id][messageReaction.emoji.name]) { 8 | role = Utils.guild.roles.get(roleActions[messageReaction.message.id][messageReaction.emoji.name].role); 9 | } else if(messageReaction.emoji.id && roleActions[messageReaction.message.id][messageReaction.emoji.id]) { 10 | role = Utils.guild.roles.get(roleActions[messageReaction.message.id][messageReaction.emoji.id].role); 11 | } else { 12 | return; 13 | } 14 | if (!role) { 15 | return; 16 | } 17 | Utils.guild.fetchMember(user).then(member => { 18 | member.addRole(role); 19 | Utils.sendDM(user, `Le role **${role.name}** vous à été ajouté.`); 20 | }).catch(err => { 21 | Utils.log(err.stack, true); 22 | }) 23 | } 24 | }); 25 | 26 | bot.on('custommessageReactionRemove', (messageReaction, user) => { 27 | if(roleActions[messageReaction.message.id]) { 28 | let role = null; 29 | if(roleActions[messageReaction.message.id][messageReaction.emoji.name]) { 30 | role = Utils.guild.roles.get(roleActions[messageReaction.message.id][messageReaction.emoji.name].role); 31 | } else if(messageReaction.emoji.id && roleActions[messageReaction.message.id][messageReaction.emoji.id]) { 32 | role = Utils.guild.roles.get(roleActions[messageReaction.message.id][messageReaction.emoji.id].role); 33 | } else { 34 | return; 35 | } 36 | if (!role) { 37 | return; 38 | } 39 | Utils.guild.fetchMember(user).then(member => { 40 | member.removeRole(role); 41 | Utils.sendDM(user, `Le role **${role.name}** vous à été retiré.`); 42 | }).catch(err => { 43 | Utils.log(err.stack, true); 44 | }) 45 | } 46 | }); 47 | } 48 | 49 | module.exports = { 50 | init 51 | } -------------------------------------------------------------------------------- /models/utip.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var Utils = require('../utils'); 3 | var utip = { 4 | found: 0, 5 | goal: 0, 6 | url: "https://www.utip.io/stupideconomics", 7 | percent: 0, 8 | channel: null, 9 | cooldown: null, 10 | lastUsed: null 11 | } 12 | 13 | function save() { 14 | fs.writeFile(__dirname + "/../data/utip.json", JSON.stringify(utip), function (err) { 15 | if (err) { 16 | return Utils.log(err, true); 17 | } 18 | //Utils.log(`The ${Utils.Color.FgYellow}utip${Utils.Color.Reset} file was saved!`); 19 | }); 20 | } 21 | 22 | function load() { 23 | return new Promise((resolve, reject) => { 24 | 25 | fs.readFile(__dirname + '/../data/utip.json', (err, data) => { 26 | if (err) return; 27 | utip = JSON.parse(data); 28 | resolve(utip); 29 | }); 30 | }) 31 | } 32 | module.exports = { 33 | init: function () { 34 | return new Promise((resolve, reject) => { 35 | load() 36 | .then(r => resolve(r)) 37 | .catch(e => reject(e)); 38 | }); 39 | }, 40 | get found() { 41 | return utip.found; 42 | }, 43 | get goal() { 44 | return utip.goal; 45 | }, 46 | get url() { 47 | return utip.url; 48 | }, 49 | get percent() { 50 | return utip.percent; 51 | }, 52 | get channel() { 53 | return utip.channel; 54 | }, 55 | get cooldown() { 56 | return utip.cooldown; 57 | }, 58 | get lastUsed() { 59 | return utip.lastUsed; 60 | }, 61 | set found(found) { 62 | utip.found = found; 63 | save(); 64 | return utip.found; 65 | }, 66 | set goal(goal) { 67 | utip.goal = goal; 68 | save(); 69 | return utip.goal; 70 | }, 71 | set url(url) { 72 | utip.url = url; 73 | save(); 74 | return utip.url; 75 | }, 76 | set percent(percent) { 77 | utip.percent = percent; 78 | save(); 79 | return utip.percent; 80 | }, 81 | set channel(channel) { 82 | utip.channel = channel; 83 | save(); 84 | return utip.channel; 85 | }, 86 | set cooldown(cooldown) { 87 | utip.cooldown = cooldown; 88 | save(); 89 | return utip.cooldown; 90 | }, 91 | set lastUsed(lastUsed) { 92 | utip.lastUsed = lastUsed; 93 | save(); 94 | return utip.lastUsed; 95 | } 96 | }; -------------------------------------------------------------------------------- /commandes/utip.js: -------------------------------------------------------------------------------- 1 | const Utils = require('../utils'); 2 | var Constants = require('../models/constants'); 3 | var utip = require('../models/utip'); 4 | 5 | var commands = { 6 | channel: { 7 | help: [ 8 | 'Permet de changer les messages utip seront affiché.' 9 | ], 10 | args: '[#channel]', 11 | runCommand: (args, message) => { 12 | if (args.length === 0) { 13 | Utils.reply(message, "**channel: **: <#" + utip.channel + ">"); 14 | return; 15 | } 16 | if (!message.mentions.channels && !message.mentions.channels.first()) { 17 | Utils.reply(message,"il faut mentioner un channel.",true); 18 | return; 19 | } 20 | utip.channel = message.mentions.channels.first().id; 21 | Utils.reply(message, 'Le channel d\'anonces à bien été modifié.'); 22 | } 23 | }, 24 | cooldown: { 25 | help: [ 26 | 'Permet de changer le cooldown des messages utip.' 27 | ], 28 | args: '[cooldown]', 29 | runCommand: (args, message) => { 30 | if (args.length === 0) { 31 | Utils.reply(message, "**cooldown: **: " + utip.cooldown + ""); 32 | return; 33 | } 34 | let nb = Number(args[0]); 35 | if (isNaN(nb) && nb <= 0) { 36 | Utils.reply(message, "Le cooldown dois être un entier positif.", true); 37 | return; 38 | } 39 | utip.cooldown = nb; 40 | Utils.reply(message, "Le cooldown à bien été modifié."); 41 | } 42 | } 43 | } 44 | var help = function (message) { 45 | var keys = Object.keys(commands); 46 | var fields = []; 47 | keys.forEach((command, index) => { 48 | fields.push({ 49 | text: commands[command].help, 50 | title: `${Constants.prefix}utip ${command} ${commands[command].args}`, 51 | grid: false 52 | }); 53 | }); 54 | Utils.sendEmbed(message, 0x00AFFF, 'Liste des commandes utip', "", message.author, fields); 55 | } 56 | 57 | module.exports = { 58 | role: 'MANAGE_GUILD', 59 | helpCat: 'Permet de changer les configurations des messages utip', 60 | help, 61 | runCommand: (args, message) => { 62 | if (!message.member.hasPermission("MANAGE_GUILD")) { 63 | Utils.reply(message, "Vous n'avez pas les permissions pour changer les paramètres utip", true); 64 | return; 65 | } 66 | if (commands[args[0]]) { 67 | var label = args[0]; 68 | args.shift(); 69 | commands[label].runCommand(args, message); 70 | } else { 71 | help(message); 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /models/youtube.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var Utils = require('../utils'); 3 | var youtube = { 4 | interval: 1000, 5 | messages: [], 6 | capmessages: [], 7 | lastNbSubscribers: 0, 8 | channel: null, 9 | } 10 | 11 | function save() { 12 | fs.writeFile(__dirname + "/../data/youtube.json", JSON.stringify(youtube), function (err) { 13 | if (err) { 14 | return Utils.log(err, true); 15 | } 16 | //Utils.log(`The ${Utils.Color.FgYellow}youtube${Utils.Color.Reset} file was saved!`); 17 | }); 18 | } 19 | 20 | function load() { 21 | return new Promise((resolve, reject) => { 22 | 23 | fs.readFile(__dirname + '/../data/youtube.json', (err, data) => { 24 | if (err) return; 25 | youtube = JSON.parse(data); 26 | resolve(youtube); 27 | }); 28 | }) 29 | } 30 | module.exports = { 31 | init: function () { 32 | return new Promise((resolve, reject) => { 33 | load() 34 | .then(r => resolve(r)) 35 | .catch(e => reject(e)); 36 | }); 37 | }, 38 | get interval() { 39 | return youtube.interval; 40 | }, 41 | get messages() { 42 | return youtube.messages; 43 | }, 44 | get capmessages() { 45 | return youtube.capmessages; 46 | }, 47 | get lastNbSubscribers() { 48 | return youtube.lastNbSubscribers; 49 | }, 50 | get channel() { 51 | return youtube.channel; 52 | }, 53 | set interval(interval) { 54 | youtube.interval = interval; 55 | save(); 56 | return youtube.interval; 57 | }, 58 | set lastNbSubscribers(lastNbSubscribers) { 59 | youtube.lastNbSubscribers = lastNbSubscribers; 60 | save(); 61 | return youtube.lastNbSubscribers; 62 | }, 63 | set channel(channel) { 64 | youtube.channel = channel; 65 | save(); 66 | return youtube.channel; 67 | }, 68 | addMessage: function(message) { 69 | youtube.messages.push(message); 70 | save(); 71 | return youtube.messages; 72 | }, 73 | delMessage: function(index) { 74 | youtube.messages.splice(index, 1); 75 | save(); 76 | return youtube.messages; 77 | }, 78 | addCapMessage: function(capmessage) { 79 | youtube.capmessages.push(capmessage); 80 | save(); 81 | return youtube.capmessages; 82 | }, 83 | delCapMessage: function(index) { 84 | youtube.capmessages.splice(index, 1); 85 | save(); 86 | return youtube.capmessages; 87 | }, 88 | getNextCap: function(nb) { 89 | 90 | nbOfZerro = (nb + '').length - 1; 91 | firstNumber = Math.floor(nb / Math.pow(10,nbOfZerro)); 92 | if (firstNumber >= 8) { 93 | return Math.pow(10,nbOfZerro + 1); 94 | } 95 | return Math.pow(10,nbOfZerro) * firstNumber + Math.pow(10,nbOfZerro) 96 | } 97 | }; -------------------------------------------------------------------------------- /commandes/config.js: -------------------------------------------------------------------------------- 1 | const Utils = require('../utils'); 2 | const Discord = require('discord.js'); 3 | var constants = require('../models/constants'); 4 | 5 | var commands = { 6 | prefix: { 7 | help: [ 8 | 'Permet de changer le préfix des commandes du bot.' 9 | ], 10 | args: '[prefix]', 11 | runCommand: (args, message) => { 12 | if (args.length === 0) { 13 | Utils.reply(message, "**Préfix**: " + constants.prefix); 14 | return; 15 | } 16 | constants.prefix = args.join(' '); 17 | Utils.reply(message, 'Le préfix a bien été modifié.'); 18 | } 19 | }, 20 | logChannel: { 21 | help: [ 22 | 'le channel ou seront log les commandes.', 23 | ], 24 | args: '[#channel]', 25 | runCommand: (args, message) => { 26 | if (args.length === 0) { 27 | Utils.reply(message, "**channel: **: <#" + constants.logChannel + ">"); 28 | return; 29 | } 30 | if (!message.mentions.channels && !message.mentions.channels.first()) { 31 | Utils.reply(message,"il faut mentioner un channel.",true); 32 | return; 33 | } 34 | constants.logChannel = message.mentions.channels.first().id; 35 | Utils.reply(message, 'Le channel de log à bien été modifié.'); 36 | } 37 | }, 38 | welcome: { 39 | help: [ 40 | 'Permet de changer le message de bienvenue.' 41 | ], 42 | args: '[message]', 43 | runCommand: (args, message) => { 44 | if (args.length === 0) { 45 | Utils.reply(message, "**Message de bienvenue**: " + constants.welcomeMessage); 46 | return; 47 | } 48 | constants.welcomeMessage = args.join(' '); 49 | Utils.reply(message, 'Le message de bienvenue a bien été modifié.'); 50 | } 51 | } 52 | } 53 | 54 | var help = function (message) { 55 | var keys = Object.keys(commands); 56 | var fields = []; 57 | keys.forEach((command, index) => { 58 | fields.push({ 59 | text: commands[command].help, 60 | title: `${constants.prefix}config ${command} ${commands[command].args}`, 61 | grid: false 62 | }); 63 | }); 64 | Utils.sendEmbed(message, 0x00AFFF, 'Liste des commandes de config', "", message.author, fields); 65 | } 66 | 67 | module.exports = { 68 | role: 'MANAGE_GUILD', 69 | helpCat: 'Permet de changer les configurations de base du bot', 70 | help, 71 | runCommand: (args, message) => { 72 | if (!message.member.hasPermission("MANAGE_GUILD")) { 73 | Utils.reply(message, "Vous n'avez pas les permissions pour changer les config", true); 74 | return; 75 | } 76 | if (commands[args[0]]) { 77 | var label = args[0]; 78 | args.shift(); 79 | commands[label].runCommand(args, message); 80 | } else { 81 | help(message); 82 | } 83 | } 84 | } -------------------------------------------------------------------------------- /commandes/roleAction.js: -------------------------------------------------------------------------------- 1 | const Utils = require('../utils'); 2 | var RoleAction = require('../models/roleAction'); 3 | var Constants = require('../models/constants'); 4 | 5 | var commands = { 6 | list: { 7 | help: [ 8 | 'Permet de lister les roleactions.' 9 | ], 10 | args: '', 11 | runCommand: (args, message) => { 12 | let actions = RoleAction.roleActions; 13 | let messageKeys = Object.keys(actions); 14 | let fields = []; 15 | let hasRoleActions = false; 16 | for (let messageId of messageKeys) { 17 | let messageAction = actions[messageId] 18 | let emojiKeys = Object.keys(messageAction); 19 | for (let emojiId of emojiKeys) { 20 | if(emojiId === 'channelid') { continue; } 21 | let emoji = messageAction[emojiId]; 22 | hasRoleActions = true; 23 | let role = Utils.guild.roles.get(emoji.role); 24 | if ( !role ) { 25 | continue; 26 | } 27 | fields.push({ 28 | title: `réaction qui ajoute le role: ${role.name}`, 29 | text: `** - Ajoute le role**: ${role}\n** - Réagir avec**: ${emoji.display}\n** - Sur le message**: ${messageId}\n** - Dans le channel**: <#${messageAction.channelid}>`, 30 | grid: false 31 | }); 32 | } 33 | } 34 | if (!hasRoleActions) { 35 | Utils.reply(message, 'Aucuns role action configuré.', true); 36 | return; 37 | } 38 | Utils.sendEmbed(message, 0xE8C408, 'Liste des role actions:', '', message.author, fields, null, 10); 39 | } 40 | }, 41 | add: { 42 | help: [ 43 | 'Permet d\'ajouter un roleaction' 44 | ], 45 | args: ' <@role> [channelid]', 46 | runCommand: (args, message) => { 47 | if (args.length < 3) { 48 | Utils.reply(message, 'Les paramètres de la commande ne sont pas bon.', true); 49 | return; 50 | } 51 | let emoji = args[0]; 52 | let result = /^<:[^:]+:([0-9]+)>$/g.exec(emoji); 53 | if (result) { 54 | emoji = Utils.guild.emojis.get(result[1]); 55 | if(!emoji) { 56 | Utils.log(message, 'Cet emoji est introuvable sur le serveur.', true) 57 | return; 58 | } 59 | } 60 | let role = message.mentions.roles.first(); 61 | if (!role) { 62 | Utils.reply(message, 'Vous devez mentionner un role.', true); 63 | return; 64 | } 65 | let channel = args[3] ? Utils.guild.channels.get(args[3]) : message.channel; 66 | if (!channel) { 67 | Utils.reply(message, 'Le channel est introuvable', true); 68 | return; 69 | } 70 | channel.fetchMessage(args[2]).then((reactionMessage) => { 71 | RoleAction.setRoleAction(emoji, reactionMessage, role.id); 72 | Utils.reply(message, 'le role action a bien été ajouté.'); 73 | }).catch(() => { 74 | Utils.reply(message, 'Le message est introuvable dans le channel ' + channel.name, true); 75 | }); 76 | } 77 | }, 78 | delete: { 79 | help: [ 80 | 'Permet de supprimer un roleaction' 81 | ], 82 | args: ' ', 83 | runCommand: (args, message) => { 84 | if (args.length < 2) { 85 | Utils.reply(message, 'Les paramètres de la commande ne sont pas bon.', true); 86 | return; 87 | } 88 | let emoji = args[0]; 89 | let result = /^<:[^:]+:([0-9]+)>$/g.exec(emoji); 90 | if (result) { 91 | emoji = Utils.guild.emojis.get(result[1]); 92 | if(!emoji) { 93 | Utils.log(message, 'Cet emoji est introuvable sur le serveur.', true) 94 | return; 95 | } 96 | emoji = emoji.id; 97 | } 98 | let messageid = args[1]; 99 | RoleAction.removeRoleAction(emoji, messageid); 100 | Utils.reply(message, 'le role action a bien été supprimé.'); 101 | } 102 | } 103 | } 104 | 105 | var help = function (message) { 106 | var keys = Object.keys(commands); 107 | var fields = []; 108 | keys.forEach((command, index) => { 109 | fields.push({ 110 | text: commands[command].help, 111 | title: `${Constants.prefix}roleaction ${command} ${commands[command].args}`, 112 | grid: false 113 | }); 114 | }); 115 | Utils.sendEmbed(message, 0x00AFFF, 'Liste des commandes roleaction', "", message.author, fields); 116 | } 117 | 118 | module.exports = { 119 | role: 'MANAGE_GUILD', 120 | helpCat: 'Permet de gérer les réations au messages', 121 | help, 122 | runCommand: (args, message) => { 123 | if (!message.member.hasPermission("MANAGE_GUILD")) { 124 | Utils.reply(message, "Vous n'avez pas les permissions pour changer les roleaction", true); 125 | return; 126 | } 127 | if (commands[args[0]]) { 128 | var label = args[0]; 129 | args.shift(); 130 | commands[label].runCommand(args, message); 131 | } else { 132 | help(message); 133 | } 134 | } 135 | } -------------------------------------------------------------------------------- /stupid-econobot.js: -------------------------------------------------------------------------------- 1 | 2 | const Discord = require('discord.js'); 3 | const bot = new Discord.Client(); 4 | const Utils = require('./utils'); 5 | var token = require('./token'); 6 | const moment = require('moment'); 7 | 8 | var guild = null; 9 | 10 | var globalConst = require('./models/constants'); 11 | var youtube = require('./models/youtube'); 12 | var utip = require('./models/utip'); 13 | var roleAction = require('./models/roleAction'); 14 | globalConst.init(); 15 | youtube.init(); 16 | utip.init(); 17 | 18 | var roleActionManager = require('./manager/roleAction'); 19 | roleAction.init(); 20 | 21 | Utils.setConfig(globalConst); 22 | var configCommands = require('./commandes/config'); 23 | var youtubeCommands = require('./commandes/youtube'); 24 | var utipCommands = require('./commandes/utip'); 25 | var reloadCommands = require('./commandes/reload'); 26 | var stopCommands = require('./commandes/stop'); 27 | var updateCommands = require('./commandes/update'); 28 | var roleActionCommands = require('./commandes/roleAction'); 29 | 30 | var commands = { 31 | config: configCommands, 32 | youtube: youtubeCommands, 33 | utip: utipCommands, 34 | reload: reloadCommands, 35 | stop: stopCommands, 36 | update: updateCommands, 37 | roleaction: roleActionCommands, 38 | } 39 | try { 40 | bot.on('ready', function () { 41 | Utils.log(Utils.Color.FgGreen + 'bot started'); 42 | bot.user.setActivity('je suis un bot'); 43 | }); 44 | } catch (e) { 45 | Utils.log(e.stack, true); 46 | } 47 | 48 | var runCommand = (args, message) => { 49 | if (args[0] === globalConst.prefix + 'help') { 50 | Utils.log(`running ${Utils.Color.FgYellow}help ${Utils.Color.Reset}command`); 51 | if (args.length > 1) { 52 | if (commands[args[1]] && message.member.hasPermission(commands[args[1]].role)) { 53 | commands[args[1]].help(message); 54 | return; 55 | } 56 | Utils.reply(message, `Aucune commande du nom de **${args[1]}**.`, true) 57 | return; 58 | } 59 | var keys = Object.keys(commands); 60 | var fields = []; 61 | keys.forEach((command) => { 62 | if (message.member.hasPermission(commands[command].role)) { 63 | fields.push({ 64 | text: commands[command].helpCat, 65 | title: command, 66 | grid: false 67 | }); 68 | } 69 | }); 70 | Utils.sendEmbed(message, 0x00AFFF, 'Liste des commandes', "Pour plus d'info sur une commandes faites **" + globalConst.prefix + "help [commande]**", message.author, fields); 71 | return; 72 | } 73 | args[0] = args[0].replace(globalConst.prefix, ''); 74 | if (commands[args[0]]) { 75 | var label = args[0]; 76 | Utils.log(`running ${Utils.Color.FgYellow}${label} ${Utils.Color.Reset}command`); 77 | args.shift(); 78 | commands[label].runCommand(args, message); 79 | return; 80 | } 81 | } 82 | 83 | bot.on('message', function (message) { 84 | try { 85 | if(message.author.bot || message.channel.type == "dm") { 86 | return; 87 | } 88 | if (message.content.substring(0, globalConst.prefix.length) === globalConst.prefix) { 89 | var args = message.content.split(" "); 90 | Utils.log('Command detected', false, message.channel.name, message.author.username, message.content); 91 | Utils.log(`fetching for ${Utils.Color.FgYellow}${message.author.username}${Utils.Color.Reset}`); 92 | message.channel.guild.fetchMember(message.author.id).then(member => { 93 | message.member = member 94 | runCommand(args, message); 95 | }).catch((e) => { 96 | Utils.log(e.stack, true); 97 | }); 98 | } else if( (new RegExp(`((utip).*(\<\@[\!]*${bot.user.id}\>))|((\<\@[\!]*${bot.user.id}\>).*(utip))`, 'gi')).test(message.content) ) { 99 | var percent = Math.floor(100 * utip.found / utip.goal); 100 | Utils.log('Magik command utip detected', false, message.channel.name, message.author.username, message.content) 101 | if (!utip.cooldown) { 102 | Utils.sendUtipMessage(utip, percent, message.channel.id); 103 | return; 104 | } 105 | if (!utip.lastUsed) { 106 | Utils.sendUtipMessage(utip, percent, message.channel.id); 107 | utip.lastUsed = moment(); 108 | return; 109 | } 110 | var diff = moment(utip.lastUsed).add(utip.cooldown, 'seconds').diff(moment()); 111 | if(diff <= 0) { 112 | Utils.sendUtipMessage(utip, percent, message.channel.id); 113 | utip.lastUsed = moment(); 114 | return; 115 | } 116 | } 117 | } catch (e) { 118 | Utils.log(e.stack, true); 119 | } 120 | }); 121 | 122 | try { 123 | const events = { 124 | MESSAGE_REACTION_ADD: 'messageReactionAdd', 125 | MESSAGE_REACTION_REMOVE: 'messageReactionRemove', 126 | }; 127 | 128 | // This is because message reaction dont work with old message :/ thanks discord 129 | bot.on('raw', event => { 130 | if (!events.hasOwnProperty(event.t)) return; 131 | 132 | const { d: data } = event; 133 | const user = bot.users.get(data.user_id); 134 | const channel = bot.channels.get(data.channel_id); 135 | if(!channel) { return; } 136 | 137 | channel.fetchMessage(data.message_id).then((message) => { 138 | 139 | bot.emit('custom' + events[event.t], { emoji: data.emoji, message}, user); 140 | }).catch((err) => { 141 | Utils.log(err.stack, true); 142 | }); 143 | 144 | }); 145 | } catch(e){ 146 | Utils.log(e.stack, true); 147 | } 148 | 149 | try { 150 | bot.login(token).then(() => { 151 | guild = bot.guilds.first() 152 | Utils.setGuild(guild); 153 | roleActionManager.init(roleAction.roleActions, bot); 154 | }).catch((e) => { 155 | Utils.log(e.stack, true); 156 | }) 157 | bot.on('error', (err) => { 158 | Utils.log(err.stack, true); 159 | }); 160 | } catch (err) { 161 | Utils.log(err.stack, true); 162 | } 163 | 164 | try { 165 | var youtubeRequest = require('./intervals/youtube'); 166 | 167 | setInterval(() => { 168 | youtubeRequest(guild); 169 | }, 1000); 170 | } catch (err) { 171 | Utils.log(err.stack, true); 172 | } 173 | try { 174 | var utipRequest = require('./intervals/utip'); 175 | setInterval(() => { 176 | utipRequest(guild); 177 | }, 5000); 178 | } catch (err) { 179 | Utils.log(err.stack, true); 180 | } 181 | 182 | var isYoutube = false; 183 | 184 | setInterval(() => { 185 | if (isYoutube) { 186 | bot.user.setActivity(Utils.spacer(Number(utip.found)) + "€ sur uTip ce mois-ci"); 187 | } else { 188 | bot.user.setActivity(Utils.spacer(Number(youtube.lastNbSubscribers)) + " abonnés youtube"); 189 | } 190 | isYoutube = !isYoutube; 191 | 192 | }, 15 * 1000) 193 | 194 | // message de bienvenue 195 | try { 196 | bot.on('guildMemberAdd', (member) => { 197 | if (globalConst.welcomeMessage) { 198 | Utils.sendDM(member.user, globalConst.welcomeMessage); 199 | } else { 200 | Utils.log('Pas de message de bienvenue configuré', true); 201 | } 202 | }) 203 | } catch(err) { 204 | Utils.log(err.stack, true); 205 | } -------------------------------------------------------------------------------- /commandes/youtube.js: -------------------------------------------------------------------------------- 1 | const Utils = require('../utils'); 2 | var youtube = require('../models/youtube'); 3 | var Constants = require('../models/constants'); 4 | 5 | var commands = { 6 | interval: { 7 | help: [ 8 | 'Permet de changer l\'interval d\'abonné à afficher.' 9 | ], 10 | args: '[nombre]', 11 | runCommand: (args, message) => { 12 | if (args.length === 0) { 13 | Utils.reply(message, "**Interval**: " + youtube.interval); 14 | return; 15 | } 16 | interval = Number(args[0]) 17 | if (isNaN(interval) || interval < 0) { 18 | Utils.reply(message, 'L\'interval dois être un nombre plus grand que 0.', true) 19 | } 20 | youtube.interval = interval; 21 | Utils.reply(message, 'L\'interval a bien été modifié.'); 22 | } 23 | }, 24 | channel: { 25 | help: [ 26 | 'Permet de changer le message ou le nombre d\'abonné sera affiché.' 27 | ], 28 | args: '[#channel]', 29 | runCommand: (args, message) => { 30 | if (args.length === 0) { 31 | Utils.reply(message, "**channel: **: <#" + youtube.channel + ">"); 32 | return; 33 | } 34 | if (!message.mentions.channels && !message.mentions.channels.first()) { 35 | Utils.reply(message,"il faut mentioner un channel.",true); 36 | return; 37 | } 38 | youtube.channel = message.mentions.channels.first().id; 39 | Utils.reply(message, 'Le channel d\'anonces à bien été modifié.'); 40 | } 41 | }, 42 | messages: { 43 | help: [ 44 | 'Permet de lister les messages.' 45 | ], 46 | args: '', 47 | runCommand: (args, message) => { 48 | messages = youtube.messages; 49 | if (messages.length === 0) { 50 | Utils.reply(message, "Pas de messages configuré."); 51 | return; 52 | } 53 | fields = []; 54 | for (var i = 0; i < messages.length; i++) { 55 | fields.push({ 56 | title: `Message numéro: ${i+1}`, 57 | text: messages[i], 58 | grid: false 59 | }); 60 | } 61 | Utils.sendEmbed(message, 0xE8C408, 'Liste des messges:', '', message.author, fields, null, 10); 62 | } 63 | }, 64 | test: { 65 | help: [ 66 | 'Permet de tester les messages.' 67 | ], 68 | args: '', 69 | runCommand: (args, message) => { 70 | if (args.length === 0) { 71 | Utils.reply(message, 'Veuillez renseigner l\'index du message à supprimé.', true); 72 | return; 73 | } 74 | var index = Number(args[0]); 75 | if (isNaN(index) || index - 1 < 0 || index > youtube.messages.length) { 76 | Utils.reply(message, `L'index doit être compris entre 1 et ${youtube.messages.length} .`, true); 77 | return; 78 | } 79 | oldcap = youtube.getNextCap(youtube.lastNbSubscribers); 80 | cap = youtube.getNextCap(youtube.lastNbSubscribers); 81 | ytmessage = youtube.messages[index - 1]; 82 | ytmessage = ytmessage.replace(new RegExp('%total%', 'g'), Utils.spacer(youtube.lastNbSubscribers)); 83 | ytmessage = ytmessage.replace(new RegExp('%cap%', 'g'), Utils.spacer(cap)); 84 | ytmessage = ytmessage.replace(new RegExp('%oldcap%', 'g'), Utils.spacer(oldcap)); 85 | ytmessage = ytmessage.replace(new RegExp('%cap-total%', 'g'), Utils.spacer(cap - youtube.lastNbSubscribers)); 86 | message.channel.send(ytmessage); 87 | } 88 | }, 89 | addmessage: { 90 | help: [ 91 | 'Permet d\'ajouter un message dans la liste', 92 | '**%total%** pour le nombre total d\'abonnés', 93 | '**%cap%** pour le prochain cap d\'abonné à avoir', 94 | '**%cap-total%** pour le nombre total d\'abonnés soustrais tu cap' 95 | ], 96 | args: '', 97 | runCommand: (args, message) => { 98 | if (args.length === 0) { 99 | Utils.reply(message, 'Veuillez mettre un message à ajouter.', true); 100 | return; 101 | } 102 | youtube.addMessage(args.join(' ')); 103 | Utils.reply(message, 'Le message à bien été ajouté.'); 104 | } 105 | }, 106 | delmessage: { 107 | help: [ 108 | 'Permet de supprimer un message dans la liste' 109 | ], 110 | args: '', 111 | runCommand: (args, message) => { 112 | if (args.length === 0) { 113 | Utils.reply(message, 'Veuillez renseigner l\'index du message à supprimé.', true); 114 | return; 115 | } 116 | var index = Number(args[0]); 117 | if (isNaN(index) || index - 1 < 0 || index > youtube.messages.length) { 118 | Utils.reply(message, `L'index doit être compris entre 1 et ${youtube.messages.length} .`, true); 119 | return; 120 | } 121 | youtube.delMessage(index - 1); 122 | Utils.reply(message, 'Le message à bien été supprimé.'); 123 | } 124 | }, 125 | capmessages: { 126 | help: [ 127 | 'Permet de lister les messages de passage de caps.' 128 | ], 129 | args: '', 130 | runCommand: (args, message) => { 131 | messages = youtube.capmessages; 132 | if (messages.length === 0) { 133 | Utils.reply(message, "Pas de messages configuré."); 134 | return; 135 | } 136 | fields = []; 137 | for (var i = 0; i < messages.length; i++) { 138 | fields.push({ 139 | title: `Message numéro: ${i+1}`, 140 | text: messages[i], 141 | grid: false 142 | }); 143 | } 144 | Utils.sendEmbed(message, 0xE8C408, 'Liste des messges de passage de cap:', '', message.author, fields, null, 10); 145 | } 146 | }, 147 | testcap: { 148 | help: [ 149 | 'Permet de tester les capmessages.' 150 | ], 151 | args: '', 152 | runCommand: (args, message) => { 153 | if (args.length === 0) { 154 | Utils.reply(message, 'Veuillez renseigner l\'index du message à supprimé.', true); 155 | return; 156 | } 157 | var index = Number(args[0]); 158 | if (isNaN(index) || index - 1 < 0 || index > youtube.capmessages.length) { 159 | Utils.reply(message, `L'index doit être compris entre 1 et ${youtube.capmessages.length} .`, true); 160 | return; 161 | } 162 | oldcap = youtube.getNextCap(youtube.lastNbSubscribers); 163 | cap = youtube.getNextCap(youtube.lastNbSubscribers); 164 | ytmessage = youtube.capmessages[index - 1] 165 | ytmessage = ytmessage.replace(new RegExp('%total%', 'g'), Utils.spacer(youtube.lastNbSubscribers)); 166 | ytmessage = ytmessage.replace(new RegExp('%cap%', 'g'), Utils.spacer(cap)); 167 | ytmessage = ytmessage.replace(new RegExp('%oldcap%', 'g'), Utils.spacer(oldcap)); 168 | ytmessage = ytmessage.replace(new RegExp('%cap-total%', 'g'), Utils.spacer(cap - youtube.lastNbSubscribers)); 169 | message.channel.send(ytmessage); 170 | } 171 | }, 172 | addcapmessage: { 173 | help: [ 174 | 'Permet d\'ajouter un message de passage de cap dans la liste', 175 | '**%total%** pour le nombre total d\'abonnés', 176 | '**%cap%** pour le prochain cap d\'abonné à avoir', 177 | '**%cap-total%** pour le nombre total d\'abonnés soustrais tu cap', 178 | '**%oldcap%** pour le précédent cap d\'abonné obtenu' 179 | ], 180 | args: '', 181 | runCommand: (args, message) => { 182 | if (args.length === 0) { 183 | Utils.reply(message, 'Veuillez mettre un message à ajouter.', true); 184 | return; 185 | } 186 | youtube.addCapMessage(args.join(' ')); 187 | Utils.reply(message, 'Le message à bien été ajouté.'); 188 | } 189 | }, 190 | delcapmessage: { 191 | help: [ 192 | 'Permet de supprimer un message de passage de cap dans la liste' 193 | ], 194 | args: '', 195 | runCommand: (args, message) => { 196 | if (args.length === 0) { 197 | Utils.reply(message, 'Veuillez renseigner l\'index du message à supprimé.', true); 198 | return; 199 | } 200 | var index = Number(args[0]); 201 | if (isNaN(index) || index - 1 < 0 || index > youtube.capmessages.length) { 202 | Utils.reply(message, `L'index doit être compris entre 1 et ${youtube.capmessages.length} .`, true); 203 | return; 204 | } 205 | youtube.delCapMessage(index - 1); 206 | Utils.reply(message, 'Le message à bien été supprimé.'); 207 | } 208 | } 209 | } 210 | 211 | var help = function (message) { 212 | var keys = Object.keys(commands); 213 | var fields = []; 214 | keys.forEach((command, index) => { 215 | fields.push({ 216 | text: commands[command].help, 217 | title: `${Constants.prefix}youtube ${command} ${commands[command].args}`, 218 | grid: false 219 | }); 220 | }); 221 | Utils.sendEmbed(message, 0x00AFFF, 'Liste des commandes youtube', "", message.author, fields); 222 | } 223 | 224 | module.exports = { 225 | role: 'MANAGE_GUILD', 226 | helpCat: 'Permet de changer les configurations des messages youtube', 227 | help, 228 | runCommand: (args, message) => { 229 | if (!message.member.hasPermission("MANAGE_GUILD")) { 230 | Utils.reply(message, "Vous n'avez pas les permissions pour changer les paramètres youtube", true); 231 | return; 232 | } 233 | if (commands[args[0]]) { 234 | var label = args[0]; 235 | args.shift(); 236 | commands[label].runCommand(args, message); 237 | } else { 238 | help(message); 239 | } 240 | } 241 | } -------------------------------------------------------------------------------- /utils.js: -------------------------------------------------------------------------------- 1 | 2 | const Discord = require('discord.js'); 3 | const moment = require('moment'); 4 | const Color = { 5 | Reset: "\x1b[0m", 6 | Bright: "\x1b[1m", 7 | Dim: "\x1b[2m", 8 | Underscore: "\x1b[4m", 9 | Blink: "\x1b[5m", 10 | Reverse: "\x1b[7m", 11 | Hidden: "\x1b[8m", 12 | 13 | FgBlack: "\x1b[30m", 14 | FgRed: "\x1b[31m", 15 | FgGreen: "\x1b[32m", 16 | FgYellow: "\x1b[33m", 17 | FgBlue: "\x1b[34m", 18 | FgMagenta: "\x1b[35m", 19 | FgCyan: "\x1b[36m", 20 | FgWhite: "\x1b[37m", 21 | 22 | BgBlack: "\x1b[40m", 23 | BgRed: "\x1b[41m", 24 | BgGreen: "\x1b[42m", 25 | BgYellow: "\x1b[43m", 26 | BgBlue: "\x1b[44m", 27 | BgMagenta: "\x1b[45m", 28 | BgCyan: "\x1b[46m", 29 | BgWhite: "\x1b[47m", 30 | } 31 | const ReactMap = { 32 | 0: "one", 33 | 1: "two", 34 | 2: "three", 35 | 3: "four", 36 | 4: "five", 37 | 5: "six", 38 | 6: "seven", 39 | 7: "eight", 40 | 8: "nine", 41 | 9: "keycap_ten", 42 | 10: "regional_indicator_a", 43 | 11: "regional_indicator_b", 44 | 12: "regional_indicator_c", 45 | 13: "regional_indicator_d", 46 | 14: "regional_indicator_e", 47 | 15: "regional_indicator_f", 48 | 16: "regional_indicator_g", 49 | 17: "regional_indicator_h", 50 | 18: "regional_indicator_i", 51 | 19: "regional_indicator_j", 52 | 20: "regional_indicator_k", 53 | 21: "regional_indicator_l", 54 | 22: "regional_indicator_m", 55 | 23: "regional_indicator_n", 56 | 24: "regional_indicator_o", 57 | 25: "regional_indicator_p", 58 | } 59 | const ConfirmReact = 'white_check_mark'; 60 | 61 | const UnicodeReactMap = { 62 | 0: `1⃣`, 63 | 1: `2⃣`, 64 | 2: `3⃣`, 65 | 3: `4⃣`, 66 | 4: `5⃣`, 67 | 5: `6⃣`, 68 | 6: `7⃣`, 69 | 7: `8⃣`, 70 | 8: `9⃣`, 71 | 9: `🔟`, 72 | 10: `🇦`, 73 | 11: `🇧`, 74 | 12: `🇨`, 75 | 13: `🇩`, 76 | 14: `🇪`, 77 | 15: `🇫`, 78 | 16: `🇬`, 79 | 17: `🇭`, 80 | 18: `🇮`, 81 | 19: `🇯`, 82 | 20: `🇰`, 83 | 21: `🇱`, 84 | 22: `🇲`, 85 | 23: `🇳`, 86 | 24: `🇴`, 87 | 25: `🇵`, 88 | } 89 | const UnicodeConfirmReact = '✅'; 90 | const UnicodeCancelReact = '❌'; 91 | var config = null; 92 | var Utilsguild = null; 93 | 94 | var sendEmbedInChannel = function (channel, color, title, content, author, fields, image = null, maxField = 25) { 95 | var embed; 96 | if (fields.length === 0) { 97 | 98 | embed = new Discord.RichEmbed({}); 99 | embed.setColor(color); 100 | embed.setTitle(title); 101 | embed.setDescription(content); 102 | if (image) { 103 | embed.setThumbnail(image); 104 | } 105 | if (author) { 106 | embed.setFooter(author.username + "#" + author.discriminator, author.avatarURL); 107 | } 108 | return channel.send("", embed); 109 | } 110 | for (var i = 0; i < fields.length; i++) { 111 | if (i % maxField === 0) { 112 | if (embed) { 113 | channel.send("", embed); 114 | embed = null; 115 | } 116 | embed = new Discord.RichEmbed({}); 117 | embed.setColor(color); 118 | embed.setTitle(title); 119 | embed.setDescription(content); 120 | if (image) { 121 | embed.setThumbnail(image); 122 | } 123 | if (author) { 124 | embed.setFooter(author.username + "#" + author.discriminator, author.avatarURL); 125 | } 126 | } 127 | embed.addField(fields[i].title, fields[i].text, fields[i].grid); 128 | } 129 | return channel.send("", embed); 130 | } 131 | var recurciveReactNbTime = function (message, nb, current, withConfirm = false, withCancel = false) { 132 | message.react(UnicodeReactMap[current]).then(() => { 133 | if(current + 1 !== nb) { 134 | recurciveReactNbTime(message, nb, current + 1, withConfirm, withCancel); 135 | return; 136 | } 137 | if (withConfirm) { 138 | message.react(UnicodeConfirmReact).then(() => { 139 | if (withCancel) { 140 | message.react(UnicodeCancelReact); 141 | } 142 | }); 143 | return; 144 | } 145 | if (withCancel) { 146 | message.react(UnicodeCancelReact); 147 | } 148 | }); 149 | } 150 | module.exports = { 151 | reply: function (message, toSend, error) { 152 | var embed = new Discord.RichEmbed({}); 153 | embed.setColor(error ? 0xA80000 : 0x00AFFF); 154 | embed.setDescription(toSend); 155 | embed.setFooter(message.author.username + "#" + message.author.discriminator, message.author.avatarURL); 156 | return message.channel.send("", embed); 157 | }, 158 | sendDM: function (user, toSend, error) { 159 | var embed = new Discord.RichEmbed({}); 160 | embed.setColor(error ? 0xA80000 : 0x00AFFF); 161 | embed.setDescription(toSend); 162 | embed.setFooter(user.username + "#" + user.discriminator, user.avatarURL); 163 | return user.send("", embed); 164 | }, 165 | getHightRole: function (roles) { 166 | var hight; 167 | roles.every(function (role) { 168 | if (!hight || hight.comparePositionTo(role) > 0) { 169 | hight = role; 170 | } 171 | }); 172 | return hight; 173 | }, 174 | canExecuteOn: function (author, user) { 175 | return getHightRole(author.roles).comparePositionTo(getHightRole(user.roles)) >= 0; 176 | }, 177 | sendEmbed: function (message, color, title, content, author, fields, image = null, maxField) { 178 | return sendEmbedInChannel(message.channel, color, title, content, author, fields, image, maxField); 179 | }, 180 | sendDmEmbed: function(user, color, title, content, author, fields, image = null, maxField) { 181 | return sendEmbedInChannel(user, color, title, content, author, fields, image, maxField); 182 | }, 183 | sendEmbedInChannel, 184 | replaceModifier: function (input, clan, guildMember, player, rank, isPS4, ps4text, withHightLight = true, withoutPlayer = false, playerNickname = null) { 185 | var playerName = `<@!${guildMember.id}>`; 186 | var clanName = clan ? guildMember.guild.roles.get(clan.id).name : null; 187 | if (!withHightLight) { 188 | if(!playerNickname) { 189 | playerName = '%player%'; 190 | } else { 191 | playerName = playerNickname; 192 | } 193 | clanName = clan ? guildMember.guild.roles.get(clan.id).name : null; 194 | } 195 | if(!withoutPlayer) { 196 | input = input.replace(/%player%/gi, playerName); 197 | } 198 | replaceSomething = false; 199 | if (player) { 200 | input = input.replace(/%rank%/gi, player.activeRank ? player.activeRank.displayName : ''); 201 | replaceSomething = player.activeRank ? true : false; 202 | } else { 203 | input = input.replace(/%rank%/gi, ''); 204 | } 205 | if (rank && rank.smiley) { 206 | input = input.replace(/%srank%/gi, rank.smiley); 207 | replaceSomething = true; 208 | } else { 209 | input = input.replace(/%srank%/gi, ''); 210 | } 211 | if (clanName) { 212 | input = input.replace(/%clan%/gi, clanName); 213 | } else { 214 | input = input.replace(/%clan%/gi, ''); 215 | } 216 | if (clan && clan.smiley) { 217 | input = input.replace(/%sclan%/gi, clan.smiley); 218 | } else { 219 | input = input.replace(/%sclan%/gi, ''); 220 | } 221 | 222 | input = input.replace(/%PS4%/gi, isPS4 ? ps4text : ''); 223 | if (!withHightLight && !replaceSomething ) { 224 | return isPS4 ? playerName + ' ' + ps4text : playerName; 225 | } 226 | return input; 227 | }, 228 | getUsernameRegex(patern) { 229 | var restrictedChar = ["\\","^","$","(",")","|","+",".","*","[","]","-","?","/"] 230 | var result = ""; 231 | var paternArr = patern.split('%player%'); 232 | for (var i = 0; i < paternArr[0].length; i++) { 233 | var char = paternArr[0].charAt(i); 234 | if (restrictedChar.indexOf(char) > -1) { 235 | char = '\\' + char; 236 | } 237 | char = `(?:${char}|$)` 238 | result+=char; 239 | } 240 | result+='(.+)'; 241 | if(paternArr[1]) { 242 | for (var i = 0; i < paternArr[1].length; i++) { 243 | var char = paternArr[1].charAt(i); 244 | if (restrictedChar.indexOf(char) > -1) { 245 | char = '\\' + char; 246 | } 247 | if (i>=3) { 248 | char = `(?:${char}|$)` 249 | } 250 | result+=char; 251 | } 252 | } 253 | return result; 254 | }, 255 | getRolesOfPerm: function(guild, permissions) { 256 | var roles = guild.roles; 257 | var rolesKey = roles.keyArray(); 258 | var rolesWithPerm = []; 259 | for (var i = 0; i < rolesKey.length; i++) { 260 | if (roles.get(rolesKey[i]).hasPermission(permissions) && !roles.get(rolesKey[i]).managed) { 261 | rolesWithPerm.push(roles.get(rolesKey[i])); 262 | } 263 | } 264 | return rolesWithPerm; 265 | }, 266 | log: function(text, err = false, place = null, by = null, content = null) { 267 | var toWrite = `${Color.FgCyan}[${moment().format('DD-MM-YYYY HH:mm:ss')}]:${Color.Reset}`; 268 | var fields = [{ 269 | title: 'Date:', 270 | text: moment().format('DD-MM-YYYY HH:mm:ss'), 271 | grid: true 272 | }]; 273 | if (err) { 274 | toWrite += Color.BgRed; 275 | } 276 | toWrite += ` ${text} ${Color.Reset}`; 277 | if(!err) { 278 | fields.push({ 279 | title: 'Type:', 280 | text: text.replace(/\x1b\[[0-9]*m/im, ''), 281 | grid: true 282 | }) 283 | } 284 | if (place) { 285 | toWrite += ` in ${Color.FgYellow}${place}${Color.Reset}`; 286 | fields.push({ 287 | title: 'Dans:', 288 | text: place, 289 | grid: true 290 | }) 291 | } 292 | if (by) { 293 | toWrite += ` by ${Color.FgGreen}${by}${Color.Reset}`; 294 | fields.push({ 295 | title: 'Auteur:', 296 | text: by, 297 | grid: true 298 | }) 299 | } 300 | if (content) { 301 | toWrite += `: ${Color.FgCyan}${content}${Color.Reset}`; 302 | fields.push({ 303 | title: 'Contenu:', 304 | text: content, 305 | grid: true 306 | }) 307 | } 308 | if (config && config.logChannel && Utilsguild && (by || err)) { 309 | if (text) { 310 | text = text.replace(/\x1b\[[0-9]*m/im, ''); 311 | } else { 312 | text = "ERREUR NULL"; 313 | } 314 | sendEmbedInChannel(Utilsguild.channels.get(config.logChannel), err ? 0xA80000 : 0x00AFFF, err ? 'Erreur' : 'Log', err ? text : '', null, fields); 315 | } 316 | console.log(toWrite); 317 | if(err) { 318 | console.log(console.trace()); 319 | } 320 | }, 321 | reactNbTime(message, nb, withConfirm = false, withCancel = false) { 322 | recurciveReactNbTime(message, nb, 0, withConfirm, withCancel); 323 | }, 324 | Color, 325 | ReactMap, 326 | ConfirmReact, 327 | UnicodeReactMap, 328 | UnicodeConfirmReact, 329 | UnicodeCancelReact, 330 | InvertedUnicodeReactMap: function () { 331 | var ret = {}; 332 | for(var key in UnicodeReactMap){ 333 | ret[UnicodeReactMap[key]] = key; 334 | } 335 | return ret; 336 | }, 337 | removeMyReact: function (message) { 338 | message.reactions.forEach(reaction => { 339 | reaction.remove(); 340 | }); 341 | 342 | }, 343 | setConfig: function (conf) { 344 | config = conf 345 | }, 346 | setGuild: function (g) { 347 | Utilsguild = g 348 | }, 349 | get guild() { 350 | return Utilsguild; 351 | }, 352 | config, 353 | spacer: function(nb) { 354 | return nb.toLocaleString('fr-FR').replace(/,/g, ' '); 355 | }, 356 | sendUtipMessage: function (utip, percent, channel) { 357 | var found = utip.found.toLocaleString('fr-FR', {style:'decimal', minimumFractionDigits: '2'}); 358 | var goal = Math.round(utip.goal); 359 | sendEmbedInChannel( 360 | Utilsguild.channels.get(channel), 361 | 0x00AFFF, 362 | "Utip Stupid Economics", 363 | `Le uTip est à **${percent}%** de son objectif ( ${found}€/${goal}€ ). 364 | Soutenez-nous nous avec uTip: ${utip.url}`, 365 | null, 366 | []); 367 | } 368 | } 369 | --------------------------------------------------------------------------------