Refactor duplicate code: command confirmation

This commit is contained in:
Aurora Lahtela 2023-01-22 13:45:47 +02:00
parent e0d80cb3b4
commit acf9d92b1d
4 changed files with 81 additions and 140 deletions

View File

@ -238,7 +238,7 @@ public class PlanCommand {
.optionalArgument(locale.getString(HelpLang.ARG_USERNAME), locale.getString(HelpLang.DESC_ARG_USERNAME))
.description(locale.getString(HelpLang.UNREGISTER))
.inDepthDescription(locale.getString(DeepHelpLang.UNREGISTER))
.onCommand((sender, arguments) -> registrationCommands.onUnregister(commandName, sender, arguments))
.onCommand(registrationCommands::onUnregister)
.onTabComplete(this::webUserNames)
.build();
}
@ -348,7 +348,7 @@ public class PlanCommand {
.optionalArgument("--remove_offline", "Remove offline players if given")
.description(locale.getString(HelpLang.ONLINE_UUID_MIGRATION))
.inDepthDescription("Moves and combines offline uuid data to online uuids where possible. Leaves offline-only players to database.")
.onCommand((sender, arguments) -> databaseCommands.onOnlineConversion(commandName, sender, arguments))
.onCommand(databaseCommands::onOnlineConversion)
.build();
}
@ -358,7 +358,7 @@ public class PlanCommand {
.requirePermission(Permissions.DATA_CLEAR)
.requiredArgument(locale.getString(HelpLang.ARG_SERVER), locale.getString(HelpLang.DESC_ARG_SERVER_IDENTIFIER))
.description(locale.getString(HelpLang.JOIN_ADDRESS_REMOVAL))
.onCommand((sender, arguments) -> databaseCommands.onFixFabricJoinAddresses(commandName, sender, arguments))
.onCommand(databaseCommands::onFixFabricJoinAddresses)
.onTabComplete(this::serverNames)
.build();
}
@ -384,7 +384,7 @@ public class PlanCommand {
.optionalArgument(DB_ARG_OPTIONS, locale.getString(HelpLang.DESC_ARG_DB_RESTORE))
.description(locale.getString(HelpLang.DB_RESTORE))
.inDepthDescription(locale.getString(DeepHelpLang.DB_RESTORE))
.onCommand((sender, arguments) -> databaseCommands.onRestore(commandName, sender, arguments))
.onCommand(databaseCommands::onRestore)
.onTabComplete(this::getBackupFilenames)
.build();
}
@ -409,7 +409,7 @@ public class PlanCommand {
.requiredArgument(DB_ARG_OPTIONS, locale.getString(HelpLang.DESC_ARG_DB_MOVE_TO))
.description(locale.getString(HelpLang.DB_MOVE))
.inDepthDescription(locale.getString(DeepHelpLang.DB_MOVE))
.onCommand((sender, arguments) -> databaseCommands.onMove(commandName, sender, arguments))
.onCommand(databaseCommands::onMove)
.onTabComplete((sender, arguments) -> DBType.names())
.build();
}
@ -434,7 +434,7 @@ public class PlanCommand {
.requiredArgument(DB_ARG_OPTIONS, locale.getString(HelpLang.DESC_ARG_DB_REMOVE))
.description(locale.getString(HelpLang.DB_CLEAR))
.inDepthDescription(locale.getString(DeepHelpLang.DB_CLEAR))
.onCommand((sender, arguments) -> databaseCommands.onClear(commandName, sender, arguments))
.onCommand(databaseCommands::onClear)
.onTabComplete((sender, arguments) ->
arguments.isEmpty() ? DBType.names() : Collections.emptyList()
).build();
@ -447,7 +447,7 @@ public class PlanCommand {
.requiredArgument(locale.getString(HelpLang.ARG_NAME_UUID), locale.getString(HelpLang.DESC_ARG_PLAYER_IDENTIFIER_REMOVE))
.description(locale.getString(HelpLang.DB_REMOVE))
.inDepthDescription(locale.getString(DeepHelpLang.DB_REMOVE))
.onCommand((sender, arguments) -> databaseCommands.onRemove(commandName, sender, arguments))
.onCommand(databaseCommands::onRemove)
.onTabComplete(this::playerNames)
.build();
}

View File

@ -17,12 +17,15 @@
package com.djrapitops.plan.commands.subcommands;
import com.djrapitops.plan.commands.use.CMDSender;
import com.djrapitops.plan.commands.use.ColorScheme;
import com.djrapitops.plan.commands.use.MessageBuilder;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.CommandLang;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
@ -31,20 +34,57 @@ import java.util.function.Consumer;
public class Confirmation {
private final Cache<CMDSender, Consumer<Boolean>> awaiting;
private final String mainCommand;
private final ColorScheme colors;
private final Locale locale;
@Inject
public Confirmation(
@Named("mainCommandName") String mainCommand,
ColorScheme colors,
Locale locale
) {
this.mainCommand = mainCommand;
this.colors = colors;
this.locale = locale;
awaiting = Caffeine.newBuilder()
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
}
public void confirm(CMDSender sender, Consumer<Boolean> confirmation) {
private void sendConfirmOptionMessages(CMDSender sender, String prompt) {
MessageBuilder message = sender.buildMessage()
.addPart(colors.getMainColor() + prompt).newLine();
sendConfirmOptionMessages(sender, message);
}
private void sendConfirmOptionMessages(CMDSender sender, MessageBuilder message) {
if (sender.supportsChatEvents()) {
message
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM))
.addPart("§2§l[\u2714]").command("/" + mainCommand + " accept").hover(locale.getString(CommandLang.CONFIRM_ACCEPT))
.addPart(" ")
.addPart("§4§l[\u2718]").command("/" + mainCommand + " cancel").hover(locale.getString(CommandLang.CONFIRM_DENY))
.send();
} else {
message
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM)).addPart("§a/" + mainCommand + " accept")
.addPart(" ")
.addPart("§c/" + mainCommand + " cancel")
.send();
}
}
public void confirm(CMDSender sender, String prompt, Consumer<Boolean> confirmation) {
if (awaiting.getIfPresent(sender) != null) onCancel(sender);
sendConfirmOptionMessages(sender, prompt);
awaiting.put(sender, confirmation);
}
public void confirm(CMDSender sender, MessageBuilder message, Consumer<Boolean> confirmation) {
if (awaiting.getIfPresent(sender) != null) onCancel(sender);
sendConfirmOptionMessages(sender, message);
awaiting.put(sender, confirmation);
}

