UNPKG

constatic

Version:

Constatic is a CLI for creating and managing modern TypeScript projects, providing an organized structure and features that streamline development.

212 lines (211 loc) 7.26 kB
// src/menus/main/discord/emojis/menu-upload.ts import { discordEmojis, divider, equalsIgnoringCase, log, sleep, uiMessage, withDefaults } from "#helpers"; import { menus } from "#menus"; import { fetchDiscordEmojis } from "#shared/emojis/fetch.js"; import { confirm, input, select } from "@inquirer/prompts"; import ck from "chalk"; import fs from "node:fs/promises"; import path from "node:path"; import ora from "ora"; import { glob } from "tinyglobby"; var u = ck.underline; async function discordEmojisUploadMenu(cli, token) { const emojis = await fetchDiscordEmojis({ cli, token, notCheckAmount: true }); if (!emojis) return; const displayCurrCwd = ck.dim.underline(path.basename(process.cwd()) + "/"); const dirpath = await input(withDefaults({ message: uiMessage({ "pt-BR": `Informe o caminho diretório de imagens `, "en-US": `Provide the image directory path ` }) + `${displayCurrCwd} `, async validate(dirpath2) { const exists = await cli.fs.exists(path.resolve(dirpath2)); if (!exists) { return uiMessage({ "en-US": `${dirpath2} is not a valid path`, "pt-BR": `${dirpath2} não é um caminho válido!` }); } return true; }, default: "./" })); const processing = ora(); processing.start(uiMessage({ "en-US": "\uD83D\uDD0D Searching for files in nested folders...", "pt-BR": "\uD83D\uDD0D Procurando por arquivos nas pastas aninhadas..." })); const paths = await glob("**/*.{png,jpeg,gif}", { cwd: path.resolve(dirpath), absolute: true }); processing.text = uiMessage({ "en-US": "\uD83D\uDDC3️ Getting information from found files...", "pt-BR": "\uD83D\uDDC3️ Obtendo informações dos arquivos encontrados..." }); const data = []; for (const filepath of paths) { const stats = await fs.stat(filepath); const size = Math.ceil(stats.size / 1024); if (size >= 256) continue; const ext = path.extname(filepath); const name = path.basename(filepath, ext); const imagedata = await fs.readFile(filepath, { encoding: "base64" }); const base64 = `data:image/${ext.slice(1)};base64,${imagedata}`; data.push({ base64, name: discordEmojis.formatName(name) }); } processing.stop(); if (!data.length) { log.fail(uiMessage({ "en-US": "No images found in the given directory!", "pt-BR": "Nenhum imagem encontrada no diretório fornecido!" })); menus.discord.emojis.main(cli, token); return; } log.success(uiMessage({ "en-US": `Image files available for upload: ${data.length}`, "pt-BR": `Arquivos de imagens disponíveis para o envio: ${data.length}` })); if (data.length >= 50) { divider(); log.warn(uiMessage({ "en-US": [ "Depending on the amount of files,", "this process may take some time due", "to Discord API rate limitations." ].join(` `), "pt-BR": [ "Dependendo da quantidade de arquivos", "esse processo pode levar algum tempo devido", "às limitações de taxa da API do Discord." ].join(` `) })); divider(); } const proceed = await confirm(withDefaults({ message: uiMessage({ "en-US": "Do you want to confirm the image files upload process?", "pt-BR": "Você quer confirmar o processo de upload dos arquivos de imagem?" }) })); if (!proceed) { await sleep(400); menus.discord.emojis.main(cli, token); return; } const overwrite = await select(withDefaults({ message: uiMessage({ "en-US": "Select the overwrite method", "pt-BR": "Selecione o método de sobrescrição" }), choices: [ { name: ck.green("✎ ") + uiMessage({ "en-US": "Overwrite if exists", "pt-BR": "Sobrescrever se existir" }, ck.green), value: "all" }, { name: ck.cyan("▣ ") + uiMessage({ "en-US": "Ask before overwrite", "pt-BR": "Perguntar antes de sobrescrever" }, ck.cyan), value: "ask" }, { name: ck.blue("◎ ") + uiMessage({ "en-US": "Skip and do not overwrite", "pt-BR": "Pular e não sobrescrever" }, ck.blue), value: "skip" } ] })); for (const { name, base64 } of data) { const emojiName = u.yellow(name); const existing = emojis.find((emoji) => equalsIgnoringCase(emoji.name, name)); if (existing) { const deleteEmoji = async () => { const result2 = await discordEmojis.delete(token, existing.id); if (!result2.success) { log.error(uiMessage({ "en-US": `An error occurred while trying delete the ${emojiName} emoji!`, "pt-BR": `Ocorreu um erro ao tentar excluir o emoji ${emojiName}!` }, ck.red)); } }; switch (overwrite) { case "all": { await deleteEmoji(); break; } case "ask": { log.warn(uiMessage({ "en-US": `An emoji named ${emojiName} already exists!`, "pt-BR": `Um emoji chamado ${emojiName} já existe!` })); const proceed2 = await confirm(withDefaults({ message: uiMessage({ "en-US": `Do you want to overwrite?`, "pt-BR": `Deseja sobrescrever?` }) })); if (!proceed2) continue; await deleteEmoji(); break; } case "skip": { log.custom(ck.yellow("◎"), uiMessage({ "en-US": `${ck.bold.yellow("Skipped")}${emojiName} already exists!`, "pt-BR": `${ck.bold.yellow("Pulado")}${emojiName} já existe!` })); continue; } } } const uploading = ora(); uploading.start(uiMessage({ "en-US": `Uploading emoji ${ck.yellow.underline(name)}`, "pt-BR": `Enviando emoji ${ck.yellow.underline(name)}` })); const result = await discordEmojis.create(token, { image: base64, name }); uploading.stop(); if (!result.success && result.code === 1) { log.fail(uiMessage({ "en-US": `An emoji named ${emojiName} already exists for this application!`, "pt-BR": `Um emoji chamado ${emojiName} já existe para essa aplicação!` }, ck.red)); continue; } if (!result.success) { log.error(uiMessage({ "en-US": `An error occurred while trying ${existing ? "overwrite" : "create"} the ${emojiName} emoji!`, "pt-BR": `Ocorreu um erro ao tentar ${existing ? "sobrescrever" : "criar"} o emoji ${emojiName}!` }, ck.red) + ck.red.dim(result.error)); continue; } log.custom(ck.green("✦"), uiMessage({ "en-US": `${ck.bold.green(existing ? "Overwrited" : "Created")}${emojiName} ${u.dim.green(result.data.id)}`, "pt-BR": `${ck.bold.green(existing ? "Sobrescrito" : "Criado")}${emojiName} ${u.dim.green(result.data.id)}` })); } divider(); log.success(uiMessage({ "en-US": "Uploading process completed!", "pt-BR": "Processo de envio concluído!" }, ck.green)); divider(); await sleep(500); menus.discord.emojis.main(cli, token); } export { discordEmojisUploadMenu };