diff --git a/.gitignore b/.gitignore index 7f1e29d..a3becd9 100644 --- a/.gitignore +++ b/.gitignore @@ -68,4 +68,4 @@ typings/ .env config.json -.vscode/ \ No newline at end of file +.vscode/ diff --git a/src/core/lib.ts b/src/core/lib.ts index 976514f..0c44fbc 100644 --- a/src/core/lib.ts +++ b/src/core/lib.ts @@ -5,6 +5,7 @@ import {get} from "https"; import FileManager from "./storage"; import {eventListeners} from "../events/messageReactionRemove"; import {client} from "../index"; +import {EmoteRegistryDump, EmoteRegistryDumpEntry} from "./structures"; /** A type that describes what the library module does. */ export interface CommonLibrary { @@ -160,6 +161,27 @@ export function botHasPermission(guild: Guild | null, permission: number): boole return !!(client.user && guild?.members.resolve(client.user)?.hasPermission(permission)); } +export function updateGlobalEmoteRegistry(): void { + const data: EmoteRegistryDump = {version: 1, list: []}; + + for (const guild of client.guilds.cache.values()) { + for (const emote of guild.emojis.cache.values()) { + data.list.push({ + ref: emote.name, + id: emote.id, + name: emote.name, + requires_colons: emote.requiresColons || false, + animated: emote.animated, + url: emote.url, + guild_id: emote.guild.name, + guild_name: emote.guild.name + }); + } + } + + FileManager.write("emote-registry", data, true); +} + // Pagination function that allows for customization via a callback. // Define your own pages outside the function because this only manages the actual turning of pages. $.paginate = async ( diff --git a/src/core/structures.ts b/src/core/structures.ts index 1513d0b..0d78e13 100644 --- a/src/core/structures.ts +++ b/src/core/structures.ts @@ -1,7 +1,7 @@ import FileManager from "./storage"; import $, {select, GenericJSON, GenericStructure} from "./lib"; import {watch} from "fs"; -import {Guild as DiscordGuild} from "discord.js"; +import {Guild as DiscordGuild, Snowflake} from "discord.js"; class ConfigStructure extends GenericStructure { public token: string; @@ -106,3 +106,19 @@ if (process.argv[2] === "dev") { export function getPrefix(guild: DiscordGuild | null): string { return Storage.getGuild(guild?.id || "N/A").prefix ?? Config.prefix; } + +export interface EmoteRegistryDumpEntry { + ref: string; + id: Snowflake; + name: string; + requires_colons: boolean; + animated: boolean; + url: string; + guild_id: Snowflake; + guild_name: string; +} + +export interface EmoteRegistryDump { + version: number; + list: EmoteRegistryDumpEntry[]; +} diff --git a/src/events/emojiCreate.ts b/src/events/emojiCreate.ts new file mode 100644 index 0000000..dffd9aa --- /dev/null +++ b/src/events/emojiCreate.ts @@ -0,0 +1,10 @@ +import Event from "../core/event"; +import $ from "../core/lib"; +import {updateGlobalEmoteRegistry} from "../core/lib"; + +export default new Event<"emojiCreate">({ + on(emote) { + $.log(`Updated emote registry. ${emote.name}`); + updateGlobalEmoteRegistry(); + } +}); diff --git a/src/events/emojiDelete.ts b/src/events/emojiDelete.ts new file mode 100644 index 0000000..a3d5d43 --- /dev/null +++ b/src/events/emojiDelete.ts @@ -0,0 +1,10 @@ +import Event from "../core/event"; +import $ from "../core/lib"; +import {updateGlobalEmoteRegistry} from "../core/lib"; + +export default new Event<"emojiDelete">({ + on() { + $.log("Updated emote registry."); + updateGlobalEmoteRegistry(); + } +}); diff --git a/src/events/emojiUpdate.ts b/src/events/emojiUpdate.ts new file mode 100644 index 0000000..a7a8e11 --- /dev/null +++ b/src/events/emojiUpdate.ts @@ -0,0 +1,10 @@ +import Event from "../core/event"; +import $ from "../core/lib"; +import {updateGlobalEmoteRegistry} from "../core/lib"; + +export default new Event<"emojiUpdate">({ + on() { + $.log("Updated emote registry."); + updateGlobalEmoteRegistry(); + } +}); diff --git a/src/events/guildCreate.ts b/src/events/guildCreate.ts new file mode 100644 index 0000000..2820db7 --- /dev/null +++ b/src/events/guildCreate.ts @@ -0,0 +1,10 @@ +import Event from "../core/event"; +import $ from "../core/lib"; +import {updateGlobalEmoteRegistry} from "../core/lib"; + +export default new Event<"guildCreate">({ + on() { + $.log("Updated emote registry."); + updateGlobalEmoteRegistry(); + } +}); diff --git a/src/events/guildDelete.ts b/src/events/guildDelete.ts new file mode 100644 index 0000000..8fed108 --- /dev/null +++ b/src/events/guildDelete.ts @@ -0,0 +1,10 @@ +import Event from "../core/event"; +import $ from "../core/lib"; +import {updateGlobalEmoteRegistry} from "../core/lib"; + +export default new Event<"guildDelete">({ + on() { + $.log("Updated emote registry."); + updateGlobalEmoteRegistry(); + } +}); diff --git a/src/events/ready.ts b/src/events/ready.ts index 9cef5ec..e3fe021 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -2,6 +2,7 @@ import Event from "../core/event"; import {client} from "../index"; import $ from "../core/lib"; import {Config} from "../core/structures"; +import {updateGlobalEmoteRegistry} from "../core/lib"; export default new Event<"ready">({ once() { @@ -12,5 +13,6 @@ export default new Event<"ready">({ name: `${Config.prefix}help` }); } + updateGlobalEmoteRegistry(); } });