diff --git a/Plan/common/src/main/java/com/djrapitops/plan/commands/PlanCommand.java b/Plan/common/src/main/java/com/djrapitops/plan/commands/PlanCommand.java index 987d61390..109c54f11 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/commands/PlanCommand.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/commands/PlanCommand.java @@ -253,6 +253,7 @@ public class PlanCommand { .subcommand(moveCommand()) .subcommand(clearCommand()) .subcommand(removeCommand()) + .subcommand(uninstalled()) .inDepthDescription("Use different database subcommands to change the data in some way") .build(); } @@ -313,4 +314,15 @@ public class PlanCommand { .onCommand((sender, arguments) -> databaseCommands.onRemove(commandName, sender, arguments)) .build(); } + + private Subcommand uninstalled() { + return Subcommand.builder() + .aliases("uninstalled") + .requirePermission("plan.data.uninstalled") + .requiredArgument("server", "Name, ID or UUID of a server") + .description("Set a server as uninstalled in the database.") + .inDepthDescription("Marks a server in Plan database as uninstalled so that it will not show up in server queries.") + .onCommand(databaseCommands::onUninstalled) + .build(); + } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/DatabaseCommands.java b/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/DatabaseCommands.java index 33df23656..a8cc596a1 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/DatabaseCommands.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/DatabaseCommands.java @@ -22,6 +22,8 @@ import com.djrapitops.plan.delivery.formatting.Formatter; import com.djrapitops.plan.delivery.formatting.Formatters; import com.djrapitops.plan.exceptions.database.DBOpException; import com.djrapitops.plan.identification.Identifiers; +import com.djrapitops.plan.identification.Server; +import com.djrapitops.plan.identification.ServerInfo; import com.djrapitops.plan.query.QuerySvc; import com.djrapitops.plan.settings.locale.Locale; import com.djrapitops.plan.settings.locale.lang.CommandLang; @@ -30,9 +32,11 @@ import com.djrapitops.plan.storage.database.DBSystem; import com.djrapitops.plan.storage.database.DBType; import com.djrapitops.plan.storage.database.Database; import com.djrapitops.plan.storage.database.SQLiteDB; +import com.djrapitops.plan.storage.database.queries.objects.ServerQueries; import com.djrapitops.plan.storage.database.transactions.BackupCopyTransaction; import com.djrapitops.plan.storage.database.transactions.commands.RemoveEverythingTransaction; import com.djrapitops.plan.storage.database.transactions.commands.RemovePlayerTransaction; +import com.djrapitops.plan.storage.database.transactions.commands.SetServerAsUninstalledTransaction; import com.djrapitops.plan.storage.file.PlanFiles; import com.djrapitops.plan.utilities.logging.ErrorContext; import com.djrapitops.plan.utilities.logging.ErrorLogger; @@ -56,6 +60,7 @@ public class DatabaseCommands { private final DBSystem dbSystem; private final SQLiteDB.Factory sqliteFactory; private final QuerySvc queryService; + private final ServerInfo serverInfo; private final Identifiers identifiers; private final PluginStatusCommands statusCommands; private final ErrorLogger errorLogger; @@ -71,6 +76,7 @@ public class DatabaseCommands { DBSystem dbSystem, SQLiteDB.Factory sqliteFactory, QuerySvc queryService, + ServerInfo serverInfo, Formatters formatters, Identifiers identifiers, PluginStatusCommands statusCommands, @@ -83,6 +89,7 @@ public class DatabaseCommands { this.dbSystem = dbSystem; this.sqliteFactory = sqliteFactory; this.queryService = queryService; + this.serverInfo = serverInfo; this.identifiers = identifiers; this.statusCommands = statusCommands; this.errorLogger = errorLogger; @@ -359,4 +366,28 @@ public class DatabaseCommands { errorLogger.log(L.ERROR, e, ErrorContext.builder().related(sender, database.getType().getName(), playerToRemove).build()); } } + + private void ensureDatabaseIsOpen() { + Database.State dbState = dbSystem.getDatabase().getState(); + if (dbState != Database.State.OPEN) { + throw new IllegalArgumentException(locale.getString(CommandLang.FAIL_DATABASE_NOT_OPEN, dbState.name())); + } + } + + public void onUninstalled(CMDSender sender, Arguments arguments) { + ensureDatabaseIsOpen(); + String identifier = arguments.concatenate(" "); + Server server = dbSystem.getDatabase() + .query(ServerQueries.fetchServerMatchingIdentifier(identifier)) + .filter(s -> !s.isProxy()) + .orElseThrow(() -> new IllegalArgumentException("Server '" + identifier + "' was not found from the database.")); + + if (server.getUuid().equals(serverInfo.getServerUUID())) { + throw new IllegalArgumentException(locale.getString(ManageLang.UNINSTALLING_SAME_SERVER)); + } + + dbSystem.getDatabase().executeTransaction(new SetServerAsUninstalledTransaction(server.getUuid())); + sender.send(locale.getString(ManageLang.PROGRESS_SUCCESS)); + sender.send("§aIf the server is still installed, it will automatically set itself as installed in the database."); + } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/manage/ManageUninstalledCommand.java b/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/manage/ManageUninstalledCommand.java deleted file mode 100644 index 2709d343e..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/manage/ManageUninstalledCommand.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.commands.subcommands.manage; - -import com.djrapitops.plan.exceptions.database.DBOpException; -import com.djrapitops.plan.identification.Server; -import com.djrapitops.plan.identification.ServerInfo; -import com.djrapitops.plan.processing.Processing; -import com.djrapitops.plan.settings.Permissions; -import com.djrapitops.plan.settings.locale.Locale; -import com.djrapitops.plan.settings.locale.lang.CmdHelpLang; -import com.djrapitops.plan.settings.locale.lang.CommandLang; -import com.djrapitops.plan.settings.locale.lang.DeepHelpLang; -import com.djrapitops.plan.settings.locale.lang.ManageLang; -import com.djrapitops.plan.storage.database.DBSystem; -import com.djrapitops.plan.storage.database.Database; -import com.djrapitops.plan.storage.database.queries.objects.ServerQueries; -import com.djrapitops.plan.storage.database.transactions.commands.SetServerAsUninstalledTransaction; -import com.djrapitops.plan.utilities.logging.ErrorLogger; -import com.djrapitops.plugin.command.CommandNode; -import com.djrapitops.plugin.command.CommandType; -import com.djrapitops.plugin.command.Sender; -import com.djrapitops.plugin.logging.L; - -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.Optional; -import java.util.UUID; - -/** - * This SubCommand is used to set a server as uninstalled on Plan. - * - * @author Rsl1122 - */ -@Singleton -public class ManageUninstalledCommand extends CommandNode { - - private final Locale locale; - private final Processing processing; - private final DBSystem dbSystem; - private final ErrorLogger errorLogger; - private final ServerInfo serverInfo; - - @Inject - public ManageUninstalledCommand( - Locale locale, - Processing processing, - DBSystem dbSystem, - ServerInfo serverInfo, - ErrorLogger errorLogger - ) { - super("uninstalled", Permissions.MANAGE.getPermission(), CommandType.ALL_WITH_ARGS); - - this.locale = locale; - this.processing = processing; - this.dbSystem = dbSystem; - this.serverInfo = serverInfo; - this.errorLogger = errorLogger; - - setShortHelp(locale.getString(CmdHelpLang.MANAGE_UNINSTALLED)); - setInDepthHelp(locale.getArray(DeepHelpLang.MANAGE_UNINSTALLED)); - setArguments("[server/id]"); - } - - @Override - public void onCommand(Sender sender, String commandLabel, String[] args) { - sender.sendMessage(locale.getString(ManageLang.PROGRESS_START)); - - Database.State dbState = dbSystem.getDatabase().getState(); - if (dbState != Database.State.OPEN) { - sender.sendMessage(locale.getString(CommandLang.FAIL_DATABASE_NOT_OPEN, dbState.name())); - return; - } - - processing.submitNonCritical(() -> { - try { - Optional serverOptional = getServer(args); - if (!serverOptional.isPresent()) { - sender.sendMessage(locale.getString(ManageLang.PROGRESS_FAIL, locale.getString(ManageLang.NO_SERVER))); - return; - } - Server server = serverOptional.get(); - UUID serverUUID = server.getUuid(); - if (serverInfo.getServerUUID().equals(serverUUID)) { - sender.sendMessage(locale.getString(ManageLang.UNINSTALLING_SAME_SERVER)); - return; - } - - dbSystem.getDatabase().executeTransaction(new SetServerAsUninstalledTransaction(serverUUID)); - sender.sendMessage(locale.getString(ManageLang.PROGRESS_SUCCESS)); - } catch (DBOpException e) { - sender.sendMessage("§cError occurred: " + e.toString()); - errorLogger.log(L.ERROR, this.getClass(), e); - } - }); - } - - private Optional getServer(String[] args) { - if (args.length >= 1) { - String serverIdentifier = getGivenIdentifier(args); - return dbSystem.getDatabase().query(ServerQueries.fetchServerMatchingIdentifier(serverIdentifier)) - .filter(Server::isNotProxy); - } - return Optional.empty(); - } - - private String getGivenIdentifier(String[] args) { - StringBuilder idBuilder = new StringBuilder(args[0]); - if (args.length > 1) { - for (int i = 1; i < args.length; i++) { - idBuilder.append(" ").append(args[i]); - } - } - return idBuilder.toString(); - } -}