feat: now compatible with kubernetes and docker :3
This commit is contained in:
36
bot/commands/emotes/dl.js
Normal file
36
bot/commands/emotes/dl.js
Normal file
@@ -0,0 +1,36 @@
|
||||
const { SlashCommandBuilder } = require("discord.js");
|
||||
const fs = require('fs/promises');
|
||||
const { EMOTE_DIR } = process.env;
|
||||
|
||||
module.exports = {
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("dl")
|
||||
.setDescription("Downloads the emote input (local).")
|
||||
.addStringOption(option =>
|
||||
option.setName("emotes")
|
||||
.setDescription("The emotes to download.")
|
||||
.setRequired(true)
|
||||
),
|
||||
async execute(interaction) {
|
||||
await interaction.deferReply();
|
||||
|
||||
// this regex matches emotes in the format <:name:id> or <a:n>
|
||||
let emoteIdRegex = /<(?<animated>a?):(?<name>\w{0,22})\w*:(?<id>\d+)>/gm;
|
||||
let replyMessage = "";
|
||||
const input = interaction.options.getString("emotes");
|
||||
// remove duplicates from the emote list
|
||||
let emoteList = input.matchAll(emoteIdRegex);
|
||||
emoteList = [...new Set(emoteList)].join(" ");
|
||||
for (const match of emoteList.matchAll(emoteIdRegex)) {
|
||||
const link = "https://cdn.discordapp.com/emojis/" + match.groups.id + ((match.groups.animated == 'a') ? ".gif": ".webp") + "?quality=lossless";
|
||||
const copyname = match.groups.name + "_FE";
|
||||
const response = await fetch(link);
|
||||
// save the file
|
||||
await fs.writeFile(`${EMOTE_DIR}${copyname}${(match.groups.animated == 'a') ? ".gif": ".webp"}`, response.body);
|
||||
await interaction.editReply(`Dowloaded ${match[0]}!\n`);
|
||||
replyMessage += `Logged ${match[0]}!\n`;
|
||||
}
|
||||
|
||||
await interaction.editReply("Done!");
|
||||
},
|
||||
};
|
43
bot/commands/emotes/emotelog.js
Normal file
43
bot/commands/emotes/emotelog.js
Normal file
@@ -0,0 +1,43 @@
|
||||
const { SlashCommandBuilder } = require("discord.js");
|
||||
|
||||
module.exports = {
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("emotelog")
|
||||
.setDescription("Logs the emote inputted.")
|
||||
.addStringOption(option =>
|
||||
option.setName("emote")
|
||||
.setDescription("The emote to log.")
|
||||
.setRequired(true)
|
||||
),
|
||||
async execute(interaction) {
|
||||
await interaction.deferReply();
|
||||
|
||||
// this regex matches emotes in the format <:name:id> or <a:n>
|
||||
let emoteIdRegex = /<(?<animated>a?):(?<name>\w{0,22})\w*:(?<id>\d+)>/gm;
|
||||
let replyMessage = "";
|
||||
const input = interaction.options.getString("emote");
|
||||
// remove duplicates from the emote list
|
||||
let emoteList = input.matchAll(emoteIdRegex);
|
||||
emoteList = [...new Set(emoteList)].join(" ");
|
||||
for (const match of emoteList.matchAll(emoteIdRegex)) {
|
||||
const link = "https://cdn.discordapp.com/emojis/" + match.groups.id + ((match.groups.animated == 'a') ? ".gif": ".webp") + "?quality=lossless";
|
||||
const copyname = match.groups.name + "_FE";
|
||||
await interaction.guild.emojis.create({attachment: link, name: copyname});
|
||||
await interaction.editReply(`Logged ${match[0]}!\n`);
|
||||
replyMessage += `Logged ${match[0]}!\n`;
|
||||
}
|
||||
|
||||
// add a message to say how many emote spots are left
|
||||
interaction.guild.emojis.fetch()
|
||||
.then(emojis => {
|
||||
let animatedEmojis = emojis.filter(emoji => emoji.animated);
|
||||
replyMessage += `\nAnimated emotes: ${animatedEmojis.size}/50\n`
|
||||
let staticEmojis = emojis.filter(emoji => !emoji.animated);
|
||||
replyMessage += `Static emotes: ${staticEmojis.size}/50\n`
|
||||
interaction.editReply(replyMessage);
|
||||
})
|
||||
.catch(console.error);
|
||||
},
|
||||
};
|
||||
|
||||
// https://cdn.discordapp.com/emojis/1166779045711720541.webp?size=44&quality=lossless
|
27
bot/commands/emotes/list.js
Normal file
27
bot/commands/emotes/list.js
Normal file
@@ -0,0 +1,27 @@
|
||||
const { SlashCommandBuilder } = require("discord.js");
|
||||
|
||||
module.exports = {
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("listemotes")
|
||||
.setDescription("Lists all emotes in the server."),
|
||||
async execute(interaction) {
|
||||
await interaction.reply("Fetching emotes...");
|
||||
let replyMessage = "";
|
||||
interaction.guild.emojis.fetch()
|
||||
.then(emojis => {
|
||||
// we need to make followup messages if the list is too long
|
||||
let emoteList = "";
|
||||
emojis.forEach(emoji => {
|
||||
emoteList += `${emoji} - ${emoji.name}\n`;
|
||||
if (emoteList.length > 1900) {
|
||||
interaction.followUp(emoteList);
|
||||
emoteList = "";
|
||||
}
|
||||
});
|
||||
if (emoteList.length > 0) {
|
||||
interaction.followUp(emoteList);
|
||||
}
|
||||
interaction.followUp("Total emotes: " + emojis.size + "\n");
|
||||
}).catch(console.error);
|
||||
},
|
||||
};
|
29
bot/commands/emotes/rm.js
Normal file
29
bot/commands/emotes/rm.js
Normal file
@@ -0,0 +1,29 @@
|
||||
const { SlashCommandBuilder } = require("discord.js");
|
||||
|
||||
module.exports = {
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("rm")
|
||||
.setDescription("Removes emotes from the server.")
|
||||
.addStringOption(option =>
|
||||
option.setName("emotes")
|
||||
.setDescription("Emotes to remove.")
|
||||
.setRequired(true)),
|
||||
async execute(interaction) {
|
||||
await interaction.reply("Removing emotes...");
|
||||
// find every emote in the message and remove them
|
||||
let emoteList = interaction.options.getString("emotes");
|
||||
let emoteIdRegex = /<(?<animated>a?):(?<name>\w{0,22})\w*:(?<id>\d+)>/gm;
|
||||
let replyMessage = "";
|
||||
for (const match of emoteList.matchAll(emoteIdRegex)) {
|
||||
let emote = interaction.guild.emojis.cache.find(emoji => emoji.id === match.groups.id);
|
||||
if (emote) {
|
||||
await emote.delete();
|
||||
replyMessage += `Removed ${match[0]}!\n`;
|
||||
} else {
|
||||
replyMessage += `Could not find ${match[0]}!\n`;
|
||||
}
|
||||
interaction.editReply(replyMessage);
|
||||
replyMessage = "";
|
||||
}
|
||||
},
|
||||
};
|
27
bot/commands/emotes/stickerlog.js
Normal file
27
bot/commands/emotes/stickerlog.js
Normal file
@@ -0,0 +1,27 @@
|
||||
const { ContextMenuCommandBuilder, ApplicationCommandType, StickerFormatType } = require("discord.js");
|
||||
const fs = require('fs/promises');
|
||||
const { STICKER_DIR } = process.env;
|
||||
|
||||
module.exports = {
|
||||
data : new ContextMenuCommandBuilder()
|
||||
.setName("Sticker Log")
|
||||
.setType(ApplicationCommandType.Message),
|
||||
async execute(interaction) {
|
||||
await interaction.deferReply();
|
||||
|
||||
const sticker = interaction.targetMessage.stickers.first();
|
||||
if (!sticker) {
|
||||
await interaction.editReply("This message does not contain a sticker.");
|
||||
return;
|
||||
}
|
||||
const link = sticker.url;
|
||||
const copyname = sticker.name + "_FE";
|
||||
const response = await fetch(link);
|
||||
const extension = (sticker.format == StickerFormatType.PNG) ? ".png" :
|
||||
(sticker.format == StickerFormatType.APNG) ? ".apng" :
|
||||
(sticker.format == StickerFormatType.LOTTIE) ? ".json" : ".webp";
|
||||
// save the file
|
||||
await fs.writeFile(`${STICKER_DIR}${copyname}${extension}`, response.body);
|
||||
await interaction.editReply(`Dowloaded ${sticker.name}!\n`);
|
||||
}
|
||||
}
|
10
bot/commands/utils/ping.js
Normal file
10
bot/commands/utils/ping.js
Normal file
@@ -0,0 +1,10 @@
|
||||
const { SlashCommandBuilder } = require("discord.js");
|
||||
|
||||
module.exports = {
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("ping")
|
||||
.setDescription("Replies with Pong!"),
|
||||
async execute(interaction) {
|
||||
await interaction.reply("Pong!");
|
||||
},
|
||||
};
|
Reference in New Issue
Block a user