Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Starboard function #947

Merged
merged 2 commits into from
Sep 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 5 additions & 51 deletions events/messageReactionAdd.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EmbedBuilder } from "discord.js";
import getStarboardMessage from "../util/getStarboardMessage.js";
import logger from "../util/logger.js";
import globalVars from "../objects/globalVars.json" with { type: "json" };

Expand All @@ -7,6 +7,7 @@ const altboardChannelID = "1234922298255872092"; // Evil starboard
const altboardEmote = "<:nostar:780198211913646130>";
const altboardEmoteID = altboardEmote.replace(/[^0-9]+/g, "");

// VIDEO ???
export default async (client, messageReaction) => {
try {
let boardEmote = starboardEmote;
Expand Down Expand Up @@ -54,66 +55,19 @@ export default async (client, messageReaction) => {
} else {
starLimit = globalVars.starboardLimit;
};
// Check for atached files
let messageImage = null;
let starboardEmbeds = [];
// let seperateFiles = null;
if (targetMessage.attachments.size > 0) {
messageImage = targetMessage.attachments.first().proxyURL;
// Videos can't be embedded unless you're X (formerly Twitter) or YouTube, so they are sent as seperate mesages
// if (messageImage.endsWith(".mp4")) seperateFiles = messageImage;
targetMessage.attachments.forEach(attachment => {
if (attachment.proxyURL !== messageImage) {
let imageEmbed = new EmbedBuilder()
.setImage(attachment.proxyURL)
.setURL(targetMessage.url);
starboardEmbeds.push(imageEmbed);
};
});
};
// Get user's avatar, try to use server avatar, otherwise default to global avatar
let avatar = targetMessage.author.displayAvatarURL(globalVars.displayAvatarSettings);
if (targetMessage.member) avatar = targetMessage.member.displayAvatarURL(globalVars.displayAvatarSettings);
// Check if the starred message is replying to another message
let isReply = false;
let replyMessage = null;
let replyString = "";
if (targetMessage.reference) isReply = true;
if (isReply) {
try {
// Format message the starred message is replying to
replyMessage = await targetMessage.channel.messages.fetch(targetMessage.reference.messageId);
if (replyMessage.content.length > 0) replyString += `"${replyMessage.content.slice(0, 950)}"`;
if (replyMessage.author) replyString += `\n-${replyMessage.author}`;
} catch (e) {
isReply = false;
};
};
// Format the starboard embed message
const starEmbed = new EmbedBuilder()
.setColor(globalVars.embedColor)
.setTitle(`${boardEmote}${messageReaction.count}`)
.setURL(targetMessage.url)
.setThumbnail(avatar)
.setImage(messageImage)
.setFooter({ text: targetMessage.author.username })
.setTimestamp(targetMessage.createdTimestamp);
if (targetMessage.content) starEmbed.setDescription(targetMessage.content);
starEmbed.addFields([{ name: `Sent:`, value: `By ${targetMessage.author} in ${targetMessage.channel}\nContext: ${targetMessage.url}`, inline: false }]);
if (isReply && replyString.length > 0) starEmbed.addFields([{ name: `Replying to:`, value: replyString, inline: true }]);
starboardEmbeds.unshift(starEmbed);
let starboardMessage = await getStarboardMessage({ messageReaction: messageReaction, targetMessage: targetMessage, boardEmote: boardEmote });
// Check if message already existed in database (was posted to starboard) or if star amount simply changed
if (messageReaction.count >= starLimit && !messageDB) {
// Send message then push data to database
await starboard.send({ embeds: starboardEmbeds }).then(async (m) => await serverApi.StarboardMessages.upsert({ channel_id: targetMessage.channel.id, message_id: targetMessage.id, starboard_channel_id: m.channel.id, starboard_message_id: m.id }));
await starboard.send(starboardMessage).then(async (m) => await serverApi.StarboardMessages.upsert({ channel_id: targetMessage.channel.id, message_id: targetMessage.id, starboard_channel_id: m.channel.id, starboard_message_id: m.id }));
return;
} else if (messageDB) {
// Update existing starboard message and database entry
let starChannel = await client.channels.fetch(messageDB.starboard_channel_id);
let starMessage = await starChannel.messages.fetch(messageDB.starboard_message_id);
if (!starMessage) return;
if (starChannel !== starboard) return; // Fix cross-updating between starboard and evil starboard
await starMessage.edit({ embeds: starboardEmbeds });
await starMessage.edit(starboardMessage);
// Try to pin messages with double stars
if (messageReaction.count >= starLimit * 2) starMessage.pin().catch(e => {
// console.log(e);
Expand Down
47 changes: 3 additions & 44 deletions events/messageReactionRemove.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EmbedBuilder } from "discord.js";
import getStarboardMessage from "../util/getStarboardMessage.js";
import logger from "../util/logger.js";
import globalVars from "../objects/globalVars.json" with { type: "json" };

Expand Down Expand Up @@ -32,48 +32,7 @@ export default async (client, messageReaction) => {
if (targetMessage.channel == starboard) return;
// Try to find the starred message in database
let messageDB = await serverApi.StarboardMessages.findOne({ where: { channel_id: targetMessage.channel.id, message_id: targetMessage.id } });
// Get attachment, don't need to check videos since those are in seperate message anyways
let messageImage = null;
let starboardEmbeds = [];
if (targetMessage.attachments.size > 0) {
messageImage = targetMessage.attachments.first().proxyURL;
targetMessage.attachments.forEach(attachment => {
if (attachment.proxyURL !== messageImage) {
let imageEmbed = new EmbedBuilder()
.setImage(attachment.proxyURL)
.setURL(targetMessage.url);
starboardEmbeds.push(imageEmbed);
};
});
};
// Get user's avatar, try to use server avatar, otherwise default to global avatar
let avatar = targetMessage.author.displayAvatarURL(globalVars.displayAvatarSettings);
if (targetMessage.member) avatar = targetMessage.member.displayAvatarURL(globalVars.displayAvatarSettings);
// Check if the starred message is replying to another message
let isReply = false;
let replyMessage;
if (targetMessage.reference) isReply = true;
if (isReply) {
// Format message the starred message is replying to
try {
replyMessage = await targetMessage.channel.messages.fetch(targetMessage.reference.messageId);
} catch (e) {
isReply = false;
};
};
// Format starred message embed
const starEmbed = new EmbedBuilder()
.setColor(globalVars.embedColor)
.setTitle(`${boardEmote}${messageReaction.count}`)
.setURL(targetMessage.url)
.setThumbnail(avatar)
.setImage(messageImage)
.setFooter({ text: targetMessage.author.username })
.setTimestamp(targetMessage.createdTimestamp);
if (targetMessage.content) starEmbed.setDescription(targetMessage.content);
starEmbed.addFields([{ name: `Sent:`, value: `By ${targetMessage.author} in ${targetMessage.channel}\nContext: ${targetMessage.url}`, inline: false }]);
if (isReply && replyMessage && replyMessage.author && replyMessage.content.length > 0) starEmbed.addFields([{ name: `Replying to:`, value: `"${replyMessage.content.slice(0, 950)}"\n-${replyMessage.author}`, inline: true }]);
starboardEmbeds.unshift(starEmbed);
let starboardMessage = await getStarboardMessage({ messageReaction: messageReaction, targetMessage: targetMessage, boardEmote: boardEmote });
if (messageReaction.count == 0 && messageDB) {
// If star amount is 0 now, delete starboard message and database entry
let starChannel = await client.channels.fetch(messageDB.starboard_channel_id);
Expand All @@ -88,7 +47,7 @@ export default async (client, messageReaction) => {
let starMessage = await starChannel.messages.fetch(messageDB.starboard_message_id);
if (!starMessage) return;
if (starChannel !== starboard) return; // Fix cross-updating between starboard and evil starboard
await starMessage.edit({ embeds: starboardEmbeds });
await starMessage.edit(starboardMessage);
return;
} else {
return;
Expand Down
58 changes: 58 additions & 0 deletions util/getStarboardMessage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import {
EmbedBuilder
} from "discord.js";
import globalVars from "../objects/globalVars.json" with { type: "json" };

export default async ({ messageReaction, targetMessage, boardEmote }) => {
// Check for atached files
let attachmentsTitle = "Attachments:";
let messageImage = null;
let starboardEmbeds = [];
// let seperateFiles = null;
if (targetMessage.attachments.size > 0) {
attachmentsTitle += ` (${targetMessage.attachments.size})`;
messageImage = targetMessage.attachments.first().proxyURL;
// Videos can't be embedded unless you're X (formerly Twitter) or YouTube, so they are sent as seperate mesages
// if (messageImage.endsWith(".mp4")) seperateFiles = messageImage;
targetMessage.attachments.forEach(attachment => {
if (attachment.proxyURL !== messageImage) {
let imageEmbed = new EmbedBuilder()
.setImage(attachment.proxyURL)
.setURL(targetMessage.url);
starboardEmbeds.push(imageEmbed);
};
});
};
// Get user's avatar, try to use server avatar, otherwise default to global avatar
let avatar = targetMessage.author.displayAvatarURL(globalVars.displayAvatarSettings);
if (targetMessage.member) avatar = targetMessage.member.displayAvatarURL(globalVars.displayAvatarSettings);
// Check if the starred message is replying to another message
let isReply = false;
let replyMessage = null;
let replyString = "";
if (targetMessage.reference) isReply = true;
if (isReply) {
try {
// Format message the starred message is replying to
replyMessage = await targetMessage.channel.messages.fetch(targetMessage.reference.messageId);
if (replyMessage.content.length > 0) replyString += `"${replyMessage.content.slice(0, 950)}"`;
if (replyMessage.author) replyString += `\n-${replyMessage.author}`;
} catch (e) {
isReply = false;
};
};
// Format the starboard embed message
const starEmbed = new EmbedBuilder()
.setColor(globalVars.embedColor)
.setTitle(`${boardEmote}${messageReaction.count}`)
.setURL(targetMessage.url)
.setThumbnail(avatar)
.setImage(messageImage)
.setFooter({ text: targetMessage.author.username })
.setTimestamp(targetMessage.createdTimestamp);
if (targetMessage.content) starEmbed.setDescription(targetMessage.content);
starEmbed.addFields([{ name: `Sent:`, value: `By ${targetMessage.author} in ${targetMessage.channel}\nContext: ${targetMessage.url}`, inline: false }]);
if (isReply && replyString.length > 0) starEmbed.addFields([{ name: `Replying to:`, value: replyString, inline: true }]);
starboardEmbeds.unshift(starEmbed);
return { embeds: starboardEmbeds };
};