View File

@ -62,6 +62,8 @@ import java.util.stream.Collectors;
@Singleton
public class DatabaseCommands {
private static final String SUPPORTED_DB_OPTIONS = "<MySQL/SQLite>";
private final Locale locale;
private final Confirmation confirmation;
private final ColorScheme colors;
@ -151,7 +153,7 @@ public class DatabaseCommands {
}
}
public void onRestore(String mainCommand, CMDSender sender, @Untrusted Arguments arguments) {
public void onRestore(CMDSender sender, @Untrusted Arguments arguments) {
@Untrusted String backupDbName = arguments.get(0)
.orElseThrow(() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_REQ_ARGS, 1, "<" + locale.getString(HelpLang.ARG_BACKUP_FILE) + ">")));
@ -178,24 +180,11 @@ public class DatabaseCommands {
if (toDB.getState() != Database.State.OPEN) toDB.init();
if (sender.supportsChatEvents()) {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_OVERWRITE_DB, toDB.getType().getName(), backupDBFile.toPath().toString())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM))
.addPart("§2§l[\u2714]").command("/" + mainCommand + " accept").hover(locale.getString(CommandLang.CONFIRM_ACCEPT))
.addPart(" ")
.addPart("§4§l[\u2718]").command("/" + mainCommand + " cancel").hover(locale.getString(CommandLang.CONFIRM_DENY))
.send();
} else {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_OVERWRITE_DB, toDB.getType().getName(), backupDBFile.toPath().toString())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM)).addPart("§a/" + mainCommand + " accept")
.addPart(" ")
.addPart("§c/" + mainCommand + " cancel")
.send();
}
String prompt = locale.getString(CommandLang.CONFIRM_OVERWRITE_DB,
toDB.getType().getName(),
backupDBFile.toPath().toString());
confirmation.confirm(sender, choice -> {
confirmation.confirm(sender, prompt, choice -> {
if (Boolean.TRUE.equals(choice)) {
performRestore(sender, backupDBFile, toDB);
} else {
@ -220,35 +209,22 @@ public class DatabaseCommands {
}
}
public void onMove(String mainCommand, CMDSender sender, @Untrusted Arguments arguments) {
public void onMove(CMDSender sender, @Untrusted Arguments arguments) {
DBType fromDB = arguments.get(0).flatMap(DBType::getForName)
.orElseThrow(() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_INCORRECT_DB, arguments.get(0).orElse("<MySQL/SQLite>"))));
.orElseThrow(() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_INCORRECT_DB, arguments.get(0).orElse(SUPPORTED_DB_OPTIONS))));
DBType toDB = arguments.get(1).flatMap(DBType::getForName)
.orElseThrow(() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_INCORRECT_DB, arguments.get(0).orElse("<MySQL/SQLite>"))));
.orElseThrow(() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_INCORRECT_DB, arguments.get(0).orElse(SUPPORTED_DB_OPTIONS))));
if (fromDB == toDB) {
throw new IllegalArgumentException(locale.getString(CommandLang.FAIL_SAME_DB));
}
if (sender.supportsChatEvents()) {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_OVERWRITE_DB, toDB.getName(), fromDB.getName())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM))
.addPart("§2§l[\u2714]").command("/" + mainCommand + " accept").hover(locale.getString(CommandLang.CONFIRM_ACCEPT))
.addPart(" ")
.addPart("§4§l[\u2718]").command("/" + mainCommand + " cancel").hover(locale.getString(CommandLang.CONFIRM_DENY))
.send();
} else {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_OVERWRITE_DB, toDB.getName(), fromDB.getName())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM)).addPart("§a/" + mainCommand + " accept")
.addPart(" ")
.addPart("§c/" + mainCommand + " cancel")
.send();
}
String prompt = locale.getString(CommandLang.CONFIRM_OVERWRITE_DB,
toDB.getName(),
fromDB.getName());
confirmation.confirm(sender, choice -> {
confirmation.confirm(sender, prompt, choice -> {
if (Boolean.TRUE.equals(choice)) {
performMove(sender, fromDB, toDB);
} else {
@ -283,28 +259,13 @@ public class DatabaseCommands {
}
public void onClear(String mainCommand, CMDSender sender, @Untrusted Arguments arguments) {
public void onClear(CMDSender sender, @Untrusted Arguments arguments) {
DBType fromDB = arguments.get(0).flatMap(DBType::getForName)
.orElseThrow(() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_INCORRECT_DB, arguments.get(0).orElse("<MySQL/SQLite>"))));
.orElseThrow(() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_INCORRECT_DB, arguments.get(0).orElse(SUPPORTED_DB_OPTIONS))));
if (sender.supportsChatEvents()) {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_CLEAR_DB, fromDB.getName())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM))
.addPart("§2§l[\u2714]").command("/" + mainCommand + " accept").hover(locale.getString(CommandLang.CONFIRM_ACCEPT))
.addPart(" ")
.addPart("§4§l[\u2718]").command("/" + mainCommand + " cancel").hover(locale.getString(CommandLang.CONFIRM_DENY))
.send();
} else {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_CLEAR_DB, fromDB.getName())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM)).addPart("§a/" + mainCommand + " accept")
.addPart(" ")
.addPart("§c/" + mainCommand + " cancel")
.send();
}
String prompt = locale.getString(CommandLang.CONFIRM_CLEAR_DB, fromDB.getName());
confirmation.confirm(sender, choice -> {
confirmation.confirm(sender, prompt, choice -> {
if (Boolean.TRUE.equals(choice)) {
performClear(sender, fromDB);
} else {
@ -336,7 +297,7 @@ public class DatabaseCommands {
}
}
public void onFixFabricJoinAddresses(String mainCommand, CMDSender sender, @Untrusted Arguments arguments) {
public void onFixFabricJoinAddresses(CMDSender sender, @Untrusted Arguments arguments) {
@Untrusted String identifier = arguments.concatenate(" ");
Optional<ServerUUID> serverUUID = identifiers.getServerUUID(identifier);
if (serverUUID.isEmpty()) {
@ -345,24 +306,9 @@ public class DatabaseCommands {
Database database = dbSystem.getDatabase();
if (sender.supportsChatEvents()) {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_JOIN_ADDRESS_REMOVAL, identifier, database.getType().getName())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM))
.addPart("§2§l[\u2714]").command("/" + mainCommand + " accept").hover(locale.getString(CommandLang.CONFIRM_ACCEPT))
.addPart(" ")
.addPart("§4§l[\u2718]").command("/" + mainCommand + " cancel").hover(locale.getString(CommandLang.CONFIRM_DENY))
.send();
} else {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_JOIN_ADDRESS_REMOVAL, identifier, database.getType().getName())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM)).addPart("§a/" + mainCommand + " accept")
.addPart(" ")
.addPart("§c/" + mainCommand + " cancel")
.send();
}
String prompt = locale.getString(CommandLang.CONFIRM_JOIN_ADDRESS_REMOVAL, identifier, database.getType().getName());
confirmation.confirm(sender, choice -> {
confirmation.confirm(sender, prompt, choice -> {
if (Boolean.TRUE.equals(choice)) {
performJoinAddressRemoval(sender, serverUUID.get(), database);
} else {
@ -386,7 +332,7 @@ public class DatabaseCommands {
}
}
public void onRemove(String mainCommand, CMDSender sender, @Untrusted Arguments arguments) {
public void onRemove(CMDSender sender, @Untrusted Arguments arguments) {
@Untrusted String identifier = arguments.concatenate(" ");
UUID playerUUID = identifiers.getPlayerUUID(identifier);
if (playerUUID == null) {
@ -395,24 +341,9 @@ public class DatabaseCommands {
Database database = dbSystem.getDatabase();
if (sender.supportsChatEvents()) {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_REMOVE_PLAYER_DB, playerUUID, database.getType().getName())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM))
.addPart("§2§l[\u2714]").command("/" + mainCommand + " accept").hover(locale.getString(CommandLang.CONFIRM_ACCEPT))
.addPart(" ")
.addPart("§4§l[\u2718]").command("/" + mainCommand + " cancel").hover(locale.getString(CommandLang.CONFIRM_DENY))
.send();
} else {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_REMOVE_PLAYER_DB, playerUUID, database.getType().getName())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM)).addPart("§a/" + mainCommand + " accept")
.addPart(" ")
.addPart("§c/" + mainCommand + " cancel")
.send();
}
String prompt = locale.getString(CommandLang.CONFIRM_REMOVE_PLAYER_DB, playerUUID, database.getType().getName());
confirmation.confirm(sender, choice -> {
confirmation.confirm(sender, prompt, choice -> {
if (Boolean.TRUE.equals(choice)) {
performRemoval(sender, database, playerUUID);
} else {
@ -463,7 +394,7 @@ public class DatabaseCommands {
public void onHotswap(CMDSender sender, @Untrusted Arguments arguments) {
DBType toDB = arguments.get(0).flatMap(DBType::getForName)
.orElseThrow(() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_INCORRECT_DB, arguments.get(0).orElse("<MySQL/SQLite>"))));
.orElseThrow(() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_INCORRECT_DB, arguments.get(0).orElse(SUPPORTED_DB_OPTIONS))));
try {
Database database = dbSystem.getActiveDatabaseByType(toDB);
@ -483,7 +414,7 @@ public class DatabaseCommands {
statusCommands.onReload(sender);
}
public void onOnlineConversion(String mainCommand, CMDSender sender, @Untrusted Arguments arguments) {
public void onOnlineConversion(CMDSender sender, @Untrusted Arguments arguments) {
boolean removeOfflinePlayers = arguments.get(0)
.map("--remove_offline"::equals)
.orElse(false);
@ -515,9 +446,8 @@ public class DatabaseCommands {
if (actualUUID == null) {
offlineOnlyUsers++;
if (removeOfflinePlayers) transactions.add(new RemovePlayerTransaction(recordedUUID));
continue;
}
if (recordedUUID == actualUUID) {
if (actualUUID == null || recordedUUID.equals(actualUUID)) {
continue;
}
BaseUser alreadyExistingProfile = baseUsersByUUID.get(actualUUID);
@ -530,30 +460,16 @@ public class DatabaseCommands {
}
}
MessageBuilder messageBuilder = sender.buildMessage()
MessageBuilder prompt = sender.buildMessage()
.addPart(colors.getMainColor() + "Moving to online-only UUIDs (irreversible):").newLine()
.addPart(colors.getSecondaryColor() + " Total players in database: " + totalProfiles).newLine()
.addPart(colors.getSecondaryColor() + (removeOfflinePlayers ? "Removing (no online UUID): " : " Offline only (no online UUID): ") + offlineOnlyUsers).newLine()
.addPart(colors.getSecondaryColor() + " Moving to new UUID: " + move).newLine()
.addPart(colors.getSecondaryColor() + " Combining offline and online profiles: " + combine).newLine()
.newLine()
.addPart(colors.getSecondaryColor() + " Estimated online UUID players in database after: " + (totalProfiles - combine - offlineOnlyUsers) + (removeOfflinePlayers ? "" : " (+" + offlineOnlyUsers + " offline)")).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM));
if (sender.supportsChatEvents()) {
messageBuilder
.addPart("§2§l[\u2714]").command("/" + mainCommand + " accept").hover(locale.getString(CommandLang.CONFIRM_ACCEPT))
.addPart(" ")
.addPart("§4§l[\u2718]").command("/" + mainCommand + " cancel").hover(locale.getString(CommandLang.CONFIRM_DENY))
.send();
} else {
messageBuilder
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM)).addPart("§a/" + mainCommand + " accept")
.addPart(" ")
.addPart("§c/" + mainCommand + " cancel")
.send();
}
.addPart(colors.getSecondaryColor() + " Estimated online UUID players in database after: " + (totalProfiles - combine - offlineOnlyUsers) + (removeOfflinePlayers ? "" : " (+" + offlineOnlyUsers + " offline)")).newLine();
confirmation.confirm(sender, choice -> {
confirmation.confirm(sender, prompt, choice -> {
if (Boolean.TRUE.equals(choice)) {
transactions.forEach(dbSystem.getDatabase()::executeTransaction);
dbSystem.getDatabase().executeTransaction(new Transaction() {

View File

@ -171,7 +171,7 @@ public class RegistrationCommands {
}
}
public void onUnregister(String mainCommand, CMDSender sender, @Untrusted Arguments arguments) {
public void onUnregister(CMDSender sender, @Untrusted Arguments arguments) {
@Untrusted Optional<String> givenUsername = arguments.get(0).filter(arg -> sender.hasPermission(Permissions.UNREGISTER_OTHER));
Database database = dbSystem.getDatabase();
@ -195,24 +195,9 @@ public class RegistrationCommands {
throw new IllegalArgumentException(locale.getString(CommandLang.USER_NOT_LINKED));
}
if (sender.supportsChatEvents()) {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_UNREGISTER, user.getUsername(), user.getLinkedTo())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM))
.addPart("§2§l[\u2714]").command("/" + mainCommand + " accept").hover(locale.getString(CommandLang.CONFIRM_ACCEPT))
.addPart(" ")
.addPart("§4§l[\u2718]").command("/" + mainCommand + " cancel").hover(locale.getString(CommandLang.CONFIRM_DENY))
.send();
} else {
sender.buildMessage()
.addPart(colors.getMainColor() + locale.getString(CommandLang.CONFIRM_UNREGISTER, user.getUsername(), user.getLinkedTo())).newLine()
.addPart(colors.getTertiaryColor() + locale.getString(CommandLang.CONFIRM)).addPart("§a/" + mainCommand + " accept")
.addPart(" ")
.addPart("§c/" + mainCommand + " cancel")
.send();
}
String prompt = locale.getString(CommandLang.CONFIRM_UNREGISTER, user.getUsername(), user.getLinkedTo());
confirmation.confirm(sender, choice -> {
confirmation.confirm(sender, prompt, choice -> {
if (Boolean.TRUE.equals(choice)) {
try {
sender.send(colors.getMainColor() + locale.getString(CommandLang.UNREGISTER, user.getUsername()));