From aa8d8cefe4e789c0c619dfb2c6a91827f78b4911 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 26 Aug 2020 19:20:21 +0200 Subject: [PATCH 01/71] fix an import --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index c6da13f0..565a98e3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import * as dotenv from "dotenv"; +import dotenv from "dotenv"; dotenv.config(); import Kwako from './Client'; From 1c8fb8c24256dad6d3d6c7f5bfd5b41663e1ee21 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 26 Aug 2020 19:20:45 +0200 Subject: [PATCH 02/71] add 'useExpSystem' in guild config --- src/index.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 565a98e3..976aa1d9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,7 +13,8 @@ const defaultSettings = { muteRole: "", modLogChannel: "", suggestionChannel: "", - disabledCommands: [] as string[] + disabledCommands: [] as string[], + useExpSystem: true } let talkedRecently = new Set(); @@ -53,8 +54,9 @@ Kwako.on('message', async (msg: Message) => { if (msg.channel.id === guildConf.suggestionChannel) return suggestion(msg); - if (!msg.content.startsWith(guildConf.prefix)) - return cooldown.exp(msg); + if(guildConf.useExpSystem) + if (!msg.content.startsWith(guildConf.prefix)) + return cooldown.exp(msg); let args = msg.content.slice(1).trim().split(/ +/g); let req = args.shift().toLowerCase(); From 8a8f0c51dc739bffd85513988d77e1435f44884d Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 26 Aug 2020 19:21:14 +0200 Subject: [PATCH 03/71] disable exp-related commands if exp system is disabled --- src/commands/config/addlevelrole.ts | 4 ++++ src/commands/config/dellevelrole.ts | 4 ++++ src/commands/utility/leaderboard.ts | 10 +++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/commands/config/addlevelrole.ts b/src/commands/config/addlevelrole.ts index 899f7d40..ba32becf 100644 --- a/src/commands/config/addlevelrole.ts +++ b/src/commands/config/addlevelrole.ts @@ -10,6 +10,10 @@ module.exports.run = async (msg: Message, args: string[]) => { await Kwako.db.collection('settings').insertOne({ '_id': msg.guild.id }); guildConf = { '_id': msg.guild.id }; } + + if(!guildConf.useExpSystem) + return msg.channel.send(':x: > You need to enable the experience system in order to use level roles'); + let levelroles:string = guildConf.levelroles ? guildConf.levelroles : "[]"; let levelrolesMap:Map> = new Map(JSON.parse(levelroles)); diff --git a/src/commands/config/dellevelrole.ts b/src/commands/config/dellevelrole.ts index 7b4eebac..83df1d5a 100644 --- a/src/commands/config/dellevelrole.ts +++ b/src/commands/config/dellevelrole.ts @@ -9,6 +9,10 @@ module.exports.run = async (msg: Message, args: string[]) => { await Kwako.db.collection('settings').insertOne({ '_id': msg.guild.id }); guildConf = { '_id': msg.guild.id }; } + + if(!guildConf.useExpSystem) + return msg.channel.send(':x: > You need to enable the experience system in order to use level roles'); + let levelroles:string = guildConf.levelroles ? guildConf.levelroles : "[]"; let levelrolesMap:Map = new Map(JSON.parse(levelroles)); diff --git a/src/commands/utility/leaderboard.ts b/src/commands/utility/leaderboard.ts index 7103ba83..0e79241f 100644 --- a/src/commands/utility/leaderboard.ts +++ b/src/commands/utility/leaderboard.ts @@ -2,13 +2,17 @@ import Kwako from '../../Client' import { Message, MessageEmbed } from 'discord.js' import utilities from '../../utils/utilities' -module.exports.run = async (msg: Message, args: string[]) => { +module.exports.run = async (msg: Message, args: string[], guildConf: any) => { if (args.length > 1) return; switch (args[0]) { case "xp": - case "exp": - return leaderboard(msg, 'exp', false) + case "exp": { + if(guildConf.useExpSystem) + return leaderboard(msg, 'exp', false) + else + return msg.channel.send(':x: > Sorry, but the experience system has been disabled in the server. Ask someone in the staff to re-enable it in order to use this command.') + } case "pat": case "pats": From 999b692d46efd7d3daf68f2de24e119e3fcd4c88 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 26 Aug 2020 19:26:58 +0200 Subject: [PATCH 04/71] level up msg are now disable-able --- src/events/messages/cooldown.ts | 4 ++-- src/index.ts | 5 +++-- src/utils/levelCheck.ts | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/events/messages/cooldown.ts b/src/events/messages/cooldown.ts index f839645b..ba93fd03 100644 --- a/src/events/messages/cooldown.ts +++ b/src/events/messages/cooldown.ts @@ -45,7 +45,7 @@ export default class cooldown { } } - static async exp(msg: Message) { + static async exp(msg: Message, guildConf: any) { if (!cooldownXP.has(msg.author.id)) { let guild = `exp.${msg.guild.id}` let user = await Kwako.db.collection('user').findOne({ '_id': { $eq: msg.author.id } }); @@ -56,7 +56,7 @@ export default class cooldown { if(user && user.exp) if(user.exp[msg.guild.id]) - levelCheck(msg, (user.exp[msg.guild.id]), amount); + levelCheck(msg, (user.exp[msg.guild.id]), amount, guildConf.showLevelUp); await Kwako.db.collection('user').updateOne({ _id: msg.author.id }, { $inc: { [guild]: amount } }, { upsert: true }); cooldownXP.add(msg.author.id); diff --git a/src/index.ts b/src/index.ts index 976aa1d9..5d502529 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,7 +14,8 @@ const defaultSettings = { modLogChannel: "", suggestionChannel: "", disabledCommands: [] as string[], - useExpSystem: true + useExpSystem: true, + showLevelUp: true } let talkedRecently = new Set(); @@ -56,7 +57,7 @@ Kwako.on('message', async (msg: Message) => { if(guildConf.useExpSystem) if (!msg.content.startsWith(guildConf.prefix)) - return cooldown.exp(msg); + return cooldown.exp(msg, guildConf); let args = msg.content.slice(1).trim().split(/ +/g); let req = args.shift().toLowerCase(); diff --git a/src/utils/levelCheck.ts b/src/utils/levelCheck.ts index 0bb062ac..56bcd8ab 100644 --- a/src/utils/levelCheck.ts +++ b/src/utils/levelCheck.ts @@ -8,11 +8,11 @@ import Kwako from '../Client'; import Discord from "discord.js"; import utilities from './utilities'; -export default async function levelCheck (msg: Discord.Message, xp: number, exp: number) { +export default async function levelCheck (msg: Discord.Message, xp: number, exp: number, showLevelUp: boolean) { let before = utilities.levelInfo(xp); let after = utilities.levelInfo((xp + exp)); if(before.level !== after.level) { - if ((after.level % 5) === 0) + if ((after.level % 5) === 0 && showLevelUp) await msg.reply(`you're now level ${after.level}!🎉🎉`).catch(() => {return}); let guildConf = await Kwako.db.collection('settings').findOne({ '_id': { $eq: msg.guild.id } }); From 165e3a627af6fcc22a9146615b647a29e1309ef0 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 26 Aug 2020 19:31:15 +0200 Subject: [PATCH 05/71] add security if no values exists --- src/commands/config/addlevelrole.ts | 1 + src/commands/config/dellevelrole.ts | 1 + src/commands/utility/leaderboard.ts | 1 + src/index.ts | 1 + src/utils/levelCheck.ts | 1 + 5 files changed, 5 insertions(+) diff --git a/src/commands/config/addlevelrole.ts b/src/commands/config/addlevelrole.ts index ba32becf..dc0e2b14 100644 --- a/src/commands/config/addlevelrole.ts +++ b/src/commands/config/addlevelrole.ts @@ -11,6 +11,7 @@ module.exports.run = async (msg: Message, args: string[]) => { guildConf = { '_id': msg.guild.id }; } + guildConf.useExpSystem ||= true; if(!guildConf.useExpSystem) return msg.channel.send(':x: > You need to enable the experience system in order to use level roles'); diff --git a/src/commands/config/dellevelrole.ts b/src/commands/config/dellevelrole.ts index 83df1d5a..d10bc6c4 100644 --- a/src/commands/config/dellevelrole.ts +++ b/src/commands/config/dellevelrole.ts @@ -10,6 +10,7 @@ module.exports.run = async (msg: Message, args: string[]) => { guildConf = { '_id': msg.guild.id }; } + guildConf.useExpSystem ||= true; if(!guildConf.useExpSystem) return msg.channel.send(':x: > You need to enable the experience system in order to use level roles'); diff --git a/src/commands/utility/leaderboard.ts b/src/commands/utility/leaderboard.ts index 0e79241f..b2d0a501 100644 --- a/src/commands/utility/leaderboard.ts +++ b/src/commands/utility/leaderboard.ts @@ -8,6 +8,7 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { switch (args[0]) { case "xp": case "exp": { + guildConf.useExpSystem ||= true; if(guildConf.useExpSystem) return leaderboard(msg, 'exp', false) else diff --git a/src/index.ts b/src/index.ts index 5d502529..6c769f9e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -55,6 +55,7 @@ Kwako.on('message', async (msg: Message) => { if (msg.channel.id === guildConf.suggestionChannel) return suggestion(msg); + guildConf.useExpSystem ||= true; if(guildConf.useExpSystem) if (!msg.content.startsWith(guildConf.prefix)) return cooldown.exp(msg, guildConf); diff --git a/src/utils/levelCheck.ts b/src/utils/levelCheck.ts index 56bcd8ab..94c3798f 100644 --- a/src/utils/levelCheck.ts +++ b/src/utils/levelCheck.ts @@ -12,6 +12,7 @@ export default async function levelCheck (msg: Discord.Message, xp: number, exp: let before = utilities.levelInfo(xp); let after = utilities.levelInfo((xp + exp)); if(before.level !== after.level) { + showLevelUp ||= true; if ((after.level % 5) === 0 && showLevelUp) await msg.reply(`you're now level ${after.level}!🎉🎉`).catch(() => {return}); From d3088c4d9c4069df0d346d4b5fee85b00e094526 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Thu, 27 Aug 2020 13:29:52 +0200 Subject: [PATCH 06/71] remove useless ':' --- src/Client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client.ts b/src/Client.ts index 62045d53..7feb111f 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -56,7 +56,7 @@ export default new class Kwako extends Client { this.golden = golden; }) .catch(err => { - return this.log.error({msg: `Error Fetching Patreon Data:`, status: err.response.status, reason: err.response.statusText}) + return this.log.error({msg: `Error Fetching Patreon Data`, status: err.response.status, reason: err.response.statusText}) }); } From 87568c48dab9e6e26b8ce903a5c8bf20f82ddaaa Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Thu, 27 Aug 2020 13:32:41 +0200 Subject: [PATCH 07/71] add more security with mentions in actions cmd --- src/utils/actions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/actions.ts b/src/utils/actions.ts index 3840ef4c..ab6ff695 100644 --- a/src/utils/actions.ts +++ b/src/utils/actions.ts @@ -102,8 +102,8 @@ export default async function actionsRun(msg: Message, args: string[], type: str embed.setImage(`https://${process.env.CDN_URL}/img/${type}/${n}.gif`) } } else { - if(!msg.author.id) return; - embed.setDescription(`<@${msg.author.id}> ${verb}${at ? ' at' : ''} you <@${(msg.mentions.members.first()).id}>!`) + if(!msg.author || !msg.mentions.users.first()) return; + embed.setDescription(`<@${msg.author.id}> ${verb}${at ? ' at' : ''} you <@${(msg.mentions.users.first()).id}>!`) let n = utilities.randomInt(count.get(type)) while (lastGif.get(type) === n) From de0b007c67796daacaa2cc2a62daa09d9c4c303e Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Thu, 27 Aug 2020 16:26:54 +0200 Subject: [PATCH 08/71] fix lvl up & lvl system customization issue --- src/commands/config/addlevelrole.ts | 2 +- src/commands/config/dellevelrole.ts | 2 +- src/commands/utility/leaderboard.ts | 2 +- src/index.ts | 2 +- src/utils/levelCheck.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/commands/config/addlevelrole.ts b/src/commands/config/addlevelrole.ts index dc0e2b14..84a02453 100644 --- a/src/commands/config/addlevelrole.ts +++ b/src/commands/config/addlevelrole.ts @@ -11,7 +11,7 @@ module.exports.run = async (msg: Message, args: string[]) => { guildConf = { '_id': msg.guild.id }; } - guildConf.useExpSystem ||= true; + guildConf.useExpSystem &&= true; if(!guildConf.useExpSystem) return msg.channel.send(':x: > You need to enable the experience system in order to use level roles'); diff --git a/src/commands/config/dellevelrole.ts b/src/commands/config/dellevelrole.ts index d10bc6c4..19a174ba 100644 --- a/src/commands/config/dellevelrole.ts +++ b/src/commands/config/dellevelrole.ts @@ -10,7 +10,7 @@ module.exports.run = async (msg: Message, args: string[]) => { guildConf = { '_id': msg.guild.id }; } - guildConf.useExpSystem ||= true; + guildConf.useExpSystem &&= true; if(!guildConf.useExpSystem) return msg.channel.send(':x: > You need to enable the experience system in order to use level roles'); diff --git a/src/commands/utility/leaderboard.ts b/src/commands/utility/leaderboard.ts index b2d0a501..92f0c720 100644 --- a/src/commands/utility/leaderboard.ts +++ b/src/commands/utility/leaderboard.ts @@ -8,7 +8,7 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { switch (args[0]) { case "xp": case "exp": { - guildConf.useExpSystem ||= true; + guildConf.useExpSystem &&= true; if(guildConf.useExpSystem) return leaderboard(msg, 'exp', false) else diff --git a/src/index.ts b/src/index.ts index 6c769f9e..ad921059 100644 --- a/src/index.ts +++ b/src/index.ts @@ -55,7 +55,7 @@ Kwako.on('message', async (msg: Message) => { if (msg.channel.id === guildConf.suggestionChannel) return suggestion(msg); - guildConf.useExpSystem ||= true; + guildConf.useExpSystem &&= true; if(guildConf.useExpSystem) if (!msg.content.startsWith(guildConf.prefix)) return cooldown.exp(msg, guildConf); diff --git a/src/utils/levelCheck.ts b/src/utils/levelCheck.ts index 94c3798f..57f3250d 100644 --- a/src/utils/levelCheck.ts +++ b/src/utils/levelCheck.ts @@ -12,7 +12,7 @@ export default async function levelCheck (msg: Discord.Message, xp: number, exp: let before = utilities.levelInfo(xp); let after = utilities.levelInfo((xp + exp)); if(before.level !== after.level) { - showLevelUp ||= true; + showLevelUp &&= true; if ((after.level % 5) === 0 && showLevelUp) await msg.reply(`you're now level ${after.level}!🎉🎉`).catch(() => {return}); From 09e85f48b212e17c1f062f4f1f22922d87ad1e9a Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Thu, 27 Aug 2020 17:49:32 +0200 Subject: [PATCH 09/71] add 'levelrole' command --- src/commands/config/levelrole.ts | 174 +++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 src/commands/config/levelrole.ts diff --git a/src/commands/config/levelrole.ts b/src/commands/config/levelrole.ts new file mode 100644 index 00000000..da993fd2 --- /dev/null +++ b/src/commands/config/levelrole.ts @@ -0,0 +1,174 @@ +import Kwako from '../../Client'; +import { Message, MessageEmbed } from 'discord.js'; +import utilities from '../../utils/utilities'; + +module.exports.run = async (msg: Message, args: string[], guildConf: any) => { + if ((!msg.member.hasPermission('MANAGE_GUILD'))) return; + guildConf.useExpSystem &&= true; + if(!guildConf.useExpSystem) + return msg.channel.send({'embed':{ + 'title': ':x: You need to enable the experience system in order to use level roles' + }}); + + if (args.length === 0) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}levelrole (add|remove|list)\`` + }}); + + let guild = await Kwako.db.collection('settings').findOne({ '_id': { $eq: msg.guild.id } }); + + let levelroles:string = guild.levelroles || "[]"; + let levelrolesMap:Map> = new Map(JSON.parse(levelroles)); + + switch (args[0]) { + // Add + case 'add': + if (args.length < 3) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}levelrole add (level number) (mention role) [mention previous role]\`` + }}); + + if(parseInt(args[1], 10) < 1 || parseInt(args[1], 10) > 50) + return msg.channel.send({'embed':{ + 'title': ':x: Please choose a valid level number between 1 and 50!' + }}) + + let role = args[2] || null; + if(role.startsWith('<@&') && role.endsWith('>')) { + role = role.slice(3, (role.length-1)) + let chan = await msg.guild.roles.fetch(role); + if(!chan || !chan.editable) + return msg.channel.send({'embed':{ + 'title': ":x: This role doesn't exist!" + }}) + } else + return msg.channel.send({'embed':{ + 'title': `:x: ${msg.author.username}, please mention a role!` + }}) + + let previous = args[3] || null; + if(parseInt(args[1], 10) === 1) + previous = null; + + if(previous && previous.startsWith('<@&') && previous.endsWith('>')) { + previous = previous.slice(3, (previous.length-1)) + let chan = await msg.guild.roles.fetch(previous); + if(!chan || !chan.editable) + return msg.channel.send({'embed':{ + 'title': ":x: The previous role doesn't exist!" + }}) + } else if(previous) + return msg.channel.send({'embed':{ + 'title': `:x: ${msg.author.username}, please mention a role!` + }}) + + levelrolesMap.set(parseInt(args[1], 10), [role, previous]); + + levelroles = JSON.stringify([...levelrolesMap]); + + await Kwako.db.collection('settings').updateOne({ _id: msg.guild.id }, { $set: { levelroles: levelroles }}, { upsert: true }) + + await giveRoleToUpper(msg, role, parseInt(args[1], 10)); + + let addEmbed = new MessageEmbed() + .setTitle('✅ New Level Role Added') + .addField('Role', `<@&${role}>`, true) + .addField('at Level', args[1], true); + + if (previous) + addEmbed.addField('Previous Role', `When members reach the level ${args[1]}, I'll remove <@&${previous}> from their roles.`, false); + + await msg.channel.send(addEmbed); + Kwako.log.info({msg: 'levelrole add', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, levelrole: { id: args[1], role: role }}) + return; + + // Remove + case 'remove': + if (args.length < 2) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}levelrole remove (level number)\`` + }}); + + if(parseInt(args[1], 10) < 1 || parseInt(args[1], 10) > 50) + return msg.channel.send({'embed':{ + 'title': ':x: Please choose a valid level number between 1 and 50!' + }}); + + if(!levelrolesMap.has(parseInt(args[1], 10))) + return msg.channel.send({'embed':{ + 'title': ':x: Deletion impossible', + 'description': "There's no Level Role set at this level" + }}) + + let removeRole = (levelrolesMap.get(parseInt(args[1], 10)))[0]; + levelrolesMap.delete(parseInt(args[1], 10)) + + levelroles = JSON.stringify([...levelrolesMap]); + + await Kwako.db.collection('settings').updateOne({ _id: msg.guild.id }, { $set: { levelroles: levelroles }}, { upsert: true }) + + let removeEmbed = new MessageEmbed() + .setTitle('🚮 Level Role Removed') + .addField('Role', `<@&${removeRole}>`, true) + .addField('at Level', args[1], true); + + await msg.channel.send(removeEmbed); + + Kwako.log.info({msg: 'levelrole remove', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, levelrole: args[1]}) + return; + + // List + case 'list': + let list = ""; + + for(const levelrole of levelrolesMap) { + let chan = await msg.guild.roles.fetch(levelrole[1][0]); + if (!chan || !chan.editable) return; + list = `${list}${levelrole[0]} > ${chan.name}\n`; + } + + if(levelrolesMap.size === 0) + list = 'nothing!' + + await msg.channel.send({ "embed": { + "title": "📃 Level Roles List", + "description": `\`\`\`${list}\`\`\`` + }}); + return; + + default: + return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}levelrole (add|remove|list)\`` + }}); + } + +}; + +module.exports.help = { + name: 'levelrole', + usage: "levelrole (add|remove|list)", + staff: true, + perms: ['EMBED_LINKS', 'ADD_REACTIONS', 'MANAGE_ROLES', 'MANAGE_MESSAGES'], + premium: true +}; + +async function giveRoleToUpper (msg: Message, role: string, level: number) { + let exp = utilities.expForLevel(level-1); + let guild = `exp.${msg.guild.id.toString()}` + + if(level === 1) { + let list = msg.guild.members.cache.filter(m => !m.user.bot).values(); + if(list) { + for(const member of list) { + if(member) + await member.roles.add(role).catch(() => {return}); + } + } + } else { + let list = await Kwako.db.collection('user').find({ [guild]: { $gte: exp } }).toArray(); + if(list) { + for(const user of list) { + let member = await msg.guild.members.fetch(user._id).catch(() => {return}); + if(member) + await member.roles.add(role).catch(() => {return}); + } + } + } +} \ No newline at end of file From 2602ac905ebd1689a38a1acd403d8bf6fdf564d3 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Thu, 27 Aug 2020 17:51:22 +0200 Subject: [PATCH 10/71] remove useless 'sleep' check --- src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index ad921059..aa98f37a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -72,7 +72,6 @@ Kwako.on('message', async (msg: Message) => { let sent = await msg.channel.send(embed); return setTimeout(async () => { await sent.delete(); }, 3000); } - if (process.env.SLEEP === '1' && msg.author.id != process.env.IWA) return; if (!cmd || disabled.includes(cmd.help.name)) return; else { From 0c7aff5cb542bb80916ce27f37383136aed3775e Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Thu, 27 Aug 2020 17:52:40 +0200 Subject: [PATCH 11/71] made some conditions strictier --- src/commands/config/enable.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/config/enable.ts b/src/commands/config/enable.ts index f16e9a0d..7373970e 100644 --- a/src/commands/config/enable.ts +++ b/src/commands/config/enable.ts @@ -3,14 +3,14 @@ import { Message } from 'discord.js'; module.exports.run = async (msg: Message, args: string[], guildConf: any) => { if ((!msg.member.hasPermission('MANAGE_GUILD'))) return; - if (args.length != 1) return; + if (args.length !== 1) return; let disabled: string[] = guildConf.disabledCommands || []; let cmd: any = Kwako.commands.get(args[0]) || Kwako.commands.find((comd) => comd.help.aliases && comd.help.aliases.includes(args[0])); if (!cmd) return; - let filtered = disabled.filter((value) => { return value != cmd.help.name }); + let filtered = disabled.filter((value) => { return value !== cmd.help.name }); if (cmd.help.aliases) filtered = filtered.filter((value) => { return !cmd.help.aliases.includes(value) }); From 72714711ce4da2a00cf6c7e3fef045d55a09df66 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Thu, 27 Aug 2020 17:56:50 +0200 Subject: [PATCH 12/71] fix formating in !disabled --- src/commands/config/disabled.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/commands/config/disabled.ts b/src/commands/config/disabled.ts index 6340e8c9..9740719d 100644 --- a/src/commands/config/disabled.ts +++ b/src/commands/config/disabled.ts @@ -12,9 +12,10 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { let desc = ""; - for(const command of disabled) { + for(const command of disabled) desc = `${desc}\`${command}\`, ` - } + + desc = desc.slice(0, (desc.length-2)) embed.setDescription(desc) From d197b4a22696e6e174513707d5c57f28085984c6 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Thu, 27 Aug 2020 18:00:10 +0200 Subject: [PATCH 13/71] add more security with !enable & !disable --- src/commands/config/disable.ts | 5 +++++ src/commands/config/enable.ts | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/commands/config/disable.ts b/src/commands/config/disable.ts index d5d4cf18..91b87ce7 100644 --- a/src/commands/config/disable.ts +++ b/src/commands/config/disable.ts @@ -10,6 +10,11 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { let cmd: any = Kwako.commands.get(args[0]) || Kwako.commands.find((comd) => comd.help.aliases && comd.help.aliases.includes(args[0])); if (!cmd) return; + if(disabled.includes(cmd.help.name)) + return msg.channel.send({'embed':{ + 'title': ':x: This command has already been disabled' + }}) + disabled.push(cmd.help.name); if(cmd.help.aliases) { for(const alias of cmd.help.aliases) { diff --git a/src/commands/config/enable.ts b/src/commands/config/enable.ts index 7373970e..709ccd5c 100644 --- a/src/commands/config/enable.ts +++ b/src/commands/config/enable.ts @@ -10,6 +10,11 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { let cmd: any = Kwako.commands.get(args[0]) || Kwako.commands.find((comd) => comd.help.aliases && comd.help.aliases.includes(args[0])); if (!cmd) return; + if(!disabled.includes(cmd.help.name)) + return msg.channel.send({'embed':{ + 'title': ':x: This command has already been enabled' + }}) + let filtered = disabled.filter((value) => { return value !== cmd.help.name }); if (cmd.help.aliases) filtered = filtered.filter((value) => { return !cmd.help.aliases.includes(value) }); From 21852ca5e424f24ef966c9c6c090491080e90665 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Thu, 27 Aug 2020 18:04:05 +0200 Subject: [PATCH 14/71] remove useless whitespaces --- src/commands/config/levelrole.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/commands/config/levelrole.ts b/src/commands/config/levelrole.ts index da993fd2..14c5c197 100644 --- a/src/commands/config/levelrole.ts +++ b/src/commands/config/levelrole.ts @@ -138,7 +138,6 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { 'title': `\`${guildConf.prefix}levelrole (add|remove|list)\`` }}); } - }; module.exports.help = { From c50317bb247775c63cf458324a743ff24b3e205b Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Sun, 30 Aug 2020 14:31:52 +0200 Subject: [PATCH 15/71] fix a missing space --- src/Client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client.ts b/src/Client.ts index 7feb111f..c82dbedc 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -1,4 +1,4 @@ -import { Collection, Client }from "discord.js"; +import { Collection, Client } from "discord.js"; import log from './Logger'; From def5af03fa02f0ab62320698c0296c8a466cf145 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Mon, 31 Aug 2020 21:30:22 +0200 Subject: [PATCH 16/71] fix a regex issue --- src/utils/music.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/music.ts b/src/utils/music.ts index e39e4dd4..8c79ff5f 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -35,7 +35,7 @@ export default class music { let video_url = args[0].split('&') let playlist = await yt.getPlaylist(args[0]).catch(() => {return}); - if (playlist && !video_url[0].match(/^https?:\/\/(www.youtube.com|youtube.com|m.youtube.com)\/playlist(.*)$/)) { + if (playlist && !video_url[0].match(/^https?:\/\/(((www|m)\.)youtube.com)\/playlist(.*)$/)) { let reply = await msg.channel.send({ "embed": { "title": ":information_source: Your link contains both a video & a playlist link", From c15f52a95ea1ed86b323d33f397e4d1c06a819dc Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Mon, 31 Aug 2020 22:23:42 +0200 Subject: [PATCH 17/71] add !reactionrole command --- src/commands/config/reactionrole.ts | 243 ++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 src/commands/config/reactionrole.ts diff --git a/src/commands/config/reactionrole.ts b/src/commands/config/reactionrole.ts new file mode 100644 index 00000000..b021c752 --- /dev/null +++ b/src/commands/config/reactionrole.ts @@ -0,0 +1,243 @@ +import Kwako from '../../Client'; +import { Message, TextChannel } from 'discord.js'; + +module.exports.run = async (msg: Message, args: string[], guildConf: any) => { + if ((!msg.member.hasPermission('MANAGE_GUILD'))) return; + + if (args.length === 0) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}reactionrole (embed|role)\`` + }}); + + switch (args[0]) { + // Embeds + case 'embed': + switch (args[1]) { + case 'add': + if (args.length < 3) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}reactionrole embed add (JSON)\``, + 'description': "If you don't know what to put in (JSON), use [this link](https://embedbuilder.nadekobot.me)\nBuild your embed, copy the code and paste it there" + }}); + + args.shift(); args.shift(); + let embedString = args.join(' ') + let embed = JSON.parse(embedString) + + if(!embed.embed) { + embedString = `{"embed":${embedString}}` + embed = JSON.parse(embedString) + } + + let sent = await msg.channel.send(embed) + + if (msg.deletable) { + try { + await msg.delete() + } catch (ex) { + Kwako.log.error(ex) + } + } + + await Kwako.db.collection('msg').insertOne({ _id: sent.id, channel: sent.channel.id }) + + Kwako.log.info({msg: 'reactionrole embed add', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }}) + return; + + case 'edit': + if (args.length < 4) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}reactionrole embed edit (Message UID) (JSON)\``, + 'description': "If you don't know what to put in (JSON), use [this link](https://embedbuilder.nadekobot.me)\nBuild your embed, copy the code and paste it there" + }}); + + let dbEditEmbed = await Kwako.db.collection('msg').findOne({ _id: args[2] }) + if (!dbEditEmbed) return msg.reply(":x: > That message doesn't exist!") + let editFetchMsg = await msg.channel.messages.fetch(args[2]); + + args.shift(); args.shift(); args.shift(); + let editEmbedString = args.join(' ') + let editEmbed = JSON.parse(editEmbedString) + + if(!editEmbed.embed) { + embedString = `{"embed":${embedString}}` + embed = JSON.parse(embedString) + } + + if (!editFetchMsg.editable) return; + await editFetchMsg.edit(embed); + + if (msg.deletable) { + try { + await msg.delete() + } catch (ex) { + Kwako.log.error(ex) + } + } + + Kwako.log.info({msg: 'reactionrole embed edit', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }}) + return; + + case 'remove': + if (args.length < 3) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}reactionrole embed remove (Message UID)\``, + 'description': "If you don't know what is the __Message UID__, go in:\n*Discord Settings > Appearance > Developer Mode*\nThen right click/long touch on a RR Embed > Copy ID\nFinally, paste the UID" + }}); + + console.log(args) + + let dbEmbed = await Kwako.db.collection('msg').findOne({ _id: args[2] }) + if (!dbEmbed) return msg.channel.send({'embed':{ + 'title': ":x: This Reaction Roles Embed doesn't exist!" + }}); + + let channel = msg.guild.channels.resolve(dbEmbed.channel) + if(!channel || channel.type !== 'text') return msg.channel.send({'embed':{ + 'title': ":x: This Reaction Roles Embed doesn't exist!" + }}); + + let fetchMsg = await (channel as TextChannel).messages.fetch(args[2]) + if(!fetchMsg) return msg.channel.send({'embed':{ + 'title': ":x: This Reaction Roles Embed doesn't exist!" + }}); + + if (fetchMsg.deletable) { + try { + await fetchMsg.delete() + await msg.react('✅') + } catch (ex) { + Kwako.log.error(ex) + await msg.react('❌') + } + } + + await Kwako.db.collection('msg').deleteOne({ _id: args[2] }) + + Kwako.log.info({msg: 'reactionrole embed remove', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }}) + return; + + default: + return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}reactionrole embed (add|edit|remove)\`` + }}); + } + + // Roles + case 'role': + case 'roles': + switch (args[1]) { + case 'add': + if (args.length < 5) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}reactionrole role add (Message UID) (Emote) (Mention Role)\``, + 'description': "If you don't know what is the __Message UID__, go in:\n*Discord Settings > Appearance > Developer Mode*\nThen right click/long touch on a RR Embed > Copy ID\nFinally, paste the UID\n\nWorks with custom emotes as well" + }}); + + let dbEmbed = await Kwako.db.collection('msg').findOne({ _id: args[2] }) + if (!dbEmbed) return msg.channel.send({'embed':{ + 'title': ":x: This Reaction Roles Embed doesn't exist!" + }}); + + let channel = msg.guild.channels.resolve(dbEmbed.channel) + if(!channel || channel.type !== 'text') return msg.channel.send({'embed':{ + 'title': ":x: This Reaction Roles Embed doesn't exist!" + }}); + + let embed = await (channel as TextChannel).messages.fetch(args[2]) + if(!embed) return msg.channel.send({'embed':{ + 'title': ":x: This Reaction Roles Embed doesn't exist!" + }}); + + let emote = args[3] + if((emote.startsWith('<:') || emote.startsWith('')) + emote = emote.slice(emote.length-19, emote.length-1); + + let role = args[4]; + if(role.startsWith('<@&') && role.endsWith('>')) { + role = role.slice(3, (role.length-1)) + let chan = await msg.guild.roles.fetch(role); + if(!chan || !chan.editable) + return msg.channel.send({'embed':{ + 'title': ":x: This role doesn't exist!" + }}); + } else + return msg.channel.send({'embed':{ + 'title': ":x: Please mention a role" + }}); + + try { + embed.react(emote) + } catch (ex) { + return msg.channel.send({'embed':{ + 'title': ":x: I can't react to the message!" + }}); + } + + if (msg.deletable) { + try { + await msg.react('✅') + } catch (ex) { + Kwako.log.error(ex) + await msg.react('❌') + } + } + + await Kwako.db.collection('msg').updateOne({ _id: args[2] }, { $push: { roles: { "id": role, "emote": emote } } }) + + Kwako.log.info({msg: 'addrole', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, role: { id: role, emote: emote }}) + return; + + case 'remove': + if (args.length < 4) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}reactionrole role remove (Message UID) (Emote)\``, + 'description': "If you don't know what is the __Message UID__, go in:\n*Discord Settings > Appearance > Developer Mode*\nThen right click/long touch on a RR Embed > Copy ID\nFinally, paste the UID\n\nWorks with custom emotes as well" + }}); + + let dbRemoveEmbed = await Kwako.db.collection('msg').findOne({ _id: args[2] }) + if (!dbRemoveEmbed) return msg.channel.send({'embed':{ + 'title': ":x: This Reaction Roles Embed doesn't exist!" + }}); + + let removeChannel = msg.guild.channels.resolve(dbRemoveEmbed.channel) + if(!removeChannel || removeChannel.type !== 'text') return msg.channel.send({'embed':{ + 'title': ":x: This Reaction Roles Embed doesn't exist!" + }}); + + let fetchMsg = await (removeChannel as TextChannel).messages.fetch(args[2]) + if(!fetchMsg) return msg.channel.send({'embed':{ + 'title': ":x: This Reaction Roles Embed doesn't exist!" + }}); + + let removeEmote = args[3] + if((removeEmote.startsWith('<:') || removeEmote.startsWith('')) + removeEmote = removeEmote.slice(removeEmote.length-19, removeEmote.length-1); + + let thing = fetchMsg.reactions.cache.find(val => val.emoji.name === removeEmote); + await thing.remove(); + + if (msg.deletable) { + try { + await msg.react('✅') + } catch (ex) { + Kwako.log.error(ex) + await msg.react('❌') + } + } + + await Kwako.db.collection('msg').updateOne({ _id: args[2] }, { $pull: { roles: { "emote": removeEmote } } }) + + Kwako.log.info({msg: 'delrole', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }}) + return; + + default: + return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}reactionrole role (add|remove)\`` + }}); + } + } +}; + +module.exports.help = { + name: 'reactionrole', + aliases: ['rr'], + usage: "reactionrole", + staff: true, + perms: ['EMBED_LINKS', 'ADD_REACTIONS', 'MANAGE_ROLES', 'MANAGE_MESSAGES', 'READ_MESSAGE_HISTORY'], + premium: true +}; \ No newline at end of file From 2917c24a30b8340d3ae8d37e5a86061bd56e6d7a Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Mon, 31 Aug 2020 22:36:13 +0200 Subject: [PATCH 18/71] fix #44 --- src/commands/profile/profile.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/profile/profile.ts b/src/commands/profile/profile.ts index 49e44628..28b2150b 100644 --- a/src/commands/profile/profile.ts +++ b/src/commands/profile/profile.ts @@ -31,7 +31,7 @@ async function profileImg(msg: Message, id: string) { if (!userDB || !userDB.exp) { let user = { - avatar: userDiscord.avatarURL({ format: 'png', dynamic: false, size: 512 }), + avatar: userDiscord.avatarURL({ format: 'png', dynamic: false, size: 512 }) || userDiscord.defaultAvatarURL, username: userDiscord.username, positionExp: "?", level: 1, @@ -61,7 +61,7 @@ async function profileImg(msg: Message, id: string) { let lvlInfo = utilities.levelInfo(userDB.exp[msg.guild.id]); let user = { - avatar: userDiscord.avatarURL({ format: 'png', dynamic: false, size: 512 }), + avatar: userDiscord.avatarURL({ format: 'png', dynamic: false, size: 512 }) || userDiscord.defaultAvatarURL, username: userDiscord.username, positionExp: (leadXP.findIndex(val => val._id == id) + 1), level: lvlInfo.level, From 4f5d58bc016632efc35fe2154b4d2decb733e1fd Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Mon, 31 Aug 2020 22:41:29 +0200 Subject: [PATCH 19/71] fix #42 --- src/commands/profile/pfp.ts | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/commands/profile/pfp.ts diff --git a/src/commands/profile/pfp.ts b/src/commands/profile/pfp.ts new file mode 100644 index 00000000..1fd33f1c --- /dev/null +++ b/src/commands/profile/pfp.ts @@ -0,0 +1,47 @@ +import Kwako from '../../Client' +import { Message } from 'discord.js' + +module.exports.run = async (msg: Message, args: string[]) => { + if (args.length === 1) { + if (msg.mentions.everyone) return; + let mention = msg.mentions.users.first() + if (!mention) return; + + let avatar = mention.avatarURL({ dynamic: true }) || mention.defaultAvatarURL + + await msg.channel.send({"embed":{ + "title": `${mention.username}'s Avatar`, + "image": { + "url": avatar + }, + "footer": { + "text": `${mention.id}` + }, + }}); + + Kwako.log.info({msg: 'pfp', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, target: { id: mention.id, name: mention.tag }}); + } else { + + let avatar = msg.author.avatarURL({ dynamic: true }) || msg.author.defaultAvatarURL + + await msg.channel.send({"embed":{ + "title": `${msg.author.username}'s Avatar`, + "image": { + "url": avatar + }, + "footer": { + "text": `${msg.author.id}` + }, + }}); + + Kwako.log.info({msg: 'pfp', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, target: { id: msg.author.id, name: msg.author.tag }}); + } +}; + +module.exports.help = { + name: 'pfp', + aliases: ['profilepic', 'avatar'], + usage: "pfp (mention someone)", + desc: "Print your or someone's pfp in the channel you sent the command.", + premium: true +}; \ No newline at end of file From 90dba5a29c5bf274ee6041ce05841c22aa096772 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:14:30 +0200 Subject: [PATCH 20/71] fix issue with actions target --- src/utils/actions.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/actions.ts b/src/utils/actions.ts index ab6ff695..954d21fd 100644 --- a/src/utils/actions.ts +++ b/src/utils/actions.ts @@ -102,8 +102,9 @@ export default async function actionsRun(msg: Message, args: string[], type: str embed.setImage(`https://${process.env.CDN_URL}/img/${type}/${n}.gif`) } } else { - if(!msg.author || !msg.mentions.users.first()) return; - embed.setDescription(`<@${msg.author.id}> ${verb}${at ? ' at' : ''} you <@${(msg.mentions.users.first()).id}>!`) + let target = msg.mentions.users.first(); + if(!msg.author || !target) return; + embed.setDescription(`<@${msg.author.id}> ${verb}${at ? ' at' : ''} you <@${target.id}>!`) let n = utilities.randomInt(count.get(type)) while (lastGif.get(type) === n) From 7c4c520850c409fb61e28f03e04de8ba1ef3b459 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:40:02 +0200 Subject: [PATCH 21/71] add !twitch command --- package.json | 1 + src/commands/config/twitch.ts | 99 ++++++++++++ yarn.lock | 293 +++++++++++++++++++++++++++++++++- 3 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 src/commands/config/twitch.ts diff --git a/package.json b/package.json index 9ec9ff57..4d00d774 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "pino": "^6.5.1", "popyt": "^4.1.1", "sodium": "^3.0.2", + "twitch": "^4.1.4", "utf-8-validate": "^5.0.2", "ytdl-core": "^3.2.1" }, diff --git a/src/commands/config/twitch.ts b/src/commands/config/twitch.ts new file mode 100644 index 00000000..03e6dd2d --- /dev/null +++ b/src/commands/config/twitch.ts @@ -0,0 +1,99 @@ +import Kwako from '../../Client'; +import { Message, TextChannel } from 'discord.js'; + +const twitch = require('twitch').default; +const twitchClient = twitch.withClientCredentials(process.env.TWITCHCLIENTID, process.env.TWITCHCLIENTSECRET); + +module.exports.run = async (msg: Message, args: string[], guildConf: any) => { + if ((!msg.member.hasPermission('MANAGE_GUILD'))) return; + + if (args.length === 0) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}twitch (add|remove|list)\`` + }}); + + switch (args[0]) { + // Add + case 'add': + if (args.length < 2) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}twitch add (streamer username)\`` + }}); + + let user = await twitchClient.helix.users.getUserByName(args[1]); + if (!user) + return msg.channel.send({'embed':{ + 'title': ":x: This streamer doesn't exist!" + }}); + + let channelID = msg.channel.id; + + let streamer = await Kwako.db.collection('twitch').findOne({ _id: args[1] }); + if (streamer) { + let channels: Array = streamer.channels || []; + if (channels.indexOf(channelID) > -1) return msg.channel.send({'embed':{ + 'title': ":x: There's already a notification set-up in this channel for this streamer" + }}); + } + + await Kwako.db.collection('twitch').updateOne({_id: args[1]}, { $push: { channels: channelID }}, { upsert: true }); + + Kwako.log.info({msg: 'twitch add', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, data: { streamer: args[1], channel: channelID }}) + return; + + // Remove + case 'remove': + if (args.length < 2) return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}twitch remove (level number)\`` + }}); + + let channelIDRemove = msg.channel.id; + + let removeStreamer = await Kwako.db.collection('twitch').findOne({ _id: args[1] }); + if (removeStreamer) { + let channels: Array = removeStreamer.channels || []; + if (channels.indexOf(channelIDRemove) === -1) return msg.channel.send({'embed':{ + 'title': ":x: There's already no notification set-up in this channel for this streamer" + }}); + } + + await Kwako.db.collection('twitch').updateOne({_id: args[1]}, { $pull: { channels: channelIDRemove }}, { upsert: true }); + + Kwako.log.info({msg: 'twitch remove', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, data: { streamer: args[1], channel: channelIDRemove }}) + return; + + // List + case 'list': + let list = `#${(msg.channel as TextChannel).name}\n\n`; + + let channelIDList = msg.channel.id; + + let streamerList = await Kwako.db.collection('twitch').find({ channels: channelIDList }).toArray(); + + for(const data of streamerList) { + list = `${list}${data._id}\n`; + } + + if(streamerList.length === 0) + list = `#${(msg.channel as TextChannel).name}\n\nnothing!` + + await msg.channel.send({ "embed": { + "title": "📃 Stream Notifications List", + "description": `\`\`\`${list}\`\`\`` + }}); + + Kwako.log.info({msg: 'twitch list', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, channel: channelIDList }) + return; + + default: + return msg.channel.send({'embed':{ + 'title': `\`${guildConf.prefix}twitch (add|remove|list)\`` + }}); + } +}; + +module.exports.help = { + name: 'twitch', + usage: "levelrole (add|remove|list)", + staff: true, + perms: ['EMBED_LINKS', 'ADD_REACTIONS', 'MANAGE_ROLES', 'MANAGE_MESSAGES'], + premium: true +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 8c62222a..3a73a5c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,72 @@ # yarn lockfile v1 +"@d-fischer/cache-decorators@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@d-fischer/cache-decorators/-/cache-decorators-2.0.0.tgz#a5f63513316a0a4e85ea5842bb9eb803e4c1c085" + integrity sha512-KTcQr0upyw+Sj8m4uakV2Y/63Qww24+MGNiopg+1YFfP+oO/XAAPIVpq6zb2N+kCswP3xFo/CInyzhtO4zqkPw== + dependencies: + "@d-fischer/shared-utils" "^2.0.0" + "@types/node" "^12.12.14" + tslib "^1.10.0" + +"@d-fischer/cross-fetch@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@d-fischer/cross-fetch/-/cross-fetch-4.0.1.tgz#884e44bfa3999a76e85d3a64f0629c7f5b56d40d" + integrity sha512-N2wdpOaSSLtCERlOFLPU3UpW27VSWiPfu65SKWdVrYJP2DeH2ZBwwvDz2OYAWkXb0fSUKQWuWk+yWhDpcmQljQ== + dependencies: + node-fetch "2.6.0" + whatwg-fetch "3.0.0" + +"@d-fischer/logger@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@d-fischer/logger/-/logger-1.1.1.tgz#e3469a01581dac3f21e9e6f8d4e2ca469f887e2e" + integrity sha512-JpK3Pl+8mW5LvsNfeCOJwOKOHX88KI1X4NFWSxSVgfY0KFV9nE478Y0/3ZjlTLJuiaxBEmOLsvhPGtQeDfi4EQ== + dependencies: + detect-node "^2.0.4" + tslib "^1.10.0" + +"@d-fischer/logger@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@d-fischer/logger/-/logger-2.0.0.tgz#0b9be52fdceddfe307563ee9f73b8b7f667f4020" + integrity sha512-KIVO0U8sqoulnepMEvXP/FjJAavfmKHLoFIn+D0iqzmFgaY8eaZ464y8nuMVgZGYUGAFxY953XVAeijBf07vcw== + dependencies: + detect-node "^2.0.4" + tslib "^2.0.0" + +"@d-fischer/promise.allsettled@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@d-fischer/promise.allsettled/-/promise.allsettled-2.0.1.tgz#3da8996ec95fd25017d0ec8289302c1b0afdce00" + integrity sha512-n3DCu++HfQBsuTRzwCk4hABtjQm+RgyPHecGTg6ze8ocCPKzSllsXQWTX7PEoQHKwoHEEoDiHzddTC62n+HZBA== + dependencies: + array.prototype.map "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.17.4" + iterate-value "^1.0.2" + +"@d-fischer/qs@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@d-fischer/qs/-/qs-7.0.2.tgz#21942f51590e20954086bdc32fb3e608d3525659" + integrity sha512-yAu3xDooiL+ef84Jo8nLjDjWBRk7RXk163Y6aTvRB7FauYd3spQD/dWvgT7R4CrN54Juhrrc3dMY7mc+jZGurQ== + +"@d-fischer/rate-limiter@^0.2.4": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@d-fischer/rate-limiter/-/rate-limiter-0.2.5.tgz#3e62e8c97d7fa049f3b3e8091b467b48a29bd657" + integrity sha512-JnnhFeB1dMT4ooaIcnZKtvepnf/wtAJTVEKEnu7i3Pl9Q7JTU0dEPoTsEdAqMjGyQHKc0msCv47Yg1htqcmH/A== + dependencies: + "@d-fischer/logger" "^2.0.0" + "@d-fischer/promise.allsettled" "^2.0.1" + "@types/node" "^12.12.5" + tslib "^1.9.3" + +"@d-fischer/shared-utils@^2.0.0", "@d-fischer/shared-utils@^2.0.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@d-fischer/shared-utils/-/shared-utils-2.3.1.tgz#a4cb0e5b098ca810421bd73bf1371c554345355d" + integrity sha512-4cWXqXYrMOvk1dIao3iODrAIiA4a6gB7FF0/OmYq0nUJFQ4u688tTJl/hQoBs2Id51wvas8oavdz0jxWAa4dZA== + dependencies: + "@types/node" "^14.0.5" + tslib "^2.0.0" + "@discordjs/collection@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" @@ -70,6 +136,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== +"@types/node@^12.12.14", "@types/node@^12.12.5": + version "12.12.54" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1" + integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== + +"@types/node@^14.0.5": + version "14.6.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.2.tgz#264b44c5a28dfa80198fc2f7b6d3c8a054b9491f" + integrity sha512-onlIwbaeqvZyniGPfdw/TEhKIh79pz66L1q06WUQqJLnAb6wbjvOtepLYTGHTqzdXgBYIE3ZdmqHDGsRsbBz7A== + "@types/pino-std-serializers@*": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz#f8bd52a209c8b3c97d1533b1ba27f57c816382bf" @@ -167,6 +243,16 @@ args@^5.0.1: leven "2.1.0" mri "1.1.4" +array.prototype.map@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" + integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.4" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -340,6 +426,13 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -360,6 +453,11 @@ detect-libc@^1.0.2, detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + discord.js@^12.3.1: version "12.3.1" resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-12.3.1.tgz#8f58ac17d29b068dbfeb6c01fc7777bacd5324cf" @@ -386,6 +484,50 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-regex "^1.1.0" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" + integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== + dependencies: + es-abstract "^1.17.4" + has-symbols "^1.0.1" + is-arguments "^1.0.4" + is-map "^2.0.1" + is-set "^2.0.1" + is-string "^1.0.5" + isarray "^2.0.5" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -437,6 +579,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -473,11 +620,23 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + html-entities@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" @@ -515,6 +674,21 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-callable@^1.1.4, is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -527,11 +701,58 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" + integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== + +is-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-set@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" + integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== + +is-string@^1.0.4, is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +iterate-iterator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" + integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== + +iterate-value@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" + integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== + dependencies: + es-get-iterator "^1.0.2" + iterate-iterator "^1.0.1" + jmespath@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" @@ -693,7 +914,7 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@^2.6.0: +node-fetch@2.6.0, node-fetch@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== @@ -768,6 +989,26 @@ object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-inspect@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1031,6 +1272,22 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -1108,11 +1365,40 @@ tar@^6.0.2: mkdirp "^1.0.3" yallist "^4.0.0" +top-package@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/top-package/-/top-package-1.0.1.tgz#17990e92963bd13faa61594fd7d32568ed267a14" + integrity sha512-tsuhQlHSigOTTvonxHXwqSKEVSnWMh2GvpTvXa5YmoyOwL5YvU4lTd/KNVZlKM5v7gqx44UEuQxyPQEpmaIHdg== + +tslib@^1.10.0, tslib@^1.9.3: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tslib@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== +twitch@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/twitch/-/twitch-4.1.4.tgz#1f072def150b7c88d568dc6331dc7f3ab23a6f1e" + integrity sha512-+SLXm8qQcOsPwAz9uDk/mcAkQlcLKzc60InJzMuhMqL5HgP6UsxQIsjINUmCAyKt3Kp7b3A+OtlWAHDeBkGbAA== + dependencies: + "@d-fischer/cache-decorators" "^2.0.0" + "@d-fischer/cross-fetch" "^4.0.1" + "@d-fischer/logger" "^1.1.1" + "@d-fischer/qs" "^7.0.2" + "@d-fischer/rate-limiter" "^0.2.4" + "@d-fischer/shared-utils" "^2.0.1" + top-package "^1.0.0" + tslib "^2.0.0" + utf-8-validate@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3" @@ -1125,6 +1411,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +whatwg-fetch@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" From 8ac70e49bf643e217ea539f76c47c59b8128fe20 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:46:21 +0200 Subject: [PATCH 22/71] add missing radix parameters --- src/commands/config/addlevelrole.ts | 6 +++--- src/commands/config/dellevelrole.ts | 4 ++-- src/commands/update.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/commands/config/addlevelrole.ts b/src/commands/config/addlevelrole.ts index 84a02453..1cc285a8 100644 --- a/src/commands/config/addlevelrole.ts +++ b/src/commands/config/addlevelrole.ts @@ -18,7 +18,7 @@ module.exports.run = async (msg: Message, args: string[]) => { let levelroles:string = guildConf.levelroles ? guildConf.levelroles : "[]"; let levelrolesMap:Map> = new Map(JSON.parse(levelroles)); - if(parseInt(args[0]) < 2 || parseInt(args[0]) > 50) + if(parseInt(args[0], 10) < 2 || parseInt(args[0], 10) > 50) return msg.channel.send(":x: > Please choose a valid level number between 2 and 50!") let role = args[1]; @@ -40,13 +40,13 @@ module.exports.run = async (msg: Message, args: string[]) => { return msg.reply('please mention a role!') - levelrolesMap.set(parseInt(args[0]), [role, previous]); + levelrolesMap.set(parseInt(args[0], 10), [role, previous]); levelroles = JSON.stringify([...levelrolesMap]); await Kwako.db.collection('settings').updateOne({ _id: msg.guild.id }, { $set: { levelroles: levelroles }}, { upsert: true }) - await giveRoleToUpper(msg, role, parseInt(args[0])); + await giveRoleToUpper(msg, role, parseInt(args[0], 10)); await msg.channel.send(`I'll now give the role <@&${role}> to members when they reach the level **${args[0]}** and to members currently above this level.`); if (previous) diff --git a/src/commands/config/dellevelrole.ts b/src/commands/config/dellevelrole.ts index 19a174ba..9dd6328b 100644 --- a/src/commands/config/dellevelrole.ts +++ b/src/commands/config/dellevelrole.ts @@ -17,10 +17,10 @@ module.exports.run = async (msg: Message, args: string[]) => { let levelroles:string = guildConf.levelroles ? guildConf.levelroles : "[]"; let levelrolesMap:Map = new Map(JSON.parse(levelroles)); - if(parseInt(args[0]) < 2 || parseInt(args[0]) > 100) + if(parseInt(args[0], 10) < 2 || parseInt(args[0], 10) > 100) return msg.channel.send(":x: > Please choose a valid level number between 2 and 100!") - levelrolesMap.delete(parseInt(args[0])) + levelrolesMap.delete(parseInt(args[0], 10)) levelroles = JSON.stringify([...levelrolesMap]); diff --git a/src/commands/update.ts b/src/commands/update.ts index 349b00e3..083b9af0 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -6,7 +6,7 @@ module.exports.run = async (msg: Message, args: string[]) => { let min = 30; if(args[0]) - min = parseInt(args[0]); + min = parseInt(args[0], 10); await Kwako.user.setActivity(`⚠️ update in ${min}min`, { type: 'LISTENING' }).catch(Kwako.log.error); await Kwako.user.setStatus('idle').catch(Kwako.log.error); From bb89801cf9d0cf0bd9716c381d0454876eb06279 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:47:08 +0200 Subject: [PATCH 23/71] fix levels in 'dellevelrole' --- src/commands/config/dellevelrole.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/config/dellevelrole.ts b/src/commands/config/dellevelrole.ts index 9dd6328b..6d116408 100644 --- a/src/commands/config/dellevelrole.ts +++ b/src/commands/config/dellevelrole.ts @@ -17,8 +17,8 @@ module.exports.run = async (msg: Message, args: string[]) => { let levelroles:string = guildConf.levelroles ? guildConf.levelroles : "[]"; let levelrolesMap:Map = new Map(JSON.parse(levelroles)); - if(parseInt(args[0], 10) < 2 || parseInt(args[0], 10) > 100) - return msg.channel.send(":x: > Please choose a valid level number between 2 and 100!") + if(parseInt(args[0], 10) < 2 || parseInt(args[0], 10) > 50) + return msg.channel.send(":x: > Please choose a valid level number between 2 and 50!") levelrolesMap.delete(parseInt(args[0], 10)) From 446999d4934112797130ee589669100de23187f5 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:47:58 +0200 Subject: [PATCH 24/71] remove unecessary await --- src/Client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client.ts b/src/Client.ts index c82dbedc..64514b45 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -32,7 +32,7 @@ export default new class Kwako extends Client { private async getPledgeData() { const link = `https://www.patreon.com/api/oauth2/api/campaigns/3028203/pledges`; - return await axios + return axios .get(link, { headers: { authorization: `Bearer ${process.env.PATREON_TOKEN}` } }) From de34b3872f0f86190c0c48dea6a3055c45b4ac0a Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:50:26 +0200 Subject: [PATCH 25/71] put process related logs in async func --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index aa98f37a..041de8c4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,8 +25,8 @@ import ready from './events/ready'; import suggestion from './events/messages/suggestion'; // Process related Events -process.on('uncaughtException', exception => Kwako.log.error(exception)); -process.on('unhandledRejection', exception => Kwako.log.error(exception)); +process.on('uncaughtException', async exception => Kwako.log.error(exception)); +process.on('unhandledRejection', async exception => Kwako.log.error(exception)); // Bot-User related Events Kwako.on('warn', (warn) => Kwako.log.warn(warn)); From 5f8cdd0731490dd1013b29ca0d81cb9efdca24d2 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:52:36 +0200 Subject: [PATCH 26/71] replace eyes by ring emote for suggestions --- src/commands/suggestions/approve.ts | 2 +- src/commands/suggestions/consider.ts | 2 +- src/commands/suggestions/deny.ts | 2 +- src/commands/suggestions/implemented.ts | 2 +- src/events/messages/suggestion.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/commands/suggestions/approve.ts b/src/commands/suggestions/approve.ts index 4553435e..2f32dd9f 100644 --- a/src/commands/suggestions/approve.ts +++ b/src/commands/suggestions/approve.ts @@ -32,7 +32,7 @@ module.exports.run = async (msg: Message, args: string[], guildConf: { suggestio let desc = embed.description; embed.setDescription(`${desc}\n\n**✅ Approved by ${msg.author.username}**\n${req}`); - let reactions = suggestion.reactions.resolve('👀'); + let reactions = suggestion.reactions.resolve('🔔'); let users = await reactions.users.fetch(); let embedDM = new MessageEmbed(); diff --git a/src/commands/suggestions/consider.ts b/src/commands/suggestions/consider.ts index b95050b6..f8ec2226 100644 --- a/src/commands/suggestions/consider.ts +++ b/src/commands/suggestions/consider.ts @@ -32,7 +32,7 @@ module.exports.run = async (msg: Message, args: string[], guildConf: { suggestio let desc = embed.description; embed.setDescription(`${desc}\n\n**🤔 Considered by ${msg.author.username}**\n${req}`); - let reactions = suggestion.reactions.resolve('👀'); + let reactions = suggestion.reactions.resolve('🔔'); let users = await reactions.users.fetch(); let embedDM = new MessageEmbed(); diff --git a/src/commands/suggestions/deny.ts b/src/commands/suggestions/deny.ts index 8ce6604e..fdc41f7d 100644 --- a/src/commands/suggestions/deny.ts +++ b/src/commands/suggestions/deny.ts @@ -32,7 +32,7 @@ module.exports.run = async (msg: Message, args: string[], guildConf: { suggestio let desc = embed.description; embed.setDescription(`${desc}\n\n**❌ Denied by ${msg.author.username}**\n${req}`); - let reactions = suggestion.reactions.resolve('👀'); + let reactions = suggestion.reactions.resolve('🔔'); let users = await reactions.users.fetch(); let embedDM = new MessageEmbed(); diff --git a/src/commands/suggestions/implemented.ts b/src/commands/suggestions/implemented.ts index f7abc685..2a97771e 100644 --- a/src/commands/suggestions/implemented.ts +++ b/src/commands/suggestions/implemented.ts @@ -27,7 +27,7 @@ module.exports.run = async (msg: Message, args: string[], guildConf: { suggestio let desc = embed.description; embed.setDescription(`${desc}\n\n**✅ Implemented by ${msg.author.username}**\n\n`); - let reactions = suggestion.reactions.resolve('👀'); + let reactions = suggestion.reactions.resolve('🔔'); let users = await reactions.users.fetch(); let embedDM = new MessageEmbed(); diff --git a/src/events/messages/suggestion.ts b/src/events/messages/suggestion.ts index cde6b0f1..865da685 100644 --- a/src/events/messages/suggestion.ts +++ b/src/events/messages/suggestion.ts @@ -23,5 +23,5 @@ export default async function suggestion (msg: Message) { await sent.react('✅'); await sent.react('❌'); - return sent.react('👀'); + return sent.react('🔔'); } \ No newline at end of file From a9bf7ad36bd9eadcbd5a92e8874766deb529c0d1 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:53:19 +0200 Subject: [PATCH 27/71] fix another regex --- src/utils/music.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/music.ts b/src/utils/music.ts index 8c79ff5f..6486376f 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -63,7 +63,7 @@ export default class music { return addPlaylistToQueue(msg, playlist, voiceChannel); } - if (video_url[0].match(/^https?:\/\/(www.youtube.com|youtube.com|m.youtube.com)\/playlist(.*)$/)) { + if (video_url[0].match(/^https?:\/\/(((www|m)\.)youtube.com)\/playlist(.*)$/)) { const playlist = await yt.getPlaylist(video_url[0]).catch(Kwako.log.error) if (!playlist) return; From f85c68f758c2892763d1cba438935d1bca78ebce Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:54:51 +0200 Subject: [PATCH 28/71] fix a condition --- src/utils/music.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/music.ts b/src/utils/music.ts index 6486376f..c3336d0f 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -555,7 +555,7 @@ async function playSong(msg: Message, voiceConnection: VoiceConnection, voiceCha async function launchPlay(msg: Message, voiceChannel: VoiceChannel, video_url: string) { msg.channel.startTyping(); let error = false, data; - let queu = queue.get(msg.guild.id) ? queue.get(msg.guild.id) : []; + let queu = queue.get(msg.guild.id) || []; if (queu && !queu.find(song => song === video_url)) { data = await ytdl.getBasicInfo(video_url).catch(err => { Kwako.log.error(err); error = true; }) if (!error && data) { From f19900c43fee582ec5cb64096fd162ad2e6cbaf6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:55:34 +0200 Subject: [PATCH 29/71] deps: ytdl-core from 3.2.1 to 3.2.2 (#40) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4d00d774..e97600f9 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "sodium": "^3.0.2", "twitch": "^4.1.4", "utf-8-validate": "^5.0.2", - "ytdl-core": "^3.2.1" + "ytdl-core": "^3.2.2" }, "devDependencies": { "pino-pretty": "^4.1.0" diff --git a/yarn.lock b/yarn.lock index 3a73a5c9..b8b293af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1443,10 +1443,10 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -ytdl-core@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-3.2.1.tgz#3c77af2456a1a78c545d453219068744bd8c21a2" - integrity sha512-e6vlLOc+yrdNGOqfbQvWuaI3XNx5Yp4sLGY2RPdP2gCiumhn1BDqrYjn1nUCze/LGZ8C3bFxEdUqKi2vS1aaXg== +ytdl-core@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-3.2.2.tgz#056eae00209410734f11046f8d7947d7e39514bf" + integrity sha512-DVE7uhk4WYB2Op742QQVGE/b9G7cr9kSB3ZDpDXmyRPhO55h9u8gwORlDIHWKucWVmCsdsdKzNP89QylpJEgiw== dependencies: html-entities "^1.3.1" m3u8stream "^0.7.1" From 40f4af86745d2c84a13aeb5a5461351d9d2630b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:55:57 +0200 Subject: [PATCH 30/71] deps: axios from 0.19.2 to 0.20.0 (#39) --- package.json | 2 +- yarn.lock | 32 +++++++++----------------------- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index e97600f9..83998728 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@types/pino": "^6.3.0", "@types/ws": "^7.2.4", "anilist-node": "^1.4.0", - "axios": "^0.19.2", + "axios": "^0.20.0", "bufferutil": "^4.0.1", "canvas": "^2.6.1", "discord.js": "^12.3.1", diff --git a/yarn.lock b/yarn.lock index b8b293af..857e858b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -263,12 +263,12 @@ atomic-sleep@^1.0.0: resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== -axios@^0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== +axios@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.20.0.tgz#057ba30f04884694993a8cd07fa394cff11c50bd" + integrity sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA== dependencies: - follow-redirects "1.5.10" + follow-redirects "^1.10.0" balanced-match@^1.0.0: version "1.0.0" @@ -400,13 +400,6 @@ dateformat@^3.0.3: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@=3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -553,12 +546,10 @@ flatstr@^1.0.12: resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" +follow-redirects@^1.10.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== fs-minipass@^1.2.5: version "1.2.7" @@ -880,11 +871,6 @@ mri@1.1.4: resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" From 36fa88f74a26ee3710edb2c8ad44ae43109d8140 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:56:21 +0200 Subject: [PATCH 31/71] deps: @types/node from 14.0.27 to 14.6.2 (#45) --- package.json | 2 +- yarn.lock | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 83998728..b1cefe2f 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "@discordjs/opus": "^0.3.2", "@types/mongodb": "^3.5.26", - "@types/node": "^14.0.27", + "@types/node": "^14.6.2", "@types/pino": "^6.3.0", "@types/ws": "^7.2.4", "anilist-node": "^1.4.0", diff --git a/yarn.lock b/yarn.lock index 857e858b..d7dbb6ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -131,21 +131,16 @@ "@types/bson" "*" "@types/node" "*" -"@types/node@*", "@types/node@^14.0.27": - version "14.0.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" - integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== +"@types/node@*", "@types/node@^14.0.5", "@types/node@^14.6.2": + version "14.6.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.2.tgz#264b44c5a28dfa80198fc2f7b6d3c8a054b9491f" + integrity sha512-onlIwbaeqvZyniGPfdw/TEhKIh79pz66L1q06WUQqJLnAb6wbjvOtepLYTGHTqzdXgBYIE3ZdmqHDGsRsbBz7A== "@types/node@^12.12.14", "@types/node@^12.12.5": version "12.12.54" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1" integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== -"@types/node@^14.0.5": - version "14.6.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.2.tgz#264b44c5a28dfa80198fc2f7b6d3c8a054b9491f" - integrity sha512-onlIwbaeqvZyniGPfdw/TEhKIh79pz66L1q06WUQqJLnAb6wbjvOtepLYTGHTqzdXgBYIE3ZdmqHDGsRsbBz7A== - "@types/pino-std-serializers@*": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz#f8bd52a209c8b3c97d1533b1ba27f57c816382bf" From 362384c89634d4026294707e644ee87238cc33d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:57:59 +0200 Subject: [PATCH 32/71] deps: anilist-node from 1.4.0 to 1.4.1 (#46) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b1cefe2f..b8cc6137 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@types/node": "^14.6.2", "@types/pino": "^6.3.0", "@types/ws": "^7.2.4", - "anilist-node": "^1.4.0", + "anilist-node": "^1.4.1", "axios": "^0.20.0", "bufferutil": "^4.0.1", "canvas": "^2.6.1", diff --git a/yarn.lock b/yarn.lock index d7dbb6ac..9433259f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -183,10 +183,10 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -anilist-node@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/anilist-node/-/anilist-node-1.4.0.tgz#37cd0b5b275163d13a27f2cdae6b35b4c7ef658b" - integrity sha512-41BNk/wv8uX3JUZRQKu1zd0Mq0hfuwIZa3OtPs5hYzpYl8SGJkes+Ia7X6H2n5uxsONTTRD+xg2vmnKDx93bXQ== +anilist-node@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/anilist-node/-/anilist-node-1.4.1.tgz#e279d155678a79b0770985d0ca4a1f24d1d1ccde" + integrity sha512-ceyDH0L9fuqvl8lT1DWCQPeOTGXF69457dFaoNTjtCFwmvvrhXcDjcvj4BmnmSOVSSP/eydeTdIHKC1mEOWxig== dependencies: node-fetch "^2.6.0" From 7a858f2be3ca688219cfebbbc5f5158df7f700a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2020 18:58:25 +0200 Subject: [PATCH 33/71] deps: pino-pretty from 4.1.0 to 4.2.0 (#47) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b8cc6137..ab708a45 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,6 @@ "ytdl-core": "^3.2.2" }, "devDependencies": { - "pino-pretty": "^4.1.0" + "pino-pretty": "^4.2.0" } } diff --git a/yarn.lock b/yarn.lock index 9433259f..6c9f06c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1020,10 +1020,10 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -pino-pretty@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-4.1.0.tgz#ad47ae00d4f3959cfadcdd691b1ebdcbdd61e42e" - integrity sha512-D4rORz/7SCZ0AGeWw9QFXsJ+ky3jDOqi/ABFzxxCk5BtEelEgJ6AABFew7TosHGw7I1t8VuMaGdTVNoYMZc+jg== +pino-pretty@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-4.2.0.tgz#522732d8579e13ccd648dd12876fb91257354dc7" + integrity sha512-CBFLgxMj/cJOANqZs+Xcjdgi1v40TJP3xMTkSN2xuOvX+03uAAHXf9SEU+1DHu/1kw44H2c31VYCImx0QewQ6w== dependencies: "@hapi/bourne" "^2.0.0" args "^5.0.1" From 08f643a801776054896d347f4d7ad96f65b819dd Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 19:06:23 +0200 Subject: [PATCH 34/71] fix music length not being correct --- src/utils/music.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/utils/music.ts b/src/utils/music.ts index c3336d0f..04b6ab95 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -172,14 +172,14 @@ export default class music { let q = queu.slice(1, 10); let videoData = await yt.getVideo(queu[0]); - let date = new Date() + let date = new Date(0); date.setSeconds((videoData.minutes * 60) + videoData.seconds) let timeString = date.toISOString().substr(11, 8) let desc = `🎶 [${Util.escapeMarkdown(videoData.title)}](${queu[0]}), *${timeString}*\n\n`; for await (const song of q) { let videoData = await yt.getVideo(song); if (!videoData) return; - let date = new Date() + let date = new Date(0); date.setSeconds((videoData.minutes * 60) + videoData.seconds) let timeString = date.toISOString().substr(11, 8) desc = `${desc}${n}. [${Util.escapeMarkdown(videoData.title)}](${song}), *${timeString}*\n`; @@ -388,7 +388,7 @@ export default class music { if (!videoData) return; - let date = new Date() + let date = new Date(0); date.setSeconds((videoData.minutes * 60) + videoData.seconds) let timeString = date.toISOString().substr(11, 8) @@ -498,7 +498,7 @@ async function playSong(msg: Message, voiceConnection: VoiceConnection, voiceCha let videoData = await yt.getVideo(queu[0]); if (!videoData) return; - let date = new Date() + let date = new Date(0); date.setSeconds((videoData.minutes * 60) + videoData.seconds) let timeString = date.toISOString().substr(11, 8) const embed = new MessageEmbed(); From c32a77b72e9a8fa8aee7cfa3f1ae5ec9a2602579 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 19:09:00 +0200 Subject: [PATCH 35/71] add indicator when adding a level role --- src/commands/config/levelrole.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/config/levelrole.ts b/src/commands/config/levelrole.ts index 14c5c197..6c5155c2 100644 --- a/src/commands/config/levelrole.ts +++ b/src/commands/config/levelrole.ts @@ -66,6 +66,7 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { await Kwako.db.collection('settings').updateOne({ _id: msg.guild.id }, { $set: { levelroles: levelroles }}, { upsert: true }) + await msg.react('🔄'); await giveRoleToUpper(msg, role, parseInt(args[1], 10)); let addEmbed = new MessageEmbed() From 90ee2d98d5a872a0393beb47f35b9c3c09a20b1d Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 19:15:11 +0200 Subject: [PATCH 36/71] fix #33 --- src/index.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/index.ts b/src/index.ts index 041de8c4..12b8682e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -102,6 +102,15 @@ Kwako.on("guildMemberAdd", async member => { if(!member.guild.available) return; let guild = await Kwako.db.collection('settings').findOne({ '_id': { $eq: member.guild.id } }); + + let levelroles:string = guild.levelroles || "[]"; + let levelrolesMap:Map> = new Map(JSON.parse(levelroles)); + + let roles = levelrolesMap.get(1); + + if (roles && roles[0]) + await member.roles.add(roles[0]).catch(() => {return}); + let guildConf = guild.config || defaultSettings; let userDB = await Kwako.db.collection('user').findOne({ _id: member.id }); From a3c680419439399d0d9eb9aceeb3568c69049cea Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 19:37:03 +0200 Subject: [PATCH 37/71] fix #14 --- src/index.ts | 12 ++++++++++++ src/utils/music.ts | 22 +++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 12b8682e..9cfe5ab0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -283,5 +283,17 @@ Kwako.on('guildBanAdd', async (guild, user) => { return guildBanAdd(guild, user, modLogChannel); }); +// VC Check if Kwako's alone +import music from './utils/music' +Kwako.on('voiceStateUpdate', async (oldState, newState) => { + let channel = oldState.channel; + if(!channel) return; + + let members = channel.members; + if(members.size === 1) + if(members.has(Kwako.user.id)) + return music.stopAlone(oldState.channel); +}); + // Login Kwako.start(process.env.TOKEN); \ No newline at end of file diff --git a/src/utils/music.ts b/src/utils/music.ts index 04b6ab95..3267f64b 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -284,7 +284,7 @@ export default class music { let dispatcher = await fetchDispatcher(msg); if(dispatcher) { - let voiceChannel:VoiceChannel = msg.member.voice.channel; + let voiceChannel: VoiceChannel = msg.member.voice.channel; queue.delete(msg.guild.id) @@ -294,6 +294,26 @@ export default class music { } } + /** + * Stops the music + * @param voiceChannel - VoiceChannel object + */ + static async stopAlone(voiceChannel: VoiceChannel) { + if (!voiceChannel) return; + + let voiceConnection = Kwako.voice.connections.find(val => val.channel.id === voiceChannel.id); + let dispatcher; + if (voiceConnection) + dispatcher = voiceConnection.dispatcher; + + if(dispatcher) { + queue.delete(voiceChannel.guild.id) + + voiceChannel.leave(); + Kwako.log.info({msg: 'auto stop', guild: { id: voiceChannel.guild.id, name: voiceChannel.guild.name }}) + } + } + /** * Forceskips the music * (only usable by the staff) From 1beeccc247e755d5f88cb8fc50916de25bef25ee Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 1 Sep 2020 19:58:39 +0200 Subject: [PATCH 38/71] fix #21 --- src/events/messages/suggestion.ts | 24 +++++++++++++++++++++++- src/index.ts | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/events/messages/suggestion.ts b/src/events/messages/suggestion.ts index 865da685..03d27c7b 100644 --- a/src/events/messages/suggestion.ts +++ b/src/events/messages/suggestion.ts @@ -1,10 +1,32 @@ import Kwako from '../../Client' import { Message, MessageEmbed, TextChannel } from 'discord.js' -export default async function suggestion (msg: Message) { +export default async function suggestion (msg: Message, isPremium: boolean) { let req = msg.cleanContent; let channel = msg.channel; + if(isPremium) { + let found = req.match(/#{1}\d+/gm); + + if(found) { + for(const id of found) { + let num = id.slice(1, id.length); + + let guild: { _id: string, suggestions: string[] } = await Kwako.db.collection('suggestions').findOne({ _id: msg.guild.id }) || null; + if (guild && guild.suggestions) { + + let message = guild.suggestions[parseInt(num, 10) - 1]; + if (message) { + + let suggestion = await msg.channel.messages.fetch(message).catch(() => { return; }); + if (suggestion) + req = req.replace(id, `[${id}](${suggestion.url})`); + } + } + } + } + } + let embed = new MessageEmbed(); embed.setDescription(req); embed.setAuthor(msg.author.username, msg.author.avatarURL({ format: 'png', dynamic: false, size: 128 })) diff --git a/src/index.ts b/src/index.ts index 9cfe5ab0..caa716a2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -53,7 +53,7 @@ Kwako.on('message', async (msg: Message) => { await cooldown.message(msg, guildConf); if (msg.channel.id === guildConf.suggestionChannel) - return suggestion(msg); + return suggestion(msg, Kwako.patrons.has(msg.guild.ownerID)); guildConf.useExpSystem &&= true; if(guildConf.useExpSystem) From f9a041d8a6cb9ebeab53698fbe63c2465fefac21 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 2 Sep 2020 16:18:43 +0200 Subject: [PATCH 39/71] add twitch alert handling --- src/commands/config/twitch.ts | 56 ++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/commands/config/twitch.ts b/src/commands/config/twitch.ts index 03e6dd2d..9ab9e36d 100644 --- a/src/commands/config/twitch.ts +++ b/src/commands/config/twitch.ts @@ -96,4 +96,58 @@ module.exports.help = { staff: true, perms: ['EMBED_LINKS', 'ADD_REACTIONS', 'MANAGE_ROLES', 'MANAGE_MESSAGES'], premium: true -}; \ No newline at end of file +}; + +let isStreamChecks: Map = new Map(); + +setInterval(async () => { + let streamers = await Kwako.db.collection('twitch').find().toArray(); + + for(const data of streamers) { + + let user = await twitchClient.helix.users.getUserByName(data._id); + + if (!user) return Kwako.db.collection('twitch').deleteOne({ _id: data._id }); + + let stream = await user.getStream(); + let isStream = data.isStream || false; + + if (stream && !isStream) { + console.log(stream) + isStreamChecks.set(data._id, 5); + await Kwako.db.collection('twitch').updateOne({ _id: data._id }, { $set: { isStream: true } }); + + let channels = data.channels || []; + for(const channelID of channels) { + let channel = await Kwako.channels.fetch(channelID, true); + + if(!channel) return Kwako.db.collection('twitch').updateOne({ _id: data._id }, { $pull: { channels: channelID } }); + if(channel.type !== 'text' && channel.type !== 'news') return; + + let thumbnail: string = stream._data.thumbnail_url; + thumbnail = thumbnail.replace('{width}', '1280'); + thumbnail = thumbnail.replace('{height}', '720'); + + await (channel as TextChannel).send({'embed':{ + "title": `🚨 ${stream._data.user_name} is going live!`, + "description": stream._data.title, + "url": `https://twitch.tv/${stream._data.user_name}`, + "color": 8926419, + "timestamp": new Date(), + "thumbnail": { + "url": thumbnail + } + }}) + } + } else if(!stream) { + if(isStream && isStreamChecks.get(data._id) === 0) { + isStreamChecks.delete(data._id); + await Kwako.db.collection('twitch').updateOne({ _id: data._id }, { $set: { isStream: false } }); + } else { + let value = isStreamChecks.get(data._id) || 1; + value -= 1; + isStreamChecks.set(data._id, value); + } + } + } +}, 5 * 1000); \ No newline at end of file From 5a3697ad5539d76c6bbdd125c8d37960f4cc6c40 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 2 Sep 2020 16:19:30 +0200 Subject: [PATCH 40/71] add feedback in twitch command --- src/commands/config/twitch.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/commands/config/twitch.ts b/src/commands/config/twitch.ts index 9ab9e36d..31ef3448 100644 --- a/src/commands/config/twitch.ts +++ b/src/commands/config/twitch.ts @@ -34,6 +34,8 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { }}); } + await msg.react('✅'); + await Kwako.db.collection('twitch').updateOne({_id: args[1]}, { $push: { channels: channelID }}, { upsert: true }); Kwako.log.info({msg: 'twitch add', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, data: { streamer: args[1], channel: channelID }}) @@ -55,6 +57,8 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { }}); } + await msg.react('✅'); + await Kwako.db.collection('twitch').updateOne({_id: args[1]}, { $pull: { channels: channelIDRemove }}, { upsert: true }); Kwako.log.info({msg: 'twitch remove', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, data: { streamer: args[1], channel: channelIDRemove }}) From 136ce40288ccd2ed227fa00c1d7800bdcc331dbb Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 2 Sep 2020 16:34:29 +0200 Subject: [PATCH 41/71] fix #6 --- src/utils/actions.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/utils/actions.ts b/src/utils/actions.ts index 954d21fd..f5ddbb9b 100644 --- a/src/utils/actions.ts +++ b/src/utils/actions.ts @@ -49,7 +49,8 @@ export default async function actionsRun(msg: Message, args: string[], type: str if (args.length === 0) return; if (args.length <= 4) { if (msg.mentions.everyone) return; - if (msg.mentions.members.has(msg.author.id)) { + let foundMe = msg.cleanContent.match(/[mM][eE]+/m); + if (msg.mentions.members.has(msg.author.id) || foundMe) { if (type === 'slap') return msg.channel.send({ "embed": { "title": `**Don't ${type} yourself! It's mean! :c**`, "color": 13632027 }}); msg.channel.send({ "embed": { "title": `**Don't ${type} yourself! Lemme do it for you...**`, "color": 13632027 }}); @@ -101,7 +102,7 @@ export default async function actionsRun(msg: Message, args: string[], type: str embed.setImage(`https://${process.env.CDN_URL}/img/${type}/${n}.gif`) } - } else { + } else if (msg.mentions.members.size === 1) { let target = msg.mentions.users.first(); if(!msg.author || !target) return; embed.setDescription(`<@${msg.author.id}> ${verb}${at ? ' at' : ''} you <@${target.id}>!`) @@ -111,6 +112,19 @@ export default async function actionsRun(msg: Message, args: string[], type: str n = utilities.randomInt(count.get(type)); lastGif.set(type, n); + embed.setImage(`https://${process.env.CDN_URL}/img/${type}/${n}.gif`) + } else { + let target = args.join(' '); + let user = msg.guild.members.cache.find(user => user.user.username.toLowerCase() === target.toLowerCase()); + + if(!msg.author || !user) return; + embed.setDescription(`<@${msg.author.id}> ${verb}${at ? ' at' : ''} you <@${user.id}>!`) + + let n = utilities.randomInt(count.get(type)) + while (lastGif.get(type) === n) + n = utilities.randomInt(count.get(type)); + lastGif.set(type, n); + embed.setImage(`https://${process.env.CDN_URL}/img/${type}/${n}.gif`) } From 7baf2b17bf2c2c14f60c100a4b556139496fde22 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 2 Sep 2020 16:44:39 +0200 Subject: [PATCH 42/71] mentionless actions for premium-only --- src/utils/actions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/actions.ts b/src/utils/actions.ts index f5ddbb9b..5b10ceca 100644 --- a/src/utils/actions.ts +++ b/src/utils/actions.ts @@ -113,7 +113,7 @@ export default async function actionsRun(msg: Message, args: string[], type: str lastGif.set(type, n); embed.setImage(`https://${process.env.CDN_URL}/img/${type}/${n}.gif`) - } else { + } else if (Kwako.patrons.has(msg.guild.ownerID)) { let target = args.join(' '); let user = msg.guild.members.cache.find(user => user.user.username.toLowerCase() === target.toLowerCase()); From 588750fcb3509840c38067d7f86231d068c003d2 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 2 Sep 2020 16:56:14 +0200 Subject: [PATCH 43/71] increase highWaterMark from ytdl --- src/utils/music.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/music.ts b/src/utils/music.ts index 3267f64b..fee11f78 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -501,7 +501,7 @@ export default class music { */ async function playSong(msg: Message, voiceConnection: VoiceConnection, voiceChannel: VoiceChannel) { let queu = queue.get(msg.guild.id); - const video = ytdl(queu[0], { filter: "audioonly", quality: "highestaudio", highWaterMark: (2048 * 1024) }).on('error', Kwako.log.error); + const video = ytdl(queu[0], { filter: "audioonly", quality: "highestaudio", highWaterMark: (16384 * 1024) }).on('error', Kwako.log.error); video.on('error', err => { Kwako.log.error(err); From 724baaaa97a47e3fb6b7162bca70b3052ecc3c58 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 2 Sep 2020 16:56:44 +0200 Subject: [PATCH 44/71] fix an error message formatting --- src/utils/music.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/utils/music.ts b/src/utils/music.ts index fee11f78..c7978b02 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -508,7 +508,9 @@ async function playSong(msg: Message, voiceConnection: VoiceConnection, voiceCha let dispatcher = voiceConnection.dispatcher loop.set(msg.guild.id, false); dispatcher.end() - return msg.channel.send(":x: > **There was an unexpected error while playing the video**") + return msg.channel.send({'embed':{ + 'title': ':x: There was an unexpected error while playing the video' + }}) }) voiceConnection.play(video, { volume: 0.8, bitrate: 76, highWaterMark: 256, fec: true, plp: 0 }) From 7bf7717933ce6bc6ae8e8667a70ef78f07ca2930 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Sat, 5 Sep 2020 11:30:00 +0200 Subject: [PATCH 45/71] remove useless comments --- src/utils/img.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/utils/img.ts b/src/utils/img.ts index 7560c49a..c155ba53 100644 --- a/src/utils/img.ts +++ b/src/utils/img.ts @@ -1,22 +1,8 @@ -/** - * Image generation function - * @packageDocumentation - * @module ImGenerator - * @category Utils - */ import { createCanvas, loadImage, CanvasRenderingContext2D, registerFont } from 'canvas'; import { MessageAttachment } from 'discord.js'; registerFont('assets/Nunito-SemiBold.ttf', { family: "Nunito" }); -/** - * @param width - Width of the screenshot (in pixels) - * @param height - Height of the screenshot (in pixels) - * @param content - HTML content, written in one string - * @param tag - UID of the user - * @param prefix - Prefix to define the type of image generated - * @returns Link to the generated file - */ export default async function imGenerator(user: any) { const canvas = createCanvas(1016, 336) const ctx = canvas.getContext('2d') From a22355f583ec85fc795f8d94479b8e9507ad8cbf Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Sat, 5 Sep 2020 14:12:18 +0200 Subject: [PATCH 46/71] fix #32 --- src/commands/profile/profile.ts | 66 ++++++---- src/commands/profile/setbackground.ts | 16 ++- src/utils/img.ts | 180 ++++++++++++++++++++------ 3 files changed, 191 insertions(+), 71 deletions(-) diff --git a/src/commands/profile/profile.ts b/src/commands/profile/profile.ts index 28b2150b..87627d9a 100644 --- a/src/commands/profile/profile.ts +++ b/src/commands/profile/profile.ts @@ -1,16 +1,18 @@ import Kwako from '../../Client' import { Message } from 'discord.js' -import imGenerator from '../../utils/img'; + +import imGenerator from '../../utils/img' import utilities from '../../utils/utilities' -module.exports.run = (msg: Message, args: string[]) => { - if (args.length == 1) { +module.exports.run = async (msg: Message, args: string[], guildConf: any) => { + if (args.length === 1) { if (msg.mentions.everyone) return; let mention = msg.mentions.users.first() if (!mention || mention.bot) return; return profileImg(msg, mention.id); - } else - return profileImg(msg, msg.author.id); + } + + return profileImg(msg, msg.author.id); }; module.exports.help = { @@ -30,28 +32,34 @@ async function profileImg(msg: Message, id: string) { let memberDiscord = await msg.guild.members.fetch(id) if (!userDB || !userDB.exp) { - let user = { - avatar: userDiscord.avatarURL({ format: 'png', dynamic: false, size: 512 }) || userDiscord.defaultAvatarURL, - username: userDiscord.username, - positionExp: "?", - level: 1, - current: 0, - max: 100, - userColor: memberDiscord.displayHexColor, - expBar: 0, - birthday: "--/--", - fc: "not registered" - } + if(!userDB.exp[msg.guild.id]) { + let user = { + avatar: userDiscord.avatarURL({ format: 'png', dynamic: false, size: 512 }) || userDiscord.defaultAvatarURL, + username: userDiscord.username, + premium: Kwako.patrons.has(id) || false, + iwa: (id === process.env.IWA) ? true : false, + positionExp: "?", + level: 1, + current: 0, + max: 100, + userColor: memberDiscord.displayHexColor, + expBar: 0, + birthday: "--/--", + fc: "not registered" + } - if(user.userColor == '#000000') user.userColor = '#444444'; - let file = await imGenerator(user); + if(user.userColor === '#000000') user.userColor = '#444444'; + let file = await imGenerator(user); - try { - Kwako.log.info({msg: 'profile', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, target: { id: userDiscord.id, name: userDiscord.tag }}); - return msg.channel.send('', { files: [file] }).then(() => { msg.channel.stopTyping(true) }); - } catch (err) { - Kwako.log.error(err) - return msg.channel.send(":x: > An error occured. Please retry later.") + try { + Kwako.log.info({msg: 'profile', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, target: { id: userDiscord.id, name: userDiscord.tag }}); + return msg.channel.send('', { files: [file] }).then(() => { msg.channel.stopTyping(true) }); + } catch (err) { + Kwako.log.error(err) + return msg.channel.send({'embed':{ + 'title': ':x: An error occured. Please retry later.' + }}) + } } } @@ -63,6 +71,8 @@ async function profileImg(msg: Message, id: string) { let user = { avatar: userDiscord.avatarURL({ format: 'png', dynamic: false, size: 512 }) || userDiscord.defaultAvatarURL, username: userDiscord.username, + premium: Kwako.patrons.has(id) || false, + iwa: (id === process.env.IWA) ? true : false, positionExp: (leadXP.findIndex(val => val._id == id) + 1), level: lvlInfo.level, current: lvlInfo.current, @@ -74,7 +84,7 @@ async function profileImg(msg: Message, id: string) { fc: userDB.fc || "not registered" } - if(user.userColor == '#000000') user.userColor = '#444444'; + if(user.userColor === '#000000') user.userColor = '#444444'; let file = await imGenerator(user); try { @@ -82,6 +92,8 @@ async function profileImg(msg: Message, id: string) { return msg.channel.send('', { files: [file] }).then(() => { msg.channel.stopTyping(true) }); } catch (err) { Kwako.log.error(err) - return msg.channel.send(":x: > An error occured. Please retry later.") + return msg.channel.send({'embed':{ + 'title': ':x: An error occured. Please retry later.' + }}) } } \ No newline at end of file diff --git a/src/commands/profile/setbackground.ts b/src/commands/profile/setbackground.ts index dd6f5900..fcc44747 100644 --- a/src/commands/profile/setbackground.ts +++ b/src/commands/profile/setbackground.ts @@ -90,13 +90,21 @@ module.exports.help = { function findRes(width: number, height: number) { let goodWidth = 0, goodHeight = 0; - for(let i = 0; i <= width; i += 25) { - for(let j = 0; j <= height; j += 8) { - if((i / j) === 3.125) { - goodWidth = i; + if(width >= height) { + goodWidth = width; + for(let j = 0; j <= height; j += 1) { + if(Math.abs((width / j) - (1016 / 356)) < 0.5) { goodHeight = j; } } + } else { + goodHeight = height; + for(let i = 0; i <= width; i += 1) { + if((i / height) === 2.8539) { + goodWidth = i; + } + } } + return { width: goodWidth, height: goodHeight }; } \ No newline at end of file diff --git a/src/utils/img.ts b/src/utils/img.ts index c155ba53..1abe2819 100644 --- a/src/utils/img.ts +++ b/src/utils/img.ts @@ -3,23 +3,30 @@ import { MessageAttachment } from 'discord.js'; registerFont('assets/Nunito-SemiBold.ttf', { family: "Nunito" }); -export default async function imGenerator(user: any) { - const canvas = createCanvas(1016, 336) +export default async function imGeneratorPremium(user: any) { + const canvas = createCanvas(1016, 356) const ctx = canvas.getContext('2d') ctx.fillStyle = '#ffffff' - ctx.fillRect(0, 0, 1016, 336) + ctx.fillRect(0, 0, 1016, 356) if(!user.userBackground) { - let grd = ctx.createLinearGradient(0, 0, 1016, 336); + let grd = ctx.createLinearGradient(0, 0, 1016, 356); grd.addColorStop(0, `${user.userColor}A6`); grd.addColorStop(1, `${user.userColor}`); ctx.fillStyle = grd; - ctx.fillRect(8, 8, 1000, 320); + ctx.fillRect(0, 0, 1016, 356); - ctx.fillStyle = 'rgba(0, 0, 0, 0.15)' - ctx.fillRect(28, 28, 960, 280) + ctx.save(); + makeRund(ctx, 20, 20, 976, 316, 10); + + ctx.clip(); + + ctx.fillStyle = 'rgba(50, 50, 50, 0.08)' + ctx.fillRect(20, 20, 976, 316) + + ctx.restore(); } else { let base_image = await loadImage(user.userBackground.url) if(base_image) { @@ -28,20 +35,34 @@ export default async function imGenerator(user: any) { Math.ceil((base_image.height - user.userBackground.height)/2), user.userBackground.width, user.userBackground.height, - 8, 8, 1000, 320); + 0, 0, 1016, 356); + + ctx.save(); + makeRund(ctx, 20, 20, 976, 316, 10); - ctx.fillStyle = 'rgba(0, 0, 0, 0.3)' - ctx.fillRect(28, 28, 960, 280) + ctx.clip(); + + ctx.fillStyle = 'rgba(50, 50, 50, 0.43)' + ctx.fillRect(20, 20, 976, 316) + + ctx.restore(); } else { - let grd = ctx.createLinearGradient(0, 0, 1016, 336); + let grd = ctx.createLinearGradient(0, 0, 1016, 356); grd.addColorStop(0, `${user.userColor}A6`); grd.addColorStop(1, `${user.userColor}`); ctx.fillStyle = grd; - ctx.fillRect(8, 8, 1000, 320); + ctx.fillRect(0, 0, 1016, 356); + + ctx.save(); + makeRund(ctx, 20, 20, 976, 316, 10); - ctx.fillStyle = 'rgba(0, 0, 0, 0.15)' - ctx.fillRect(28, 28, 960, 280) + ctx.clip(); + + ctx.fillStyle = 'rgba(50, 50, 50, 0.1)' + ctx.fillRect(20, 20, 976, 316) + + ctx.restore(); } } @@ -54,93 +75,172 @@ export default async function imGenerator(user: any) { ctx.font = 'bold 56pt Nunito' ctx.textAlign = 'left' ctx.fillStyle = '#fff' - ctx.fillText(username, 328, 148) + + ctx.save(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 3; + ctx.shadowColor = "rgba(0, 0, 0, 0.3)"; + ctx.shadowBlur = 4; + + ctx.fillText(username, 328, 154) + + ctx.restore() + // level let level = `Level ${user.level}` ctx.font = '300 34pt Nunito' ctx.textAlign = 'left' ctx.fillStyle = '#fff' - ctx.fillText(level, 338, 240) + + ctx.save(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 2; + ctx.shadowColor = "rgba(0, 0, 0, 0.2)"; + ctx.shadowBlur = 4; + + ctx.fillText(level, 328, 250) + + ctx.restore(); // rank let rank = `#${user.positionExp} | ${user.current}/${user.max}` ctx.font = '300 24pt Nunito' ctx.textAlign = 'right' ctx.fillStyle = 'rgba(255, 255, 255, 0.75)' - ctx.fillText(rank, 964, 240) + + ctx.save(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 1; + ctx.shadowColor = "rgba(0, 0, 0, 0.2)"; + ctx.shadowBlur = 4; + + ctx.fillText(rank, 974, 250) + + ctx.restore(); // pfp await make_base(ctx, user.avatar); - // contour progress bar - ctx.save(); - makeRund(ctx, 326, 248, 650, 19, 10); + // premium icon + if(user.premium && !user.iwa) { + let premium_icon = await loadImage("https://cdn.iwa.sh/img/star.png") + ctx.save(); - ctx.clip(); + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowColor = "rgba(0, 0, 0, 0.15)"; + ctx.shadowBlur = 4; - ctx.fillStyle = "rgba(255, 255, 255, 0.4)"; - ctx.fillRect(326, 248, 650, 19); + ctx.drawImage(premium_icon, 258, 54, 40, 40); + ctx.restore(); + } else if (user.iwa) { + let premium_icon = await loadImage("https://cdn.iwa.sh/img/tools.png") + ctx.save(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowColor = "rgba(0, 0, 0, 0.15)"; + ctx.shadowBlur = 4; + + ctx.drawImage(premium_icon, 258, 54, 40, 40); + ctx.restore(); + } + console.log(user.iwa) - ctx.restore(); // progress bar ctx.save(); - makeRund(ctx, 328, 250, 646, 15, 8); + makeRund(ctx, 328, 260, 646, 15, 8); ctx.clip(); ctx.fillStyle = "rgba(22, 22, 22, 0.8)"; - ctx.fillRect(328, 250, 646, 15); + ctx.fillRect(328, 260, 646, 15); ctx.fillStyle = '#ffffff'; - ctx.fillRect(328, 250, user.expBar, 15); + ctx.fillRect(328, 260, user.expBar, 15); var grad = ctx.createLinearGradient(0, 0, 1516, 0); grad.addColorStop(0, "transparent"); grad.addColorStop(1, "rgba(0,0,0,0.4)"); ctx.fillStyle = grad; - ctx.fillRect(328, 250, user.expBar, 15); + ctx.fillRect(328, 260, user.expBar, 15); ctx.restore(); // birthday icon let cake_image = await loadImage("https://cdn.iwa.sh/img/cake.png") ctx.save(); - ctx.drawImage(cake_image, 338, 270, 34, 34); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 1; + ctx.shadowColor = "rgba(0, 0, 0, 0.2)"; + ctx.shadowBlur = 4; + + ctx.drawImage(cake_image, 168, 295, 34, 34); ctx.restore(); // birthday let birthday = `${user.birthday}` ctx.font = '300 24pt Nunito' ctx.textAlign = 'left' - ctx.fillStyle = 'rgba(255, 255, 255, 0.65)' - ctx.fillText(birthday, 382, 299) + ctx.fillStyle = 'rgba(255, 255, 255, 0.75)' + + ctx.save(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 1; + ctx.shadowColor = "rgba(0, 0, 0, 0.2)"; + ctx.shadowBlur = 4; + + ctx.fillText(birthday, 212, 324) // birthday format let birthdayFormat = "(mm/dd)" ctx.font = '300 14pt Nunito' ctx.textAlign = 'left' - ctx.fillStyle = 'rgba(255, 255, 255, 0.55)' - ctx.fillText(birthdayFormat, 472, 297) + ctx.fillStyle = 'rgba(255, 255, 255, 0.6)' + ctx.fillText(birthdayFormat, 302, 322) + + ctx.restore() // switch icon let switch_image = await loadImage("https://cdn.iwa.sh/img/switch.png") ctx.save(); - ctx.drawImage(switch_image, 658, 272, 30, 30); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 1; + ctx.shadowColor = "rgba(0, 0, 0, 0.2)"; + ctx.shadowBlur = 4; + + ctx.drawImage(switch_image, 592, 299, 26, 26); ctx.restore(); - // switch + // switch fc let fc = `${user.fc}` ctx.font = '300 24pt Nunito' ctx.textAlign = 'left' - ctx.fillStyle = 'rgba(255, 255, 255, 0.65)' - ctx.fillText(fc, 698, 298) + ctx.fillStyle = 'rgba(255, 255, 255, 0.75)' + + ctx.save(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 1; + ctx.shadowColor = "rgba(0, 0, 0, 0.2)"; + ctx.shadowBlur = 4; + + ctx.fillText(fc, 628, 324) + + ctx.restore(); // made with love let made = `made with ♥ by iwa` ctx.font = '300 12pt Nunito' ctx.textAlign = 'center' ctx.fillStyle = 'rgba(255, 255, 255, 0.05)' - ctx.fillText(made, 488, 324) + ctx.fillText(made, 488, 354) return new MessageAttachment(canvas.toBuffer('image/jpeg', {quality: 1}), 'rank.jpg') } @@ -148,9 +248,9 @@ export default async function imGenerator(user: any) { async function make_base(ctx: CanvasRenderingContext2D, url: string) { let base_image = await loadImage(url) ctx.save(); - makeRund(ctx, 28, 28, 280, 280, 140); + makeRund(ctx, 38, 28, 260, 260, 130); ctx.clip(); - ctx.drawImage(base_image, 28, 28, 280, 280); + ctx.drawImage(base_image, 38, 28, 260, 260); ctx.restore(); } From 7b422e0f6e9fc4439edfe5baedbf84279159ed3b Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Sat, 5 Sep 2020 14:30:49 +0200 Subject: [PATCH 47/71] accepts file attachment in !setbackground --- src/commands/profile/setbackground.ts | 42 +++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/commands/profile/setbackground.ts b/src/commands/profile/setbackground.ts index fcc44747..9c2f8452 100644 --- a/src/commands/profile/setbackground.ts +++ b/src/commands/profile/setbackground.ts @@ -3,12 +3,14 @@ import { Message } from 'discord.js' import { loadImage } from 'canvas' module.exports.run = async (msg: Message, args: string[], guildConf: any) => { - if (args.length !== 1) return msg.channel.send({ + let attachment = msg.attachments.first(); + + if (args.length !== 1 && !attachment) return msg.channel.send({ "embed": { "description": `\`${guildConf.prefix}setbackground (url)\` to set an image background in your profile card\n\n\`${guildConf.prefix}setbackground off\` to disable it and use the colored background back`, "color": 11462520 } - }) + }) let url = args[0]; @@ -32,6 +34,13 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { }) } + if(attachment) { + let fileName = attachment.name.split('.') + let name = `${msg.author.id}.${fileName.pop()}` + await download(msg.attachments.first().proxyURL, `image/${name}`); + url = `image/${name}` + } + let image = await loadImage(url).catch(() => { msg.channel.send({ "embed": { @@ -107,4 +116,31 @@ function findRes(width: number, height: number) { } return { width: goodWidth, height: goodHeight }; -} \ No newline at end of file +} + +import fs from 'fs' +import axios from 'axios' + +async function download(url: string, filename: string) { + //let bar = new Promise((resolve, reject) => { + // request.head(uri, function(err: any, res: { headers: { [x: string]: any; }; }, body: any) { + // request(uri).pipe(fs.createWriteStream(filename)).on('close', () => { resolve() }); + // }); + //}); + //return bar; + + const writer = fs.createWriteStream(filename) + + const response = await axios({ + url, + method: 'GET', + responseType: 'stream' + }) + + response.data.pipe(writer) + + return new Promise((resolve, reject) => { + writer.on('finish', resolve) + writer.on('error', reject) + }) +}; \ No newline at end of file From 59c9e1666d12751932e49854c18ce55730cb2fa9 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Sun, 6 Sep 2020 19:10:09 +0200 Subject: [PATCH 48/71] disable modLog channel if no channel --- src/events/logs/guildBanAdd.ts | 4 +++- src/events/logs/guildMemberRemove.ts | 4 +++- src/events/logs/messageDelete.ts | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/events/logs/guildBanAdd.ts b/src/events/logs/guildBanAdd.ts index 7e92bab5..1ed7ac34 100644 --- a/src/events/logs/guildBanAdd.ts +++ b/src/events/logs/guildBanAdd.ts @@ -22,7 +22,9 @@ export default async function guildBanAdd(guild: Guild, user: User | PartialUser const { executor, target, createdTimestamp, reason } = banLog; if ((target as User).id === user.id) { - let channel = await Kwako.channels.fetch(modLogChannel); + let channel = await Kwako.channels.fetch(modLogChannel).catch(() => {return}); + if(!channel) return Kwako.db.collection('settings').updateOne({ _id: guild.id }, { $set: { 'config.modLogChannel': "" } }); + let embed = new MessageEmbed(); embed.setTitle("Member banned"); embed.setDescription(`Who: ${user.tag} (<@${user.id}>)\nBy: ${executor.tag} (<@${executor.id}>)\nReason:\`\`\`${reason ? reason : "no reason"}\`\`\``); diff --git a/src/events/logs/guildMemberRemove.ts b/src/events/logs/guildMemberRemove.ts index c2d77efb..72eab741 100644 --- a/src/events/logs/guildMemberRemove.ts +++ b/src/events/logs/guildMemberRemove.ts @@ -25,7 +25,9 @@ export default async function guildMemberRemove(member: GuildMember | PartialGu const { executor, target, createdTimestamp, reason } = kickLog; if ((target as User).id === member.id) { - let channel = await Kwako.channels.fetch(modLogChannel); + let channel = await Kwako.channels.fetch(modLogChannel).catch(() => {return}); + if(!channel) return Kwako.db.collection('settings').updateOne({ _id: member.guild.id }, { $set: { 'config.modLogChannel': "" } }); + let embed = new MessageEmbed(); embed.setTitle("Member kicked"); embed.setDescription(`Who: ${member.user.tag} (<@${member.id}>)\nBy: ${executor.tag} (<@${executor.id}>)\nReason:\`\`\`${reason ? reason : "no reason"}\`\`\``); diff --git a/src/events/logs/messageDelete.ts b/src/events/logs/messageDelete.ts index 3f34ec24..fd7c1bc0 100644 --- a/src/events/logs/messageDelete.ts +++ b/src/events/logs/messageDelete.ts @@ -28,7 +28,9 @@ export default async function messageDelete(msg: Message | PartialMessage, modLo if ((target as User).id === msg.author.id) return; if (suggestionChannel && suggestionChannel === msg.channel.id) return; if (msg.author.bot) return; - let channel = await Kwako.channels.fetch(modLogChannel); + let channel = await Kwako.channels.fetch(modLogChannel).catch(() => {return}); + if(!channel) return Kwako.db.collection('settings').updateOne({ _id: msg.guild.id }, { $set: { 'config.modLogChannel': "" } }); + let embed = new MessageEmbed(); embed.setTitle("Message Self-deleted"); embed.setDescription(`Author: ${msg.author.tag} (<@${msg.author.id}>)\nWhere: <#${msg.channel.id}>\n\`\`\`${msg.cleanContent ? msg.cleanContent : "empty message"}\`\`\``); From 0f1ee70ebdc7668dda3dfda3cf17093fd76fee30 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 8 Sep 2020 08:48:55 +0200 Subject: [PATCH 49/71] deps: update --- package.json | 14 +++---- yarn.lock | 113 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 81 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index ab708a45..385deb1f 100644 --- a/package.json +++ b/package.json @@ -20,25 +20,25 @@ "homepage": "https://github.com/iwa/Kwako#readme", "dependencies": { "@discordjs/opus": "^0.3.2", - "@types/mongodb": "^3.5.26", - "@types/node": "^14.6.2", + "@types/mongodb": "^3.5.27", + "@types/node": "^14.6.4", "@types/pino": "^6.3.0", "@types/ws": "^7.2.4", - "anilist-node": "^1.4.1", + "anilist-node": "^1.5.0", "axios": "^0.20.0", "bufferutil": "^4.0.1", "canvas": "^2.6.1", "discord.js": "^12.3.1", "dotenv": "^8.2.0", - "mongodb": "^3.6.0", - "pino": "^6.5.1", + "mongodb": "^3.6.1", + "pino": "^6.6.0", "popyt": "^4.1.1", "sodium": "^3.0.2", - "twitch": "^4.1.4", + "twitch": "^4.2.2", "utf-8-validate": "^5.0.2", "ytdl-core": "^3.2.2" }, "devDependencies": { - "pino-pretty": "^4.2.0" + "pino-pretty": "^4.2.1" } } diff --git a/yarn.lock b/yarn.lock index 6c9f06c4..7e82c5a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,13 +19,10 @@ node-fetch "2.6.0" whatwg-fetch "3.0.0" -"@d-fischer/logger@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@d-fischer/logger/-/logger-1.1.1.tgz#e3469a01581dac3f21e9e6f8d4e2ca469f887e2e" - integrity sha512-JpK3Pl+8mW5LvsNfeCOJwOKOHX88KI1X4NFWSxSVgfY0KFV9nE478Y0/3ZjlTLJuiaxBEmOLsvhPGtQeDfi4EQ== - dependencies: - detect-node "^2.0.4" - tslib "^1.10.0" +"@d-fischer/deprecate@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@d-fischer/deprecate/-/deprecate-2.0.1.tgz#5cccedff47477ae9e055a8be799ac8ac3dd22eda" + integrity sha512-HrK3Yu3iRJo1YzG52bt2TyhRGZRIyFumbV/fH0h6IWa43ZJeAI3o4LXzBVLLdA7ITLTMtYP8yJnpHuFftQwQ2A== "@d-fischer/logger@^2.0.0": version "2.0.0" @@ -50,7 +47,7 @@ resolved "https://registry.yarnpkg.com/@d-fischer/qs/-/qs-7.0.2.tgz#21942f51590e20954086bdc32fb3e608d3525659" integrity sha512-yAu3xDooiL+ef84Jo8nLjDjWBRk7RXk163Y6aTvRB7FauYd3spQD/dWvgT7R4CrN54Juhrrc3dMY7mc+jZGurQ== -"@d-fischer/rate-limiter@^0.2.4": +"@d-fischer/rate-limiter@^0.2.5": version "0.2.5" resolved "https://registry.yarnpkg.com/@d-fischer/rate-limiter/-/rate-limiter-0.2.5.tgz#3e62e8c97d7fa049f3b3e8091b467b48a29bd657" integrity sha512-JnnhFeB1dMT4ooaIcnZKtvepnf/wtAJTVEKEnu7i3Pl9Q7JTU0dEPoTsEdAqMjGyQHKc0msCv47Yg1htqcmH/A== @@ -60,7 +57,7 @@ "@types/node" "^12.12.5" tslib "^1.9.3" -"@d-fischer/shared-utils@^2.0.0", "@d-fischer/shared-utils@^2.0.1": +"@d-fischer/shared-utils@^2.0.0": version "2.3.1" resolved "https://registry.yarnpkg.com/@d-fischer/shared-utils/-/shared-utils-2.3.1.tgz#a4cb0e5b098ca810421bd73bf1371c554345355d" integrity sha512-4cWXqXYrMOvk1dIao3iODrAIiA4a6gB7FF0/OmYq0nUJFQ4u688tTJl/hQoBs2Id51wvas8oavdz0jxWAa4dZA== @@ -68,6 +65,14 @@ "@types/node" "^14.0.5" tslib "^2.0.0" +"@d-fischer/shared-utils@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@d-fischer/shared-utils/-/shared-utils-2.3.2.tgz#ba271cf04dba05c89b8815e9427f7e647eb2633e" + integrity sha512-/eOhwUcdbWrpdPDWu77Q21UDuL6q9GJAp1dfXr6QgGs4pHTg9ZUFSs6Vhotk0Muu6xNkwwlOlZFwds3CRXhTmg== + dependencies: + "@types/node" "^14.0.5" + tslib "^2.0.0" + "@discordjs/collection@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" @@ -123,15 +128,15 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/mongodb@^3.5.26": - version "3.5.26" - resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.5.26.tgz#aa10315925ba10cdc7931ef280c0ff6f54fd37f3" - integrity sha512-p0X2VJgIBNHfNBdZdzzG8eQ/3bf6mQoXDT0UhVyVEdSzXEa1+2pFcwGvEZp72sjztyBwfRKlgrXMjCVavLcuGg== +"@types/mongodb@^3.5.27": + version "3.5.27" + resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.5.27.tgz#158a7a43ce25ef3592ac8a62e62ab38bebf661f2" + integrity sha512-1jxKDgdfJEOO9zp+lv43p8jOqRs02xPrdUTzAZIVK9tVEySfCEmktL2jEu9A3wOBEOs18yKzpVIKUh8b8ALk3w== dependencies: "@types/bson" "*" "@types/node" "*" -"@types/node@*", "@types/node@^14.0.5", "@types/node@^14.6.2": +"@types/node@*", "@types/node@^14.0.5": version "14.6.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.2.tgz#264b44c5a28dfa80198fc2f7b6d3c8a054b9491f" integrity sha512-onlIwbaeqvZyniGPfdw/TEhKIh79pz66L1q06WUQqJLnAb6wbjvOtepLYTGHTqzdXgBYIE3ZdmqHDGsRsbBz7A== @@ -141,6 +146,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1" integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== +"@types/node@^14.6.4": + version "14.6.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.4.tgz#a145cc0bb14ef9c4777361b7bbafa5cf8e3acb5a" + integrity sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ== + "@types/pino-std-serializers@*": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz#f8bd52a209c8b3c97d1533b1ba27f57c816382bf" @@ -183,12 +193,12 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -anilist-node@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/anilist-node/-/anilist-node-1.4.1.tgz#e279d155678a79b0770985d0ca4a1f24d1d1ccde" - integrity sha512-ceyDH0L9fuqvl8lT1DWCQPeOTGXF69457dFaoNTjtCFwmvvrhXcDjcvj4BmnmSOVSSP/eydeTdIHKC1mEOWxig== +anilist-node@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/anilist-node/-/anilist-node-1.5.0.tgz#39a981599273a26b35412cbf595d2f1d9d965139" + integrity sha512-X2+maALGaxGr+cv4ujzhvxloOdNrGPlDrMRDZAGo9rOVcxIuAXvXyX8dNpRgsbChwTHy+owzTEmG9bMwLjnUPw== dependencies: - node-fetch "^2.6.0" + node-fetch "^2.6.1" ansi-regex@^2.0.0: version "2.1.1" @@ -848,10 +858,10 @@ mkdirp@^1.0.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mongodb@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.0.tgz#babd7172ec717e2ed3f85e079b3f1aa29dce4724" - integrity sha512-/XWWub1mHZVoqEsUppE0GV7u9kanLvHxho6EvBxQbShXTKYF9trhZC2NzbulRGeG7xMJHD8IOWRcdKx5LPjAjQ== +mongodb@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.1.tgz#2c5cc2a81456ba183e8c432d80e78732cc72dabd" + integrity sha512-uH76Zzr5wPptnjEKJRQnwTsomtFOU/kQEU8a9hKHr2M7y9qVk7Q4Pkv0EQVp88742z9+RwvsdTw6dRjDZCNu1g== dependencies: bl "^2.2.0" bson "^1.1.4" @@ -900,6 +910,11 @@ node-fetch@2.6.0, node-fetch@^2.6.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + node-gyp-build@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" @@ -1020,10 +1035,10 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -pino-pretty@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-4.2.0.tgz#522732d8579e13ccd648dd12876fb91257354dc7" - integrity sha512-CBFLgxMj/cJOANqZs+Xcjdgi1v40TJP3xMTkSN2xuOvX+03uAAHXf9SEU+1DHu/1kw44H2c31VYCImx0QewQ6w== +pino-pretty@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-4.2.1.tgz#fb2508d0d77cae00dc5fe5006755bfd454a73c32" + integrity sha512-WyO/n6c6T2gj0ioYGFUFbrvyUoERK37Lu0liLxMIJnp1YaaG+XZBU2TAQB0yVJNb+7T+oDh9t8HGMzk00jy+tw== dependencies: "@hapi/bourne" "^2.0.0" args "^5.0.1" @@ -1042,10 +1057,10 @@ pino-std-serializers@^2.4.2: resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz#cb5e3e58c358b26f88969d7e619ae54bdfcc1ae1" integrity sha512-WaL504dO8eGs+vrK+j4BuQQq6GLKeCCcHaMB2ItygzVURcL1CycwNEUHTD/lHFHs/NL5qAz2UKrjYWXKSf4aMQ== -pino@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/pino/-/pino-6.5.1.tgz#a245adf960a1f3e88e61a339045d509bccbfb7cc" - integrity sha512-76+RUhQkqjUD4AtQcSfEzh6vlsjXmoWZK5gg+2d70aCLXZTbo4/5js4I9rN1Xk6z1h2/7pnOFX10G4c2T4qNiA== +pino@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-6.6.0.tgz#690ca4a98d027b32f2302c3750eced280fbc8dee" + integrity sha512-rLfJXX8i2P1VNXZY05fDMI/qK1IQSpKnOg5iNY5TRJn+vKhc9hBg1iCiAuOw3hKEAf54MZMlT8P6T+wgYQYpIA== dependencies: fast-redact "^2.0.0" fast-safe-stringify "^2.0.7" @@ -1366,19 +1381,39 @@ tweetnacl@^1.0.3: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== -twitch@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/twitch/-/twitch-4.1.4.tgz#1f072def150b7c88d568dc6331dc7f3ab23a6f1e" - integrity sha512-+SLXm8qQcOsPwAz9uDk/mcAkQlcLKzc60InJzMuhMqL5HgP6UsxQIsjINUmCAyKt3Kp7b3A+OtlWAHDeBkGbAA== +twitch-api-call@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/twitch-api-call/-/twitch-api-call-4.2.2.tgz#c3348c28377da09c004e5871ae68e0c48c5c415d" + integrity sha512-+fB0bZLJRXFYTLUYa5br8bT8TlTK2sZb7jukTZZb/2qNrC6IanUGmA/PnbpoHNVhsmvT7867zwjzgkRgmc5BNA== dependencies: - "@d-fischer/cache-decorators" "^2.0.0" "@d-fischer/cross-fetch" "^4.0.1" - "@d-fischer/logger" "^1.1.1" "@d-fischer/qs" "^7.0.2" - "@d-fischer/rate-limiter" "^0.2.4" - "@d-fischer/shared-utils" "^2.0.1" + tslib "^2.0.0" + +twitch-auth@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/twitch-auth/-/twitch-auth-4.2.2.tgz#ec44db2d6a3863bb31f08acdbcd575fc91570e66" + integrity sha512-g6VGTMPozp9u0rHubu2epWFuDPoGXwBe1fIQvOUUyFllr105KDzPa2poAWyB4rWnXHNvoDu8A/uSbVEjq1kbRQ== + dependencies: + "@d-fischer/deprecate" "^2.0.1" + "@d-fischer/shared-utils" "^2.3.2" + tslib "^2.0.0" + twitch-api-call "^4.2.2" + +twitch@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/twitch/-/twitch-4.2.2.tgz#fc06bc068f7cacd63d40375e143f37179374295c" + integrity sha512-k55L5mu/RSPzKQZHmkzbipG+oLrkJXbYc8K26MQ/aAoRfX8Ley0CwO3a0ol5UzSI8+g6l9jPcmISJZrDRPdRVQ== + dependencies: + "@d-fischer/cache-decorators" "^2.0.0" + "@d-fischer/deprecate" "^2.0.1" + "@d-fischer/logger" "^2.0.0" + "@d-fischer/rate-limiter" "^0.2.5" + "@d-fischer/shared-utils" "^2.3.2" top-package "^1.0.0" tslib "^2.0.0" + twitch-api-call "^4.2.2" + twitch-auth "^4.2.2" utf-8-validate@^5.0.2: version "5.0.2" From 7b8385caef4fcaf9b91471f71f958382992c448b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2020 08:50:49 +0200 Subject: [PATCH 50/71] deps: bl from 2.2.0 to 2.2.1 (#49) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7e82c5a0..d348b713 100644 --- a/yarn.lock +++ b/yarn.lock @@ -281,9 +281,9 @@ balanced-match@^1.0.0: integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= bl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493" - integrity sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" + integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== dependencies: readable-stream "^2.3.5" safe-buffer "^5.1.1" From ae3ec21834f6091223c7fa958ac3a94a781683b5 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 8 Sep 2020 08:53:57 +0200 Subject: [PATCH 51/71] fix #31 --- src/events/messages/cooldown.ts | 7 +++++-- src/index.ts | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/events/messages/cooldown.ts b/src/events/messages/cooldown.ts index ba93fd03..eee054ad 100644 --- a/src/events/messages/cooldown.ts +++ b/src/events/messages/cooldown.ts @@ -51,8 +51,11 @@ export default class cooldown { let user = await Kwako.db.collection('user').findOne({ '_id': { $eq: msg.author.id } }); let amount = exp; - if(msg.member.premiumSinceTimestamp != null || msg.member.hasPermission('MANAGE_GUILD')) - amount = Math.floor(amount * 1.25); + + let boosterBenefits = guildConf.boosterBenefits || true; + if(boosterBenefits) + if(msg.member.premiumSinceTimestamp != null || msg.member.hasPermission('MANAGE_GUILD')) + amount = Math.floor(amount * 1.25); if(user && user.exp) if(user.exp[msg.guild.id]) diff --git a/src/index.ts b/src/index.ts index caa716a2..8d4cfdd6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,7 +15,8 @@ const defaultSettings = { suggestionChannel: "", disabledCommands: [] as string[], useExpSystem: true, - showLevelUp: true + showLevelUp: true, + boosterBenefits: true } let talkedRecently = new Set(); From 192e031fa752767954265614e97d7d372311179a Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 8 Sep 2020 09:18:18 +0200 Subject: [PATCH 52/71] add customizable emote in starboard --- src/events/starboard.ts | 45 ++++++++++++++++++++++------------------- src/index.ts | 7 +++++-- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/events/starboard.ts b/src/events/starboard.ts index b0132c02..c5fcf1c9 100644 --- a/src/events/starboard.ts +++ b/src/events/starboard.ts @@ -43,31 +43,34 @@ export default class starboard { * @param {User} author - Author Object * @param {Client} bot - Discord Client object */ - static async check(reaction: MessageReaction, author: User, starboardChannel: string) { - if (reaction.message.guild.id !== process.env.GUILDID) return; - if (reaction.message.channel.id == process.env.STARBOARDTC) return; - if (reaction.message.channel.id == process.env.ANNOUNCEMENTSTC) return; + static async check(reaction: MessageReaction, author: User, starboardChannel: string, customEmote: string) { if (reaction.users.cache.find(val => val.id === Kwako.user.id)) return; - if (reaction.emoji.name == '⭐') { - if (reaction.count >= 5) { - let msg = reaction.message; - let content; - if (!msg.cleanContent) - content = "*attachment only*\n" - else - content = `\`\`\`${msg.cleanContent}\`\`\`` + if (customEmote !== "") { + if (reaction.emoji.id === customEmote) { + if (reaction.count >= 5) { + let msg = reaction.message; + let content; + if (!msg.cleanContent) + content = "*attachment only*\n" + else + content = `\`\`\`${msg.cleanContent}\`\`\`` - return starboard.send(msg, reaction, content, starboardChannel); + return starboard.send(msg, reaction, content, starboardChannel); + } } - } else if (reaction.emoji.name == '🌟' && author.id == process.env.IWA) { - let msg = reaction.message; - let content; - if (!msg.cleanContent) - content = "*attachment only*\n" - else - content = `\`\`\`${msg.cleanContent}\`\`\`` + } else { + if (reaction.emoji.name === '⭐') { + if (reaction.count >= 5) { + let msg = reaction.message; + let content; + if (!msg.cleanContent) + content = "*attachment only*\n" + else + content = `\`\`\`${msg.cleanContent}\`\`\`` - return starboard.send(msg, reaction, content, starboardChannel); + return starboard.send(msg, reaction, content, starboardChannel); + } + } } } } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 8d4cfdd6..a4841b0c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,7 +16,8 @@ const defaultSettings = { disabledCommands: [] as string[], useExpSystem: true, showLevelUp: true, - boosterBenefits: true + boosterBenefits: true, + customEmote: "" } let talkedRecently = new Set(); @@ -221,7 +222,9 @@ Kwako.on('messageReactionAdd', async (reaction: MessageReaction, author: User) = let starboardChannel = guildConf.starboardChannel; if(!starboardChannel) return; - await starboard.check(reaction, author, starboardChannel); + let customEmote = guildConf.customEmote || ""; + + await starboard.check(reaction, author, starboardChannel, customEmote); }); // Reaction Role Events From 9c415067fee9a9e750e6279904f6180e1768db76 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Tue, 8 Sep 2020 09:37:30 +0200 Subject: [PATCH 53/71] customizable star amount for the starboard --- src/events/starboard.ts | 6 +++--- src/index.ts | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/events/starboard.ts b/src/events/starboard.ts index c5fcf1c9..fbe181da 100644 --- a/src/events/starboard.ts +++ b/src/events/starboard.ts @@ -43,11 +43,11 @@ export default class starboard { * @param {User} author - Author Object * @param {Client} bot - Discord Client object */ - static async check(reaction: MessageReaction, author: User, starboardChannel: string, customEmote: string) { + static async check(reaction: MessageReaction, author: User, starboardChannel: string, customEmote: string, starReactions: number) { if (reaction.users.cache.find(val => val.id === Kwako.user.id)) return; if (customEmote !== "") { if (reaction.emoji.id === customEmote) { - if (reaction.count >= 5) { + if (reaction.count >= starReactions) { let msg = reaction.message; let content; if (!msg.cleanContent) @@ -60,7 +60,7 @@ export default class starboard { } } else { if (reaction.emoji.name === '⭐') { - if (reaction.count >= 5) { + if (reaction.count >= starReactions) { let msg = reaction.message; let content; if (!msg.cleanContent) diff --git a/src/index.ts b/src/index.ts index a4841b0c..c1540ede 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,7 +17,8 @@ const defaultSettings = { useExpSystem: true, showLevelUp: true, boosterBenefits: true, - customEmote: "" + customEmote: "", + starReactions: 5 } let talkedRecently = new Set(); @@ -223,8 +224,9 @@ Kwako.on('messageReactionAdd', async (reaction: MessageReaction, author: User) = if(!starboardChannel) return; let customEmote = guildConf.customEmote || ""; + let starReactions = guildConf.starReactions || 5; - await starboard.check(reaction, author, starboardChannel, customEmote); + await starboard.check(reaction, author, starboardChannel, customEmote, starReactions); }); // Reaction Role Events From f57d2ba35b3044bf2dddafaae631f483a8675aba Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 14:56:22 +0200 Subject: [PATCH 54/71] add 'transfermee6' command --- package.json | 1 + src/commands/config/transfermee6.ts | 32 +++++ yarn.lock | 196 +++++++++++++++++++++++++++- 3 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 src/commands/config/transfermee6.ts diff --git a/package.json b/package.json index 385deb1f..1ff656f3 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "canvas": "^2.6.1", "discord.js": "^12.3.1", "dotenv": "^8.2.0", + "mee6-levels-api": "^1.1.0", "mongodb": "^3.6.1", "pino": "^6.6.0", "popyt": "^4.1.1", diff --git a/src/commands/config/transfermee6.ts b/src/commands/config/transfermee6.ts new file mode 100644 index 00000000..42670a94 --- /dev/null +++ b/src/commands/config/transfermee6.ts @@ -0,0 +1,32 @@ +import Kwako from '../../Client'; +import { Message } from 'discord.js'; +const Mee6LevelsApi = require("mee6-levels-api"); + +module.exports.run = async (msg: Message) => { + if ((!msg.member.hasPermission('MANAGE_GUILD'))) return msg.delete(); + + Mee6LevelsApi.getLeaderboardPage(msg.guild.id).then(async (leaderboard: any) => { + console.log(leaderboard) + if(!leaderboard) return msg.react('❌'); + if(!leaderboard[0]) return msg.react('❌'); + + let guild = `exp.${msg.guild.id}`; + + await Kwako.db.collection('user').updateMany({}, { $unset: { [guild]: 0 }}); + + for(const user of leaderboard) + await Kwako.db.collection('user').updateOne({ _id: user.id }, { $set: { [guild]: Math.floor(user.xp.totalXp/10) } }, { upsert: true }); + + await msg.react('✅') + }).catch(() => { return msg.react('❌'); }); + + Kwako.log.info({msg: 'transfer mee6', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }}) +}; + +module.exports.help = { + name: 'transfermee6', + usage: "transfermee6", + desc: "Transfer Levels from MEE6\n\n:warning: This will erase all the current levels.", + staff: true, + perms: ['EMBED_LINKS', 'MANAGE_ROLES', 'MANAGE_MESSAGES'] +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index d348b713..55ccfaaa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -116,6 +116,18 @@ resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d" integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg== +"@sindresorhus/is@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.1.tgz#ceff6a28a5b4867c2dd4a1ba513de278ccbe8bb1" + integrity sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg== + +"@szmarczak/http-timer@^4.0.0": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" + integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== + dependencies: + defer-to-connect "^2.0.0" + "@types/bson@*": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.0.2.tgz#7accb85942fc39bbdb7515d4de437c04f698115f" @@ -123,11 +135,33 @@ dependencies: "@types/node" "*" +"@types/cacheable-request@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" + integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/http-cache-semantics@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" + integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== + +"@types/keyv@*", "@types/keyv@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" + integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== + dependencies: + "@types/node" "*" + "@types/mongodb@^3.5.27": version "3.5.27" resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.5.27.tgz#158a7a43ce25ef3592ac8a62e62ab38bebf661f2" @@ -167,6 +201,13 @@ "@types/pino-std-serializers" "*" "@types/sonic-boom" "*" +"@types/responselike@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + "@types/sonic-boom@*": version "0.7.0" resolved "https://registry.yarnpkg.com/@types/sonic-boom/-/sonic-boom-0.7.0.tgz#38337036293992a1df65dd3161abddf8fb9b7176" @@ -308,6 +349,27 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "~3.7.0" +cacheable-lookup@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz#87be64a18b925234875e10a9bb1ebca4adce6b38" + integrity sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg== + dependencies: + "@types/keyv" "^3.1.1" + keyv "^4.0.0" + +cacheable-request@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" + integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^2.0.0" + camelcase@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" @@ -349,6 +411,13 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -419,11 +488,23 @@ decompress-response@^4.2.0: dependencies: mimic-response "^2.0.0" +decompress-response@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-5.0.0.tgz#7849396e80e3d1eba8cb2f75ef4930f76461cb0f" + integrity sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw== + dependencies: + mimic-response "^2.0.0" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +defer-to-connect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" + integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -475,6 +556,11 @@ dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -594,6 +680,13 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + glob@^7.1.3: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -606,6 +699,27 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +got@^10.0.3: + version "10.7.0" + resolved "https://registry.yarnpkg.com/got/-/got-10.7.0.tgz#62889dbcd6cca32cd6a154cc2d0c6895121d091f" + integrity sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg== + dependencies: + "@sindresorhus/is" "^2.0.0" + "@szmarczak/http-timer" "^4.0.0" + "@types/cacheable-request" "^6.0.1" + cacheable-lookup "^2.0.0" + cacheable-request "^7.0.1" + decompress-response "^5.0.0" + duplexer3 "^0.1.4" + get-stream "^5.0.0" + lowercase-keys "^2.0.0" + mimic-response "^2.1.0" + p-cancelable "^2.0.0" + p-event "^4.0.0" + responselike "^2.0.0" + to-readable-stream "^2.0.0" + type-fest "^0.10.0" + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -638,6 +752,11 @@ html-entities@^1.3.1: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -759,11 +878,28 @@ joycon@^2.2.5: resolved "https://registry.yarnpkg.com/joycon/-/joycon-2.2.5.tgz#8d4cf4cbb2544d7b7583c216fcdfec19f6be1615" integrity sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +keyv@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.1.tgz#9fe703cb4a94d6d11729d320af033307efd02ee6" + integrity sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw== + dependencies: + json-buffer "3.0.1" + leven@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + m3u8stream@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.7.1.tgz#74b01a67ca248ac7bbdc263a65d9d8d2c479a65c" @@ -772,6 +908,13 @@ m3u8stream@^0.7.1: miniget "^1.6.1" sax "^1.2.4" +mee6-levels-api@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mee6-levels-api/-/mee6-levels-api-1.1.0.tgz#0265aacf6ef81140fce23644f4648288e1fffbad" + integrity sha512-vlQVmSs7Z0wJxUv3SMCkP4U4BEzY7CmDzNo6EhZ6UOtgtK8c9NEuQkzvUumbtYj7L5jvlpoNHFbyYFwA1IpHyQ== + dependencies: + got "^10.0.3" + memory-pager@^1.0.2: version "1.5.0" resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" @@ -789,7 +932,12 @@ mime-types@^2.1.12: dependencies: mime-db "1.44.0" -mimic-response@^2.0.0: +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^2.0.0, mimic-response@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== @@ -944,6 +1092,11 @@ nopt@^4.0.1, nopt@^4.0.3: abbrev "1" osenv "^0.1.4" +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + npm-bundled@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" @@ -1030,6 +1183,30 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-cancelable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" + integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== + +p-event@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-timeout@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -1142,6 +1319,13 @@ resolve-from@^2.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + rimraf@^2.6.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -1361,6 +1545,11 @@ tar@^6.0.2: mkdirp "^1.0.3" yallist "^4.0.0" +to-readable-stream@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-2.1.0.tgz#82880316121bea662cdc226adb30addb50cb06e8" + integrity sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w== + top-package@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/top-package/-/top-package-1.0.1.tgz#17990e92963bd13faa61594fd7d32568ed267a14" @@ -1415,6 +1604,11 @@ twitch@^4.2.2: twitch-api-call "^4.2.2" twitch-auth "^4.2.2" +type-fest@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.10.0.tgz#7f06b2b9fbfc581068d1341ffabd0349ceafc642" + integrity sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw== + utf-8-validate@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3" From 592a5a8ce28e88e80e00e6c8bcbdb1caf21ceee8 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:01:23 +0200 Subject: [PATCH 55/71] fix the level info calculation function --- src/utils/utilities.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/utils/utilities.ts b/src/utils/utilities.ts index 9b49cdfc..be311d1c 100644 --- a/src/utils/utilities.ts +++ b/src/utils/utilities.ts @@ -6,14 +6,13 @@ export default class utilities { static levelInfo(xp: number): { 'level': number, 'current': number, 'max': number } { let x = 100; - for (let i = 1; i < 50; i++) { - if (xp < x) { + for (let i = 1; i <= 50; i++) { + if (xp < x || i === 50) return { 'level': i, 'current': xp, 'max': x } - } xp -= x; x = Math.round(Math.log(Math.pow(x, 2))+(x*1.12)) } - return { 'level': 50, 'current': 1, 'max': 1 } + return { 'level': 1, 'current': 0, 'max': 100 } } static expForLevel(level: number): number { From 6cd6291a79acd1a66dd04c34e49c7064f0d6f2dd Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:03:02 +0200 Subject: [PATCH 56/71] strictier conditions --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index c1540ede..d71e172d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -47,7 +47,7 @@ Kwako.on('message', async (msg: Message) => { if (!msg) return; if (msg.author.bot) return; if (!msg.guild) return Kwako.log.trace({msg: 'dm', author: { id: msg.author.id, name: msg.author.tag }, content: msg.cleanContent, attachment: msg.attachments.first()}); - if (msg.channel.type != "text") return; + if (msg.channel.type !== "text") return; let guildConf = await Kwako.db.collection('settings').findOne({ '_id': { $eq: msg.guild.id } }); guildConf = guildConf.config || defaultSettings; From c3e80642cc385939464006506f94e33ce60d5fd4 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:05:42 +0200 Subject: [PATCH 57/71] fix prefix not being taken in account --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index d71e172d..6e74bb66 100644 --- a/src/index.ts +++ b/src/index.ts @@ -59,8 +59,8 @@ Kwako.on('message', async (msg: Message) => { return suggestion(msg, Kwako.patrons.has(msg.guild.ownerID)); guildConf.useExpSystem &&= true; - if(guildConf.useExpSystem) - if (!msg.content.startsWith(guildConf.prefix)) + if (!msg.content.startsWith(guildConf.prefix)) + if(guildConf.useExpSystem) return cooldown.exp(msg, guildConf); let args = msg.content.slice(1).trim().split(/ +/g); From 90c4bfc8509162bcb2d1e56d2e0a1c23d4909204 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:09:19 +0200 Subject: [PATCH 58/71] prefix returned if mentionned without a cmd --- src/index.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6e74bb66..51b14bfc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -58,11 +58,20 @@ Kwako.on('message', async (msg: Message) => { if (msg.channel.id === guildConf.suggestionChannel) return suggestion(msg, Kwako.patrons.has(msg.guild.ownerID)); - guildConf.useExpSystem &&= true; - if (!msg.content.startsWith(guildConf.prefix)) + if (!msg.content.startsWith(guildConf.prefix)) { + if(msg.mentions.has(Kwako.user.id)) + return msg.channel.send({'embed':{ + 'title': 'My prefix here is:', + 'description': `\`${guildConf.prefix}\`` + }}) + + guildConf.useExpSystem &&= true; if(guildConf.useExpSystem) return cooldown.exp(msg, guildConf); + return; + } + let args = msg.content.slice(1).trim().split(/ +/g); let req = args.shift().toLowerCase(); let cmd: any = Kwako.commands.get(req) || Kwako.commands.find((comd) => comd.help.aliases && comd.help.aliases.includes(req)); From 2abfcf20b07c3e2ad06f2a900735bf9a7f45a926 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:14:53 +0200 Subject: [PATCH 59/71] add multiple gifs for !facepalm --- src/commands/actions/facepalm.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/commands/actions/facepalm.ts b/src/commands/actions/facepalm.ts index b4b8db80..eb9d3956 100644 --- a/src/commands/actions/facepalm.ts +++ b/src/commands/actions/facepalm.ts @@ -1,11 +1,21 @@ import Kwako from '../../Client' import { Message, MessageEmbed } from 'discord.js' +import utilities from '../../utils/utilities' + +let nbGifs = 5; +let lastGif = 0; module.exports.run = async (msg: Message) => { const embed = new MessageEmbed(); embed.setColor('#F2DEB0') embed.setDescription(`**<@${msg.author.id}>**, facepalm!`) - embed.setImage('https://i.imgur.com/zqUDpIk.gif'); + + let n = utilities.randomInt(nbGifs) + while (lastGif === n) + n = utilities.randomInt(nbGifs); + lastGif = n; + + embed.setImage(`https://${process.env.CDN_URL}/img/facepalm/${n}.gif`); return msg.channel.send(embed) .then(() => { From f5bcb5cc649cf2364b98ba497809b9915ffa66e5 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:28:44 +0200 Subject: [PATCH 60/71] update !twitch to match with new version requirements --- src/commands/config/twitch.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/commands/config/twitch.ts b/src/commands/config/twitch.ts index 31ef3448..ebdd5dc9 100644 --- a/src/commands/config/twitch.ts +++ b/src/commands/config/twitch.ts @@ -1,8 +1,10 @@ import Kwako from '../../Client'; import { Message, TextChannel } from 'discord.js'; -const twitch = require('twitch').default; -const twitchClient = twitch.withClientCredentials(process.env.TWITCHCLIENTID, process.env.TWITCHCLIENTSECRET); +import { ApiClient } from 'twitch'; +import { ClientCredentialsAuthProvider } from 'twitch-auth'; +const authProvider = new ClientCredentialsAuthProvider(process.env.TWITCHCLIENTID, process.env.TWITCHCLIENTSECRET); +const twitchClient = new ApiClient({ authProvider }); module.exports.run = async (msg: Message, args: string[], guildConf: any) => { if ((!msg.member.hasPermission('MANAGE_GUILD'))) return; @@ -128,14 +130,14 @@ setInterval(async () => { if(!channel) return Kwako.db.collection('twitch').updateOne({ _id: data._id }, { $pull: { channels: channelID } }); if(channel.type !== 'text' && channel.type !== 'news') return; - let thumbnail: string = stream._data.thumbnail_url; + let thumbnail: string = stream.thumbnailUrl; thumbnail = thumbnail.replace('{width}', '1280'); thumbnail = thumbnail.replace('{height}', '720'); await (channel as TextChannel).send({'embed':{ - "title": `🚨 ${stream._data.user_name} is going live!`, - "description": stream._data.title, - "url": `https://twitch.tv/${stream._data.user_name}`, + "title": `🚨 ${stream.userDisplayName} is going live!`, + "description": stream.title, + "url": `https://twitch.tv/${stream.userDisplayName}`, "color": 8926419, "timestamp": new Date(), "thumbnail": { From 5c87770a6579b0cad478040e8b6b8ee948bcaab0 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:44:36 +0200 Subject: [PATCH 61/71] post 'new guild' message in the first tc the bot find --- src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 51b14bfc..a75ef43b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -169,7 +169,7 @@ Kwako.on("guildMemberAdd", async member => { Kwako.on('guildCreate', async guild => { if(!guild.available) return; - let channel = guild.channels.cache.find(val => val.name.includes('general') && val.type === 'text'); + let channel = guild.channels.cache.find(val => val.type === 'text' && val.permissionsFor(Kwako.user.id).has(['SEND_MESSAGES', 'EMBED_LINKS'])); if(channel) { await (channel as TextChannel).send({ "embed": { @@ -208,6 +208,7 @@ Kwako.on('guildCreate', async guild => { await (channel as TextChannel).send(':x: **Some needed perms are unavailable. Please give me all the required permissions or I won\'t be able to work normally.**').catch(() => {return;}) } } + await Kwako.db.collection('settings').insertOne({ '_id': guild.id }); http.get('http://localhost:8080/api/guilds/update').on("error", Kwako.log.error); From 6962d2b77167b7cc1ce01bce9fd29b5b85258ea3 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:45:44 +0200 Subject: [PATCH 62/71] make http request with axios instead of http --- src/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index a75ef43b..688eb13a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ dotenv.config(); import Kwako from './Client'; import { MessageReaction, User, Message, MessageEmbed, TextChannel } from 'discord.js'; -import http from 'http'; +import axios from "axios"; const defaultSettings = { prefix: "!", @@ -210,14 +210,15 @@ Kwako.on('guildCreate', async guild => { } await Kwako.db.collection('settings').insertOne({ '_id': guild.id }); - http.get('http://localhost:8080/api/guilds/update').on("error", Kwako.log.error); + + await axios.get('http://localhost:8080/api/guilds/update').catch(Kwako.log.error); Kwako.log.info({msg: 'new guild', guild: { id: guild.id, name: guild.name }}); }); Kwako.on("guildDelete", async guild => { await Kwako.db.collection('settings').deleteOne({ '_id': { $eq: guild.id } }); - http.get('http://localhost:8080/api/guilds/update').on("error", Kwako.log.error); + await axios.get('http://localhost:8080/api/guilds/update').catch(Kwako.log.error); Kwako.log.info({msg: 'guild removed', guild: { id: guild.id, name: guild.name }}); }); From 450a283a8a12579e687a6e21b3610276ff9387e9 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:51:59 +0200 Subject: [PATCH 63/71] fix all error logs not being correctly catch --- src/commands/games/roll.ts | 4 ++-- src/commands/games/rps.ts | 2 +- src/commands/mod/bulk.ts | 4 ++-- src/commands/update.ts | 8 ++++---- src/commands/utility/ping.ts | 2 +- src/commands/utility/pong.ts | 2 +- src/events/highfiveWatcher.ts | 2 +- src/events/ready.ts | 4 ++-- src/index.ts | 4 ++-- src/utils/music.ts | 6 +++--- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/commands/games/roll.ts b/src/commands/games/roll.ts index d76cf01a..e587771c 100644 --- a/src/commands/games/roll.ts +++ b/src/commands/games/roll.ts @@ -12,7 +12,7 @@ module.exports.run = (msg: Message, args: string[]) => { } }) .then(() => { Kwako.log.info({msg: 'roll', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, x: x}) }) - .catch(Kwako.log.error); + .catch(err => Kwako.log.error(err)); } else { msg.channel.send({ "embed": { @@ -21,7 +21,7 @@ module.exports.run = (msg: Message, args: string[]) => { } }) .then(() => { Kwako.log.info({msg: 'roll', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, x: 100}) }) - .catch(Kwako.log.error); + .catch(err => Kwako.log.error(err)); } }; diff --git a/src/commands/games/rps.ts b/src/commands/games/rps.ts index 0e6841fb..9a82c9c0 100644 --- a/src/commands/games/rps.ts +++ b/src/commands/games/rps.ts @@ -45,7 +45,7 @@ module.exports.run = (msg: Message, args: string[]) => { embed.setDescription(res); Kwako.log.info({msg: 'rps', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }}) - return msg.channel.send(embed).catch(Kwako.log.error) + return msg.channel.send(embed).catch(err => Kwako.log.error(err)) }; module.exports.help = { diff --git a/src/commands/mod/bulk.ts b/src/commands/mod/bulk.ts index ed7b2fde..f59503e9 100644 --- a/src/commands/mod/bulk.ts +++ b/src/commands/mod/bulk.ts @@ -7,13 +7,13 @@ module.exports.run = (msg: Message, args: string[]) => { if (args.length !== 0) { let channel: any = msg.channel if (msg.channel.type !== "dm") { - msg.delete().catch(Kwako.log.error); + msg.delete().catch(err => Kwako.log.error(err)); let nb = parseInt(args[0]) msg.channel.bulkDelete(nb) .then(() => { Kwako.log.info({msg: 'bulk', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, bulk: { channel: channel.id, name: channel.name, x: nb }}); }) - .catch(Kwako.log.error); + .catch(err => Kwako.log.error(err)); } } else diff --git a/src/commands/update.ts b/src/commands/update.ts index 083b9af0..4c93fad9 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -8,15 +8,15 @@ module.exports.run = async (msg: Message, args: string[]) => { if(args[0]) min = parseInt(args[0], 10); - await Kwako.user.setActivity(`⚠️ update in ${min}min`, { type: 'LISTENING' }).catch(Kwako.log.error); - await Kwako.user.setStatus('idle').catch(Kwako.log.error); + await Kwako.user.setActivity(`⚠️ update in ${min}min`, { type: 'LISTENING' }).catch(err => Kwako.log.error(err)); + await Kwako.user.setStatus('idle').catch(err => Kwako.log.error(err)); setInterval(async () => { if(min > 1) { min -= 1; - await Kwako.user.setActivity(`⚠️ update in ${min}min`, { type: 'LISTENING' }).catch(Kwako.log.error); + await Kwako.user.setActivity(`⚠️ update in ${min}min`, { type: 'LISTENING' }).catch(err => Kwako.log.error(err)); } else { - await Kwako.user.setActivity(`⚠️ update soon...`, { type: 'LISTENING' }).catch(Kwako.log.error); + await Kwako.user.setActivity(`⚠️ update soon...`, { type: 'LISTENING' }).catch(err => Kwako.log.error(err)); } }, 60000); }; diff --git a/src/commands/utility/ping.ts b/src/commands/utility/ping.ts index 81aafd1e..4e7f5ed4 100644 --- a/src/commands/utility/ping.ts +++ b/src/commands/utility/ping.ts @@ -5,7 +5,7 @@ module.exports.run = async (msg: Message) => { let ping = Math.ceil(Kwako.ws.ping) await msg.channel.send(`:ping_pong: Pong ! \`${ping}ms\``) .then(() => { Kwako.log.info({msg: 'ping', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }}) }) - .catch(Kwako.log.error); + .catch(err => Kwako.log.error(err)); }; module.exports.help = { diff --git a/src/commands/utility/pong.ts b/src/commands/utility/pong.ts index ff8adbb4..34b395bf 100644 --- a/src/commands/utility/pong.ts +++ b/src/commands/utility/pong.ts @@ -5,7 +5,7 @@ module.exports.run = async (msg: Message) => { let ping = Math.ceil(Kwako.ws.ping) await msg.channel.send(`:ping_pong: Ping ! \`${ping}ms\``) .then(() => { Kwako.log.info({msg: 'ping', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }}) }) - .catch(Kwako.log.error); + .catch(err => Kwako.log.error(err)); }; module.exports.help = { diff --git a/src/events/highfiveWatcher.ts b/src/events/highfiveWatcher.ts index 4652714b..68ce7df2 100644 --- a/src/events/highfiveWatcher.ts +++ b/src/events/highfiveWatcher.ts @@ -26,7 +26,7 @@ export default async function highfiveWatcher(reaction: MessageReaction, author: .then(() => { Kwako.log.info(`info: highfive`); }) - .catch(Kwako.log.error); + .catch(err => Kwako.log.error(err)); } } } \ No newline at end of file diff --git a/src/events/ready.ts b/src/events/ready.ts index 3406b70d..bbf468ed 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -14,8 +14,8 @@ let { version } = require('../../package.json'); * - Cache all messages needed for Reaction Roles system */ export default async function ready() { - await Kwako.user.setActivity(`kwako.iwa.sh | v${version}`, { type: 'WATCHING' }).catch(Kwako.log.error); - await Kwako.user.setStatus("online").catch(Kwako.log.error) + await Kwako.user.setActivity(`kwako.iwa.sh | v${version}`, { type: 'WATCHING' }).catch(err => Kwako.log.error(err)); + await Kwako.user.setStatus("online").catch(err => Kwako.log.error(err)) let allMsg = Kwako.db.collection('msg').find() if(allMsg) { diff --git a/src/index.ts b/src/index.ts index 688eb13a..d7f85264 100644 --- a/src/index.ts +++ b/src/index.ts @@ -211,14 +211,14 @@ Kwako.on('guildCreate', async guild => { await Kwako.db.collection('settings').insertOne({ '_id': guild.id }); - await axios.get('http://localhost:8080/api/guilds/update').catch(Kwako.log.error); + await axios.get('http://localhost:8080/api/guilds/update').catch(err => Kwako.log.error(err)); Kwako.log.info({msg: 'new guild', guild: { id: guild.id, name: guild.name }}); }); Kwako.on("guildDelete", async guild => { await Kwako.db.collection('settings').deleteOne({ '_id': { $eq: guild.id } }); - await axios.get('http://localhost:8080/api/guilds/update').catch(Kwako.log.error); + await axios.get('http://localhost:8080/api/guilds/update').catch(err => Kwako.log.error(err)); Kwako.log.info({msg: 'guild removed', guild: { id: guild.id, name: guild.name }}); }); diff --git a/src/utils/music.ts b/src/utils/music.ts index c7978b02..31a3d1f9 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -65,7 +65,7 @@ export default class music { if (video_url[0].match(/^https?:\/\/(((www|m)\.)youtube.com)\/playlist(.*)$/)) { - const playlist = await yt.getPlaylist(video_url[0]).catch(Kwako.log.error) + const playlist = await yt.getPlaylist(video_url[0]).catch(err => Kwako.log.error(err)) if (!playlist) return; let reply = await msg.channel.send({ @@ -501,7 +501,7 @@ export default class music { */ async function playSong(msg: Message, voiceConnection: VoiceConnection, voiceChannel: VoiceChannel) { let queu = queue.get(msg.guild.id); - const video = ytdl(queu[0], { filter: "audioonly", quality: "highestaudio", highWaterMark: (16384 * 1024) }).on('error', Kwako.log.error); + const video = ytdl(queu[0], { filter: "audioonly", quality: "highestaudio", highWaterMark: (16384 * 1024) }).on('error', err => Kwako.log.error(err)); video.on('error', err => { Kwako.log.error(err); @@ -563,7 +563,7 @@ async function playSong(msg: Message, voiceConnection: VoiceConnection, voiceCha skippers.delete(msg.guild.id); playSong(msg, voiceConnection, voiceChannel) } - }).on('error', Kwako.log.error); + }).on('error', err => Kwako.log.error(err)); } /** From 28ca80ea247e37206f923429e2ecf85a2ca80c43 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 15:53:36 +0200 Subject: [PATCH 64/71] remove some bold in embeds title --- src/utils/music.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/music.ts b/src/utils/music.ts index 31a3d1f9..bee92ad7 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -678,7 +678,7 @@ async function addPlaylistToQueue(msg: Message, playlist: Playlist, voiceChannel bar.then(async () => { const embedDone = new MessageEmbed(); - embedDone.setTitle("**Done!**") + embedDone.setTitle("Done!") embedDone.setColor('LUMINOUS_VIVID_PINK') if (errors > 0) embedDone.setDescription("Some videos are unavailable :("); From a19ea1c5329e7fdcee9f7b959e72faf7b5ba874d Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 16:10:59 +0200 Subject: [PATCH 65/71] fix #35 --- src/events/birthdayCheck.ts | 34 ++++++++++++++++++++++++++++++++++ src/index.ts | 6 ++++++ 2 files changed, 40 insertions(+) create mode 100644 src/events/birthdayCheck.ts diff --git a/src/events/birthdayCheck.ts b/src/events/birthdayCheck.ts new file mode 100644 index 00000000..5f078eaa --- /dev/null +++ b/src/events/birthdayCheck.ts @@ -0,0 +1,34 @@ +import Kwako from '../Client' +import { MessageEmbed, TextChannel } from 'discord.js'; + +export default async function birthdayCheck() { + let today = new Date(); + let hh = today.getUTCHours() + + if (hh === 8) { + let dd = String(today.getDate()).padStart(2, '0'); + let mm = String(today.getMonth() + 1).padStart(2, '0'); + let todayString = `${mm}/${dd}`; + + let data = await Kwako.db.collection('user').find({ 'birthday': { $eq: todayString } }).toArray(); + if(!data || data.length === 0) return; + + for(const guild of Kwako.guilds.cache.values()) { + let channel = guild.channels.cache.find(val => val.type === 'text' && val.permissionsFor(Kwako.user.id).has(['SEND_MESSAGES', 'EMBED_LINKS'])) + + data.forEach(async user => { + let userInfo = guild.members.resolve(user._id) + if(!userInfo) return; + + const embed = new MessageEmbed(); + embed.setTitle(`**Happy Birthday, ${userInfo.user.username}! 🎉🎉**`); + embed.setFooter(`Born on: ${todayString}`); + embed.setColor('#FFFF72'); + embed.setThumbnail(userInfo.user.avatarURL({ format: 'png', dynamic: false, size: 128 })); + + (channel as TextChannel).send(`<@${user._id}>`); + (channel as TextChannel).send(embed); + }); + } + } +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index d7f85264..b4ef72da 100644 --- a/src/index.ts +++ b/src/index.ts @@ -312,5 +312,11 @@ Kwako.on('voiceStateUpdate', async (oldState, newState) => { return music.stopAlone(oldState.channel); }); +// Check if it's someone's birthday, and send a HBP message at 8am UTC +import birthdayCheck from './events/birthdayCheck'; +setInterval(async () => { + await birthdayCheck() +}, 3600000); + // Login Kwako.start(process.env.TOKEN); \ No newline at end of file From ff00e2ff7cde01b395372a373027461f72134573 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 16:27:15 +0200 Subject: [PATCH 66/71] add yeet command --- src/commands/actions/yeet.ts | 13 +++++++++++++ src/utils/actions.ts | 8 ++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 src/commands/actions/yeet.ts diff --git a/src/commands/actions/yeet.ts b/src/commands/actions/yeet.ts new file mode 100644 index 00000000..401ca765 --- /dev/null +++ b/src/commands/actions/yeet.ts @@ -0,0 +1,13 @@ +import { Message } from 'discord.js' +import actionsRun from '../../utils/actions'; + +module.exports.run = (msg: Message, args: string[]) => { + actionsRun(msg, args, 'yeet', 'yeet', false); +}; + +module.exports.help = { + name: 'Yeet', + usage: "Yeet (mention someone) [someone else]", + desc: "Yeet people by mentioning them", + perms: ['EMBED_LINKS'] +}; \ No newline at end of file diff --git a/src/utils/actions.ts b/src/utils/actions.ts index 5b10ceca..cf718fa8 100644 --- a/src/utils/actions.ts +++ b/src/utils/actions.ts @@ -23,7 +23,9 @@ let lastGif = new Map([ ['slap', 0], ['squish', 0], ['glare', 0], - ['tickle', 0] + ['tickle', 0], + ['peck', 0], + ['yeet', 0] ]); /** define the number of gifs available */ @@ -35,7 +37,9 @@ let count = new Map([ ['slap', 11], ['squish', 4], ['glare', 6], - ['tickle', 5] + ['tickle', 5], + ['peck', 0], + ['yeet', 3] ]); /** From c1f738ca28bccbb8169d7b3cfd504bfdd8de2150 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 16:42:02 +0200 Subject: [PATCH 67/71] fix some deepscan issues --- src/commands/config/levelrole.ts | 2 +- src/events/messages/cooldown.ts | 2 +- src/utils/music.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/commands/config/levelrole.ts b/src/commands/config/levelrole.ts index 6c5155c2..0ed9fe1a 100644 --- a/src/commands/config/levelrole.ts +++ b/src/commands/config/levelrole.ts @@ -31,7 +31,7 @@ module.exports.run = async (msg: Message, args: string[], guildConf: any) => { 'title': ':x: Please choose a valid level number between 1 and 50!' }}) - let role = args[2] || null; + let role = args[2] || ""; if(role.startsWith('<@&') && role.endsWith('>')) { role = role.slice(3, (role.length-1)) let chan = await msg.guild.roles.fetch(role); diff --git a/src/events/messages/cooldown.ts b/src/events/messages/cooldown.ts index eee054ad..21509d96 100644 --- a/src/events/messages/cooldown.ts +++ b/src/events/messages/cooldown.ts @@ -53,7 +53,7 @@ export default class cooldown { let amount = exp; let boosterBenefits = guildConf.boosterBenefits || true; - if(boosterBenefits) + if(boosterBenefits === true) if(msg.member.premiumSinceTimestamp != null || msg.member.hasPermission('MANAGE_GUILD')) amount = Math.floor(amount * 1.25); diff --git a/src/utils/music.ts b/src/utils/music.ts index bee92ad7..e3180f8f 100644 --- a/src/utils/music.ts +++ b/src/utils/music.ts @@ -578,7 +578,7 @@ async function launchPlay(msg: Message, voiceChannel: VoiceChannel, video_url: s msg.channel.startTyping(); let error = false, data; let queu = queue.get(msg.guild.id) || []; - if (queu && !queu.find(song => song === video_url)) { + if (!queu.find(song => song === video_url)) { data = await ytdl.getBasicInfo(video_url).catch(err => { Kwako.log.error(err); error = true; }) if (!error && data) { video_url = data.videoDetails.video_url From 08b9b423d104abfc0ed89b433c067511b1f0cd1b Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 16:48:33 +0200 Subject: [PATCH 68/71] refactor some codes in !profile --- src/commands/profile/profile.ts | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/commands/profile/profile.ts b/src/commands/profile/profile.ts index 87627d9a..4e38c477 100644 --- a/src/commands/profile/profile.ts +++ b/src/commands/profile/profile.ts @@ -48,18 +48,7 @@ async function profileImg(msg: Message, id: string) { fc: "not registered" } - if(user.userColor === '#000000') user.userColor = '#444444'; - let file = await imGenerator(user); - - try { - Kwako.log.info({msg: 'profile', author: { id: msg.author.id, name: msg.author.tag }, guild: { id: msg.guild.id, name: msg.guild.name }, target: { id: userDiscord.id, name: userDiscord.tag }}); - return msg.channel.send('', { files: [file] }).then(() => { msg.channel.stopTyping(true) }); - } catch (err) { - Kwako.log.error(err) - return msg.channel.send({'embed':{ - 'title': ':x: An error occured. Please retry later.' - }}) - } + return sendRankCard(msg, user, userDiscord); } } @@ -84,6 +73,10 @@ async function profileImg(msg: Message, id: string) { fc: userDB.fc || "not registered" } + return sendRankCard(msg, user, userDiscord); +} + +async function sendRankCard(msg: Message, user: { userColor: string; }, userDiscord: any) { if(user.userColor === '#000000') user.userColor = '#444444'; let file = await imGenerator(user); From fb0b40af5a253d99c1be28507d97994cd285aade Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Wed, 9 Sep 2020 17:03:25 +0200 Subject: [PATCH 69/71] update version tag --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ff656f3..c0fd4f82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kwako", - "version": "1.0.6", + "version": "1.1.0", "description": "", "main": "build/index.js", "scripts": { From f193477532162a93840c70f4e996e36468292f50 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Fri, 11 Sep 2020 13:20:59 +0200 Subject: [PATCH 70/71] remoev unecessary perm in !help --- src/commands/utility/help.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/utility/help.ts b/src/commands/utility/help.ts index 0d07ae0b..3a213afa 100644 --- a/src/commands/utility/help.ts +++ b/src/commands/utility/help.ts @@ -85,7 +85,7 @@ module.exports.help = { aliases: ['commands', 'command'], usage: "help", desc: "Sends you the list of the commands available", - perms: ['EMBED_LINKS', 'MANAGE_ROLES'] + perms: ['EMBED_LINKS'] }; async function sendHelp(msg: Message, guildConf: any) { From 10436c5bb19173574e7137e6e3bbcc4402a846c8 Mon Sep 17 00:00:00 2001 From: Pierre <19956672+iwa@users.noreply.github.com> Date: Fri, 11 Sep 2020 13:24:22 +0200 Subject: [PATCH 71/71] fix some outputs --- src/commands/utility/help.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/utility/help.ts b/src/commands/utility/help.ts index 3a213afa..dc25c770 100644 --- a/src/commands/utility/help.ts +++ b/src/commands/utility/help.ts @@ -97,13 +97,13 @@ async function sendHelp(msg: Message, guildConf: any) { await msg.channel.send(member) await msg.author.send(mod) } catch (ex) { - return msg.channel.send(":x: > **Please open your DMs, I can't reach you**") + return msg.channel.send(":x: **Please open your DMs, I can't reach you**") } else try { await msg.channel.send(member) } catch { - return msg.channel.send(":x: > **Commands list loading, redo the commands in a few seconds!**") + return msg.channel.send(":x: **Commands list loading, redo the command in a few seconds!**") } }