/* * Copyright (C) 2021 - 2023 Elytrium * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package net.elytrium.limboauth.command; import com.google.common.collect.ImmutableList; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.command.SimpleCommand; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; import net.elytrium.limboauth.LimboAuth; import net.elytrium.limboauth.Settings; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; public class LimboAuthCommand implements SimpleCommand { private static final List HELP_MESSAGE = List.of( Component.text("This server is using LimboAuth and LimboAPI.", NamedTextColor.YELLOW), Component.text("(C) 2021 - 2023 Elytrium", NamedTextColor.YELLOW), Component.text("https://elytrium.net/github/", NamedTextColor.GREEN), Component.empty() ); private static final Component AVAILABLE_SUBCOMMANDS_MESSAGE = Component.text("Available subcommands:", NamedTextColor.WHITE); private static final Component NO_AVAILABLE_SUBCOMMANDS_MESSAGE = Component.text("There is no available subcommands for you.", NamedTextColor.WHITE); private final LimboAuth plugin; public LimboAuthCommand(LimboAuth plugin) { this.plugin = plugin; } @Override public List suggest(SimpleCommand.Invocation invocation) { CommandSource source = invocation.source(); String[] args = invocation.arguments(); if (args.length == 0) { return Arrays.stream(Subcommand.values()) .filter(command -> command.hasPermission(source)) .map(Subcommand::getCommand) .collect(Collectors.toList()); } else if (args.length == 1) { String argument = args[0]; return Arrays.stream(Subcommand.values()) .filter(command -> command.hasPermission(source)) .map(Subcommand::getCommand) .filter(str -> str.regionMatches(true, 0, argument, 0, argument.length())) .collect(Collectors.toList()); } else { return ImmutableList.of(); } } @Override public void execute(SimpleCommand.Invocation invocation) { CommandSource source = invocation.source(); String[] args = invocation.arguments(); int argsAmount = args.length; if (argsAmount > 0) { try { Subcommand subcommand = Subcommand.valueOf(args[0].toUpperCase(Locale.ROOT)); if (!subcommand.hasPermission(source)) { this.showHelp(source); return; } subcommand.executor.execute(this, source, args); } catch (IllegalArgumentException e) { this.showHelp(source); } } else { this.showHelp(source); } } @Override public boolean hasPermission(Invocation invocation) { return Settings.IMP.MAIN.COMMAND_PERMISSION_STATE.HELP .hasPermission(invocation.source(), "limboauth.commands.help"); } private void showHelp(CommandSource source) { HELP_MESSAGE.forEach(source::sendMessage); List availableSubcommands = Arrays.stream(Subcommand.values()) .filter(command -> command.hasPermission(source)) .collect(Collectors.toList()); if (availableSubcommands.size() > 0) { source.sendMessage(AVAILABLE_SUBCOMMANDS_MESSAGE); availableSubcommands.forEach(command -> source.sendMessage(command.getMessageLine())); } else { source.sendMessage(NO_AVAILABLE_SUBCOMMANDS_MESSAGE); } } private enum Subcommand { RELOAD("Reload config.", Settings.IMP.MAIN.COMMAND_PERMISSION_STATE.RELOAD, (LimboAuthCommand parent, CommandSource source, String[] args) -> { parent.plugin.reload(); source.sendMessage(LimboAuth.getSerializer().deserialize(Settings.IMP.MAIN.STRINGS.RELOAD)); }); private final String command; private final String description; private final CommandPermissionState permissionState; private final SubcommandExecutor executor; Subcommand(String description, CommandPermissionState permissionState, SubcommandExecutor executor) { this.permissionState = permissionState; this.command = this.name().toLowerCase(Locale.ROOT); this.description = description; this.executor = executor; } public boolean hasPermission(CommandSource source) { return this.permissionState.hasPermission(source, "limboauth.admin." + this.command); } public Component getMessageLine() { return Component.textOfChildren( Component.text(" /limboauth " + this.command, NamedTextColor.GREEN), Component.text(" - ", NamedTextColor.DARK_GRAY), Component.text(this.description, NamedTextColor.YELLOW) ); } public String getCommand() { return this.command; } } private interface SubcommandExecutor { void execute(LimboAuthCommand parent, CommandSource source, String[] args); } }