mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-05-10 20:35:02 +00:00
Migrate Starboard to new Plugin structure
This commit is contained in:
parent
a3d0ec03d9
commit
599a504b17
12 changed files with 443 additions and 0 deletions
|
@ -0,0 +1,74 @@
|
|||
import { starboardEvt } from "../types";
|
||||
import { Message } from "eris";
|
||||
import { UnknownUser, resolveMember, noop } from "src/utils";
|
||||
import { saveMessageToStarboard } from "../util/saveMessageToStarboard";
|
||||
|
||||
export const StarboardReactionAddEvt = starboardEvt({
|
||||
event: "messageReactionAdd",
|
||||
|
||||
async listener(meta) {
|
||||
const pluginData = meta.pluginData;
|
||||
|
||||
let msg = meta.args.message as Message;
|
||||
const userId = meta.args.userID;
|
||||
const emoji = meta.args.emoji;
|
||||
|
||||
if (!msg.author) {
|
||||
// Message is not cached, fetch it
|
||||
try {
|
||||
msg = await msg.channel.getMessage(msg.id);
|
||||
} catch (e) {
|
||||
// Sometimes we get this event for messages we can't fetch with getMessage; ignore silently
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// No self-votes!
|
||||
if (msg.author.id === userId) return;
|
||||
|
||||
const user = await resolveMember(pluginData.client, pluginData.guild, userId);
|
||||
if (user instanceof UnknownUser) return;
|
||||
if (user.bot) return;
|
||||
|
||||
const config = pluginData.config.getMatchingConfig({ member: user, channelId: msg.channel.id });
|
||||
const applicableStarboards = Object.values(config.boards)
|
||||
.filter(board => board.enabled)
|
||||
// Can't star messages in the starboard channel itself
|
||||
.filter(board => board.channel_id !== msg.channel.id)
|
||||
// Matching emoji
|
||||
.filter(board => {
|
||||
return board.star_emoji.some((boardEmoji: string) => {
|
||||
if (emoji.id) {
|
||||
// Custom emoji
|
||||
const customEmojiMatch = boardEmoji.match(/^<?:.+?:(\d+)>?$/);
|
||||
if (customEmojiMatch) {
|
||||
return customEmojiMatch[1] === emoji.id;
|
||||
}
|
||||
|
||||
return boardEmoji === emoji.id;
|
||||
} else {
|
||||
// Unicode emoji
|
||||
return emoji.name === boardEmoji;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
for (const starboard of applicableStarboards) {
|
||||
// Save reaction into the database
|
||||
await pluginData.state.starboardReactions.createStarboardReaction(msg.id, userId).catch(noop);
|
||||
|
||||
// If the message has already been posted to this starboard, we don't need to do anything else
|
||||
const starboardMessages = await pluginData.state.starboardMessages.getMatchingStarboardMessages(
|
||||
starboard.channel_id,
|
||||
msg.id,
|
||||
);
|
||||
if (starboardMessages.length > 0) continue;
|
||||
|
||||
const reactions = await pluginData.state.starboardReactions.getAllReactionsForMessageId(msg.id);
|
||||
const reactionsCount = reactions.length;
|
||||
if (reactionsCount >= starboard.stars_required) {
|
||||
await saveMessageToStarboard(pluginData, msg, starboard);
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue