***VERY EXPERIMENTAL*** args parser

This commit is contained in:
Chayapak 2023-09-18 20:22:47 +07:00
parent 840afd22ef
commit 824697879d
39 changed files with 533 additions and 508 deletions

View file

@ -26,5 +26,5 @@ public abstract class Command {
this.consoleOnly = consoleOnly; this.consoleOnly = consoleOnly;
} }
public abstract Component execute (CommandContext context, String[] args, String[] fullArgs) throws Exception; public abstract Component execute (CommandContext context) throws Exception;
} }

View file

@ -4,6 +4,8 @@ import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry; import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import java.util.Arrays;
public class CommandContext { public class CommandContext {
public final Bot bot; public final Bot bot;
@ -15,7 +17,8 @@ public class CommandContext {
public String commandName = null; public String commandName = null;
public String[] splitInput; public String[] fullArgs;
public String[] args;
public CommandContext(Bot bot, String prefix, PlayerEntry sender, boolean inGame) { public CommandContext(Bot bot, String prefix, PlayerEntry sender, boolean inGame) {
this.bot = bot; this.bot = bot;
@ -26,4 +29,82 @@ public class CommandContext {
public Component displayName () { return Component.empty(); } public Component displayName () { return Component.empty(); }
public void sendOutput (Component component) {} public void sendOutput (Component component) {}
private int argsPosition = 0;
public String getString (boolean greedy, boolean required) throws CommandException { return getString(greedy, required, "string"); }
private String getString (boolean greedy, boolean required, String type) throws CommandException {
if (args.length == 0 || args[Math.min(argsPosition, args.length - 1)] == null) {
if (required) {
throw new CommandException(
Component.translatable(
"Expected %s",
Component.text(type)
)
);
} else {
return "";
}
}
return greedy ? String.join(" ", Arrays.copyOfRange(args, argsPosition++, args.length)) : args[Math.min(argsPosition++, args.length - 1)];
}
public Integer getInteger (boolean required) throws CommandException {
final String string = getString(false, required, "integer");
if (string.isEmpty()) return null;
try {
return Integer.parseInt(string);
} catch (NumberFormatException e) {
throw new CommandException(Component.text("Invalid integer"));
}
}
public Double getDouble (boolean required) throws CommandException {
final String string = getString(false, required, "double");
if (string.isEmpty()) return null;
try {
return Double.parseDouble(string);
} catch (NumberFormatException e) {
throw new CommandException(Component.text("Invalid double"));
}
}
public Float getFloat (boolean required) throws CommandException {
final String string = getString(false, required, "float");
if (string.isEmpty()) return null;
try {
return Float.parseFloat(string);
} catch (NumberFormatException e) {
throw new CommandException(Component.text("Invalid float"));
}
}
public Boolean getBoolean (boolean required) throws CommandException {
final String string = getString(false, required, "boolean");
if (string.isEmpty()) return null;
return switch (string) {
case "true" -> true;
case "false" -> false;
default -> throw new CommandException(Component.text("Invalid boolean"));
};
}
public <T extends Enum<T>> T getEnum (Class<T> enumClass) throws CommandException {
final String string = getString(false, true, enumClass.getSimpleName());
try {
return Enum.valueOf(enumClass, string.toUpperCase());
} catch (IllegalArgumentException | NullPointerException e) {
throw new CommandException(Component.text("Invalid enum"));
}
}
} }

View file

@ -0,0 +1,11 @@
package land.chipmunk.chayapak.chomens_bot.command;
import net.kyori.adventure.text.Component;
public class CommandException extends Exception {
public final Component message;
public CommandException (Component message) {
this.message = message;
}
}

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -21,10 +22,12 @@ public class BotVisibilityCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
if (args.length == 0) { final String action = context.getString(false, false);
if (action.isEmpty()) {
final boolean visibility = bot.selfCare.visibility; final boolean visibility = bot.selfCare.visibility;
bot.selfCare.visibility = !visibility; bot.selfCare.visibility = !visibility;
@ -37,7 +40,7 @@ public class BotVisibilityCommand extends Command {
.append(Component.text(visibleOrInvisible).color(greenOrGold)) .append(Component.text(visibleOrInvisible).color(greenOrGold))
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); .color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} else { } else {
switch (args[0]) { switch (action) {
case "on", "true" -> { case "on", "true" -> {
bot.selfCare.visibility = true; bot.selfCare.visibility = true;
bot.chat.send("/essentials:vanish disable"); bot.chat.send("/essentials:vanish disable");
@ -55,7 +58,7 @@ public class BotVisibilityCommand extends Command {
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); .color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} }
default -> { default -> {
return Component.text("Invalid action").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid action"));
} }
} }
} }

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -11,7 +12,7 @@ public class BruhifyCommand extends Command {
super( super(
"bruhify", "bruhify",
"RecycleBots bruhify but actionbar", "RecycleBots bruhify but actionbar",
new String[] { "[{message}]" }, new String[] { "[message]" },
new String[] {}, new String[] {},
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -19,14 +20,10 @@ public class BruhifyCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
if (args.length == 0) { bot.bruhify.bruhifyText = context.getString(true, false);
bot.bruhify.bruhifyText = "";
} else {
bot.bruhify.bruhifyText = String.join(" ", args);
}
return null; return null;
} }

View file

@ -1,10 +1,11 @@
package land.chipmunk.chayapak.chomens_bot.commands; package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
@ -23,13 +24,15 @@ public class ClearChatCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
if (args.length > 0) { final String name = context.getString(true, false);
final PlayerEntry entry = bot.players.getEntry(String.join(" ", args));
if (entry == null) return Component.text("Invalid player name").color(NamedTextColor.RED); if (name.isEmpty()) {
final PlayerEntry entry = bot.players.getEntry(name);
if (entry == null) throw new CommandException(Component.text("Invalid player name"));
final UUID uuid = entry.profile.getId(); final UUID uuid = entry.profile.getId();

View file

@ -19,7 +19,7 @@ public class ClearChatQueueCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) {
final Bot bot = context.bot; final Bot bot = context.bot;
bot.chat.clearQueue(); bot.chat.clearQueue();

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.CommandLoop; import land.chipmunk.chayapak.chomens_bot.data.CommandLoop;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
@ -11,7 +12,6 @@ import net.kyori.adventure.text.JoinConfiguration;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
public class CloopCommand extends Command { public class CloopCommand extends Command {
@ -19,7 +19,7 @@ public class CloopCommand extends Command {
super( super(
"cloop", "cloop",
"Loop commands", "Loop commands",
new String[] { "<hash> add <interval> <{command}>", "<hash> remove <index>", "<hash> clear", "<hash> list" }, new String[] { "<hash> add <interval> <command>", "<hash> remove <index>", "<hash> clear", "<hash> list" },
new String[] { "commandloop" }, new String[] { "commandloop" },
TrustLevel.TRUSTED, TrustLevel.TRUSTED,
false false
@ -27,21 +27,17 @@ public class CloopCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
switch (args[0]) { final String action = context.getString(false, true);
case "add" -> {
if (args.length < 3) return Component.text("Please specify interval and command").color(NamedTextColor.RED);
int interval;
try {
interval = Integer.parseInt(args[1]);
if (interval < 1) interval = 1;
} catch (IllegalArgumentException ignored) {
return Component.text("Invalid interval").color(NamedTextColor.RED);
}
final String command = String.join(" ", Arrays.copyOfRange(args, 2, args.length)); switch (action) {
case "add" -> {
int interval = context.getInteger(true);
if (interval < 1) interval = 1;
final String command = context.getString(true, true);
bot.cloop.add(interval, command); bot.cloop.add(interval, command);
@ -53,7 +49,7 @@ public class CloopCommand extends Command {
} }
case "remove" -> { case "remove" -> {
try { try {
final int index = Integer.parseInt(args[1]); final int index = context.getInteger(true);
bot.cloop.remove(index); bot.cloop.remove(index);
return Component.translatable( return Component.translatable(
@ -61,7 +57,7 @@ public class CloopCommand extends Command {
Component.text(index).color(ColorUtilities.getColorByString(bot.config.colorPalette.number)) Component.text(index).color(ColorUtilities.getColorByString(bot.config.colorPalette.number))
).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); ).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} catch (IndexOutOfBoundsException | IllegalArgumentException | NullPointerException ignored) { } catch (IndexOutOfBoundsException | IllegalArgumentException | NullPointerException ignored) {
return Component.text("Invalid index").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid index"));
} }
} }
case "clear" -> { case "clear" -> {
@ -95,7 +91,7 @@ public class CloopCommand extends Command {
); );
} }
default -> { default -> {
return Component.text("Invalid action").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid action"));
} }
} }
} }

View file

@ -5,6 +5,7 @@ import com.github.steveice10.opennbt.tag.builtin.StringTag;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.JoinConfiguration; import net.kyori.adventure.text.JoinConfiguration;
@ -18,7 +19,7 @@ public class CommandBlockCommand extends Command {
super( super(
"cb", "cb",
"Executes a command in the command core and return its output", "Executes a command in the command core and return its output",
new String[] { "<{command}>" }, new String[] { "<command>" },
new String[] { "cmd", "commandblock", "run" }, new String[] { "cmd", "commandblock", "run" },
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -26,10 +27,10 @@ public class CommandBlockCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final CompletableFuture<CompoundTag> future = bot.core.runTracked(String.join(" ", args)); final CompletableFuture<CompoundTag> future = bot.core.runTracked(context.getString(true, true));
if (future == null) return null; if (future == null) return null;

View file

@ -3,13 +3,13 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
public class ConsoleCommand extends Command { public class ConsoleCommand extends Command {
@ -18,7 +18,7 @@ public class ConsoleCommand extends Command {
"console", "console",
"Controls stuff about console", "Controls stuff about console",
new String[] { new String[] {
"<ownerHash> server <{server}>", "<ownerHash> server <server>",
"<ownerHash> logtoconsole <true|false>" "<ownerHash> logtoconsole <true|false>"
}, },
new String[] {}, new String[] {},
@ -28,12 +28,12 @@ public class ConsoleCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
if (args.length < 2) return Component.text("Not enough arguments").color(NamedTextColor.RED); final String action = context.getString(false, true);
switch (args[0]) { switch (action) {
case "server" -> { case "server" -> {
final List<String> servers = new ArrayList<>(); final List<String> servers = new ArrayList<>();
@ -41,9 +41,9 @@ public class ConsoleCommand extends Command {
servers.add(eachBot.host + ":" + eachBot.port); servers.add(eachBot.host + ":" + eachBot.port);
} }
for (Bot eachBot : bot.bots) { final String server = context.getString(true, true);
final String server = String.join(" ", Arrays.copyOfRange(args, 1, args.length));
for (Bot eachBot : bot.bots) {
if (server.equalsIgnoreCase("all")) { if (server.equalsIgnoreCase("all")) {
eachBot.console.consoleServer = "all"; eachBot.console.consoleServer = "all";
@ -60,12 +60,12 @@ public class ConsoleCommand extends Command {
context.sendOutput(Component.text("Set the console server to " + bot.console.consoleServer).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor))); context.sendOutput(Component.text("Set the console server to " + bot.console.consoleServer).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)));
} catch (ArrayIndexOutOfBoundsException e) { } catch (ArrayIndexOutOfBoundsException e) {
return Component.text("Invalid server: " + server).color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid server: " + server));
} }
} }
} }
case "logtoconsole" -> { case "logtoconsole" -> {
final boolean bool = Boolean.parseBoolean(args[1]); final boolean bool = context.getBoolean(true);
bot.logger.logToConsole = bool; bot.logger.logToConsole = bool;

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import com.github.ricksbrown.cowsay.plugin.CowExecutor; import com.github.ricksbrown.cowsay.plugin.CowExecutor;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -11,7 +12,7 @@ public class CowsayCommand extends Command {
super( super(
"cowsay", "cowsay",
"Moo", "Moo",
new String[] { "<{message}>" }, new String[] { "<message>" },
new String[] {}, new String[] {},
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -19,8 +20,8 @@ public class CowsayCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final String message = String.join(" ", args); final String message = context.getString(true, true);
final CowExecutor cowExecutor = new CowExecutor(); final CowExecutor cowExecutor = new CowExecutor();
cowExecutor.setMessage(message); cowExecutor.setMessage(message);

View file

@ -22,7 +22,7 @@ public class DiscordCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) {
final Bot bot = context.bot; final Bot bot = context.bot;
final String link = bot.config.discord.inviteLink; final String link = bot.config.discord.inviteLink;

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -11,7 +12,7 @@ public class EchoCommand extends Command {
super( super(
"echo", "echo",
"Makes the bot say a message", "Makes the bot say a message",
new String[] { "<{message}>" }, new String[] { "<message>" },
new String[] { "say" }, new String[] { "say" },
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -19,10 +20,10 @@ public class EchoCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
bot.chat.send(String.join(" ", args)); bot.chat.send(context.getString(true, true));
return null; return null;
} }

View file

@ -19,7 +19,7 @@ public class EndCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) {
final Bot bot = context.bot; final Bot bot = context.bot;
bot.session.disconnect("End command"); bot.session.disconnect("End command");

View file

@ -3,13 +3,13 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.EvalOutput; import land.chipmunk.chayapak.chomens_bot.data.EvalOutput;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import java.util.Arrays;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
public class EvalCommand extends Command { public class EvalCommand extends Command {
@ -17,7 +17,7 @@ public class EvalCommand extends Command {
super( super(
"eval", "eval",
"Evaluate JavaScript codes", "Evaluate JavaScript codes",
new String[] { "run <{code}>", "reset" }, new String[] { "run <code>", "reset" },
new String[] {}, new String[] {},
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -25,16 +25,16 @@ public class EvalCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
if (args.length < 1) return Component.text("Not enough arguments").color(NamedTextColor.RED);
final Bot bot = context.bot; final Bot bot = context.bot;
if (!bot.eval.connected) return Component.text("Eval server is not online").color(NamedTextColor.RED); if (!bot.eval.connected) throw new CommandException(Component.text("Eval server is not online"));
switch (args[0]) { final String action = context.getString(false, true);
switch (action) {
case "run" -> { case "run" -> {
final String command = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); final String command = context.getString(true, true);
final CompletableFuture<EvalOutput> future = bot.eval.run(command); final CompletableFuture<EvalOutput> future = bot.eval.run(command);
@ -51,7 +51,7 @@ public class EvalCommand extends Command {
return Component.text("Reset the eval worker").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); return Component.text("Reset the eval worker").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} }
default -> { default -> {
return Component.text("Invalid action").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid action"));
} }
} }

View file

@ -5,6 +5,7 @@ import com.google.gson.JsonElement;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.FilteredPlayer; import land.chipmunk.chayapak.chomens_bot.data.FilteredPlayer;
import land.chipmunk.chayapak.chomens_bot.plugins.FilterPlugin; import land.chipmunk.chayapak.chomens_bot.plugins.FilterPlugin;
@ -14,7 +15,6 @@ import net.kyori.adventure.text.JoinConfiguration;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
public class FilterCommand extends Command { public class FilterCommand extends Command {
@ -23,10 +23,10 @@ public class FilterCommand extends Command {
"filter", "filter",
"Filter players", "Filter players",
new String[] { new String[] {
"<hash> add <{player}>", "<hash> add <player>",
"<hash> -ignorecase add <{player}>", "<hash> -ignorecase add <player>",
"<hash> -regex add <{player}>", "<hash> -regex add <player>",
"<hash> -ignorecase -regex add <{player}>", "<hash> -ignorecase -regex add <player>",
"<hash> remove <index>", "<hash> remove <index>",
"<hash> clear", "<hash> clear",
"<hash> list" "<hash> list"
@ -38,36 +38,37 @@ public class FilterCommand extends Command {
} }
// most of these codes are from cloop and greplog // most of these codes are from cloop and greplog
public Component execute(CommandContext context, String[] _args, String[] fullArgs) { @Override
public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
boolean ignoreCase = false; boolean ignoreCase = false;
boolean regex = false; boolean regex = false;
String[] args = _args; String action = context.getString(false, true);
// this is a mess // this is a mess
if (_args[0].equals("-ignorecase")) { if (action.equals("-ignorecase")) {
ignoreCase = true; ignoreCase = true;
args = Arrays.copyOfRange(_args, 1, _args.length); action = context.getString(false, true);
} else if (_args[0].equals("-regex")) { } else if (action.equals("-regex")) {
regex = true; regex = true;
args = Arrays.copyOfRange(_args, 1, _args.length); action = context.getString(false, true);
} }
if (_args.length > 1 && _args[1].equals("-ignorecase")) { if (action.equals("-ignorecase")) {
ignoreCase = true; ignoreCase = true;
args = Arrays.copyOfRange(_args, 2, _args.length); action = context.getString(false, true);
} else if (_args.length > 1 && _args[1].equals("-regex")) { } else if (action.equals("-regex")) {
regex = true; regex = true;
args = Arrays.copyOfRange(_args, 2, _args.length); action = context.getString(false, true);
} }
final Gson gson = new Gson(); final Gson gson = new Gson();
switch (args[0]) { switch (action) {
case "add" -> { case "add" -> {
final String player = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); final String player = context.getString(true, true);
bot.filter.add(player, regex, ignoreCase); bot.filter.add(player, regex, ignoreCase);
return Component.translatable( return Component.translatable(
@ -77,7 +78,7 @@ public class FilterCommand extends Command {
} }
case "remove" -> { case "remove" -> {
try { try {
final int index = Integer.parseInt(args[1]); final int index = context.getInteger(true);
final FilteredPlayer removed = bot.filter.remove(index); final FilteredPlayer removed = bot.filter.remove(index);
@ -86,7 +87,7 @@ public class FilterCommand extends Command {
Component.text(removed.playerName).color(ColorUtilities.getColorByString(bot.config.colorPalette.username)) Component.text(removed.playerName).color(ColorUtilities.getColorByString(bot.config.colorPalette.username))
).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); ).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} catch (IndexOutOfBoundsException | IllegalArgumentException | NullPointerException ignored) { } catch (IndexOutOfBoundsException | IllegalArgumentException | NullPointerException ignored) {
return Component.text("Invalid index").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid index"));
} }
} }
case "clear" -> { case "clear" -> {
@ -122,7 +123,7 @@ public class FilterCommand extends Command {
); );
} }
default -> { default -> {
return Component.text("Invalid action").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid action"));
} }
} }
} }

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.plugins.CommandHandlerPlugin; import land.chipmunk.chayapak.chomens_bot.plugins.CommandHandlerPlugin;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
@ -31,17 +32,19 @@ public class HelpCommand extends Command {
private CommandContext context; private CommandContext context;
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
this.context = context; this.context = context;
if (args.length == 0) { final String commandName = context.getString(true, false);
if (commandName.isEmpty()) {
return sendCommandList(); return sendCommandList();
} else { } else {
return sendUsages(context, args); return sendUsages(context, commandName);
} }
} }
public Component sendCommandList () { public Component sendCommandList () throws CommandException {
final List<Component> list = new ArrayList<>(); final List<Component> list = new ArrayList<>();
list.addAll(getCommandListByTrustLevel(TrustLevel.PUBLIC)); list.addAll(getCommandListByTrustLevel(TrustLevel.PUBLIC));
list.addAll(getCommandListByTrustLevel(TrustLevel.TRUSTED)); list.addAll(getCommandListByTrustLevel(TrustLevel.TRUSTED));
@ -60,7 +63,7 @@ public class HelpCommand extends Command {
.append(Component.join(JoinConfiguration.separator(Component.space()), list)); .append(Component.join(JoinConfiguration.separator(Component.space()), list));
} }
public List<Component> getCommandListByTrustLevel(TrustLevel trustLevel) { public List<Component> getCommandListByTrustLevel(TrustLevel trustLevel) throws CommandException {
final List<Component> list = new ArrayList<>(); final List<Component> list = new ArrayList<>();
List<String> commandNames = new ArrayList<>(); List<String> commandNames = new ArrayList<>();
@ -80,7 +83,7 @@ public class HelpCommand extends Command {
.color(getColorByTrustLevel(trustLevel)) .color(getColorByTrustLevel(trustLevel))
.hoverEvent( .hoverEvent(
HoverEvent.showText( HoverEvent.showText(
sendUsages(context, new String[] { name }) sendUsages(context, name)
) )
) )
); );
@ -97,20 +100,20 @@ public class HelpCommand extends Command {
}; };
} }
public Component sendUsages (CommandContext context, String[] args) { public Component sendUsages (CommandContext context, String commandName) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final String prefix = context.prefix; final String prefix = context.prefix;
for (Command command : CommandHandlerPlugin.commands) { for (Command command : CommandHandlerPlugin.commands) {
if (!command.name.equals(args[0]) && !Arrays.stream(command.aliases).toList().contains(args[0])) continue; if (!command.name.equals(commandName) && !Arrays.stream(command.aliases).toList().contains(commandName)) continue;
final String commandName = command.name; final String actualCommandName = command.name;
final List<Component> usages = new ArrayList<>(); final List<Component> usages = new ArrayList<>();
usages.add( usages.add(
Component.empty() Component.empty()
.append(Component.text(prefix + commandName).color(ColorUtilities.getColorByString(bot.config.colorPalette.secondary))) .append(Component.text(prefix + actualCommandName).color(ColorUtilities.getColorByString(bot.config.colorPalette.secondary)))
.append(Component.text( .append(Component.text(
(command.aliases.length > 0 && !command.aliases[0].equals("")) ? (command.aliases.length > 0 && !command.aliases[0].equals("")) ?
" (" + String.join(", ", command.aliases) + ")" : " (" + String.join(", ", command.aliases) + ")" :
@ -128,7 +131,7 @@ public class HelpCommand extends Command {
for (String usage : command.usages) { for (String usage : command.usages) {
usages.add( usages.add(
Component.empty() Component.empty()
.append(Component.text(prefix + commandName).color(ColorUtilities.getColorByString(bot.config.colorPalette.secondary))) .append(Component.text(prefix + actualCommandName).color(ColorUtilities.getColorByString(bot.config.colorPalette.secondary)))
.append(Component.text(" ")) .append(Component.text(" "))
.append(Component.text(usage).color(ColorUtilities.getColorByString(bot.config.colorPalette.string))) .append(Component.text(usage).color(ColorUtilities.getColorByString(bot.config.colorPalette.string)))
); );
@ -137,6 +140,6 @@ public class HelpCommand extends Command {
return Component.join(JoinConfiguration.separator(Component.newline()), usages); return Component.join(JoinConfiguration.separator(Component.newline()), usages);
} }
return Component.text("Unknown command").color(NamedTextColor.RED); throw new CommandException(Component.text("Unknown command"));
} }
} }

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -43,10 +44,12 @@ public class InfoCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
switch (args[0]) { final String action = context.getString(false, true);
switch (action) {
case "creator" -> { case "creator" -> {
return Component.empty() return Component.empty()
.append(Component.text("ChomeNS Bot ").color(ColorUtilities.getColorByString(bot.config.colorPalette.primary))) .append(Component.text("ChomeNS Bot ").color(ColorUtilities.getColorByString(bot.config.colorPalette.primary)))
@ -194,7 +197,7 @@ public class InfoCommand extends Command {
).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); ).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} }
default -> { default -> {
return Component.text("Invalid action").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid action"));
} }
} }
} }

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry; import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
@ -16,7 +17,7 @@ public class KickCommand extends Command {
super( super(
"kick", "kick",
"Kicks a player", "Kicks a player",
new String[] { "<hash> <{player}>" }, new String[] { "<hash> <player>" },
new String[] {}, new String[] {},
TrustLevel.TRUSTED, TrustLevel.TRUSTED,
false false
@ -24,12 +25,12 @@ public class KickCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final PlayerEntry entry = bot.players.getEntry(String.join(" ", args)); final PlayerEntry entry = bot.players.getEntry(context.getString(true, true));
if (entry == null) return Component.text("Invalid player name").color(NamedTextColor.RED); if (entry == null) throw new CommandException(Component.text("Invalid player name"));
final String name = entry.profile.getName(); final String name = entry.profile.getName();
final UUID uuid = entry.profile.getId(); final UUID uuid = entry.profile.getId();

View file

@ -1,10 +1,10 @@
package land.chipmunk.chayapak.chomens_bot.commands; package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.JoinConfiguration; import net.kyori.adventure.text.JoinConfiguration;
@ -28,7 +28,7 @@ public class ListCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) {
final Bot bot = context.bot; final Bot bot = context.bot;
final List<PlayerEntry> list = bot.players.list; final List<PlayerEntry> list = bot.players.list;

View file

@ -7,6 +7,7 @@ import com.google.gson.JsonElement;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.Mail; import land.chipmunk.chayapak.chomens_bot.data.Mail;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry; import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
@ -26,7 +27,6 @@ import org.joda.time.format.DateTimeFormatter;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@ -35,7 +35,7 @@ public class MailCommand extends Command {
super( super(
"mail", "mail",
"Sends a mail", "Sends a mail",
new String[] { "send <player> <{message}>", "sendselecteditem <player>", "read" }, new String[] { "send <player> <message>", "sendselecteditem <player>", "read" },
new String[] {}, new String[] {},
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -43,9 +43,7 @@ public class MailCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
if (args.length < 1) return Component.text("Not enough arguments").color(NamedTextColor.RED);
final Bot bot = context.bot; final Bot bot = context.bot;
final PlayerEntry sender = context.sender; final PlayerEntry sender = context.sender;
@ -54,195 +52,191 @@ public class MailCommand extends Command {
// kinda messy ngl // kinda messy ngl
bot.executorService.submit(() -> { final String action = context.getString(false, true);
switch (args[0]) {
case "send" -> {
int senderMailsSentTotal = 0;
for (JsonElement mailElement : MailPlugin.mails) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (mail.sentBy == null) continue; switch (action) {
case "send" -> {
int senderMailsSentTotal = 0;
for (JsonElement mailElement : MailPlugin.mails) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (!mail.sentBy.equals(sender.profile.getName())) continue; if (mail.sentBy == null) continue;
senderMailsSentTotal++;
}
if (senderMailsSentTotal > 256) { if (!mail.sentBy.equals(sender.profile.getName())) continue;
context.sendOutput(Component.text("You are sending too many mails!").color(NamedTextColor.RED)); senderMailsSentTotal++;
return;
}
bot.mail.send(
new Mail(
sender.profile.getName(),
args[1],
Instant.now().toEpochMilli(),
bot.host + ":" + bot.port,
String.join(" ", Arrays.copyOfRange(args, 2, args.length))
)
);
context.sendOutput(Component.text("Mail sent!").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)));
} }
case "sendselecteditem" -> {
int senderMailsSentTotal = 0;
for (JsonElement mailElement : MailPlugin.mails) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (!mail.sentTo.equals(sender.profile.getName())) continue; if (senderMailsSentTotal > 256) {
senderMailsSentTotal++; throw new CommandException(Component.text("You are sending too many mails!"));
}
bot.mail.send(
new Mail(
sender.profile.getName(),
context.getString(true, true),
Instant.now().toEpochMilli(),
bot.host + ":" + bot.port,
context.getString(true, true)
)
);
return Component.text("Mail sent!").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
}
case "sendselecteditem" -> {
int senderMailsSentTotal = 0;
for (JsonElement mailElement : MailPlugin.mails) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (!mail.sentTo.equals(sender.profile.getName())) continue;
senderMailsSentTotal++;
}
if (senderMailsSentTotal > 256) {
throw new CommandException(Component.text("You are sending too many mails!"));
}
final CompletableFuture<CompoundTag> future = bot.core.runTracked(
"minecraft:data get entity " +
UUIDUtilities.selector(sender.profile.getId()) +
" SelectedItem.tag.message"
);
if (future == null) {
throw new CommandException(Component.text("There was an error while sending your mail"));
}
future.thenApply(tags -> {
if (!tags.contains("LastOutput") || !(tags.get("LastOutput") instanceof StringTag)) return tags;
final StringTag lastOutput = tags.get("LastOutput");
final Component output = GsonComponentSerializer.gson().deserialize(lastOutput.getValue());
final List<Component> children = output.children();
if (
children.size() > 0 &&
children.get(0).children().size() > 0 &&
((TranslatableComponent) children.get(0).children().get(0))
.key()
.equals("arguments.nbtpath.nothing_found")
) {
context.sendOutput(Component.text("Player has no `message` NBT tag in the selected item").color(NamedTextColor.RED));
return tags;
} }
if (senderMailsSentTotal > 256) { final String value = ComponentUtilities.stringify(((TranslatableComponent) children.get(0)).args().get(1));
context.sendOutput(Component.text("You are sending too many mails!").color(NamedTextColor.RED));
return; if (!value.startsWith("\"") && !value.endsWith("\"") && !value.startsWith("'") && !value.endsWith("'")) {
context.sendOutput(Component.text("`message` NBT is not a string").color(NamedTextColor.RED));
return tags;
} }
final CompletableFuture<CompoundTag> future = bot.core.runTracked( try {
"minecraft:data get entity " +
UUIDUtilities.selector(sender.profile.getId()) +
" SelectedItem.tag.message"
);
if (future == null) {
context.sendOutput(Component.text("There was an error while sending your mail").color(NamedTextColor.RED));
return;
}
future.thenApply(tags -> {
if (!tags.contains("LastOutput") || !(tags.get("LastOutput") instanceof StringTag)) return tags;
final StringTag lastOutput = tags.get("LastOutput");
final Component output = GsonComponentSerializer.gson().deserialize(lastOutput.getValue());
final List<Component> children = output.children();
if (
children.size() > 0 &&
children.get(0).children().size() > 0 &&
((TranslatableComponent) children.get(0).children().get(0))
.key()
.equals("arguments.nbtpath.nothing_found")
) {
context.sendOutput(Component.text("Player has no `message` NBT tag in the selected item").color(NamedTextColor.RED));
return tags;
}
final String value = ComponentUtilities.stringify(((TranslatableComponent) children.get(0)).args().get(1));
if (!value.startsWith("\"") && !value.endsWith("\"") && !value.startsWith("'") && !value.endsWith("'")) {
context.sendOutput(Component.text("`message` NBT is not a string").color(NamedTextColor.RED));
return tags;
}
bot.mail.send( bot.mail.send(
new Mail( new Mail(
sender.profile.getName(), sender.profile.getName(),
args[1], context.getString(true, true),
Instant.now().toEpochMilli(), Instant.now().toEpochMilli(),
bot.host + ":" + bot.port, bot.host + ":" + bot.port,
value.substring(1).substring(0, value.length() - 2) value.substring(1).substring(0, value.length() - 2)
) )
); );
} catch (CommandException e) {
context.sendOutput( context.sendOutput(e.message.color(NamedTextColor.RED));
Component.text("Mail sent!").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor))
);
return tags;
});
}
case "read" -> {
// TODO: use less for loops?
int senderMailSize = 0;
for (JsonElement mailElement : MailPlugin.mails) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (!mail.sentTo.equals(sender.profile.getName())) continue;
senderMailSize++;
} }
if (senderMailSize == 0) { context.sendOutput(
context.sendOutput(Component.text("You have no new mails").color(NamedTextColor.RED)); Component.text("Mail sent!").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor))
);
return; return tags;
} });
final List<Component> mailsComponent = new ArrayList<>();
int i = 1;
for (JsonElement mailElement : MailPlugin.mails) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (!mail.sentTo.equals(sender.profile.getName())) continue;
final DateTimeFormatter formatter = DateTimeFormat.forPattern("MMMM d, YYYY, hh:mm:ss a Z");
final String formattedTime = formatter.print(mail.timeSent);
mailsComponent.add(
Component.translatable(
"""
%s %s Sent by: %s %s
Contents:
%s""",
Component.text(i).color(ColorUtilities.getColorByString(bot.config.colorPalette.number)),
Component.text("-").color(NamedTextColor.DARK_GRAY),
Component.text(mail.sentBy).color(ColorUtilities.getColorByString(bot.config.colorPalette.username)),
Component
.text("[Hover here for more info]")
.color(NamedTextColor.GREEN)
.hoverEvent(
HoverEvent.showText(
Component.translatable(
"""
Time sent: %s
Server: %s""",
Component.text(formattedTime).color(ColorUtilities.getColorByString(bot.config.colorPalette.string)),
Component.text(mail.server).color(ColorUtilities.getColorByString(bot.config.colorPalette.string))
).color(NamedTextColor.GREEN)
)
),
Component.text(mail.contents).color(NamedTextColor.WHITE)
).color(NamedTextColor.GREEN)
);
i++;
}
final Component component = Component.empty()
.append(Component.text("Mails ").color(NamedTextColor.GREEN))
.append(Component.text("(").color(NamedTextColor.DARK_GRAY))
.append(Component.text(senderMailSize).color(NamedTextColor.GRAY))
.append(Component.text(")").color(NamedTextColor.DARK_GRAY))
.append(Component.newline())
.append(Component.join(JoinConfiguration.newlines(), mailsComponent));
if (context.inGame) {
bot.chat.tellraw(
component,
context.sender.profile.getId()
);
} else {
context.sendOutput(component);
}
for (JsonElement mailElement : MailPlugin.mails.deepCopy()) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (mail.sentTo.equals(sender.profile.getName())) MailPlugin.mails.remove(mailElement);
}
PersistentDataUtilities.put("mails", MailPlugin.mails);
}
default -> context.sendOutput(Component.text("Invalid action").color(NamedTextColor.RED));
} }
}); case "read" -> {
// TODO: use less for loops?
int senderMailSize = 0;
for (JsonElement mailElement : MailPlugin.mails) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (!mail.sentTo.equals(sender.profile.getName())) continue;
senderMailSize++;
}
if (senderMailSize == 0) {
throw new CommandException(Component.text("You have no new mails"));
}
final List<Component> mailsComponent = new ArrayList<>();
int i = 1;
for (JsonElement mailElement : MailPlugin.mails) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (!mail.sentTo.equals(sender.profile.getName())) continue;
final DateTimeFormatter formatter = DateTimeFormat.forPattern("MMMM d, YYYY, hh:mm:ss a Z");
final String formattedTime = formatter.print(mail.timeSent);
mailsComponent.add(
Component.translatable(
"""
%s %s Sent by: %s %s
Contents:
%s""",
Component.text(i).color(ColorUtilities.getColorByString(bot.config.colorPalette.number)),
Component.text("-").color(NamedTextColor.DARK_GRAY),
Component.text(mail.sentBy).color(ColorUtilities.getColorByString(bot.config.colorPalette.username)),
Component
.text("[Hover here for more info]")
.color(NamedTextColor.GREEN)
.hoverEvent(
HoverEvent.showText(
Component.translatable(
"""
Time sent: %s
Server: %s""",
Component.text(formattedTime).color(ColorUtilities.getColorByString(bot.config.colorPalette.string)),
Component.text(mail.server).color(ColorUtilities.getColorByString(bot.config.colorPalette.string))
).color(NamedTextColor.GREEN)
)
),
Component.text(mail.contents).color(NamedTextColor.WHITE)
).color(NamedTextColor.GREEN)
);
i++;
}
final Component component = Component.empty()
.append(Component.text("Mails ").color(NamedTextColor.GREEN))
.append(Component.text("(").color(NamedTextColor.DARK_GRAY))
.append(Component.text(senderMailSize).color(NamedTextColor.GRAY))
.append(Component.text(")").color(NamedTextColor.DARK_GRAY))
.append(Component.newline())
.append(Component.join(JoinConfiguration.newlines(), mailsComponent));
if (context.inGame) {
bot.chat.tellraw(
component,
context.sender.profile.getId()
);
} else {
context.sendOutput(component);
}
for (JsonElement mailElement : MailPlugin.mails.deepCopy()) {
final Mail mail = gson.fromJson(mailElement, Mail.class);
if (mail.sentTo.equals(sender.profile.getName())) MailPlugin.mails.remove(mailElement);
}
PersistentDataUtilities.put("mails", MailPlugin.mails);
}
default -> context.sendOutput(Component.text("Invalid action").color(NamedTextColor.RED));
}
return null; return null;
} }

View file

@ -4,6 +4,7 @@ import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.Main; import land.chipmunk.chayapak.chomens_bot.Main;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.plugins.MusicPlayerPlugin; import land.chipmunk.chayapak.chomens_bot.plugins.MusicPlayerPlugin;
import land.chipmunk.chayapak.chomens_bot.song.Instrument; import land.chipmunk.chayapak.chomens_bot.song.Instrument;
@ -37,10 +38,10 @@ public class MusicCommand extends Command {
"music", "music",
"Plays music", "Plays music",
new String[] { new String[] {
"play <{song|URL}>", "play <song|URL>",
"stop", "stop",
"loop <current|all|off>", "loop <current|all|off>",
"list [{directory}]", "list [directory]",
"skip", "skip",
"nowplaying", "nowplaying",
"queue", "queue",
@ -61,26 +62,26 @@ public class MusicCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
if (args.length < 1) return Component.text("Not enough arguments").color(NamedTextColor.RED);
ratelimit++; ratelimit++;
if (ratelimit > 10) return null; if (ratelimit > 10) return null;
final String action = context.getString(false, true);
root = MusicPlayerPlugin.SONG_DIR; root = MusicPlayerPlugin.SONG_DIR;
return switch (args[0]) { return switch (action) {
case "play", "playurl", "playnbs", "playnbsurl" -> play(context, args); case "play", "playurl", "playnbs", "playnbsurl" -> play(context);
case "stop" -> stop(context); case "stop" -> stop(context);
case "loop" -> loop(context, args); case "loop" -> loop(context);
case "list" -> list(context, args); case "list" -> list(context);
case "skip" -> skip(context); case "skip" -> skip(context);
case "nowplaying" -> nowplaying(context); case "nowplaying" -> nowplaying(context);
case "queue" -> queue(context); case "queue" -> queue(context);
case "goto" -> goTo(context, args); case "goto" -> goTo(context);
case "pitch" -> pitch(context, args); case "pitch" -> pitch(context);
case "speed" -> speed(context, args); case "speed" -> speed(context);
case "noteinstrument" -> noteInstrument(context, args); case "noteinstrument" -> noteInstrument(context);
case "pause", "resume" -> pause(context); case "pause", "resume" -> pause(context);
case "info" -> info(context); case "info" -> info(context);
case "testsong" -> testSong(context); case "testsong" -> testSong(context);
@ -88,22 +89,22 @@ public class MusicCommand extends Command {
}; };
} }
public Component play (CommandContext context, String[] args) { public Component play (CommandContext context) throws CommandException {
final MusicPlayerPlugin player = context.bot.music; final MusicPlayerPlugin player = context.bot.music;
String _path; String _path;
Path path; Path path;
try { try {
_path = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); _path = context.getString(true, true);
if (_path.isBlank()) return Component.text("No song specified").color(NamedTextColor.RED); // if (_path.isBlank()) throw new CommandException(Component.text("No song specified"));
path = Path.of(root.toString(), _path); path = Path.of(root.toString(), _path);
if (path.toString().contains("http")) player.loadSong(new URL(_path)); if (path.toString().contains("http")) player.loadSong(new URL(_path));
else { else {
// among us protection!!!11 // among us protection!!!11
if (!path.normalize().startsWith(root.toString())) return Component.text("no").color(NamedTextColor.RED); if (!path.normalize().startsWith(root.toString())) throw new CommandException(Component.text("no"));
// ignore my ohio code for autocomplete // ignore my ohio code for autocomplete
final String separator = File.separator; // how do i do this with the new Files? final String separator = File.separator; // how do i do this with the new Files?
@ -118,7 +119,7 @@ public class MusicCommand extends Command {
final String[] songs = realPath.toFile().list(); final String[] songs = realPath.toFile().list();
if (songs == null) return Component.text("Directory does not exist").color(NamedTextColor.RED); if (songs == null) throw new CommandException(Component.text("Directory does not exist"));
final String lowerCaseFile = pathSplitted[pathSplitted.length - 1].toLowerCase(); final String lowerCaseFile = pathSplitted[pathSplitted.length - 1].toLowerCase();
@ -140,11 +141,11 @@ public class MusicCommand extends Command {
} }
} }
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
return Component.text("Invalid URL").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid URL"));
} catch (IndexOutOfBoundsException e) { } catch (IndexOutOfBoundsException e) {
return Component.text("Song not found").color(NamedTextColor.RED); throw new CommandException(Component.text("Song not found"));
} catch (Exception e) { } catch (Exception e) {
return Component.text(e.toString()).color(NamedTextColor.RED); throw new CommandException(Component.text(e.toString()));
} }
return null; return null;
@ -158,58 +159,50 @@ public class MusicCommand extends Command {
return Component.text("Cleared the song queue").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); return Component.text("Cleared the song queue").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} }
public Component loop (CommandContext context, String[] args) { public Component loop (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
if (args.length < 2) return Component.text("Invalid loop").color(NamedTextColor.RED); final Loop loop = context.getEnum(Loop.class);
Loop loop;
switch (args[1]) {
case "off" -> {
loop = Loop.OFF;
context.sendOutput(
Component.empty()
.append(Component.text("Looping is now "))
.append(Component.text("disabled").color(NamedTextColor.RED))
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor))
);
}
case "current" -> {
loop = Loop.CURRENT;
context.sendOutput(
Component.empty()
.append(Component.text("Now looping "))
.append(Component.text(bot.music.currentSong.name).color(ColorUtilities.getColorByString(bot.config.colorPalette.secondary)))
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor))
);
}
case "all" -> {
loop = Loop.ALL;
context.sendOutput(Component.text("Now looping every song").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)));
}
default -> {
return Component.text("Invalid action").color(NamedTextColor.RED);
}
}
bot.music.loop = loop; bot.music.loop = loop;
return null; switch (loop) {
case OFF -> {
return Component.empty()
.append(Component.text("Looping is now "))
.append(Component.text("disabled").color(NamedTextColor.RED))
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
}
case CURRENT -> {
return Component.empty()
.append(Component.text("Now looping "))
.append(Component.text(bot.music.currentSong.name).color(ColorUtilities.getColorByString(bot.config.colorPalette.secondary)))
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
}
case ALL -> {
return Component.text("Now looping every song").color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
}
default -> {
throw new CommandException(Component.text("Invalid action"));
}
}
} }
public Component list (CommandContext context, String[] args) { public Component list (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final String prefix = context.prefix; final String prefix = context.prefix;
final Path path = (args.length < 2) ? final String stringPathIfExists = context.getString(true, false);
final Path path = (stringPathIfExists.isEmpty()) ?
root : root :
Path.of( Path.of(
root.toString(), root.toString(),
String.join(" ", Arrays.copyOfRange(args, 1, args.length)) stringPathIfExists
); );
if (!path.normalize().startsWith(root.toString())) return Component.text("no").color(NamedTextColor.RED); if (!path.normalize().startsWith(root.toString())) throw new CommandException(Component.text("no"));
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) { try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
final List<Path> paths = new ArrayList<>(); final List<Path> paths = new ArrayList<>();
@ -238,7 +231,7 @@ public class MusicCommand extends Command {
location = Paths.get(""); // wtf mabe location = Paths.get(""); // wtf mabe
} }
final String joinedPath = (args.length < 2) ? eachPath.getFileName().toString() : Paths.get(location.getFileName().toString(), eachPath.getFileName().toString()).toString(); final String joinedPath = stringPathIfExists.isEmpty() ? eachPath.getFileName().toString() : Paths.get(location.getFileName().toString(), eachPath.getFileName().toString()).toString();
fullList.add( fullList.add(
Component Component
@ -269,7 +262,7 @@ public class MusicCommand extends Command {
list.clear(); list.clear();
} }
} catch (NoSuchFileException e) { } catch (NoSuchFileException e) {
return Component.text("Directory doesn't exist").color(NamedTextColor.RED); throw new CommandException(Component.text("Directory doesn't exist"));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -277,10 +270,10 @@ public class MusicCommand extends Command {
return null; return null;
} }
public Component skip (CommandContext context) { public Component skip (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final MusicPlayerPlugin music = bot.music; final MusicPlayerPlugin music = bot.music;
if (music.currentSong == null) return Component.text("No song is currently playing").color(NamedTextColor.RED); if (music.currentSong == null) throw new CommandException(Component.text("No song is currently playing"));
context.sendOutput( context.sendOutput(
Component.empty() Component.empty()
@ -294,10 +287,10 @@ public class MusicCommand extends Command {
return null; return null;
} }
public Component nowplaying (CommandContext context) { public Component nowplaying (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final Song song = bot.music.currentSong; final Song song = bot.music.currentSong;
if (song == null) return Component.text("No song is currently playing").color(NamedTextColor.RED); if (song == null) throw new CommandException(Component.text("No song is currently playing"));
return Component.empty() return Component.empty()
.append(Component.text("Now playing ")) .append(Component.text("Now playing "))
@ -323,17 +316,17 @@ public class MusicCommand extends Command {
} }
// lazy fix for java using "goto" as keyword real // lazy fix for java using "goto" as keyword real
public Component goTo (CommandContext context, String[] args) { public Component goTo (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final Song currentSong = bot.music.currentSong; final Song currentSong = bot.music.currentSong;
final String input = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); final String input = context.getString(true, true);
final long timestamp = TimestampUtilities.parseTimestamp(input); final long timestamp = TimestampUtilities.parseTimestamp(input);
if (currentSong == null) return Component.text("No song is currently playing").color(NamedTextColor.RED); if (currentSong == null) throw new CommandException(Component.text("No song is currently playing"));
if (timestamp < 0 || timestamp > currentSong.length) return Component.text("Invalid timestamp").color(NamedTextColor.RED); if (timestamp < 0 || timestamp > currentSong.length) throw new CommandException(Component.text("Invalid timestamp"));
currentSong.setTime(timestamp); currentSong.setTime(timestamp);
@ -343,15 +336,10 @@ public class MusicCommand extends Command {
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); .color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} }
public Component pitch (CommandContext context, String[] args) { public Component pitch (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
float pitch; final float pitch = context.getFloat(true);
try {
pitch = Float.parseFloat(args[1]);
} catch (IllegalArgumentException ignored) {
return Component.text("Invalid pitch").color(NamedTextColor.RED);
}
bot.music.pitch = pitch; bot.music.pitch = pitch;
@ -361,18 +349,13 @@ public class MusicCommand extends Command {
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); .color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} }
public Component speed (CommandContext context, String[] args) { public Component speed (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final Song currentSong = bot.music.currentSong; final Song currentSong = bot.music.currentSong;
float speed; final float speed = context.getFloat(true);
try {
speed = Float.parseFloat(args[1]);
} catch (IllegalArgumentException ignored) {
return Component.text("Invalid speed").color(NamedTextColor.RED);
}
if (speed > 5) return Component.text("Too fast").color(NamedTextColor.RED); if (speed > 5) throw new CommandException(Component.text("Too fast!"));
long oldTime = -1; long oldTime = -1;
@ -388,10 +371,10 @@ public class MusicCommand extends Command {
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); .color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} }
public Component noteInstrument (CommandContext context, String[] args) { public Component noteInstrument (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final String instrument = args[1]; final String instrument = context.getString(true, true);
bot.music.instrument = instrument; bot.music.instrument = instrument;
@ -405,11 +388,11 @@ public class MusicCommand extends Command {
} }
} }
public Component pause (CommandContext context) { public Component pause (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final Song currentSong = bot.music.currentSong; final Song currentSong = bot.music.currentSong;
if (currentSong == null) return Component.text("No song is currently playing").color(NamedTextColor.RED); if (currentSong == null) throw new CommandException(Component.text("No song is currently playing"));
if (currentSong.paused) { if (currentSong.paused) {
currentSong.play(); currentSong.play();
@ -420,11 +403,11 @@ public class MusicCommand extends Command {
} }
} }
public Component info (CommandContext context) { public Component info (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final Song currentSong = bot.music.currentSong; final Song currentSong = bot.music.currentSong;
if (currentSong == null) return Component.text("No song is currently playing").color(NamedTextColor.RED); if (currentSong == null) throw new CommandException(Component.text("No song is currently playing"));
// ig very code yup // ig very code yup
final String title = currentSong.originalName; final String title = currentSong.originalName;

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.ClickEvent;
@ -16,7 +17,7 @@ public class NetMessageCommand extends Command {
super( super(
"netmsg", "netmsg",
"Broadcasts a message to all of the servers that the bot is connected", "Broadcasts a message to all of the servers that the bot is connected",
new String[] { "<{message}>" }, new String[] { "<message>" },
new String[] { "networkmessage", "irc" }, new String[] { "networkmessage", "irc" },
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -24,7 +25,7 @@ public class NetMessageCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final List<Bot> bots = bot.bots; final List<Bot> bots = bot.bots;
@ -47,7 +48,7 @@ public class NetMessageCommand extends Command {
Component.text(" "), Component.text(" "),
context.sender.displayName == null ? Component.text(context.sender.profile.getName()).color(NamedTextColor.GRAY) : context.sender.displayName.color(NamedTextColor.GRAY), context.sender.displayName == null ? Component.text(context.sender.profile.getName()).color(NamedTextColor.GRAY) : context.sender.displayName.color(NamedTextColor.GRAY),
Component.text(" "), Component.text(" "),
Component.text(String.join(" ", args)).color(NamedTextColor.GRAY) Component.text(context.getString(true, true)).color(NamedTextColor.GRAY)
).color(NamedTextColor.DARK_GRAY); ).color(NamedTextColor.DARK_GRAY);
for (Bot eachBot : bots) { for (Bot eachBot : bots) {

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry; import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
@ -14,7 +15,7 @@ public class PCrashCommand extends Command {
super( super(
"pcrash", "pcrash",
"Crashes a player using particle", "Crashes a player using particle",
new String[] { "<hash> <{player}>" }, new String[] { "<hash> <player>" },
new String[] { "particlecrash" }, new String[] { "particlecrash" },
TrustLevel.TRUSTED, TrustLevel.TRUSTED,
false false
@ -22,14 +23,12 @@ public class PCrashCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
if (args.length == 0) return Component.text("Not enough arguments").color(NamedTextColor.RED);
final Bot bot = context.bot; final Bot bot = context.bot;
final PlayerEntry player = bot.players.getEntry(args[0]); final PlayerEntry player = bot.players.getEntry(context.getString(true, true));
if (player == null) return Component.text("Invalid player name").color(NamedTextColor.RED); if (player == null) throw new CommandException(Component.text("Invalid player name"));
bot.exploits.pcrash(player.profile.getId()); bot.exploits.pcrash(player.profile.getId());

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry; import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
@ -23,14 +24,14 @@ public class RandomTeleportCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final PlayerEntry sender = context.sender; final PlayerEntry sender = context.sender;
final int positionX = MathUtilities.between(-1_000_000, 1_000_000); final int positionX = MathUtilities.between(-1_000_000, 1_000_000);
final int positionZ = MathUtilities.between(-1_000_000, 1_000_000); final int positionZ = MathUtilities.between(-1_000_000, 1_000_000);
final String stringPosition = positionX + " 100 " + positionZ; // is harding the y to 100 a great idea? final String stringPosition = positionX + " 100 " + positionZ; // is hardcoding the y to 100 a great idea?
bot.core.run("essentials:teleport " + sender.profile.getIdAsString() + " " + stringPosition); bot.core.run("essentials:teleport " + sender.profile.getIdAsString() + " " + stringPosition);

View file

@ -19,7 +19,7 @@ public class RefillCoreCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) {
final Bot bot = context.bot; final Bot bot = context.bot;
bot.core.reset(); bot.core.reset();

View file

@ -18,7 +18,7 @@ public class ScreenshareCommand { // extends Command {
// } // }
// @Override // @Override
// public Component execute(CommandContext context, String[] args, String[] fullArgs) { // public Component execute(CommandContext context) throws CommandException {
// final Bot bot = context.bot; // final Bot bot = context.bot;
// //
// try { // try {
@ -66,11 +66,11 @@ public class ScreenshareCommand { // extends Command {
// .color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); // .color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
// } // }
// default -> { // default -> {
// return Component.text("Invalid action").color(NamedTextColor.RED); // throw new CommandException(Component.text("Invalid action"));
// } // }
// } // }
// } catch (NumberFormatException e) { // } catch (NumberFormatException e) {
// return Component.text("Invalid integer").color(NamedTextColor.RED); // throw new CommandException(Component.text("Invalid integer"));
// } // }
// } // }
} }

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
@ -16,7 +17,7 @@ public class ServerEvalCommand extends Command {
super( super(
"servereval", "servereval",
"Evaluate codes using LuaJ", "Evaluate codes using LuaJ",
new String[] { "<ownerHash> <{code}>" }, new String[] { "<ownerHash> <code>" },
new String[] {}, new String[] {},
TrustLevel.OWNER, TrustLevel.OWNER,
false false
@ -24,7 +25,7 @@ public class ServerEvalCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
try { try {
final Bot bot = context.bot; final Bot bot = context.bot;
@ -34,13 +35,13 @@ public class ServerEvalCommand extends Command {
globals.set("class", CoerceJavaToLua.coerce(Class.class)); globals.set("class", CoerceJavaToLua.coerce(Class.class));
globals.set("context", CoerceJavaToLua.coerce(context)); globals.set("context", CoerceJavaToLua.coerce(context));
LuaValue chunk = globals.load(String.join(" ", args)); LuaValue chunk = globals.load(context.getString(true, true));
final LuaValue output = chunk.call(); final LuaValue output = chunk.call();
return Component.text(output.toString()).color(NamedTextColor.GREEN); return Component.text(output.toString()).color(NamedTextColor.GREEN);
} catch (Exception e) { } catch (Exception e) {
return Component.text(e.toString()).color(NamedTextColor.RED); throw new CommandException(Component.text(e.toString()));
} }
} }
} }

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -21,10 +22,12 @@ public class TPSBarCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
switch (args[0]) { final String action = context.getString(false, true);
switch (action) {
case "on" -> { case "on" -> {
bot.tps.on(); bot.tps.on();
return Component.empty() return Component.empty()
@ -40,7 +43,7 @@ public class TPSBarCommand extends Command {
.color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); .color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} }
default -> { default -> {
return Component.text("Invalid action").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid action"));
} }
} }
} }

View file

@ -2,6 +2,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
@ -11,7 +12,7 @@ public class TestCommand extends Command {
super( super(
"test", "test",
"Tests if the bot is working", "Tests if the bot is working",
new String[] { "[{args}]" }, new String[] { "[args]" },
new String[] {}, new String[] {},
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -19,13 +20,13 @@ public class TestCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
return Component.translatable( return Component.translatable(
"Hello, World! Username: %s, Sender UUID: %s, Prefix: %s, Args: %s", "Hello, World! Username: %s, Sender UUID: %s, Prefix: %s, Args: %s",
Component.text(context.sender.profile.getName()), Component.text(context.sender.profile.getName()),
Component.text(context.sender.profile.getIdAsString()), Component.text(context.sender.profile.getIdAsString()),
Component.text(context.prefix), Component.text(context.prefix),
Component.text(String.join(", ", args)) Component.text(context.getString(true, false))
).color(NamedTextColor.GREEN); ).color(NamedTextColor.GREEN);
} }
} }

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -25,16 +26,16 @@ public class TimeCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final String timezone = args[0]; final String timezone = context.getString(true, true);
DateTimeZone zone; DateTimeZone zone;
try { try {
zone = DateTimeZone.forID(timezone); zone = DateTimeZone.forID(timezone);
} catch (IllegalArgumentException ignored) { } catch (IllegalArgumentException ignored) {
return Component.text("Invalid timezone (case-sensitive)").color(NamedTextColor.RED); throw new CommandException(Component.text("Invalid timezone (case-sensitive)"));
} }
final DateTime dateTime = new DateTime(zone); final DateTime dateTime = new DateTime(zone);

View file

@ -6,6 +6,7 @@ import com.google.gson.JsonObject;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import land.chipmunk.chayapak.chomens_bot.util.HttpUtilities; import land.chipmunk.chayapak.chomens_bot.util.HttpUtilities;
@ -15,14 +16,13 @@ import net.kyori.adventure.text.format.NamedTextColor;
import java.net.URL; import java.net.URL;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class TranslateCommand extends Command { public class TranslateCommand extends Command {
public TranslateCommand () { public TranslateCommand () {
super( super(
"translate", "translate",
"Translates a message using Google Translate", "Translates a message using Google Translate",
new String[] { "<fromLanguage> <toLanguage> <{message}>" }, new String[] { "<fromLanguage> <toLanguage> <message>" },
new String[] {}, new String[] {},
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -30,13 +30,13 @@ public class TranslateCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final String from = args[0]; final String from = context.getString(false, true);
final String to = args[1]; final String to = context.getString(false, true);
final String message = String.join(" ", Arrays.copyOfRange(args, 2, args.length)); final String message = context.getString(true, true);
final Gson gson = new Gson(); final Gson gson = new Gson();

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry; import land.chipmunk.chayapak.chomens_bot.data.chat.PlayerEntry;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
@ -16,7 +17,7 @@ public class UUIDCommand extends Command {
super( super(
"uuid", "uuid",
"Shows your UUID or other player's UUID", "Shows your UUID or other player's UUID",
new String[] { "[{username}]" }, new String[] { "[username]" },
new String[] {}, new String[] {},
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -24,13 +25,15 @@ public class UUIDCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
if (args.length > 0) { final String player = context.getString(true, false);
final PlayerEntry entry = bot.players.getEntry(String.join(" ", args));
if (entry == null) return Component.text("Invalid player name").color(NamedTextColor.RED); if (!player.isEmpty()) {
final PlayerEntry entry = bot.players.getEntry(player);
if (entry == null) throw new CommandException(Component.text("Invalid player name"));
final String name = entry.profile.getName(); final String name = entry.profile.getName();
final String uuid = entry.profile.getIdAsString(); final String uuid = entry.profile.getIdAsString();

View file

@ -6,10 +6,7 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.Main; import land.chipmunk.chayapak.chomens_bot.Main;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.*;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.DiscordCommandContext;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import land.chipmunk.chayapak.chomens_bot.util.HttpUtilities; import land.chipmunk.chayapak.chomens_bot.util.HttpUtilities;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -32,7 +29,7 @@ public class UrbanCommand extends Command {
super( super(
"urban", "urban",
"Urban Dictionary in Minecraft", "Urban Dictionary in Minecraft",
new String[] { "<{term}>" }, new String[] { "<term>" },
new String[] {}, new String[] {},
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
@ -41,14 +38,14 @@ public class UrbanCommand extends Command {
Main.executor.scheduleAtFixedRate(() -> requestsPerSecond = 0, 0, 1, TimeUnit.SECONDS); Main.executor.scheduleAtFixedRate(() -> requestsPerSecond = 0, 0, 1, TimeUnit.SECONDS);
} }
public Component execute (CommandContext context, String[] args, String[] fullArgs) { public Component execute (CommandContext context) throws CommandException {
if (requestsPerSecond > 3) return Component.text("Too many requests").color(NamedTextColor.RED); if (requestsPerSecond > 3) throw new CommandException(Component.text("Too many requests"));
final Bot bot = context.bot; final Bot bot = context.bot;
final boolean discord = context instanceof DiscordCommandContext; final boolean discord = context instanceof DiscordCommandContext;
final String term = String.join(" ", args); final String term = context.getString(true, true);
final Gson gson = new Gson(); final Gson gson = new Gson();

View file

@ -3,6 +3,7 @@ package land.chipmunk.chayapak.chomens_bot.commands;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
@ -20,13 +21,13 @@ public class ValidateCommand extends Command {
} }
@Override @Override
public Component execute(CommandContext context, String[] args, String[] fullArgs) { public Component execute(CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final String hash = fullArgs[0]; final String hash = context.fullArgs[0];
if (bot.hashing.isCorrectHash(hash, context.splitInput[0], context.sender)) return Component.text("Valid hash").color(NamedTextColor.GREEN); if (bot.hashing.isCorrectHash(hash, context.commandName, context.sender)) return Component.text("Valid hash").color(NamedTextColor.GREEN);
else if (bot.hashing.isCorrectOwnerHash(hash, context.splitInput[0], context.sender)) return Component.text("Valid OwnerHash").color(NamedTextColor.GREEN); else if (bot.hashing.isCorrectOwnerHash(hash, context.commandName, context.sender)) return Component.text("Valid OwnerHash").color(NamedTextColor.GREEN);
return null; return null;
} }

View file

@ -5,6 +5,7 @@ import com.google.gson.JsonObject;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities; import land.chipmunk.chayapak.chomens_bot.util.ColorUtilities;
import land.chipmunk.chayapak.chomens_bot.util.HttpUtilities; import land.chipmunk.chayapak.chomens_bot.util.HttpUtilities;
@ -24,17 +25,17 @@ public class WeatherCommand extends Command {
super( super(
"weather", "weather",
"Shows the weather in a place", "Shows the weather in a place",
new String[] { "<{location}>" }, new String[] { "<location>" },
new String[] {}, new String[] {},
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
); );
} }
public Component execute (CommandContext context, String[] args, String[] fullArgs) { public Component execute (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final String location = String.join(" ", args); final String location = context.getString(true, true);
final Gson gson = new Gson(); final Gson gson = new Gson();
@ -107,7 +108,7 @@ public class WeatherCommand extends Command {
Component.text(time).color(ColorUtilities.getColorByString(bot.config.colorPalette.string)) Component.text(time).color(ColorUtilities.getColorByString(bot.config.colorPalette.string))
).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor)); ).color(ColorUtilities.getColorByString(bot.config.colorPalette.defaultColor));
} catch (Exception e) { } catch (Exception e) {
return Component.text("Location \"" + location + "\" not found").color(NamedTextColor.RED); throw new CommandException(Component.text("Location \"" + location + "\" not found"));
} }
} }
} }

View file

@ -5,6 +5,7 @@ import com.google.gson.JsonObject;
import land.chipmunk.chayapak.chomens_bot.Bot; import land.chipmunk.chayapak.chomens_bot.Bot;
import land.chipmunk.chayapak.chomens_bot.command.Command; import land.chipmunk.chayapak.chomens_bot.command.Command;
import land.chipmunk.chayapak.chomens_bot.command.CommandContext; import land.chipmunk.chayapak.chomens_bot.command.CommandContext;
import land.chipmunk.chayapak.chomens_bot.command.CommandException;
import land.chipmunk.chayapak.chomens_bot.command.TrustLevel; import land.chipmunk.chayapak.chomens_bot.command.TrustLevel;
import land.chipmunk.chayapak.chomens_bot.util.HttpUtilities; import land.chipmunk.chayapak.chomens_bot.util.HttpUtilities;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -20,17 +21,17 @@ public class WikipediaCommand extends Command {
super( super(
"wikipedia", "wikipedia",
"Wikipedia in Minecraft", "Wikipedia in Minecraft",
new String[] { "<{page}>" }, new String[] { "<page>" },
new String[] { "wiki" }, new String[] { "wiki" },
TrustLevel.PUBLIC, TrustLevel.PUBLIC,
false false
); );
} }
public Component execute (CommandContext context, String[] args, String[] fullArgs) { public Component execute (CommandContext context) throws CommandException {
final Bot bot = context.bot; final Bot bot = context.bot;
final String page = String.join(" ", args); final String page = context.getString(true, true);
final Gson gson = new Gson(); final Gson gson = new Gson();

View file

@ -58,9 +58,11 @@ public class ChatCommandHandlerPlugin extends ChatPlugin.Listener {
final PlayerCommandContext context = new PlayerCommandContext(bot, displayName, prefix, "@a", message.sender); final PlayerCommandContext context = new PlayerCommandContext(bot, displayName, prefix, "@a", message.sender);
final Component output = bot.commandHandler.executeCommand(commandString, context, null); bot.executorService.submit(() -> {
final Component output = bot.commandHandler.executeCommand(commandString, context, null);
if (output != null) context.sendOutput(output); if (output != null) context.sendOutput(output);
});
} }
public void commandSpyMessageReceived (PlayerEntry sender, String command) { public void commandSpyMessageReceived (PlayerEntry sender, String command) {
@ -90,8 +92,10 @@ public class ChatCommandHandlerPlugin extends ChatPlugin.Listener {
final PlayerCommandContext context = new PlayerCommandContext(bot, displayName, prefix, selector, sender); final PlayerCommandContext context = new PlayerCommandContext(bot, displayName, prefix, selector, sender);
final Component output = bot.commandHandler.executeCommand(commandString, context, null); bot.executorService.submit(() -> {
final Component output = bot.commandHandler.executeCommand(commandString, context, null);
if (output != null) context.sendOutput(output); if (output != null) context.sendOutput(output);
});
} }
} }

View file

@ -100,24 +100,13 @@ public class CommandHandlerPlugin {
final TrustLevel trustLevel = command.trustLevel; final TrustLevel trustLevel = command.trustLevel;
final String[] fullArgs = Arrays.copyOfRange(splitInput, 1, splitInput.length);
// TODO: improve these minimum args and maximum args stuff, the current one really sucks.,.,
final int shortestUsageIndex = getShortestUsageIndex(command.usages);
final int longestUsageIndex = getLongestUsageIndex(command.usages);
final String shortestUsage = shortestUsageIndex == 0 && command.usages.length == 0 ? "" : command.usages[shortestUsageIndex];
final String longestUsage = longestUsageIndex == 0 && command.usages.length == 0 ? "" : command.usages[longestUsageIndex];
final int minimumArgs = getMinimumArgs(shortestUsage, inGame, command.trustLevel);
final int maximumArgs = getMaximumArgs(longestUsage, inGame, command.trustLevel);
if (fullArgs.length < minimumArgs) return Component.text("Excepted minimum of " + minimumArgs + " argument(s), got " + fullArgs.length).color(NamedTextColor.RED);
if (fullArgs.length > maximumArgs && !longestUsage.contains("{")) return Component.text("Too many arguments, expected " + maximumArgs + " max").color(NamedTextColor.RED);
if (trustLevel != TrustLevel.PUBLIC && splitInput.length < 2 && inGame) return Component.text("Please provide a hash").color(NamedTextColor.RED); if (trustLevel != TrustLevel.PUBLIC && splitInput.length < 2 && inGame) return Component.text("Please provide a hash").color(NamedTextColor.RED);
String userHash = ""; String userHash = "";
if (trustLevel != TrustLevel.PUBLIC && inGame) userHash = splitInput[1]; if (trustLevel != TrustLevel.PUBLIC && inGame) userHash = splitInput[1];
final String[] fullArgs = Arrays.copyOfRange(splitInput, 1, splitInput.length);
final String[] args = Arrays.copyOfRange(splitInput, (trustLevel != TrustLevel.PUBLIC && inGame) ? 2 : 1, splitInput.length); final String[] args = Arrays.copyOfRange(splitInput, (trustLevel != TrustLevel.PUBLIC && inGame) ? 2 : 1, splitInput.length);
if (command.trustLevel != TrustLevel.PUBLIC && !console) { if (command.trustLevel != TrustLevel.PUBLIC && !console) {
@ -157,11 +146,15 @@ public class CommandHandlerPlugin {
if (!console && command.consoleOnly) return Component.text("This command can only be ran via console").color(NamedTextColor.RED); if (!console && command.consoleOnly) return Component.text("This command can only be ran via console").color(NamedTextColor.RED);
context.splitInput = splitInput; // should these be here?
context.fullArgs = fullArgs;
context.args = args;
context.commandName = command.name; context.commandName = command.name;
try { try {
return command.execute(context, args, fullArgs); return command.execute(context);
} catch (CommandException e) {
return e.message.color(NamedTextColor.RED);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -176,7 +169,8 @@ public class CommandHandlerPlugin {
.text(stackTrace) .text(stackTrace)
.color(NamedTextColor.RED) .color(NamedTextColor.RED)
) )
); )
.color(NamedTextColor.RED);
} else { } else {
return Component.text(stackTrace).color(NamedTextColor.RED); return Component.text(stackTrace).color(NamedTextColor.RED);
} }
@ -197,66 +191,4 @@ public class CommandHandlerPlugin {
} }
return null; return null;
} }
private int getLongestUsageIndex(String[] usages) {
int longestIndex = 0;
int maxLength = 0;
final int usagesSize = usages.length;
for (int i = 0; i < usagesSize; i++) {
String[] args = usages[i].split("\\s+");
if (args.length > maxLength) {
longestIndex = i;
maxLength = args.length;
}
}
return longestIndex;
}
private int getShortestUsageIndex(String[] usages) {
int shortestIndex = 0;
int minLength = Integer.MAX_VALUE;
final int usagesSize = usages.length;
for (int i = 0; i < usagesSize; i++) {
String[] args = usages[i].split("\\s+");
if (args.length < minLength) {
shortestIndex = i;
minLength = args.length;
}
}
return shortestIndex;
}
private int getMinimumArgs(String usage, boolean inGame, TrustLevel trustLevel) {
int count = 0;
final int usageLength = usage.length();
for (int i = 0; i < usageLength; i++) {
if (usage.charAt(i) == '<') {
count++;
}
}
if (usage.contains("<hash>")) count--; // bad fix?
if ((!inGame && trustLevel != TrustLevel.PUBLIC)) count--;
return count;
}
private int getMaximumArgs(String usage, boolean inGame, TrustLevel trustLevel) {
int count = 0;
final int usageLength = usage.length();
for (int i = 0; i < usageLength; i++) {
if (usage.charAt(i) == '<' || usage.charAt(i) == '[') {
count++;
}
}
if (!inGame && trustLevel != TrustLevel.PUBLIC) count++;
return count;
}
} }