From 450ab79c0860334e1263c8cf9cf79c0894ce25c5 Mon Sep 17 00:00:00 2001 From: loicbersier Date: Fri, 27 Dec 2019 20:27:15 +0100 Subject: [PATCH] edit star/shameboard when reaction count change --- event/listeners/messageReactionAdd.js | 66 ++++++++++++++---- event/listeners/messageReactionRemove.js | 87 ++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 13 deletions(-) create mode 100644 event/listeners/messageReactionRemove.js diff --git a/event/listeners/messageReactionAdd.js b/event/listeners/messageReactionAdd.js index ff55cd8e..5e6dd976 100644 --- a/event/listeners/messageReactionAdd.js +++ b/event/listeners/messageReactionAdd.js @@ -1,6 +1,6 @@ const { Listener } = require('discord-akairo'); const fs = require('fs'); -let messageID = []; // Where reaction.message.id that entered a board will be stocked so it doesn't enter again +let messageID = require('../../json/messageID.json'); // Save messages that ented starboard so we can edit/remove the embed class MessageReactionAddListener extends Listener { @@ -15,8 +15,6 @@ class MessageReactionAddListener extends Listener { if (reaction.message.author == user) return; let starboardChannel, shameboardChannel; - if (messageID.includes(reaction.message.id)) return; - // Starboard if (fs.existsSync(`./board/star${reaction.message.guild.id}.json`)) { starboardChannel = require(`../../board/star${reaction.message.guild.id}.json`); @@ -28,9 +26,12 @@ class MessageReactionAddListener extends Listener { staremote = this.client.util.resolveEmoji(staremote, reaction.message.guild.emojis).name; } - if (reaction.emoji.name == staremote && reaction.count == starcount) { - messageID.push(reaction.message.id); - return sendEmbed('starboard', staremote, this.client); + if (reaction.emoji.name == staremote) { + if (messageID[reaction.message.id] && reaction.count > starcount) { + return editEmbed('starboard', staremote, messageID[reaction.message.id], this.client); + } else if (reaction.count == starcount) { + return sendEmbed('starboard', staremote, this.client); + } } } @@ -41,11 +42,43 @@ class MessageReactionAddListener extends Listener { let shamecount = shameboardChannel.count; delete require.cache[require.resolve(`../../board/shame${reaction.message.guild.id}.json`)]; // Delete the boardChannel cache so it can reload it next time - - if (reaction.emoji.name == shameemote && reaction.count == shamecount) { - messageID.push(reaction.message.id); - return sendEmbed('shameboard', shameemote, this.client); + if (this.client.util.resolveEmoji(shameemote, reaction.message.guild.emojis)) { + shameemote = this.client.util.resolveEmoji(shameemote, reaction.message.guild.emojis).name; } + + if (reaction.emoji.name == shameemote) { + if (messageID[reaction.message.id] && reaction.count > shamecount) { + return editEmbed('shameboard', shameemote, messageID[reaction.message.id], this.client); + } else if (reaction.count == shamecount) { + return sendEmbed('shameboard', shameemote, this.client); + } + } + } + + async function editEmbed(name, emote, boardID, client) { + let channel; + if (name == 'starboard') { + channel = client.channels.get(starboardChannel.starboard); + } else { + channel = client.channels.get(shameboardChannel.shameboard); + } + + let message = await channel.messages.get(boardID); + + let Embed = client.util.embed() + .setColor(reaction.message.member.displayHexColor) + .setAuthor(reaction.message.author.username, reaction.message.author.displayAvatarURL()) + .addField('Jump to', `[message](https://discordapp.com/channels/${reaction.message.guild.id}/${reaction.message.channel.id}/${reaction.message.id})`, true) + .addField('Channel', reaction.message.channel, true) + .setDescription(message.embeds[0].description) + .setFooter(reaction.count + ' ' + emote) + .setTimestamp(); + + if (reaction.message.guild.emojis.find(emoji => emoji.name === emote)) { + Embed.setFooter(reaction.count, reaction.message.guild.emojis.find(emoji => emoji.name === emote).url); + } + + message.edit({ embed: Embed }); } async function sendEmbed(name, emote, client) { @@ -74,15 +107,22 @@ class MessageReactionAddListener extends Listener { if (reaction.message.channel.nsfw && !channel.nsfw) { Embed.setDescription(`||${reaction.message.content}||`); if (messageAttachments != '') { - return channel.send(`||${messageAttachments}||`, { embed: Embed }); + let message = await channel.send(`||${messageAttachments}||`, { embed: Embed }); + messageID[reaction.message.id] = message.id; + //boardMessage.push({ reactionID: reaction.message.id, boardID: message.id }); } else { - return channel.send({embed: Embed}); + let message = await channel.send({embed: Embed}); + messageID[reaction.message.id] = message.id; + //boardMessage.push({ reactionID: reaction.message.id, boardID: message.id }); } } else { Embed.setDescription(reaction.message.content); - return channel.send({ files: messageAttachments, embed: Embed }) + let message = await channel.send({ files: messageAttachments, embed: Embed }) .catch(async () => channel.send(messageAttachments, { embed: Embed })); + messageID[reaction.message.id] = message.id; + + //boardMessage.push({ reactionID: reaction.message.id, boardID: message.id }); } } } diff --git a/event/listeners/messageReactionRemove.js b/event/listeners/messageReactionRemove.js new file mode 100644 index 00000000..0eb0d54a --- /dev/null +++ b/event/listeners/messageReactionRemove.js @@ -0,0 +1,87 @@ +const { Listener } = require('discord-akairo'); +const fs = require('fs'); +let messageID = require('../../json/messageID.json'); // Where reaction.message.id that entered a board will be stocked so it doesn't enter again + +class messageReactionRemoveListener extends Listener { + constructor() { + super('messagereactionremove', { + emitter: 'client', + event: 'messageReactionRemove' + }); + } + + async exec(reaction, user) { + if (reaction.message.author == user) return; + let starboardChannel, shameboardChannel; + + // Starboard + if (fs.existsSync(`./board/star${reaction.message.guild.id}.json`)) { + starboardChannel = require(`../../board/star${reaction.message.guild.id}.json`); + let staremote = starboardChannel.emote; + let starcount = starboardChannel.count; + delete require.cache[require.resolve(`../../board/star${reaction.message.guild.id}.json`)]; // Delete the boardChannel cache so it can reload it next time + + if (this.client.util.resolveEmoji(staremote, reaction.message.guild.emojis)) { + staremote = this.client.util.resolveEmoji(staremote, reaction.message.guild.emojis).name; + } + + if (reaction.emoji.name == staremote && reaction.count < starcount) { + console.log('probably removed by now'); + let channel = this.client.channels.get(starboardChannel.starboard); + let message = await channel.messages.get(messageID[reaction.message.id]); + message.delete(); + } else if (reaction.emoji.name == staremote && reaction.count >= starcount) { + return editEmbed('starboard', staremote, messageID[reaction.message.id], this.client); + } + } + + //Shameboard + if (fs.existsSync(`./board/shame${reaction.message.guild.id}.json`)) { + shameboardChannel = require(`../../board/shame${reaction.message.guild.id}.json`); + let shameemote = shameboardChannel.emote; + let shamecount = shameboardChannel.count; + delete require.cache[require.resolve(`../../board/shame${reaction.message.guild.id}.json`)]; // Delete the boardChannel cache so it can reload it next time + + if (this.client.util.resolveEmoji(shameemote, reaction.message.guild.emojis)) { + shameemote = this.client.util.resolveEmoji(shameemote, reaction.message.guild.emojis).name; + } + + if (reaction.emoji.name == shameemote && reaction.count < shamecount) { + console.log('probably removed by now'); + let channel = this.client.channels.get(shameboardChannel.shameboard); + let message = await channel.messages.get(messageID[reaction.message.id]); + message.delete(); + } else if (reaction.emoji.name == shameemote && reaction.count >= shamecount) { + return editEmbed('shameboard', shameemote, messageID[reaction.message.id], this.client); + } + } + + async function editEmbed(name, emote, boardID, client) { + let channel; + if (name == 'starboard') { + channel = client.channels.get(starboardChannel.starboard); + } else { + channel = client.channels.get(shameboardChannel.shameboard); + } + + let message = await channel.messages.get(boardID); + + let Embed = client.util.embed() + .setColor(reaction.message.member.displayHexColor) + .setAuthor(reaction.message.author.username, reaction.message.author.displayAvatarURL()) + .addField('Jump to', `[message](https://discordapp.com/channels/${reaction.message.guild.id}/${reaction.message.channel.id}/${reaction.message.id})`, true) + .addField('Channel', reaction.message.channel, true) + .setDescription(message.embeds[0].description) + .setFooter(reaction.count + ' ' + emote) + .setTimestamp(); + + if (reaction.message.guild.emojis.find(emoji => emoji.name === emote)) { + Embed.setFooter(reaction.count, reaction.message.guild.emojis.find(emoji => emoji.name === emote).url); + } + + message.edit({ embed: Embed }); + } + } +} + +module.exports = messageReactionRemoveListener; \ No newline at end of file