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
JavaScript
;
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);