UNPKG

deleo

Version:

Deleo, a TypeScript-based CLI tool, simplifies Discord content management by enabling efficient deletion of messages in open DMs or specific channels.

176 lines (175 loc) 10.9 kB
#! /usr/bin/env node "use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }); const e = require("@sapphire/result"), r = _interop_require_default(require("chalk")), o = require("commander"), a = _interop_require_default(require("inquirer")), t = require("./core"), s = require("./shared"), n = require("./shared/prompts"), l = require("./shared/utils"), i = require("../package.json"); function _interop_require_default(e) { return e && e.__esModule ? e : { default: e }; } const g = new o.Command(); g.name("deleo").description(i.description).version(i.version, "-v, --version", "Output the current version").option("-t, --token <token>", "Your discord token").option("--verbose", "Enable verbose logging (disables progress bar)").option("--check-updates", "Check for updates", !0).helpCommand("help [command]", "Display help for command").helpOption("-h, --help", "Display help for command"), g.command("delete").description("Delete messages from open DMs or a specified channel.").option("-d, --delete-delay <delay>", "Delay between each message deletion in ms", "300").option("--close-dms", "Close DMs after deleting messages").action(async (o)=>{ s.Logger.banner(); let d = { ...g.opts(), ...o }; d.checkUpdates && await (0, l.isUpdated)(i.version); let p = new t.DeleoClient(d), c = await p.getToken(); c.isErr() && (s.Logger.error(c.unwrapErr()), process.exit()), p.on("ready", async ()=>{ s.Logger.success(`Logged in as ${p.user?.tag}!`); let { option: o } = await a.default.prompt({ name: "option", type: "list", message: (0, r.default)`{white Select an option {rgb(237,112,20).bold >>}}`, prefix: s.Logger.tag, choices: [ { name: "Delete messages from open DMs", value: "deleteMessagesFromOpenedDMs" }, { name: "Delete all messages from a guild", value: "deleteMessagesFromGuild" }, { name: "Delete all messages from a specified channel", value: "deleteMessagesFromChannel" } ] }); switch(o){ case "deleteMessagesFromOpenedDMs": { let e = p.channels.cache.filter((e)=>[ "DM", "GROUP_DM" ].includes(e.type)), o = await (0, n.checkbox)({ message: (0, r.default)`{white Select the channels you want to delete messages from {rgb(237,112,20).bold >>}}`, prefix: s.Logger.tag, default: e.map((e)=>e.id), choices: e.map((e)=>({ name: (0, l.getChannelName)(e), value: e.id })), transformer: (e)=>(0, r.default)`{cyan Selected {bold ${e.length}} ${(0, l.pluralize)("channel", e.length)}}` }); 0 === o.length && (s.Logger.error("You must select at least one channel."), process.exit()), console.log(); let a = await p.deleteMessagesFromChannels(o); a.isErr() && (s.Logger.error("Something went wrong while deleting messages."), console.log(a.unwrapErr()), process.exit()); } break; case "deleteMessagesFromChannel": { let { channelId: e } = await a.default.prompt({ name: "channelId", type: "input", message: (0, r.default)`{white Enter the channel id {rgb(237,112,20).bold >>}}`, prefix: s.Logger.tag, transformer: (e)=>e }); console.log(); let o = await p.deleteMessagesFromChannel(e); o.isErr() && (s.Logger.error("Something went wrong while deleting messages."), console.log(o.unwrapErr()), process.exit()); } break; case "deleteMessagesFromGuild": { let { guildId: o } = await a.default.prompt({ name: "guildId", type: "input", message: (0, r.default)`{white Enter the guild id {rgb(237,112,20).bold >>}}`, prefix: s.Logger.tag, transformer: (e)=>e }); console.log(); let t = await e.Result.fromAsync(()=>p.guilds.fetch(o)); t.isErr() && (s.Logger.error("Invalid guild ID provided."), process.exit()); let i = t.unwrap(), g = await e.Result.fromAsync(()=>i.channels.fetch()); g.isErr() && (s.Logger.error("Something went wrong while fetching guild channels."), process.exit()); let d = g.unwrap().filter((e)=>e?.viewable && e?.isText()), c = await (0, n.checkbox)({ message: (0, r.default)`{white Select the channels you want to delete messages from {rgb(237,112,20).bold >>}}`, prefix: s.Logger.tag, default: d.map((e)=>e.id), choices: d.map((e)=>({ name: e.name, value: e.id })), transformer: (e)=>(0, r.default)`{cyan Selected {bold ${e.length}} ${(0, l.pluralize)("channel", e.length)}}` }); 0 === c.length && (s.Logger.error("You must select at least one channel."), process.exit()), console.log(), (await p.deleteMessagesFromChannels(c)).isErr() && (s.Logger.error("Something went wrong while deleting messages."), process.exit()); } } s.Logger.success("Done!"), p.destroy(), process.exit(); }), p.deleter.on(t.MessageDeleterEvents.Ready, (e)=>{ s.Logger.log((0, r.default)`{white Deleting an approximate total of {yellow.bold ${p.deleter.approximateTotal}} ${(0, l.pluralize)("message", p.deleter.approximateTotal)} from {yellow.bold ${(0, l.getChannelName)(e)}}}`), d.verbose || p.progress.start(p.deleter.approximateTotal, 0); }), p.deleter.on(t.MessageDeleterEvents.Delete, (e)=>{ d.verbose ? s.Logger.log((0, r.default)`{white Deleted {yellow.bold ${e.id}} - ${e.author.tag}: ${(0, l.truncate)(e.content, 20)}}`) : p.progress.increment(); }), p.deleter.on(t.MessageDeleterEvents.FailedDelete, (e)=>{ d.verbose ? s.Logger.error(`Failed to delete message ${e.id}.`) : p.progress.increment(); }), p.deleter.on(t.MessageDeleterEvents.Done, async (e)=>{ d.verbose || (p.progress.update(p.deleter.approximateTotal), p.progress.stop()), d.closeDms && "DM" === e.type && (d.verbose && s.Logger.log((0, r.default)`{white Closing DM with {yellow.bold ${e.recipient.tag}}}`), await p.users.deleteDM(e.recipient.id).catch(()=>null)), console.log(); }); try { s.Logger.warn("Logging in..."), await p.login(c.unwrap()); } catch (e) { s.Logger.error("Invalid token."), process.exit(); } }), g.command("open").description("Opens all DMs provided by the Discord Data Package.").option("--open-delay <delay>", "Delay between each DM open in ms", "300").action(async (e)=>{ s.Logger.banner(); let o = { ...g.opts(), ...e }; o.checkUpdates && await (0, l.isUpdated)(i.version); let n = new t.DeleoClient(o), d = await n.getToken(); d.isErr() && (s.Logger.error(d.unwrapErr()), process.exit()), n.on("ready", async ()=>{ s.Logger.success(`Logged in as ${n.user?.tag}!`); let { packageDataFolder: e } = await a.default.prompt({ name: "packageDataFolder", type: "input", message: (0, r.default)`{white Enter the path to the Discord Data Package {rgb(237,112,20).bold messages} folder {rgb(237,112,20).bold >>}}`, prefix: s.Logger.tag, transformer: (e)=>e }); console.log(); let o = await n.packageOpener.readPackage(e); o.isErr() && (s.Logger.error("Failed to read the Discord Data Package."), process.exit()); let t = await n.packageOpener.openChannels(o.unwrap()); t.isErr() && (s.Logger.error("Something went wrong while opening the channels."), console.log(t.unwrapErr()), process.exit()), s.Logger.success("Done!"), n.destroy(), process.exit(); }), n.packageOpener.on(t.PackageOpenerEvents.Ready, (e)=>{ s.Logger.log((0, r.default)`{white Opening a total of {yellow.bold ${e.length}} ${(0, l.pluralize)("channel", e.length)}}`), o.verbose || n.progress.start(e.length, 0); }), n.packageOpener.on(t.PackageOpenerEvents.Load, (e)=>{ o.verbose && s.Logger.log((0, r.default)`{white Loaded {yellow.bold ${e.id}}}`); }), n.packageOpener.on(t.PackageOpenerEvents.FailedToLoad, (e)=>{ o.verbose && s.Logger.error((0, r.default)`{white Failed to load {yellow.bold ${e}}}`); }), n.packageOpener.on(t.PackageOpenerEvents.Open, (e)=>{ o.verbose ? s.Logger.log((0, r.default)`{white Opened {yellow.bold ${e.id}} - ${(0, l.getChannelName)(e)}}`) : n.progress.increment(); }), n.packageOpener.on(t.PackageOpenerEvents.FailedToOpen, (e)=>{ o.verbose ? s.Logger.error((0, r.default)`{white Failed to open {yellow.bold ${e.id}}}`) : n.progress.increment(); }), n.packageOpener.on(t.PackageOpenerEvents.Done, (e)=>{ o.verbose || (n.progress.update(e.length), n.progress.stop()), console.log(); }); try { s.Logger.warn("Logging in..."), await n.login(d.unwrap()); } catch (e) { s.Logger.error("Invalid token."), process.exit(); } }), g.command("auth").description("Save your discord token.").argument("<token>", "Your discord token").action(async (e)=>{ if (s.Logger.banner(), g.opts().checkUpdates && await (0, l.isUpdated)(i.version), (await t.AuthManager.getToken()).isOk()) { let { confirm: o } = await a.default.prompt({ name: "confirm", type: "confirm", message: (0, r.default)`{white Are you sure you want to overwrite your saved token?}`, prefix: s.Logger.tag }); if (!o) return; let n = await t.AuthManager.setToken(e); n.isErr() && (s.Logger.error(n.unwrapErr()), process.exit()), s.Logger.success("Successfully saved the new token!"); } else { let r = await t.AuthManager.setToken(e); r.isErr() && (s.Logger.error(r.unwrapErr()), process.exit()), s.Logger.success("Successfully saved the token!"); } }), g.parse(process.argv);