diff --git a/build-number.txt b/build-number.txt index a9561ada..90c77a33 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -2662 \ No newline at end of file +2669 \ No newline at end of file diff --git a/src/main/java/me/chayapak1/chomens_bot/command/contexts/RemoteCommandContext.java b/src/main/java/me/chayapak1/chomens_bot/command/contexts/RemoteCommandContext.java new file mode 100644 index 00000000..7e4003a7 --- /dev/null +++ b/src/main/java/me/chayapak1/chomens_bot/command/contexts/RemoteCommandContext.java @@ -0,0 +1,33 @@ +package me.chayapak1.chomens_bot.command.contexts; + +import me.chayapak1.chomens_bot.Bot; +import me.chayapak1.chomens_bot.command.CommandContext; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +public class RemoteCommandContext extends CommandContext { + public final Bot targetBot; + public final CommandContext source; + + public RemoteCommandContext (final Bot targetBot, final CommandContext source) { + super(targetBot, source.prefix, source.sender, source.inGame); + + this.targetBot = targetBot; + this.source = source; + } + + @Override + public void sendOutput (final Component component) { + source.sendOutput( + Component + .translatable( + "[%s] %s", + Component.text(targetBot.getServerString(), NamedTextColor.GRAY), + Component.empty() + .color(NamedTextColor.WHITE) + .append(component) + ) + .color(NamedTextColor.DARK_GRAY) + ); + } +} diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/NetCommandCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/NetCommandCommand.java new file mode 100644 index 00000000..34b6f7d8 --- /dev/null +++ b/src/main/java/me/chayapak1/chomens_bot/commands/NetCommandCommand.java @@ -0,0 +1,69 @@ +package me.chayapak1.chomens_bot.commands; + +import me.chayapak1.chomens_bot.Bot; +import me.chayapak1.chomens_bot.command.Command; +import me.chayapak1.chomens_bot.command.CommandContext; +import me.chayapak1.chomens_bot.command.CommandException; +import me.chayapak1.chomens_bot.command.TrustLevel; +import me.chayapak1.chomens_bot.command.contexts.RemoteCommandContext; +import net.kyori.adventure.text.Component; + +import java.util.ArrayList; +import java.util.List; + +public class NetCommandCommand extends Command { + public NetCommandCommand () { + super( + "netcmd", + "Runs a command on the specified server(s) and return its output", + new String[] { " " }, + new String[] { "networkcommand", "irccommand", "remotecommand" }, + TrustLevel.TRUSTED + ); + } + + @Override + public Component execute (final CommandContext context) throws CommandException { + final String rawServers = context.getString(false, true, true); + + final List allBots = context.bot.bots; + + final List bots; + + if (rawServers.equals("all")) { + bots = allBots; + } else { + bots = new ArrayList<>(); + + final String[] servers = rawServers.split(","); + + for (final Bot bot : allBots) { + if (!bot.loggedIn) continue; + + for (final String server : servers) { + if ( + server.isBlank() + || !bot.getServerString(true) + .toLowerCase() + .trim() + .contains(server.toLowerCase()) + ) continue; + + bots.add(bot); + } + } + } + + if (bots.isEmpty()) throw new CommandException(Component.text("No servers have been found with your input")); + + final String command = context.getString(true, true); + + for (final Bot bot : bots) { + final CommandContext remoteContext = new RemoteCommandContext(bot, context); + + context.bot.commandHandler.executeCommand(command, remoteContext, null); + } + + return null; + } +} diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/CommandHandlerPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/CommandHandlerPlugin.java index faaa351e..75fe52ab 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/CommandHandlerPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/CommandHandlerPlugin.java @@ -65,6 +65,7 @@ public class CommandHandlerPlugin implements TickPlugin.Listener { registerCommand(new GrepLogCommand()); registerCommand(new FindAltsCommand()); registerCommand(new RestartCommand()); + registerCommand(new NetCommandCommand()); } public static void registerCommand (final Command command) {