diff --git a/backend/src/plugins/Utility/UtilityPlugin.ts b/backend/src/plugins/Utility/UtilityPlugin.ts index 75651374..2da3f28f 100644 --- a/backend/src/plugins/Utility/UtilityPlugin.ts +++ b/backend/src/plugins/Utility/UtilityPlugin.ts @@ -20,6 +20,11 @@ import { VcmoveCmd } from "./commands/VcmoveCmd"; import { HelpCmd } from "./commands/HelpCmd"; import { AboutCmd } from "./commands/AboutCmd"; import { PluginOptions } from "knub"; +import { activeReloads } from "./guildReloads"; +import { sendSuccessMessage } from "../../pluginUtils"; +import { ReloadGuildCmd } from "./commands/ReloadGuildCmd"; +import { JumboCmd } from "./commands/JumboCmd"; +import { AvatarCmd } from "./commands/AvatarCmd"; const defaultOptions: PluginOptions = { config: { @@ -91,9 +96,14 @@ export const UtilityPlugin = zeppelinPlugin()("utility", { VcmoveCmd, HelpCmd, AboutCmd, + ReloadGuildCmd, + JumboCmd, + AvatarCmd, ], - onLoad({ state, guild }) { + onLoad(pluginData) { + const { state, guild } = pluginData; + state.logs = new GuildLogs(guild.id); state.cases = GuildCases.getGuildInstance(guild.id); state.savedMessages = GuildSavedMessages.getGuildInstance(guild.id); @@ -101,5 +111,10 @@ export const UtilityPlugin = zeppelinPlugin()("utility", { state.supporters = new Supporters(); state.lastReload = Date.now(); + + if (activeReloads.has(guild.id)) { + sendSuccessMessage(pluginData, activeReloads.get(guild.id), "Reloaded!"); + activeReloads.delete(guild.id); + } }, }); diff --git a/backend/src/plugins/Utility/commands/AvatarCmd.ts b/backend/src/plugins/Utility/commands/AvatarCmd.ts new file mode 100644 index 00000000..636942c2 --- /dev/null +++ b/backend/src/plugins/Utility/commands/AvatarCmd.ts @@ -0,0 +1,31 @@ +import { utilityCmd } from "../types"; +import { commandTypeHelpers as ct } from "../../../commandTypes"; +import { downloadFile, messageLink, SECONDS, UnknownUser } from "../../../utils"; +import { sendErrorMessage } from "../../../pluginUtils"; +import { EmbedOptions, TextChannel } from "eris"; +import { activeReloads } from "../guildReloads"; + +export const AvatarCmd = utilityCmd({ + trigger: "avatar", + description: "Retrieves a user's profile picture", + permission: "can_avatar", + + signature: { + user: ct.resolvedUserLoose(), + }, + + async run({ message: msg, args, pluginData }) { + const user = args.user || msg.author; + if (!(user instanceof UnknownUser)) { + const extention = user.avatarURL.slice(user.avatarURL.lastIndexOf("."), user.avatarURL.lastIndexOf("?")); + const avatarUrl = user.avatarURL.slice(0, user.avatarURL.lastIndexOf(".")); + const embed: EmbedOptions = { + image: { url: avatarUrl + `${extention}?size=2048` }, + }; + embed.title = `Avatar of ${user.username}#${user.discriminator}:`; + msg.channel.createMessage({ embed }); + } else { + sendErrorMessage(pluginData, msg.channel, "Invalid user ID"); + } + }, +}); diff --git a/backend/src/plugins/Utility/commands/JumboCmd.ts b/backend/src/plugins/Utility/commands/JumboCmd.ts new file mode 100644 index 00000000..4b34d492 --- /dev/null +++ b/backend/src/plugins/Utility/commands/JumboCmd.ts @@ -0,0 +1,85 @@ +import { utilityCmd } from "../types"; +import { commandTypeHelpers as ct } from "../../../commandTypes"; +import { downloadFile, messageLink, SECONDS } from "../../../utils"; +import { sendErrorMessage } from "../../../pluginUtils"; +import { TextChannel } from "eris"; +import { activeReloads } from "../guildReloads"; +import fs from "fs"; +import sharp from "sharp"; +import twemoji from "twemoji"; + +const fsp = fs.promises; + +async function getBufferFromUrl(url: string): Promise { + const downloadedEmoji = await downloadFile(url); + return fsp.readFile(downloadedEmoji.path); +} + +async function resizeBuffer(input: Buffer, width: number, height: number): Promise { + return sharp(input, { density: 800 }) + .resize(width, height, { + fit: "inside", + }) + .toBuffer(); +} + +const CDN_URL = "https://twemoji.maxcdn.com/2/svg"; + +export const JumboCmd = utilityCmd({ + trigger: "jumbo", + description: "Makes an emoji jumbo", + permission: "can_jumbo", + cooldown: 5 * SECONDS, + + signature: { + emoji: ct.string(), + }, + + async run({ message: msg, args, pluginData }) { + // Get emoji url + const config = pluginData.config.get(); + const size = config.jumbo_size > 2048 ? 2048 : config.jumbo_size; + const emojiRegex = new RegExp(`(<.*:).*:(\\d+)`); + const results = emojiRegex.exec(args.emoji); + let extention = ".png"; + let file; + + if (results) { + let url = "https://cdn.discordapp.com/emojis/"; + if (results[1] === " = new Map();