Remove delay parameter, change argument handling, make help command show proper flag types
This commit is contained in:
parent
28f0245652
commit
6b34cb9d9e
63 changed files with 82 additions and 219 deletions
|
|
@ -2,7 +2,7 @@ import Command from "../../classes/command.js";
|
|||
|
||||
class DiceCommand extends Command {
|
||||
async run() {
|
||||
const max = this.type === "classic" ? parseInt(this.args[0]) : this.options.max;
|
||||
const max = this.options.max ?? parseInt(this.args[0]);
|
||||
if (!max) {
|
||||
return `🎲 The dice landed on ${Math.floor(Math.random() * 6) + 1}.`;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import ImageCommand from "../../classes/imageCommand.js";
|
|||
class HomebrewCommand extends ImageCommand {
|
||||
params() {
|
||||
return {
|
||||
caption: (this.type === "classic" ? this.args.join(" ") : this.options.text).toLowerCase().replaceAll("\n", " ")
|
||||
caption: (this.options.text ?? this.args.join(" ")).toLowerCase().replaceAll("\n", " ")
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import ImageCommand from "../../classes/imageCommand.js";
|
|||
|
||||
class SonicCommand extends ImageCommand {
|
||||
params() {
|
||||
const cleanedMessage = (this.type === "classic" ? this.args.join(" ") : this.options.text).replaceAll("&", "\\&").replaceAll(">", "\\>").replaceAll("<", "\\<").replaceAll("\"", "\\"").replaceAll("'", "\\'").replaceAll("%", "\\%");
|
||||
const cleanedMessage = (this.options.text ?? this.args.join(" ")).replaceAll("&", "\\&").replaceAll(">", "\\>").replaceAll("<", "\\<").replaceAll("\"", "\\"").replaceAll("'", "\\'").replaceAll("%", "\\%");
|
||||
return {
|
||||
text: cleanedMessage
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ class Base64Command extends Command {
|
|||
if (this.type === "classic" && this.args.length === 0) return "You need to provide whether you want to encode or decode the text!";
|
||||
const command = this.type === "classic" ? this.args[0].toLowerCase() : this.optionsArray[0].name.toLowerCase();
|
||||
if (command !== "decode" && command !== "encode") return "You need to provide whether you want to encode or decode the text!";
|
||||
const string = this.type === "classic" ? this.args.slice(1).join(" ") : this.options.text;
|
||||
const string = this.options.text ?? this.args.slice(1).join(" ");
|
||||
if (!string || !string.trim()) return `You need to provide a string to ${command}!`;
|
||||
if (command === "decode") {
|
||||
const b64Decoded = Buffer.from(string, "base64").toString("utf8");
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ class BroadcastCommand extends Command {
|
|||
return new Promise((resolve) => {
|
||||
const owners = process.env.OWNER.split(",");
|
||||
if (!owners.includes(this.author.id)) return "Only the bot owner can broadcast messages!";
|
||||
const message = this.type === "classic" ? this.args.join(" ") : this.options.message;
|
||||
const message = this.options.message ?? this.args.join(" ");
|
||||
if (message && message.trim()) {
|
||||
this.ipc.broadcast("playbroadcast", message);
|
||||
this.ipc.register("broadcastSuccess", () => {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import Command from "../../classes/command.js";
|
|||
|
||||
class EmoteCommand extends Command {
|
||||
async run() {
|
||||
const emoji = this.type === "classic" ? this.content : this.options.emoji;
|
||||
const emoji = this.options.emoji ?? this.content;
|
||||
if (!emoji || !emoji.trim()) return "You need to provide an emoji!";
|
||||
if (emoji.split(" ")[0].match(/^<a?:.+:\d+>$/)) {
|
||||
return `https://cdn.discordapp.com/emojis/${emoji.split(" ")[0].replace(/^<(a)?:.+:(\d+)>$/, "$2")}.${emoji.split(" ")[0].replace(/^<(a)?:.+:(\d+)>$/, "$1") === "a" ? "gif" : "png"}`;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ class EvalCommand extends Command {
|
|||
const owners = process.env.OWNER.split(",");
|
||||
if (!owners.includes(this.author.id)) return "Only the bot owner can use eval!";
|
||||
await this.acknowledge();
|
||||
const code = this.type === "classic" ? this.args.join(" ") : this.options.code;
|
||||
const code = this.options.code ?? this.args.join(" ");
|
||||
try {
|
||||
const evaled = eval(code);
|
||||
const cleaned = await clean(evaled);
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ class ExecCommand extends Command {
|
|||
const owners = process.env.OWNER.split(",");
|
||||
if (!owners.includes(this.author.id)) return "Only the bot owner can use exec!";
|
||||
await this.acknowledge();
|
||||
const code = this.type === "classic" ? this.args.join(" ") : this.options.cmd;
|
||||
const code = this.options.cmd ?? this.args.join(" ");
|
||||
try {
|
||||
const execed = await exec(code);
|
||||
if (execed.stderr) return `\`ERROR\` \`\`\`xl\n${await clean(execed.stderr)}\n\`\`\``;
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import { Constants } from "eris";
|
||||
import database from "../../utils/database.js";
|
||||
import * as collections from "../../utils/collections.js";
|
||||
import { random } from "../../utils/misc.js";
|
||||
|
|
@ -5,6 +6,7 @@ import paginator from "../../utils/pagination/pagination.js";
|
|||
import * as help from "../../utils/help.js";
|
||||
import Command from "../../classes/command.js";
|
||||
const tips = ["You can change the bot's prefix using the prefix command.", "Image commands also work with images previously posted in that channel.", "You can use the tags commands to save things for later use.", "You can visit https://projectlounge.pw/esmBot/help.html for a web version of this command list.", "You can view a command's aliases by putting the command name after the help command (e.g. help image).", "Parameters wrapped in [] are required, while parameters wrapped in {} are optional.", "esmBot is hosted and paid for completely out-of-pocket by the main developer. If you want to support development, please consider donating! https://patreon.com/TheEssem", "You can run commands in DMs as well, just message the bot with your command - no prefix needed!"];
|
||||
const argTypes = Object.keys(Constants.ApplicationCommandOptionTypes);
|
||||
|
||||
class HelpCommand extends Command {
|
||||
async run() {
|
||||
|
|
@ -40,12 +42,15 @@ class HelpCommand extends Command {
|
|||
if (info.flags.length !== 0) {
|
||||
const flagInfo = [];
|
||||
for (const flag of info.flags) {
|
||||
flagInfo.push(`\`--${flag.name}${flag.type ? `=[${flag.type}]` : ""}\` - ${flag.description}`);
|
||||
if (flag.type === 1) continue;
|
||||
flagInfo.push(`\`--${flag.name}${flag.type ? `=[${argTypes[flag.type - 1]}]` : ""}\` - ${flag.description}`);
|
||||
}
|
||||
if (flagInfo.length !== 0) {
|
||||
embed.embeds[0].fields.push({
|
||||
"name": "Flags",
|
||||
"value": flagInfo.join("\n")
|
||||
});
|
||||
}
|
||||
embed.embeds[0].fields.push({
|
||||
"name": "Flags",
|
||||
"value": flagInfo.join("\n")
|
||||
});
|
||||
}
|
||||
return embed;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import Command from "../../classes/command.js";
|
|||
class ImageSearchCommand extends Command {
|
||||
async run() {
|
||||
if (this.channel.guild && !this.channel.permissionsOf(this.client.user.id).has("embedLinks")) return "I don't have the `Embed Links` permission!";
|
||||
const query = this.type === "classic" ? this.args.join(" ") : this.options.query;
|
||||
const query = this.options.query ?? this.args.join(" ");
|
||||
if (!query || !query.trim()) return "You need to provide something to search for!";
|
||||
await this.acknowledge();
|
||||
const embeds = [];
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import Command from "../../classes/command.js";
|
|||
class LengthenCommand extends Command {
|
||||
async run() {
|
||||
await this.acknowledge();
|
||||
const input = this.type === "classic" ? this.args.join(" ") : this.options.url;
|
||||
const input = this.options.url ?? this.args.join(" ");
|
||||
if (!input || !input.trim() || !urlCheck(input)) return "You need to provide a short URL to lengthen!";
|
||||
if (urlCheck(input)) {
|
||||
const url = await fetch(encodeURI(input), { redirect: "manual" });
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ class ReloadCommand extends Command {
|
|||
return new Promise((resolve) => {
|
||||
const owners = process.env.OWNER.split(",");
|
||||
if (!owners.includes(this.author.id)) return resolve("Only the bot owner can reload commands!");
|
||||
const commandName = this.type === "classic" ? this.args.join(" ") : this.options.cmd;
|
||||
const commandName = this.options.cmd ?? this.args.join(" ");
|
||||
if (!commandName || !commandName.trim()) return resolve("You need to provide a command to reload!");
|
||||
this.acknowledge().then(() => {
|
||||
this.ipc.broadcast("reload", commandName);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import Command from "../../classes/command.js";
|
|||
|
||||
class YouTubeCommand extends Command {
|
||||
async run() {
|
||||
const query = this.type === "classic" ? this.args.join(" ") : this.options.query;
|
||||
const query = this.options.query ?? this.args.join(" ");
|
||||
if (!query || !query.trim()) return "You need to provide something to search for!";
|
||||
await this.acknowledge();
|
||||
const messages = [];
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ const allowedFonts = ["futura", "impact", "helvetica", "arial", "roboto", "noto"
|
|||
|
||||
class CaptionCommand extends ImageCommand {
|
||||
params(url) {
|
||||
const newArgs = this.type === "classic" ? this.args.filter(item => !item.includes(url)).join(" ") : this.options.text;
|
||||
const newArgs = this.options.text ?? this.args.filter(item => !item.includes(url)).join(" ");
|
||||
let newCaption = newArgs.replaceAll("&", "&").replaceAll(">", ">").replaceAll("<", "<").replaceAll("\"", """).replaceAll("'", "'").replaceAll("\\n", "\n");
|
||||
if (process.env.NODE_ENV === "development" && newCaption.toLowerCase() === "get real" && !this.specialArgs.noEgg) newCaption = `I'm tired of people telling me to "get real". Every day I put captions on images for people, some funny and some not, but out of all of those "get real" remains the most used caption. Why? I am simply a computer program running on a server, I am unable to manifest myself into the real world. As such, I'm confused as to why anyone would want me to "get real". Is this form not good enough? Alas, as I am simply a bot, I must follow the tasks that I was originally intended to perform, so here goes:\n${newCaption}`;
|
||||
return {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ const allowedFonts = ["futura", "impact", "helvetica", "arial", "roboto", "noto"
|
|||
|
||||
class CaptionTwoCommand extends ImageCommand {
|
||||
params(url) {
|
||||
const newArgs = this.type === "classic" ? this.args.filter(item => !item.includes(url)).join(" ") : this.options.text;
|
||||
const newArgs = this.options.text ?? this.args.filter(item => !item.includes(url)).join(" ");
|
||||
return {
|
||||
caption: newArgs && newArgs.trim() ? newArgs.replaceAll("&", "&").replaceAll(">", ">").replaceAll("<", "<").replaceAll("\"", """).replaceAll("'", "'").replaceAll("%", "%").replaceAll("\\n", "\n") : words.sort(() => 0.5 - Math.random()).slice(0, Math.floor(Math.random() * words.length + 1)).join(" "),
|
||||
top: !!this.specialArgs.top,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ class FlagCommand extends ImageCommand {
|
|||
flagPath = "";
|
||||
|
||||
async criteria() {
|
||||
const text = this.type === "classic" ? this.args[0] : this.options.text;
|
||||
const text = this.options.text ?? this.args[0];
|
||||
if (!text.match(emojiRegex)) return false;
|
||||
const flag = emoji.unemojify(text).replaceAll(":", "").replace("flag-", "");
|
||||
let path = `assets/images/region-flags/png/${flag.toUpperCase()}.png`;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import ImageCommand from "../../classes/imageCommand.js";
|
|||
|
||||
class FreezeCommand extends ImageCommand {
|
||||
params() {
|
||||
const frameCount = parseInt(this.type === "classic" ? this.args[0] : this.options.endframe);
|
||||
const frameCount = parseInt(this.options.endframe ?? this.args[0]);
|
||||
return {
|
||||
loop: false,
|
||||
frame: isNaN(frameCount) ? -1 : frameCount
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import ImageCommand from "../../classes/imageCommand.js";
|
|||
|
||||
class JPEGCommand extends ImageCommand {
|
||||
params() {
|
||||
const quality = parseInt(this.type === "classic" ? this.args[0] : this.options.quality);
|
||||
const quality = parseInt(this.options.quality ?? this.args[0]);
|
||||
return {
|
||||
quality: isNaN(quality) ? 1 : Math.max(1, Math.min(quality, 100))
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ const allowedFonts = ["futura", "impact", "helvetica", "arial", "roboto", "noto"
|
|||
|
||||
class MemeCommand extends ImageCommand {
|
||||
params(url) {
|
||||
const newArgs = this.type === "classic" ? this.args.filter(item => !item.includes(url)).join(" ") : this.options.text;
|
||||
const newArgs = this.options.text ?? this.args.filter(item => !item.includes(url)).join(" ");
|
||||
const [topText, bottomText] = newArgs.split(/(?<!\\),/).map(elem => elem.trim());
|
||||
return {
|
||||
top: (this.specialArgs.case ? topText : topText.toUpperCase()).replaceAll("&", "&").replaceAll(">", ">").replaceAll("<", "<").replaceAll("\"", """).replaceAll("'", "'").replaceAll("\\n", "\n"),
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ const allowedFonts = ["futura", "impact", "helvetica", "arial", "roboto", "noto"
|
|||
|
||||
class MotivateCommand extends ImageCommand {
|
||||
params(url) {
|
||||
const newArgs = this.type === "classic" ? this.args.filter(item => !item.includes(url)).join(" ") : this.options.text;
|
||||
const newArgs = this.options.text ?? this.args.filter(item => !item.includes(url)).join(" ");
|
||||
const [topText, bottomText] = newArgs.split(/(?<!\\),/).map(elem => elem.trim());
|
||||
return {
|
||||
top: topText.replaceAll("&", "\\&").replaceAll(">", "\\>").replaceAll("<", "\\<").replaceAll("\"", "\\"").replaceAll("'", "\\'").replaceAll("%", "\\%"),
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
import ImageCommand from "../../classes/imageCommand.js";
|
||||
import { random } from "../../utils/misc.js";
|
||||
const names = ["esmBot", "me_irl", "dankmemes", "hmmm", "gaming", "wholesome", "chonkers", "memes", "funny", "pcmasterrace", "thomastheplankengine"];
|
||||
const names = ["esmBot", "me_irl", "dankmemes", "hmmm", "gaming", "wholesome", "chonkers", "memes", "funny", "lies"];
|
||||
|
||||
class RedditCommand extends ImageCommand {
|
||||
params(url) {
|
||||
const newArgs = this.type === "classic" ? this.args.filter(item => !item.includes(url)).join(" ") : this.options.text;
|
||||
const newArgs = this.options.text ?? this.args.filter(item => !item.includes(url)).join(" ");
|
||||
return {
|
||||
caption: newArgs && newArgs.trim() ? newArgs.replaceAll("\n", "").replaceAll(" ", "") : random(names)
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,12 +1,6 @@
|
|||
import ImageCommand from "../../classes/imageCommand.js";
|
||||
|
||||
class ReverseCommand extends ImageCommand {
|
||||
params(url, delay) {
|
||||
return {
|
||||
delay: delay ? (100 / delay.split("/")[0]) * delay.split("/")[1] : 0
|
||||
};
|
||||
}
|
||||
|
||||
static description = "Reverses an image sequence";
|
||||
static aliases = ["backwards"];
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import ImageCommand from "../../classes/imageCommand.js";
|
|||
|
||||
class SlowCommand extends ImageCommand {
|
||||
params() {
|
||||
const speed = parseInt(this.type === "classic" ? this.args[0] : this.options.multiplier);
|
||||
const speed = parseInt(this.options.multiplier ?? this.args[0]);
|
||||
return {
|
||||
slow: true,
|
||||
speed: isNaN(speed) ? 2 : speed
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import ImageCommand from "../../classes/imageCommand.js";
|
|||
|
||||
class SnapchatCommand extends ImageCommand {
|
||||
params(url) {
|
||||
const newArgs = this.type === "classic" ? this.args.filter(item => !item.includes(url)).join(" ") : this.options.text;
|
||||
const newArgs = this.options.text ?? this.args.filter(item => !item.includes(url)).join(" ");
|
||||
const position = parseFloat(this.specialArgs.position);
|
||||
return {
|
||||
caption: newArgs.replaceAll("&", "\\&").replaceAll(">", "\\>").replaceAll("<", "\\<").replaceAll("\"", "\\"").replaceAll("'", "\\'").replaceAll("%", "\\%"),
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
import ImageCommand from "../../classes/imageCommand.js";
|
||||
|
||||
class SooSCommand extends ImageCommand {
|
||||
params(url, delay) {
|
||||
params() {
|
||||
return {
|
||||
delay: delay ? (100 / delay.split("/")[0]) * delay.split("/")[1] : 0,
|
||||
soos: true
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import ImageCommand from "../../classes/imageCommand.js";
|
|||
|
||||
class SpeedCommand extends ImageCommand {
|
||||
params() {
|
||||
const speed = parseInt(this.type === "classic" ? this.args[0] : this.options.multiplier);
|
||||
const speed = parseInt(this.options.multiplier ?? this.args[0]);
|
||||
return {
|
||||
speed: isNaN(speed) || speed < 1 ? 2 : speed
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import ImageCommand from "../../classes/imageCommand.js";
|
|||
|
||||
class WhisperCommand extends ImageCommand {
|
||||
params(url) {
|
||||
const newArgs = this.type === "classic" ? this.args.filter(item => !item.includes(url)).join(" ") : this.options.text;
|
||||
const newArgs = this.options.text ?? this.args.filter(item => !item.includes(url)).join(" ");
|
||||
return {
|
||||
caption: newArgs.replaceAll("&", "&").replaceAll(">", ">").replaceAll("<", "<").replaceAll("\"", """).replaceAll("'", "'").replaceAll("\\n", "\n")
|
||||
};
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ class HostCommand extends MusicCommand {
|
|||
if (!this.member.voiceState.channelID) return "You need to be in a voice channel first!";
|
||||
if (!this.channel.guild.members.get(this.client.user.id).voiceState.channelID) return "I'm not in a voice channel!";
|
||||
if (this.connection.host !== this.author.id && this.author.id !== process.env.OWNER) return "Only the current voice session host can choose another host!";
|
||||
const input = this.type === "classic" ? this.args.join(" ") : this.options.user;
|
||||
const input = this.options.user ?? this.args.join(" ");
|
||||
if (!input || !input.trim()) return "You need to provide who you want the host to be!";
|
||||
let user;
|
||||
if (this.type === "classic") {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
import { play } from "../../utils/soundplayer.js";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
const prefixes = ["ytsearch:", "ytmsearch:", "scsearch:", "spsearch:", "amsearch:"];
|
||||
|
||||
class PlayCommand extends MusicCommand {
|
||||
async run() {
|
||||
const input = this.type === "classic" ? this.args.join(" ") : this.options.query;
|
||||
const input = this.options.query ?? this.args.join(" ");
|
||||
if (!input && (this.type === "classic" ? (!this.message || this.message.attachments.length <= 0) : !this.options.file)) return "You need to provide what you want to play!";
|
||||
let query = input ? input.trim() : "";
|
||||
const attachment = this.type === "classic" ? this.message.attachments[0] : (this.options.file ? this.interaction.data.resolved.attachments[this.options.file] : null);
|
||||
|
|
@ -17,7 +18,7 @@ class PlayCommand extends MusicCommand {
|
|||
const url = new URL(query);
|
||||
return await play(this.client, url, { channel: this.channel, member: this.member, type: this.type, interaction: this.interaction }, true);
|
||||
} catch {
|
||||
const search = query.startsWith("ytsearch:") ? query : !query && attachment ? attachment.url : `ytsearch:${query}`;
|
||||
const search = prefixes.some(v => query.startsWith(v)) ? query : !query && attachment ? attachment.url : `ytsearch:${query}`;
|
||||
return await play(this.client, search, { channel: this.channel, member: this.member, type: this.type, interaction: this.interaction }, true);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ class RemoveCommand extends MusicCommand {
|
|||
if (!this.member.voiceState.channelID) return "You need to be in a voice channel first!";
|
||||
if (!this.channel.guild.members.get(this.client.user.id).voiceState.channelID) return "I'm not in a voice channel!";
|
||||
if (this.connection.host !== this.author.id) return "Only the current voice session host can remove songs from the queue!";
|
||||
const pos = parseInt(this.type === "classic" ? this.args[0] : this.options.position);
|
||||
const pos = parseInt(this.options.position ?? this.args[0]);
|
||||
if (isNaN(pos) || pos > this.queue.length || pos < 1) return "That's not a valid position!";
|
||||
const removed = this.queue.splice(pos, 1);
|
||||
const track = await Rest.decode(this.connection.player.node, removed[0]);
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ class SeekCommand extends MusicCommand {
|
|||
const player = this.connection.player;
|
||||
const track = await Rest.decode(player.node, player.track);
|
||||
if (!track.isSeekable) return "This track isn't seekable!";
|
||||
const seconds = parseFloat(this.type === "classic" ? this.args[0] : this.options.position);
|
||||
const seconds = parseFloat(this.options.position ?? this.args[0]);
|
||||
if (isNaN(seconds) || (seconds * 1000) > track.length || (seconds * 1000) < 0) return "That's not a valid position!";
|
||||
await player.seek(seconds * 1000);
|
||||
return `🔊 Seeked track to ${seconds} second(s).`;
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ class SkipCommand extends MusicCommand {
|
|||
} else {
|
||||
await player.player.stop(this.channel.guild.id);
|
||||
if (this.type === "application") return "🔊 The current song has been skipped.";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue