starboar client
This commit is contained in:
parent
5b3e43e98c
commit
9958b8c029
6 changed files with 199 additions and 21 deletions
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "cath",
|
"name": "cath",
|
||||||
"version": "1.2.2",
|
"version": "1.2.5",
|
||||||
"description": "A powerful package that can interact with Cath API",
|
"description": "A powerful package that can interact with Cath API",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
|
|
7
src/StarboardClient/index.ts
Normal file
7
src/StarboardClient/index.ts
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
export { StarboardClient } from "./starboard";
|
||||||
|
export {
|
||||||
|
StarboardClientOptions,
|
||||||
|
StarboardGuild,
|
||||||
|
StarboardGuildOptions,
|
||||||
|
starMessageData,
|
||||||
|
} from "./starboard.interface";
|
38
src/StarboardClient/starboard.interface.ts
Normal file
38
src/StarboardClient/starboard.interface.ts
Normal file
|
@ -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;
|
||||||
|
}
|
146
src/StarboardClient/starboard.ts
Normal file
146
src/StarboardClient/starboard.ts
Normal file
|
@ -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<Snowflake, starMessageData[]> = 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();
|
||||||
|
}
|
||||||
|
}
|
7
src/index.d.ts
vendored
7
src/index.d.ts
vendored
|
@ -1,2 +1,9 @@
|
||||||
export { CODMClient, CODMClientOptions } from "./CODMClient/index";
|
export { CODMClient, CODMClientOptions } from "./CODMClient/index";
|
||||||
|
export {
|
||||||
|
StarboardClient,
|
||||||
|
StarboardClientOptions,
|
||||||
|
StarboardGuild,
|
||||||
|
StarboardGuildOptions,
|
||||||
|
starMessageData,
|
||||||
|
} from "./StarboardClient/index";
|
||||||
export { random8ball } from "./functions/8ball";
|
export { random8ball } from "./functions/8ball";
|
||||||
|
|
20
src/index.js
20
src/index.js
|
@ -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
|
|
Loading…
Reference in a new issue