From 9958b8c0296f4006af9bf9b2c065c22c9d57581d Mon Sep 17 00:00:00 2001 From: night0721 Date: Sat, 18 Sep 2021 17:30:10 +0800 Subject: [PATCH] starboar client --- package.json | 2 +- src/StarboardClient/index.ts | 7 + src/StarboardClient/starboard.interface.ts | 38 ++++++ src/StarboardClient/starboard.ts | 146 +++++++++++++++++++++ src/index.d.ts | 7 + src/index.js | 20 --- 6 files changed, 199 insertions(+), 21 deletions(-) create mode 100644 src/StarboardClient/index.ts create mode 100644 src/StarboardClient/starboard.interface.ts create mode 100644 src/StarboardClient/starboard.ts delete mode 100644 src/index.js diff --git a/package.json b/package.json index 323c2ea..f24afbe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cath", - "version": "1.2.2", + "version": "1.2.5", "description": "A powerful package that can interact with Cath API", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/src/StarboardClient/index.ts b/src/StarboardClient/index.ts new file mode 100644 index 0000000..cf50cbb --- /dev/null +++ b/src/StarboardClient/index.ts @@ -0,0 +1,7 @@ +export { StarboardClient } from "./starboard"; +export { + StarboardClientOptions, + StarboardGuild, + StarboardGuildOptions, + starMessageData, +} from "./starboard.interface"; diff --git a/src/StarboardClient/starboard.interface.ts b/src/StarboardClient/starboard.interface.ts new file mode 100644 index 0000000..9fea1ab --- /dev/null +++ b/src/StarboardClient/starboard.interface.ts @@ -0,0 +1,38 @@ +import { Client, Snowflake, ColorResolvable } from "discord.js"; + +export interface StarboardClientOptions { + /** + * Discord Client + */ + client: Client; + /** + * Color of Embed + */ + color?: ColorResolvable; + /** + * Preload data + */ + Guilds?: StarboardGuild[]; +} + +export interface StarboardGuild { + id: Snowflake; + options: StarboardGuildOptions; +} + +export interface StarboardGuildOptions { + /** + * Amount of stars required in order to be registered as a starred channel + */ + starCount: number; + + /** + * Channel to send starred messages + */ + starboardChannel: Snowflake; +} + +export interface starMessageData { + origin: Snowflake; + id: Snowflake; +} diff --git a/src/StarboardClient/starboard.ts b/src/StarboardClient/starboard.ts new file mode 100644 index 0000000..6d352f8 --- /dev/null +++ b/src/StarboardClient/starboard.ts @@ -0,0 +1,146 @@ +import { + Client, + MessageReaction, + Collection, + Snowflake, + TextChannel, + Message, + MessageEmbed, + MessageOptions, + ColorResolvable, +} from "discord.js"; +import { + starMessageData, + StarboardClientOptions, + StarboardGuild, +} from "./starboard.interface"; + +export class StarboardClient { + public client: Client; + public color: ColorResolvable; + public guilds: StarboardGuild[]; + public cache: Collection = new Collection(); + + constructor(options: StarboardClientOptions) { + this.client = options.client; + this.color = options.color || "RANDOM"; + this.guilds = options.Guilds || []; + this.client.on("ready", () => this.cacheData()); + } + public config = { + guilds: { + set: (StarboardGuilds: StarboardGuild[]) => { + this.guilds = StarboardGuilds; + this.cacheData(); + }, + add: (StarboardGuild: StarboardGuild) => { + const filtered = (this.guilds || []).filter( + x => x.id === StarboardGuild.id + ); + + this.guilds = [...filtered, StarboardGuild]; + this.cacheData(); + }, + }, + }; + private cacheData() { + this.guilds.forEach(async guild => { + const channel = this.client.channels.cache.get( + guild.options.starboardChannel + ) as TextChannel; + if (!channel) return; + const messages = await channel.messages.fetch({ limit: 100 }); + if (!messages) return; + const value = messages.reduce( + (accumulator: starMessageData[], message) => { + if (message.author.id !== this.client.user.id) return accumulator; + const starCount = message.content.match(/(?<=\*\*)\d*(?=\*\*)/)?.[0]; + const origin = message.embeds?.[0]?.footer?.text.match(/\d*/)?.[0]; + if (!starCount || !origin) return accumulator; + const data: starMessageData = { + id: message.id, + origin, + }; + return [...accumulator, data]; + }, + [] + ); + this.cache.set(guild.id, value); + }); + } + private validGuild(guild: Snowflake): Boolean { + return this.guilds.some(x => x.id === guild); + } + private getData(guildId: Snowflake): StarboardGuild { + return this.guilds.find(x => x.id === guildId); + } + private generateEdit(starCount: number, message: Message): MessageOptions { + return { + content: `⭐ **${starCount}** ${message.channel}`, + embeds: [ + new MessageEmbed() + .setAuthor( + message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ) + .setColor(this.color) + .setDescription( + `Content: ${message.content ? message.content : "None"}` + ) + .setThumbnail(message.author.displayAvatarURL({ dynamic: true })) + .addField("Message", `[Jump!](${message.url})`) + .setImage(message.attachments.first()?.url || null) + .setTimestamp(message.createdTimestamp) + .setFooter(message.id), + ], + }; + } + + public async listener(reaction: MessageReaction) { + if (!this.validGuild) return; + if (reaction.message.partial) await reaction.message.fetch(); + if (reaction.partial) await reaction.fetch(); + const { guildId, id } = reaction.message; + if ( + reaction.emoji.name !== "⭐" + // ||reaction.count < this.getData(guildId)?.options.starCount + ) + return; + const data = this.cache.get(guildId) || []; + const starboardChannel = this.client.channels.cache.get( + this.guilds.find(x => x.id === guildId)?.options.starboardChannel + ) as TextChannel; + const getMessage = data.find(x => x.origin === id); + + const generateEdit = this.generateEdit( + reaction.count, + reaction.message as Message + ); + const sendMessage = () => { + starboardChannel?.send(generateEdit).then(m => { + this.cache.set(reaction.message.guildId, [ + ...data, + { id: m.id, origin: reaction.message.id }, + ]); + }); + }; + if (getMessage) { + if (reaction.count === 0) { + setTimeout( + () => + starboardChannel.messages + .fetch(getMessage.id) + .then(async r => await r.delete()), + 10000 + ); + } else { + starboardChannel.messages + .fetch(getMessage.id) + .then(publishedMessage => { + publishedMessage.edit(generateEdit); + }) + .catch(sendMessage); + } + } else sendMessage(); + } +} diff --git a/src/index.d.ts b/src/index.d.ts index fdd8581..2b56404 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -1,2 +1,9 @@ export { CODMClient, CODMClientOptions } from "./CODMClient/index"; +export { + StarboardClient, + StarboardClientOptions, + StarboardGuild, + StarboardGuildOptions, + starMessageData, +} from "./StarboardClient/index"; export { random8ball } from "./functions/8ball"; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 28dba65..0000000 --- a/src/index.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CODMClient = void 0; -// CODMClient -var codmclient_1 = require("./CODMClient/index"); -Object.defineProperty(exports, "CODMClient", { - enumerable: true, - get: function () { - return codmclient_1.CODMClient; - }, -}); -// functions -var _8ball_1 = require("./functions/8ball"); -Object.defineProperty(exports, "random8ball", { - enumerable: true, - get: function () { - return _8ball_1.random8ball; - }, -}); -//# sourceMappingURL=index.js.map