diff --git a/pom.xml b/pom.xml
index 044db6d7..8c8e7e4d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
voidpointer.spigotvoidwhitelist
- 0.9.5
+ 1.0.0jarVoidWhitelist
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/TimesAutoWhitelisted.java b/src/main/java/voidpointer/spigot/voidwhitelist/TimesAutoWhitelisted.java
new file mode 100644
index 00000000..32cd5c46
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/TimesAutoWhitelisted.java
@@ -0,0 +1,28 @@
+package voidpointer.spigot.voidwhitelist;
+
+import java.util.UUID;
+
+public interface TimesAutoWhitelisted {
+ static TimesAutoWhitelisted zero(final UUID uniqueId) {
+ return of(uniqueId, 0);
+ }
+
+ static TimesAutoWhitelisted of(final UUID uniqueId, final int timesAutoWhitelisted) {
+ return new TimesAutoWhitelisted() {
+ @Override public UUID getUniqueId() {
+ return uniqueId;
+ }
+ @Override public int get() {
+ return timesAutoWhitelisted;
+ }
+ };
+ }
+
+ UUID getUniqueId();
+
+ int get();
+
+ default boolean isExceeded(final int limit) {
+ return (limit >= 0) && (get() >= limit);
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/VoidWhitelistPlugin.java b/src/main/java/voidpointer/spigot/voidwhitelist/VoidWhitelistPlugin.java
index 66c4b262..39883a33 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/VoidWhitelistPlugin.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/VoidWhitelistPlugin.java
@@ -25,7 +25,8 @@
import voidpointer.spigot.framework.localemodule.annotation.LocaleAnnotationResolver;
import voidpointer.spigot.framework.localemodule.annotation.PluginLocale;
import voidpointer.spigot.framework.localemodule.config.TranslatedLocaleFile;
-import voidpointer.spigot.voidwhitelist.command.WhitelistCommand;
+import voidpointer.spigot.voidwhitelist.command.autowhitelist.AutoWhitelistCommand;
+import voidpointer.spigot.voidwhitelist.command.whitelist.WhitelistCommand;
import voidpointer.spigot.voidwhitelist.config.GuiConfig;
import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
import voidpointer.spigot.voidwhitelist.event.EventManager;
@@ -41,6 +42,7 @@
import voidpointer.spigot.voidwhitelist.message.WhitelistMessage;
import voidpointer.spigot.voidwhitelist.papi.PapiLocale;
import voidpointer.spigot.voidwhitelist.papi.TimeLeftExpansion;
+import voidpointer.spigot.voidwhitelist.storage.AutoWhitelistService;
import voidpointer.spigot.voidwhitelist.storage.StorageFactory;
import voidpointer.spigot.voidwhitelist.storage.WhitelistService;
import voidpointer.spigot.voidwhitelist.task.KickTaskScheduler;
@@ -54,7 +56,8 @@ public final class VoidWhitelistPlugin extends JavaPlugin {
private static TranslatedLocaleFile locale;
@Dependency private static WhitelistConfig whitelistConfig;
@Dependency private static LocaleLog guiLocale;
- @Dependency private static WhitelistService whitelistService;
+ @Dependency(id="whitelistService")
+ private static AutoWhitelistService whitelistService;
@Dependency private static EventManager eventManager;
@Dependency private static StorageFactory storageFactory;
@Dependency private static KickTaskScheduler kickTaskScheduler;
@@ -70,6 +73,7 @@ public final class VoidWhitelistPlugin extends JavaPlugin {
@Override public void onLoad() {
instance = this;
whitelistConfig = new WhitelistConfig(this);
+ whitelistConfig.runMigrations();
guiLocale = new GuiConfig(this, whitelistConfig).getLocaleLog();
papiLocale = new PapiLocale(this);
eventManager = new EventManager(this);
@@ -86,6 +90,7 @@ public final class VoidWhitelistPlugin extends JavaPlugin {
kickTaskScheduler = new KickTaskScheduler();
Injector.inject(this);
new WhitelistCommand().register(this);
+ new AutoWhitelistCommand().register(this);
registerListeners();
hookPapi();
@@ -95,11 +100,12 @@ public final class VoidWhitelistPlugin extends JavaPlugin {
}
@Override public void onDisable() {
- whitelistService.shutdown();
+ if (whitelistService != null)
+ whitelistService.shutdown();
}
/** Changes the {@link WhitelistService}, but doesn't inject it. */
- public void changeWhitelistService(final @NonNull WhitelistService whitelistService) {
+ public void changeWhitelistService(final @NonNull AutoWhitelistService whitelistService) {
VoidWhitelistPlugin.whitelistService = whitelistService;
}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/Whitelistable.java b/src/main/java/voidpointer/spigot/voidwhitelist/Whitelistable.java
index 5728158e..0df4e619 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/Whitelistable.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/Whitelistable.java
@@ -48,8 +48,10 @@ public interface Whitelistable {
*/
boolean isAssociatedWith(final Player player);
- /** @return {@code true} if the entity has an "expires at" date
- * and {@code false} otherwise. */
+ /**
+ * @return {@code true} if the given {@link Date} can expire.
+ * @see #NEVER_EXPIRES
+ */
static boolean isDateExpirable(final Date date) {
return NEVER_EXPIRES != date;
}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/Command.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/Command.java
index 3f6fbe20..5f241ce8 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/Command.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/Command.java
@@ -39,6 +39,7 @@
import static java.util.Collections.emptyList;
import static lombok.AccessLevel.PROTECTED;
+import static lombok.AccessLevel.PUBLIC;
@Getter
@RequiredArgsConstructor
@@ -49,7 +50,7 @@ public abstract class Command implements CommandExecutor, TabCompleter {
private static final List EMPTY_ALIASES = emptyList();
@AutowiredLocale private static LocaleLog localeLog;
- @Setter(PROTECTED)
+ @Setter(PUBLIC)
private @NonNull String permission = EMPTY_PERMISSION;
private final String name;
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/CommandManager.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/CommandManager.java
index cfa88576..70e82df6 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/CommandManager.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/CommandManager.java
@@ -14,6 +14,8 @@
*/
package voidpointer.spigot.voidwhitelist.command;
+import lombok.AccessLevel;
+import lombok.Getter;
import voidpointer.spigot.framework.localemodule.LocaleLog;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
@@ -28,6 +30,8 @@
public final class CommandManager {
@AutowiredLocale private static LocaleLog log;
+
+ @Getter(AccessLevel.PUBLIC)
private final Map commands = new HashMap<>();
public void addCommand(final Command command) {
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/ExportCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/ExportCommand.java
deleted file mode 100644
index 32c4a9f3..00000000
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/ExportCommand.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package voidpointer.spigot.voidwhitelist.command;
-
-import org.bukkit.plugin.Plugin;
-import voidpointer.spigot.framework.di.Autowired;
-import voidpointer.spigot.framework.localemodule.LocaleLog;
-import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
-import voidpointer.spigot.voidwhitelist.Whitelistable;
-import voidpointer.spigot.voidwhitelist.command.arg.Args;
-import voidpointer.spigot.voidwhitelist.storage.WhitelistService;
-import voidpointer.spigot.voidwhitelist.storage.db.OrmliteWhitelistService;
-import voidpointer.spigot.voidwhitelist.storage.json.JsonWhitelist;
-
-import java.io.File;
-
-import static java.lang.System.currentTimeMillis;
-import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
-
-public class ExportCommand extends Command {
- public static final String NAME = "export-db";
- public static final String PERMISSION = "whitelist.export";
-
- @AutowiredLocale private static LocaleLog localeLog;
- @Autowired(mapId="plugin") private static Plugin plugin;
- @Autowired private static WhitelistService whitelistService;
-
- public ExportCommand() {
- super(NAME);
- super.setPermission(PERMISSION);
- }
-
- @Override public void execute(final Args args) {
- if (!(whitelistService instanceof OrmliteWhitelistService)) {
- localeLog.localize(EXPORT_ONLY_FROM_DATABASE).send(args.getSender());
- return;
- }
- OrmliteWhitelistService database = (OrmliteWhitelistService) whitelistService;
- localeLog.localize(EXPORT_GATHERING).send(args.getSender());
- database.findAll().thenAcceptAsync(allWhitelistable -> {
- final long start = currentTimeMillis();
- JsonWhitelist jsonWhitelist = new JsonWhitelist();
- long nGathered = 0;
- for (final Whitelistable whitelistable : allWhitelistable) {
- jsonWhitelist.add(whitelistable);
- nGathered++;
- }
- localeLog.localize(EXPORT_PROCESSING).set("gathered", nGathered).send(args.getSender());
-
- if (jsonWhitelist.save(newExportFile())) {
- localeLog.localize(EXPORT_FINISHED)
- .set("ms-spent", currentTimeMillis() - start)
- .send(args.getSender());
- } else {
- localeLog.localize(EXPORT_FAILURE).send(args.getSender());
- }
- });
- }
-
- private File newExportFile() {
- return new File(plugin.getDataFolder(), "export-" + currentTimeMillis() + ".json");
- }
-}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/AutoWhitelistCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/AutoWhitelistCommand.java
new file mode 100644
index 00000000..a2758481
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/AutoWhitelistCommand.java
@@ -0,0 +1,61 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import org.bukkit.command.CommandSender;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.CommandManager;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+
+import java.util.List;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+public final class AutoWhitelistCommand extends Command {
+ public static final String NAME = "auto-whitelist";
+
+ @AutowiredLocale private static Locale locale;
+
+ private final CommandManager autoWhitelistCommands = new CommandManager();
+
+ public AutoWhitelistCommand() {
+ super(NAME);
+
+ super.setPermission("voidwhitelist.auto-whitelist");
+ super.setRequiredArgsNumber(1);
+
+ autoWhitelistCommands.addCommand(new HelpCommand());
+ /* general commands */
+ autoWhitelistCommands.addCommand(new EnableCommand());
+ autoWhitelistCommands.addCommand(new DisableCommand());
+ autoWhitelistCommands.addCommand(new IsOnCommand());
+ /* configuration related commands */
+ autoWhitelistCommands.addCommand(new GetDurationCommand());
+ autoWhitelistCommands.addCommand(new SetDurationCommand());
+ autoWhitelistCommands.addCommand(new GetLimitCommand());
+ autoWhitelistCommands.addCommand(new SetLimitCommand());
+ autoWhitelistCommands.addCommand(new GetStrategyCommand());
+ autoWhitelistCommands.addCommand(new SetStrategyCommand());
+ /* player related commands */
+ autoWhitelistCommands.addCommand(new InfoCommand());
+ autoWhitelistCommands.addCommand(new ResetCommand());
+ autoWhitelistCommands.addCommand(new SetCommand());
+ /* set appropriate permissions for sub commands */
+ autoWhitelistCommands.getCommands().values()
+ .forEach(cmd -> cmd.setPermission(getPermission() + '.' + cmd.getName()));
+ }
+
+ @Override public void execute(final Args args) {
+ final String subCommandName = args.removeFirst();
+ if (!autoWhitelistCommands.executeCommand(subCommandName, args))
+ locale.localize(AUTO_WHITELIST_UNKNOWN_COMMAND).send(args.getSender());
+ }
+
+ @Override public List tabComplete(final Args args) {
+ return autoWhitelistCommands.tabComplete(args);
+ }
+
+ @Override protected void onNotEnoughArgs(final CommandSender sender, final Args args) {
+ locale.localize(AUTO_WHITELIST_NOT_ENOUGH_ARGS).send(sender);
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/DisableCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/DisableCommand.java
new file mode 100644
index 00000000..0fedfb0f
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/DisableCommand.java
@@ -0,0 +1,23 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+import voidpointer.spigot.voidwhitelist.message.WhitelistMessage;
+
+final class DisableCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+ @Autowired private static WhitelistConfig whitelistConfig;
+
+ DisableCommand() {
+ super("off");
+ }
+
+ @Override public void execute(final Args args) {
+ whitelistConfig.disableAutoWhitelist();
+ locale.localize(WhitelistMessage.AUTO_WHITELIST_DISABLED).send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/EnableCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/EnableCommand.java
new file mode 100644
index 00000000..30395828
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/EnableCommand.java
@@ -0,0 +1,24 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class EnableCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+ @Autowired private static WhitelistConfig whitelistConfig;
+
+ EnableCommand() {
+ super("on");
+ }
+
+ @Override public void execute(final Args args) {
+ whitelistConfig.enableAutoWhitelist();
+ locale.localize(AUTO_WHITELIST_ENABLED).send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/GetDurationCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/GetDurationCommand.java
new file mode 100644
index 00000000..c5921c3e
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/GetDurationCommand.java
@@ -0,0 +1,27 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+import voidpointer.spigot.voidwhitelist.date.Duration;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class GetDurationCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+ @Autowired private static WhitelistConfig whitelistConfig;
+
+ GetDurationCommand() {
+ super("get-duration");
+ }
+
+ @Override public void execute(final Args args) {
+ final String rawDuration = whitelistConfig.getRawAutoDuration();
+ locale.localize(AUTO_WHITELIST_GET_DURATION)
+ .set("duration", rawDuration).set("exact", Duration.exactMillis(rawDuration).orElse(-1L))
+ .send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/GetLimitCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/GetLimitCommand.java
new file mode 100644
index 00000000..8de85de1
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/GetLimitCommand.java
@@ -0,0 +1,23 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class GetLimitCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+ @Autowired private static WhitelistConfig whitelistConfig;
+
+ GetLimitCommand() {
+ super("get-limit");
+ }
+
+ @Override public void execute(final Args args) {
+ locale.localize(AUTO_WHITELIST_GET_LIMIT).set("limit", whitelistConfig.getAutoLimit()).send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/GetStrategyCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/GetStrategyCommand.java
new file mode 100644
index 00000000..119c0825
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/GetStrategyCommand.java
@@ -0,0 +1,25 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class GetStrategyCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+ @Autowired private static WhitelistConfig whitelistConfig;
+
+ GetStrategyCommand() {
+ super("get-strategy");
+ }
+
+ @Override public void execute(final Args args) {
+ locale.localize(AUTO_WHITELIST_GET_STRATEGY)
+ .set("strategy", whitelistConfig.getStrategyPredicate().getName())
+ .send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/HelpCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/HelpCommand.java
new file mode 100644
index 00000000..64dab529
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/HelpCommand.java
@@ -0,0 +1,19 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.message.WhitelistMessage;
+
+final class HelpCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+
+ HelpCommand() {
+ super("help");
+ }
+
+ @Override public void execute(final Args args) {
+ locale.localize(WhitelistMessage.AUTO_WHITELIST_HELP).send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/InfoCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/InfoCommand.java
new file mode 100644
index 00000000..6c3ff06b
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/InfoCommand.java
@@ -0,0 +1,57 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import org.bukkit.command.CommandSender;
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.storage.AutoWhitelistService;
+import voidpointer.spigot.voidwhitelist.uuid.UUIDFetchers;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class InfoCommand extends Command {
+ @AutowiredLocale
+ private static Locale locale;
+ @Autowired(mapId="whitelistService")
+ private static AutoWhitelistService autoWhitelistService;
+
+ InfoCommand() {
+ super("info");
+
+ super.setRequiredArgsNumber(1);
+ }
+
+ @Override public void execute(final Args args) {
+ UUIDFetchers.of(args.getDefinedOptions()).getUUID(args.get(0)).thenAcceptAsync(optionalUuid -> {
+ if (!optionalUuid.isPresent()) { /* TODO: Java upgrade #isEmpty() */
+ locale.localize(AUTO_UUID_FAIL_TRY_OFFLINE)
+ .set("cmd", getName())
+ .set("player", args.get(0))
+ .send(args.getSender());
+ return;
+ }
+ autoWhitelistService.getTimesAutoWhitelisted(optionalUuid.get()).thenAcceptAsync(optionalTimesAutoWhitelist -> {
+ if (!optionalTimesAutoWhitelist.isPresent()) { /* TODO: Java upgrade #isEmpty() */
+ locale.localize(AUTO_WHITELIST_INFO_NOT_FOUND)
+ .set("player-details", locale.localize(PLAYER_DETAILS))
+ .set("player", args.get(0))
+ .set("uuid", optionalUuid.get())
+ .send(args.getSender());
+ return;
+ }
+ locale.localize(AUTO_WHITELIST_INFO)
+ .set("player-details", locale.localize(PLAYER_DETAILS))
+ .set("player", args.get(0))
+ .set("uuid", optionalUuid.get())
+ .set("times-auto-whitelisted", optionalTimesAutoWhitelist.get().get())
+ .send(args.getSender());
+ });
+ });
+ }
+
+ @Override protected void onNotEnoughArgs(final CommandSender sender, final Args args) {
+ locale.localize(AUTO_WHITELIST_INFO_ARGS).send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/IsOnCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/IsOnCommand.java
new file mode 100644
index 00000000..1019851c
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/IsOnCommand.java
@@ -0,0 +1,24 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class IsOnCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+ @Autowired private static WhitelistConfig whitelistConfig;
+
+ IsOnCommand() {
+ super("is-on");
+ }
+
+ @Override public void execute(final Args args) {
+ locale.localize(whitelistConfig.isAutoWhitelistEnabled() ? AUTO_WHITELIST_ENABLED : AUTO_WHITELIST_DISABLED)
+ .send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/ResetCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/ResetCommand.java
new file mode 100644
index 00000000..bd454b9b
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/ResetCommand.java
@@ -0,0 +1,51 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import org.bukkit.command.CommandSender;
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.TimesAutoWhitelisted;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.command.arg.UuidOptions;
+import voidpointer.spigot.voidwhitelist.storage.AutoWhitelistService;
+import voidpointer.spigot.voidwhitelist.uuid.UUIDFetchers;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class ResetCommand extends Command {
+ @AutowiredLocale
+ private static Locale locale;
+ @Autowired(mapId="whitelistService")
+ private static AutoWhitelistService autoWhitelistService;
+
+ ResetCommand() {
+ super("reset");
+
+ super.setRequiredArgsNumber(1);
+ super.addOptions(UuidOptions.values());
+ }
+
+ @Override public void execute(final Args args) {
+ UUIDFetchers.of(args.getDefinedOptions()).getUUID(args.get(0)).thenAcceptAsync(optionalUuid -> {
+ if (!optionalUuid.isPresent()) { /* TODO: Java upgrade #isEmpty() */
+ locale.localize(AUTO_UUID_FAIL_TRY_OFFLINE)
+ .set("cmd", getName())
+ .set("player", args.get(0))
+ .send(args.getSender());
+ return;
+ }
+ autoWhitelistService.update(TimesAutoWhitelisted.zero(optionalUuid.get())).thenAccept(isUpdated -> {
+ locale.localize(isUpdated ? AUTO_WHITELIST_RESET : AUTO_WHITELIST_RESET_FAIL)
+ .set("player-details", locale.localize(PLAYER_DETAILS))
+ .set("player", args.get(0))
+ .set("uuid", optionalUuid.get())
+ .send(args.getSender());
+ });
+ });
+ }
+
+ @Override protected void onNotEnoughArgs(final CommandSender sender, final Args args) {
+ locale.localize(AUTO_WHITELIST_RESET_ARGS).send(sender);
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetCommand.java
new file mode 100644
index 00000000..31b87838
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetCommand.java
@@ -0,0 +1,59 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import org.bukkit.command.CommandSender;
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.TimesAutoWhitelisted;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.storage.AutoWhitelistService;
+import voidpointer.spigot.voidwhitelist.uuid.UUIDFetchers;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class SetCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+ @Autowired(mapId="whitelistService")
+ private static AutoWhitelistService autoWhitelistService;
+
+ SetCommand() {
+ super("set");
+
+ super.setRequiredArgsNumber(2);
+ }
+
+ @Override public void execute(final Args args) {
+ final int newTimesAutoWhitelisted;
+ try {
+ newTimesAutoWhitelisted = Integer.parseInt(args.get(1));
+ } catch (final NumberFormatException numberFormatException) {
+ locale.localize(AUTO_WHITELIST_SET_INVALID_INT)
+ .set("player", args.get(0)).set("given", args.get(1)).send(args.getSender());
+ return;
+ }
+ UUIDFetchers.of(args.getDefinedOptions()).getUUID(args.get(0)).thenAcceptAsync(optionalUuid -> {
+ if (!optionalUuid.isPresent()) { /* TODO: Java upgrade #isEmpty() */
+ locale.localize(AUTO_UUID_FAIL_TRY_OFFLINE)
+ .set("cmd", getName())
+ .set("player", args.get(0))
+ .send(args.getSender());
+ return;
+ }
+ autoWhitelistService.update(TimesAutoWhitelisted.of(optionalUuid.get(), newTimesAutoWhitelisted))
+ .thenAccept(isUpdated -> {
+ locale.localize(isUpdated ? AUTO_WHITELIST_SET : AUTO_WHITELIST_SET_FAIL)
+ .set("player-details", locale.localize(PLAYER_DETAILS))
+ .set("player", args.get(0))
+ .set("uuid", optionalUuid.get())
+ .set("new", newTimesAutoWhitelisted)
+ .send(args.getSender());
+ });
+ });
+ }
+
+ @Override protected void onNotEnoughArgs(final CommandSender sender, final Args args) {
+ locale.localize(AUTO_WHITELIST_SET_ARGS).set("given", args.size()).set("needed", getRequiredArgsNumber())
+ .send(sender);
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetDurationCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetDurationCommand.java
new file mode 100644
index 00000000..e7fc95aa
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetDurationCommand.java
@@ -0,0 +1,39 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import org.bukkit.command.CommandSender;
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+import voidpointer.spigot.voidwhitelist.date.Duration;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class SetDurationCommand extends Command {
+ @AutowiredLocale
+ private static Locale locale;
+ @Autowired
+ private static WhitelistConfig whitelistConfig;
+
+ SetDurationCommand() {
+ super("set-duration");
+
+ super.setRequiredArgsNumber(1);
+ }
+
+ @Override public void execute(final Args args) {
+ if (!Duration.exactMillis(args.get(0)).isPresent()) { /* TODO java upgrade #isEmpty() */
+ locale.localize(AUTO_WHITELIST_SET_INVALID_DURATION).set("given", args.get(0)).send(args.getSender());
+ return;
+ }
+ final String previousDuration = whitelistConfig.setAutoDuration(args.get(0));
+ locale.localize(AUTO_WHITELIST_SET_DURATION).set("old", previousDuration).set("new", args.get(0))
+ .send(args.getSender());
+ }
+
+ @Override protected void onNotEnoughArgs(final CommandSender sender, final Args args) {
+ locale.localize(AUTO_WHITELIST_SET_DURATION_ARGS).send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetLimitCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetLimitCommand.java
new file mode 100644
index 00000000..396f3431
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetLimitCommand.java
@@ -0,0 +1,38 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import org.bukkit.command.CommandSender;
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class SetLimitCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+ @Autowired private static WhitelistConfig whitelistConfig;
+
+ SetLimitCommand() {
+ super("set-limit");
+
+ super.setRequiredArgsNumber(1);
+ }
+
+ @Override public void execute(final Args args) {
+ final int newLimit;
+ try {
+ newLimit = Integer.parseInt(args.get(0));
+ } catch (NumberFormatException e) {
+ locale.localize(AUTO_WHITELIST_SET_LIMIT_INT).set("given", args.get(0)).send(args.getSender());
+ return;
+ }
+ final int previousLimit = whitelistConfig.setAutoLimit(newLimit);
+ locale.localize(AUTO_WHITELIST_SET_LIMIT).set("old", previousLimit).set("new", newLimit).send(args.getSender());
+ }
+
+ @Override protected void onNotEnoughArgs(final CommandSender sender, final Args args) {
+ locale.localize(AUTO_WHITELIST_SET_LIMIT_ARGS).send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetStrategyCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetStrategyCommand.java
new file mode 100644
index 00000000..7ab339a5
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/autowhitelist/SetStrategyCommand.java
@@ -0,0 +1,62 @@
+package voidpointer.spigot.voidwhitelist.command.autowhitelist;
+
+import com.google.common.base.Joiner;
+import org.bukkit.command.CommandSender;
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.Locale;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.config.StrategyPredicate;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+final class SetStrategyCommand extends Command {
+ @AutowiredLocale private static Locale locale;
+ @Autowired private static WhitelistConfig whitelistConfig;
+
+ SetStrategyCommand() {
+ super("set-strategy");
+
+ super.setRequiredArgsNumber(1);
+ }
+
+ @Override public void execute(final Args args) {
+ Optional strategy = StrategyPredicate.of(args.get(0));
+ if (!strategy.isPresent()) { /* TODO java upgrade #isEmpty() */
+ locale.localize(AUTO_WHITELIST_SET_INVALID_STRATEGY)
+ .set("given", args.get(0)).set("strategies", Joiner.on(", ").join(StrategyPredicate.values()))
+ .send(args.getSender());
+ return;
+ }
+ final StrategyPredicate previousStrategy = whitelistConfig.setAutoWhitelistStrategy(strategy.get());
+ locale.localize(AUTO_WHITELIST_SET_STRATEGY)
+ .set("old", previousStrategy.getName()).set("new", strategy.get().getName())
+ .send(args.getSender());
+ }
+
+ @Override public List tabComplete(final Args args) {
+ if (args.isEmpty()) { /* TODO java upgrade functional switch-case */
+ return Arrays.stream(StrategyPredicate.values())
+ .map(StrategyPredicate::getName)
+ .collect(Collectors.toList());
+ } else if (args.size() == 1) {
+ return Arrays.stream(StrategyPredicate.values())
+ .map(StrategyPredicate::getName)
+ .filter(strategyName -> strategyName.startsWith(args.get(0)))
+ .collect(Collectors.toList());
+ }
+ return Collections.emptyList();
+ }
+
+ @Override protected void onNotEnoughArgs(final CommandSender sender, final Args args) {
+ locale.localize(AUTO_WHITELIST_SET_STRATEGY_ARGS).send(args.getSender());
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/AddCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/AddCommand.java
similarity index 78%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/AddCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/AddCommand.java
index 0a318f60..0f33ba11 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/AddCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/AddCommand.java
@@ -12,7 +12,7 @@
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
@@ -21,10 +21,11 @@
import voidpointer.spigot.framework.localemodule.Message;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
import voidpointer.spigot.voidwhitelist.Whitelistable;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Arg;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.command.arg.UuidOptions;
-import voidpointer.spigot.voidwhitelist.date.EssentialsDateParser;
+import voidpointer.spigot.voidwhitelist.date.Duration;
import voidpointer.spigot.voidwhitelist.event.EventManager;
import voidpointer.spigot.voidwhitelist.event.WhitelistAddedEvent;
import voidpointer.spigot.voidwhitelist.message.WhitelistMessage;
@@ -40,51 +41,57 @@
import static java.util.Arrays.stream;
import static java.util.Collections.emptyList;
import static org.bukkit.Bukkit.getOfflinePlayers;
-import static voidpointer.spigot.voidwhitelist.Whitelistable.NEVER_EXPIRES;
import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
public final class AddCommand extends Command {
public static final String NAME = "add";
- public static final String PERMISSION = "whitelist.add";
public static final int MIN_ARGS = 1;
@AutowiredLocale private static LocaleLog locale;
- @Autowired private static WhitelistService whitelistService;
+ @Autowired(mapId="whitelistService")
+ private static WhitelistService whitelistService;
@Autowired private static EventManager eventManager;
public AddCommand() {
super(NAME);
super.setRequiredArgsNumber(MIN_ARGS);
- super.setPermission(PERMISSION);
super.addOptions(UuidOptions.values());
}
@Override public void execute(final Args args) {
- final Optional expiresAt = parseExpiresAtAndWarnIfWrong(args);
- if (expiresAt == null)
- return;
+ final Date whitelistTimeDuration;
+ if (hasExpiresAtArgument(args)) {
+ final Optional optionalWhitelistTimeDuration = Duration.ofEssentialsDate(args.get(1));
+ if (!optionalWhitelistTimeDuration.isPresent()) {/* TODO java upgrade #isEmpty() */
+ locale.localize(WhitelistMessage.WRONG_DATE_FORMAT).send(args.getSender());
+ return;
+ }
+ whitelistTimeDuration = optionalWhitelistTimeDuration.get();
+ } else {
+ whitelistTimeDuration = null;
+ }
UUIDFetchers.of(args.getDefinedOptions()).getUUID(args.get(0)).thenAcceptAsync(uuidOptional -> {
if (!uuidOptional.isPresent()) {
locale.localize(WhitelistMessage.UUID_FAIL_TRY_OFFLINE)
.set("cmd", getName())
.set("player", args.get(0))
- .set("date", expiresAt.orElse(null))
+ .set("date", whitelistTimeDuration)
.send(args.getSender());
return;
}
- whitelistService.add(uuidOptional.get(), args.get(0), expiresAt.orElse(NEVER_EXPIRES))
+ whitelistService.add(uuidOptional.get(), args.get(0), whitelistTimeDuration)
.whenCompleteAsync((res, th) -> {
if (th != null) {
locale.warn("Couldn't add a player to the whitelist", th);
return;
}
- if (!res.isPresent())
+ if (!res.isPresent()) {
notifyFail(args, uuidOptional.get());
- else if (expiresAt.isPresent())
- notifyAdded(args, expiresAt.get(), uuidOptional.get(), WhitelistMessage.ADDED_TEMP);
- else
- notifyAdded(args, null, uuidOptional.get(), WhitelistMessage.ADDED);
+ } else {
+ notifyAdded(args, whitelistTimeDuration, uuidOptional.get(),
+ whitelistTimeDuration == null ? WhitelistMessage.ADDED : WhitelistMessage.ADDED_TEMP);
+ }
res.ifPresent(this::callWhitelistAddedEvent);
});
}).whenCompleteAsync((res, th) -> {
@@ -93,20 +100,8 @@ else if (expiresAt.isPresent())
});
}
- private Optional parseExpiresAtAndWarnIfWrong(final Args args) {
- if (hasExpiresAtArgument(args.size())) {
- final long whitelistTimePeriod = EssentialsDateParser.parseDate(args.get(1));
- if (EssentialsDateParser.WRONG_DATE_FORMAT == whitelistTimePeriod) {
- locale.localize(WhitelistMessage.WRONG_DATE_FORMAT).send(args.getSender());
- return null;
- }
- return Optional.of(new Date(whitelistTimePeriod));
- }
- return Optional.empty();
- }
-
- private boolean hasExpiresAtArgument(int argsNumber) {
- return MIN_ARGS < argsNumber;
+ private boolean hasExpiresAtArgument(final Args args) {
+ return MIN_ARGS < args.size();
}
private void notifyFail(final Args args, final UUID uuid) {
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/DisableCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/DisableCommand.java
similarity index 90%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/DisableCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/DisableCommand.java
index d4ca2ae0..38efc30b 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/DisableCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/DisableCommand.java
@@ -12,11 +12,12 @@
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import voidpointer.spigot.framework.di.Autowired;
import voidpointer.spigot.framework.localemodule.Locale;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
import voidpointer.spigot.voidwhitelist.event.EventManager;
@@ -25,7 +26,6 @@
public final class DisableCommand extends Command {
public static final String NAME = "off";
- public static final String PERMISSION = "whitelist.disable";
@AutowiredLocale private static Locale locale;
@Autowired private static WhitelistConfig whitelistConfig;
@@ -33,7 +33,6 @@ public final class DisableCommand extends Command {
public DisableCommand() {
super(NAME);
- super.setPermission(PERMISSION);
}
@Override public void execute(final Args args) {
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/EnableCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/EnableCommand.java
similarity index 90%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/EnableCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/EnableCommand.java
index b1b7213f..20503ef5 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/EnableCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/EnableCommand.java
@@ -12,11 +12,12 @@
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import voidpointer.spigot.framework.di.Autowired;
import voidpointer.spigot.framework.localemodule.Locale;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
import voidpointer.spigot.voidwhitelist.event.EventManager;
@@ -25,7 +26,6 @@
public final class EnableCommand extends Command {
public static final String NAME = "on";
- public static final String PERMISSION = "whitelist.enable";
@AutowiredLocale private static Locale locale;
@Autowired private static WhitelistConfig whitelistConfig;
@@ -33,7 +33,6 @@ public final class EnableCommand extends Command {
public EnableCommand() {
super(NAME);
- super.setPermission(PERMISSION);
}
@Override public void execute(final Args args) {
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ExportCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ExportCommand.java
new file mode 100644
index 00000000..9ef5c0c3
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ExportCommand.java
@@ -0,0 +1,90 @@
+package voidpointer.spigot.voidwhitelist.command.whitelist;
+
+import com.j256.ormlite.dao.CloseableWrappedIterable;
+import org.bukkit.command.CommandSender;
+import org.bukkit.plugin.Plugin;
+import voidpointer.spigot.framework.di.Autowired;
+import voidpointer.spigot.framework.localemodule.LocaleLog;
+import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.Whitelistable;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.arg.Args;
+import voidpointer.spigot.voidwhitelist.storage.WhitelistService;
+import voidpointer.spigot.voidwhitelist.storage.db.OrmliteWhitelistService;
+import voidpointer.spigot.voidwhitelist.storage.db.TimesAutoWhitelistedModel;
+import voidpointer.spigot.voidwhitelist.storage.json.JsonAutoWhitelist;
+import voidpointer.spigot.voidwhitelist.storage.json.JsonWhitelist;
+
+import java.io.File;
+
+import static java.lang.System.currentTimeMillis;
+import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
+
+public class ExportCommand extends Command {
+ public static final String NAME = "export-db";
+
+ @AutowiredLocale private static LocaleLog localeLog;
+ @Autowired(mapId="plugin") private static Plugin plugin;
+ @Autowired(mapId="whitelistService")
+ private static WhitelistService whitelistService;
+
+ public ExportCommand() {
+ super(NAME);
+ }
+
+ @Override public void execute(final Args args) {
+ if (!(whitelistService instanceof OrmliteWhitelistService)) {
+ localeLog.localize(EXPORT_ONLY_FROM_DATABASE).send(args.getSender());
+ return;
+ }
+ OrmliteWhitelistService database = (OrmliteWhitelistService) whitelistService;
+ localeLog.localize(EXPORT_GATHERING).send(args.getSender());
+ /* whitelist export */
+ database.getTotalCountOfWhitelist().thenAcceptAsync(optionalTotalWhitelist -> {
+ optionalTotalWhitelist.ifPresent(total -> /* TODO Java update ifPresentOrElse */
+ localeLog.localize(WHITELIST_EXPORT_PROCESSING).set("total", total).send(args.getSender()));
+ database.findAll().thenAccept(allWhitelistable -> exportWhitelist(allWhitelistable, args.getSender()));
+ });
+ /* auto-whitelist export */
+ database.getTotalCountOfAutoWhitelist().thenAcceptAsync(optionalTotalAutoWhitelist -> {
+ optionalTotalAutoWhitelist.ifPresent(total ->
+ localeLog.localize(AUTO_WHITELIST_EXPORT_PROCESSING).set("total", total).send(args.getSender()));
+ database.findAllAuto().thenAccept(allAuto -> exportAuto(allAuto, args.getSender()));
+ });
+ }
+
+ private void exportWhitelist(final CloseableWrappedIterable extends Whitelistable> allWhitelistable,
+ final CommandSender sender) {
+ final long start = currentTimeMillis();
+ final JsonWhitelist jsonWhitelist = new JsonWhitelist();
+ /* TODO try-with-resource reference Java 9 */
+ for (final Whitelistable whitelistable : allWhitelistable)
+ jsonWhitelist.add(whitelistable);
+
+ if (jsonWhitelist.save(new File(plugin.getDataFolder(), "whitelist-export-" + currentTimeMillis() + ".json"))) {
+ localeLog.localize(WHITELIST_EXPORT_FINISHED)
+ .set("ms-spent", currentTimeMillis() - start)
+ .send(sender);
+ } else {
+ localeLog.localize(WHITELIST_EXPORT_FAILURE).send(sender);
+ }
+ }
+
+ private void exportAuto(final CloseableWrappedIterable allAuto,
+ final CommandSender sender) {
+ final long start = currentTimeMillis();
+ final JsonAutoWhitelist jsonAutoWhitelist = new JsonAutoWhitelist();
+ /* TODO try-with-resource reference Java 9 */
+ for (final TimesAutoWhitelistedModel timesAutoWhitelisted : allAuto)
+ jsonAutoWhitelist.add(timesAutoWhitelisted);
+
+ if (jsonAutoWhitelist.save(new File(plugin.getDataFolder(),
+ "auto-whitelist-export-" + currentTimeMillis() + ".json"))) {
+ localeLog.localize(AUTO_WHITELIST_EXPORT_FINISHED)
+ .set("ms-spent", currentTimeMillis() - start)
+ .send(sender);
+ } else {
+ localeLog.localize(AUTO_WHITELIST_EXPORT_FAILURE).send(sender);
+ }
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/GuiCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/GuiCommand.java
similarity index 89%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/GuiCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/GuiCommand.java
index 96106a6d..613707d6 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/GuiCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/GuiCommand.java
@@ -12,11 +12,12 @@
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import voidpointer.spigot.framework.di.Autowired;
import voidpointer.spigot.framework.localemodule.Locale;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.gui.WhitelistGui;
import voidpointer.spigot.voidwhitelist.message.WhitelistMessage;
@@ -25,14 +26,13 @@
public final class GuiCommand extends Command {
private static final String NAME = "gui";
- private static final String PERMISSION = "whitelist.gui";
@AutowiredLocale private static Locale locale;
- @Autowired private static WhitelistService whitelistService;
+ @Autowired(mapId="whitelistService")
+ private static WhitelistService whitelistService;
public GuiCommand() {
super(NAME);
- super.setPermission(PERMISSION);
}
@Override public void execute(final Args args) {
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/HelpCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/HelpCommand.java
similarity index 80%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/HelpCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/HelpCommand.java
index d3476755..505df151 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/HelpCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/HelpCommand.java
@@ -1,20 +1,19 @@
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import voidpointer.spigot.framework.localemodule.Locale;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
final class HelpCommand extends Command {
public static final String NAME = "help";
- public static final String PERMISSION = "whitelist.help";
@AutowiredLocale private static Locale locale;
public HelpCommand() {
super(NAME);
- setPermission(PERMISSION);
}
@Override public void execute(final Args args) {
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/ImportJsonCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ImportJsonCommand.java
similarity index 69%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/ImportJsonCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ImportJsonCommand.java
index f077e330..95c1aa30 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/ImportJsonCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ImportJsonCommand.java
@@ -12,22 +12,24 @@
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import org.bukkit.plugin.Plugin;
import voidpointer.spigot.framework.di.Autowired;
import voidpointer.spigot.framework.localemodule.Locale;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.TimesAutoWhitelisted;
import voidpointer.spigot.voidwhitelist.Whitelistable;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.command.arg.ImportOptions;
import voidpointer.spigot.voidwhitelist.event.EventManager;
-import voidpointer.spigot.voidwhitelist.event.WhitelistImportEvent;
import voidpointer.spigot.voidwhitelist.storage.StorageFactory;
import voidpointer.spigot.voidwhitelist.storage.WhitelistService;
import voidpointer.spigot.voidwhitelist.storage.db.OrmliteWhitelistService;
import voidpointer.spigot.voidwhitelist.storage.json.JsonWhitelistService;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
@@ -40,18 +42,17 @@
public class ImportJsonCommand extends Command {
public static final String NAME = "import-json";
- public static final String PERMISSION = "whitelist.import";
@AutowiredLocale private static Locale locale;
@Autowired private static EventManager eventManager;
- @Autowired private static WhitelistService whitelistService;
+ @Autowired(mapId="whitelistService")
+ private static WhitelistService whitelistService;
@Autowired private static StorageFactory storageFactory;
@Autowired(mapId="plugin")
private static Plugin plugin;
public ImportJsonCommand() {
super(NAME);
- super.setPermission(PERMISSION);
super.addOptions(ImportOptions.values());
}
@@ -60,29 +61,33 @@ public ImportJsonCommand() {
locale.localize(IMPORT_ONLY_TO_DATABASE).send(args.getSender());
return;
}
- plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> execute0(args));
+ plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> importJson(args));
}
- private void execute0(final Args args) {
+ private void importJson(final Args args) {
final long start = currentTimeMillis();
JsonWhitelistService json = (JsonWhitelistService) storageFactory.loadStorage(JSON);
locale.localize(IMPORT_LOADED)
.set("loaded", json.getWhitelist().size())
.set("storage", WHITELIST_FILE_NAME)
.send(args.getSender());
- OrmliteWhitelistService database = (OrmliteWhitelistService) ImportJsonCommand.whitelistService;
- Set imported;
- if (args.hasOption(REPLACE))
- imported = database.addAllReplacing(json.getWhitelist()).join();
- else
- imported = database.addAllIfNotExists(json.getWhitelist()).join();
+ final OrmliteWhitelistService database = (OrmliteWhitelistService) whitelistService;
+ final Set whitelist = json.getWhitelist();
+ final Collection autoWhitelist = json.getAutoWhitelist().values();
+ final int whitelistImportedInTotal, autoWhitelistImportedInTotal;
+ if (args.hasOption(REPLACE)) {
+ whitelistImportedInTotal = database.addAllReplacing(whitelist).join();
+ autoWhitelistImportedInTotal = database.addAllAutoReplacing(autoWhitelist).join();
+ } else {
+ whitelistImportedInTotal = database.addAllIfNotExists(whitelist).join();
+ autoWhitelistImportedInTotal = database.addAllAutoIfNotExists(autoWhitelist).join();
+ }
final long end = currentTimeMillis();
- locale.localize(IMPORT_RESULT)
- .set("imported", imported.size())
- .set("loaded", json.getWhitelist().size())
+ locale.localize(WHITELIST_IMPORT_RESULT)
+ .set("imported", whitelistImportedInTotal).set("loaded", whitelist.size())
+ .set("auto-imported", autoWhitelistImportedInTotal).set("auto-loaded", autoWhitelist.size())
.set("ms-spent", end - start)
.send(args.getSender());
- eventManager.callAsyncEvent(new WhitelistImportEvent(imported));
}
@Override public List tabComplete(final Args args) {
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/InfoCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/InfoCommand.java
similarity index 95%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/InfoCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/InfoCommand.java
index 3ef78e1f..7461c600 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/InfoCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/InfoCommand.java
@@ -12,7 +12,7 @@
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import org.bukkit.OfflinePlayer;
import voidpointer.spigot.framework.di.Autowired;
@@ -20,6 +20,7 @@
import voidpointer.spigot.framework.localemodule.LocalizedMessage;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
import voidpointer.spigot.voidwhitelist.Whitelistable;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Arg;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.command.arg.UuidOptions;
@@ -40,14 +41,13 @@
public final class InfoCommand extends Command {
public static final String NAME = "info";
- public static final String PERMISSION = "whitelist.info";
@AutowiredLocale private static LocaleLog locale;
- @Autowired private static WhitelistService whitelistService;
+ @Autowired(mapId="whitelistService")
+ private static WhitelistService whitelistService;
public InfoCommand() {
super(NAME);
- super.setPermission(PERMISSION);
super.addOptions(UuidOptions.values());
}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/ReconnectCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ReconnectCommand.java
similarity index 74%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/ReconnectCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ReconnectCommand.java
index 8f6e187f..2c4b5126 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/ReconnectCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ReconnectCommand.java
@@ -1,35 +1,35 @@
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import voidpointer.spigot.framework.di.Autowired;
import voidpointer.spigot.framework.localemodule.Locale;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.event.EventManager;
import voidpointer.spigot.voidwhitelist.event.WhitelistReconnectEvent;
import voidpointer.spigot.voidwhitelist.storage.WhitelistService;
import static voidpointer.spigot.voidwhitelist.message.WhitelistMessage.*;
-import static voidpointer.spigot.voidwhitelist.storage.WhitelistService.ReconnectResult;
+import static voidpointer.spigot.voidwhitelist.storage.WhitelistService.ConnectionResult;
public final class ReconnectCommand extends Command {
public static final String NAME = "reconnect";
- public static final String PERMISSION = "whitelist.reconnect";
@AutowiredLocale private static Locale locale;
- @Autowired private static WhitelistService whitelistService;
+ @Autowired(mapId="whitelistService")
+ private static WhitelistService whitelistService;
@Autowired private static EventManager eventManager;
public ReconnectCommand() {
super(NAME);
- super.setPermission(PERMISSION);
}
@Override public void execute(final Args args) {
- ReconnectResult reconnectResult = whitelistService.reconnect();
- if (reconnectResult.isSuccess())
+ ConnectionResult connectionResult = whitelistService.reconnect();
+ if (connectionResult.isSuccess())
locale.localize(RECONNECT_SUCCESS).send(args.getSender());
else
locale.localize(RECONNECT_FAIL).send(args.getSender());
- eventManager.callAsyncEvent(new WhitelistReconnectEvent(reconnectResult, args.getSender()));
+ eventManager.callAsyncEvent(new WhitelistReconnectEvent(connectionResult, args.getSender()));
}
}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/ReloadCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ReloadCommand.java
similarity index 90%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/ReloadCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ReloadCommand.java
index b99ad738..3f8923f4 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/ReloadCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/ReloadCommand.java
@@ -1,4 +1,4 @@
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import voidpointer.spigot.framework.di.Autowired;
import voidpointer.spigot.framework.di.Injector;
@@ -7,11 +7,13 @@
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
import voidpointer.spigot.framework.localemodule.config.TranslatedLocaleFile;
import voidpointer.spigot.voidwhitelist.VoidWhitelistPlugin;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
import voidpointer.spigot.voidwhitelist.event.EventManager;
import voidpointer.spigot.voidwhitelist.event.WhitelistReloadEvent;
import voidpointer.spigot.voidwhitelist.papi.PapiLocale;
+import voidpointer.spigot.voidwhitelist.storage.AutoWhitelistService;
import voidpointer.spigot.voidwhitelist.storage.StorageFactory;
import voidpointer.spigot.voidwhitelist.storage.StorageMethod;
import voidpointer.spigot.voidwhitelist.storage.WhitelistService;
@@ -21,7 +23,6 @@
public final class ReloadCommand extends Command {
public static final String NAME = "reload";
- public static final String PERMISSION = "whitelist.reload";
@AutowiredLocale private static Locale locale;
@Autowired private static LocaleLog guiLocale;
@@ -31,11 +32,11 @@ public final class ReloadCommand extends Command {
@Autowired private static StorageFactory storageFactory;
@Autowired private static WhitelistConfig config;
@Autowired private static EventManager eventManager;
- @Autowired private static WhitelistService whitelistService;
+ @Autowired(mapId="whitelistService")
+ private static WhitelistService whitelistService;
public ReloadCommand() {
super(NAME);
- setPermission(PERMISSION);
}
@Override public void execute(final Args args) {
@@ -53,6 +54,7 @@ public ReloadCommand() {
private void reloadConfig(final Args args) {
config.reload();
+ config.runMigrations();
UUIDFetchers.updateMode(config.isUUIDModeOnline());
locale.localize(CONFIG_RELOADED).send(args.getSender());
}
@@ -88,7 +90,7 @@ private void reloadStorage(final Args args) {
if (oldMethod.equals(config.getStorageMethod()))
return;
- WhitelistService reloadedStorage = storageFactory.loadStorage(config.getStorageMethod());
+ AutoWhitelistService reloadedStorage = storageFactory.loadStorage(config.getStorageMethod());
whitelistService.shutdown();
plugin.changeWhitelistService(reloadedStorage);
Injector.inject(plugin);
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/RemoveCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/RemoveCommand.java
similarity index 95%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/RemoveCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/RemoveCommand.java
index 25f576c7..99db616a 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/RemoveCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/RemoveCommand.java
@@ -12,7 +12,7 @@
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
@@ -20,6 +20,7 @@
import voidpointer.spigot.framework.localemodule.LocaleLog;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
import voidpointer.spigot.voidwhitelist.Whitelistable;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Arg;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.command.arg.UuidOptions;
@@ -43,16 +44,15 @@
public class RemoveCommand extends Command {
public static final String NAME = "remove";
public static final List ALIASES = singletonList("rem");
- public static final String PERMISSION = "whitelist.remove";
public static final Integer MIN_ARGS = 1;
@AutowiredLocale private static LocaleLog locale;
- @Autowired private static WhitelistService whitelistService;
+ @Autowired(mapId="whitelistService")
+ private static WhitelistService whitelistService;
@Autowired private static EventManager eventManager;
public RemoveCommand() {
super(NAME);
- super.setPermission(PERMISSION);
super.setRequiredArgsNumber(MIN_ARGS);
super.addOptions(UuidOptions.values());
}
@@ -78,7 +78,7 @@ public RemoveCommand() {
.send(args.getSender());
return;
}
- boolean isRemoved = whitelistService.remove(whitelistable.get()).join().booleanValue();
+ boolean isRemoved = whitelistService.remove(whitelistable.get()).join();
if (isRemoved) {
notifyRemoved(args.getSender(), uuidOptional.get(), name);
eventManager.callEvent(new WhitelistRemovedEvent(whitelistable.get()));
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/StatusCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/StatusCommand.java
similarity index 89%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/StatusCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/StatusCommand.java
index 3667efc9..65de465e 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/StatusCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/StatusCommand.java
@@ -12,11 +12,12 @@
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import voidpointer.spigot.framework.di.Autowired;
import voidpointer.spigot.framework.localemodule.Locale;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
@@ -24,14 +25,12 @@
public final class StatusCommand extends Command {
public static final String NAME = "status";
- public static final String PERMISSION = "whitelist.status";
@AutowiredLocale private static Locale locale;
@Autowired private static WhitelistConfig config;
public StatusCommand() {
super(NAME);
- setPermission(PERMISSION);
}
@Override public void execute(final Args args) {
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/command/WhitelistCommand.java b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/WhitelistCommand.java
similarity index 86%
rename from src/main/java/voidpointer/spigot/voidwhitelist/command/WhitelistCommand.java
rename to src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/WhitelistCommand.java
index a8dd3092..ad36c6be 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/command/WhitelistCommand.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/command/whitelist/WhitelistCommand.java
@@ -12,11 +12,13 @@
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
-package voidpointer.spigot.voidwhitelist.command;
+package voidpointer.spigot.voidwhitelist.command.whitelist;
import org.bukkit.command.CommandSender;
import voidpointer.spigot.framework.localemodule.Locale;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.command.Command;
+import voidpointer.spigot.voidwhitelist.command.CommandManager;
import voidpointer.spigot.voidwhitelist.command.arg.Args;
import java.util.List;
@@ -33,6 +35,9 @@ public final class WhitelistCommand extends Command {
public WhitelistCommand() {
super(NAME);
+ super.setPermission("voidwhitelist." + NAME);
+ super.setRequiredArgsNumber(MIN_REQUIRED_ARGS);
+
whitelistCommands.addCommand(new AddCommand());
whitelistCommands.addCommand(new RemoveCommand());
whitelistCommands.addCommand(new EnableCommand());
@@ -45,7 +50,9 @@ public WhitelistCommand() {
whitelistCommands.addCommand(new HelpCommand());
whitelistCommands.addCommand(new ReloadCommand());
whitelistCommands.addCommand(new ReconnectCommand());
- super.setRequiredArgsNumber(MIN_REQUIRED_ARGS);
+
+ whitelistCommands.getCommands().values()
+ .forEach(cmd -> cmd.setPermission(getPermission() + "." + cmd.getName()));
}
@Override public void execute(final Args args) {
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/config/OrmliteConfig.java b/src/main/java/voidpointer/spigot/voidwhitelist/config/OrmliteConfig.java
index 65f43cee..5ff24ad5 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/config/OrmliteConfig.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/config/OrmliteConfig.java
@@ -14,21 +14,12 @@
*/
package voidpointer.spigot.voidwhitelist.config;
-import com.j256.ormlite.dao.Dao;
-import com.j256.ormlite.dao.DaoManager;
-import com.j256.ormlite.support.ConnectionSource;
-import com.j256.ormlite.table.TableUtils;
-import lombok.Getter;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import voidpointer.spigot.framework.localemodule.LocaleLog;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
-import voidpointer.spigot.voidwhitelist.storage.db.WhitelistableModel;
import java.io.File;
-import java.net.ConnectException;
-import java.sql.SQLException;
-import java.util.UUID;
import static java.lang.Integer.parseInt;
import static java.util.concurrent.TimeUnit.MINUTES;
@@ -54,7 +45,6 @@ public final class OrmliteConfig {
private final Plugin plugin;
private final File configFile;
private YamlConfiguration config;
- @Getter private ConnectionSource connectionSource;
public OrmliteConfig(final Plugin plugin) {
this.plugin = plugin;
@@ -80,26 +70,11 @@ public long getSyncTimerInTicks() {
return MINUTES.toSeconds(config.getLong(SYNC_PATH, DEFAULT_SYNC)) * 20L;
}
- public Dao getWhitelistableDao() {
- try {
- Dao dao = DaoManager.createDao(connectionSource, WhitelistableModel.class);
- TableUtils.createTableIfNotExists(connectionSource, WhitelistableModel.class);
- return dao;
- } catch (final SQLException sqlException) {
- Throwable rootCause = sqlException;
- while ((rootCause.getCause() != null) && (rootCause != rootCause.getCause()))
- rootCause = rootCause.getCause();
- Throwable reportableCause = (rootCause instanceof ConnectException) ? rootCause : sqlException;
- log.warn("Unable to establish connection: {0}", reportableCause.getMessage());
- return null;
- }
- }
-
- String getHost() {
+ public String getHost() {
return config.getString(HOST_PATH, DEFAULT_HOST);
}
- int getPort() {
+ public int getPort() {
try {
return parseInt(config.getString(PORT_PATH, "-1"));
} catch (final NumberFormatException numberFormatException) {
@@ -108,32 +83,25 @@ int getPort() {
}
}
- String getDatabase() {
+ public String getDatabase() {
return config.getString(DATABASE_PATH, DEFAULT_DATABASE);
}
- String getUser() {
+ public String getUser() {
return config.getString(USER_PATH, DEFAULT_USER);
}
- String getPassword() {
+ public String getPassword() {
return config.getString(PASSWORD_PATH, DEFAULT_PASSWORD);
}
+ public String getDbms() {
+ return config.getString(DBMS_PATH, DEFAULT_DBMS);
+ }
+
private void load() {
if (!configFile.exists())
plugin.saveResource(FILENAME, true);
config = YamlConfiguration.loadConfiguration(configFile);
- createConnectionSource();
- }
-
- private void createConnectionSource() {
- DbmsFactory dbmsFactory = new DbmsFactory(plugin);
- Dbms dbms = dbmsFactory.matchingOrDefault(getDbms());
- connectionSource = dbms.newConnectionSource(this);
- }
-
- private String getDbms() {
- return config.getString(DBMS_PATH, DEFAULT_DBMS);
}
}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/config/StrategyPredicate.java b/src/main/java/voidpointer/spigot/voidwhitelist/config/StrategyPredicate.java
new file mode 100644
index 00000000..4b9e1fae
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/config/StrategyPredicate.java
@@ -0,0 +1,39 @@
+package voidpointer.spigot.voidwhitelist.config;
+
+import lombok.RequiredArgsConstructor;
+import org.bukkit.Bukkit;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Optional;
+import java.util.UUID;
+import java.util.function.Predicate;
+
+@RequiredArgsConstructor
+public enum StrategyPredicate implements Predicate {
+ ALL(uuid -> true), NEWCOMERS(uuid -> !Bukkit.getOfflinePlayer(uuid).hasPlayedBefore()),
+ ;
+
+ public static final StrategyPredicate DEFAULT_STRATEGY = ALL;
+
+ public static Optional of(final String strategyName) {
+ try {
+ return Optional.of(StrategyPredicate.valueOf(strategyName.toUpperCase()));
+ } catch (final IllegalArgumentException unknownStrategy) {
+ return Optional.empty();
+ }
+ }
+
+ static StrategyPredicate getOrDefault(final String strategyName) {
+ return of(strategyName).orElse(DEFAULT_STRATEGY);
+ }
+
+ @NotNull private final Predicate uuidStrategyPredicate;
+
+ @Override public boolean test(final UUID uuid) {
+ return uuidStrategyPredicate.test(uuid);
+ }
+
+ public String getName() {
+ return toString().toLowerCase().replace('_', '-');
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/config/WhitelistConfig.java b/src/main/java/voidpointer/spigot/voidwhitelist/config/WhitelistConfig.java
index cfba5290..da66e6ae 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/config/WhitelistConfig.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/config/WhitelistConfig.java
@@ -19,24 +19,25 @@
import org.bukkit.plugin.java.JavaPlugin;
import voidpointer.spigot.framework.localemodule.LocaleLog;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
-import voidpointer.spigot.voidwhitelist.date.EssentialsDateParser;
+import voidpointer.spigot.voidwhitelist.config.migration.WhitelistConfigMigrationRepository;
+import voidpointer.spigot.voidwhitelist.date.Duration;
import voidpointer.spigot.voidwhitelist.storage.StorageMethod;
import java.io.File;
import java.util.Date;
-
-import static voidpointer.spigot.voidwhitelist.Whitelistable.NEVER_EXPIRES;
-import static voidpointer.spigot.voidwhitelist.date.EssentialsDateParser.WRONG_DATE_FORMAT;
+import java.util.Optional;
public final class WhitelistConfig {
public static final String DEFAULT_LANGUAGE = "en";
public static final StorageMethod DEFAULT_STORAGE_METHOD = StorageMethod.JSON;
- private static final String DEFAULT_AUTO_WHITELIST_TIME = "1mon";
+ public static final String AUTO_WL_PATH = "auto-whitelist";
+ public static final String AUTO_WL_ENABLED_PATH = "auto-whitelist.enabled";
+ public static final String AUTO_WL_DURATION_PATH = "auto-whitelist.duration";
+ public static final String AUTO_WL_LIMIT_PATH = "auto-whitelist.limit";
+ public static final String AUTO_WL_STRATEGY_PATH = "auto-whitelist.strategy";
private static final String WHITELIST_ENABLED_PATH = "whitelist.enabled";
private static final String UUID_MODE_PATH = "whitelist.uuid-mode";
private static final String STORAGE_METHOD_PATH = "storage-method";
- private static final String AUTO_WHITELIST_NEW_PLAYERS = "auto-whitelist-new-players";
- private static final String AUTO_WHITELIST_TIME = "auto-whitelist-time";
@AutowiredLocale private static LocaleLog log;
private final JavaPlugin plugin;
@@ -46,38 +47,34 @@ public WhitelistConfig(final @NonNull JavaPlugin plugin) {
saveIfNotExists();
}
- public void reload() {
- plugin.reloadConfig();
- }
-
- // TODO: a planned feature
- public boolean autoWhitelistNewPlayers() {
- if (!plugin.getConfig().isSet(AUTO_WHITELIST_NEW_PLAYERS)) {
- plugin.getConfig().set(AUTO_WHITELIST_NEW_PLAYERS, false);
- plugin.getConfig().addDefault(AUTO_WHITELIST_TIME, "1mon");
- plugin.saveConfig();
- }
- return plugin.getConfig().getBoolean(AUTO_WHITELIST_NEW_PLAYERS);
+ /**
+ * Detects if newly-featured configuration properties are missing
+ * and runs an appropriate migration for them.
+ */
+ public void runMigrations() {
+ WhitelistConfigMigrationRepository.getAllMigrations().forEach(migration -> {
+ if (!migration.isUpToDate(plugin.getConfig())) {
+ /* this method is called at plugin load stage, in which LocaleLog is not
+ * initialized yet, so we have report any information this way. */
+ plugin.getLogger().info("Running config migration " + migration.getMigrationName());
+ migration.run(plugin.getConfig());
+ plugin.saveConfig();
+ }
+ });
}
- // TODO: a planned feature
- public Date getAutoWhitelistTime() {
- if (!plugin.getConfig().isSet(AUTO_WHITELIST_TIME)) {
- plugin.getConfig().set(AUTO_WHITELIST_TIME, DEFAULT_AUTO_WHITELIST_TIME);
- plugin.saveConfig();
- }
- final String autoWhitelistTime = plugin.getConfig().getString(AUTO_WHITELIST_TIME);
- long autoWhitelistTimestamp = EssentialsDateParser.parseDate(autoWhitelistTime);
- if ((autoWhitelistTimestamp == WRONG_DATE_FORMAT) || (autoWhitelistTimestamp == 0)) {
- return NEVER_EXPIRES;
- }
- return new Date(autoWhitelistTimestamp);
+ public void reload() {
+ plugin.reloadConfig();
}
public boolean isWhitelistEnabled() {
return plugin.getConfig().getBoolean(WHITELIST_ENABLED_PATH, false);
}
+ public boolean isAutoWhitelistEnabled() {
+ return plugin.getConfig().getBoolean(AUTO_WL_ENABLED_PATH, false);
+ }
+
public boolean isUUIDModeOnline() {
if (plugin.getConfig().isSet(UUID_MODE_PATH)) {
String uuidModeName = plugin.getConfig().getString(UUID_MODE_PATH);
@@ -113,6 +110,38 @@ public String getLanguage() {
return plugin.getConfig().getString("language", DEFAULT_LANGUAGE);
}
+ public StrategyPredicate getStrategyPredicate() {
+ return StrategyPredicate.getOrDefault(plugin.getConfig().getString(AUTO_WL_STRATEGY_PATH, "all"));
+ }
+
+ public int getAutoLimit() {
+ return plugin.getConfig().getInt(AUTO_WL_LIMIT_PATH, 0);
+ }
+
+ /** @return previous limit. */
+ public int setAutoLimit(final int newLimit) {
+ final int previousLimit = plugin.getConfig().getInt(AUTO_WL_LIMIT_PATH);
+ plugin.getConfig().set(AUTO_WL_LIMIT_PATH, newLimit);
+ plugin.saveConfig();
+ return previousLimit;
+ }
+
+ public Optional getAutoDuration() {
+ return Duration.ofEssentialsDate(getRawAutoDuration());
+ }
+
+ /** @return previous duration. */
+ public String setAutoDuration(final String newDuration) {
+ final String previousDuration = getRawAutoDuration();
+ plugin.getConfig().set(AUTO_WL_DURATION_PATH, newDuration);
+ plugin.saveConfig();
+ return previousDuration;
+ }
+
+ public String getRawAutoDuration() {
+ return plugin.getConfig().getString(AUTO_WL_DURATION_PATH, "7d");
+ }
+
public void enableWhitelist() {
plugin.getConfig().set(WHITELIST_ENABLED_PATH, true);
plugin.saveConfig();
@@ -123,6 +152,16 @@ public void disableWhitelist() {
plugin.saveConfig();
}
+ public void enableAutoWhitelist() {
+ plugin.getConfig().set(AUTO_WL_ENABLED_PATH, true);
+ plugin.saveConfig();
+ }
+
+ public void disableAutoWhitelist() {
+ plugin.getConfig().set(AUTO_WL_ENABLED_PATH, false);
+ plugin.saveConfig();
+ }
+
private void saveIfNotExists() {
if (!new File(plugin.getDataFolder(), "config.yml").exists())
plugin.saveResource("config.yml", true);
@@ -143,4 +182,11 @@ private boolean isOnline(UUIDMode uuidMode) {
private void reportUnknown(final String property, final String defaultValue) {
log.warn("Property «{0}» is not set; using default value «{1}» instead", property, defaultValue);
}
+
+ public StrategyPredicate setAutoWhitelistStrategy(final StrategyPredicate strategy) {
+ final StrategyPredicate previousStrategy = getStrategyPredicate();
+ plugin.getConfig().set(AUTO_WL_STRATEGY_PATH, strategy.getName());
+ plugin.saveConfig();
+ return previousStrategy;
+ }
}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/AbstractMigration.java b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/AbstractMigration.java
new file mode 100644
index 00000000..5f5284bd
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/AbstractMigration.java
@@ -0,0 +1,28 @@
+package voidpointer.spigot.voidwhitelist.config.migration;
+
+import org.bukkit.configuration.ConfigurationSection;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import static java.util.Arrays.asList;
+
+abstract class AbstractMigration implements ConfigMigration {
+ protected boolean supportsComments(final ConfigurationSection config) {
+ /* Because this method will always return the same result, it could be considered to
+ * store the result in a static field, although I believe it is better to spend
+ * a few more nanoseconds than to store an extra static variable. */
+
+ /* SpigotMC only introduced comment manipulation methods in 1.18.2
+ * if we can trust the release & commit dates commit 3e2dd2bc120 on 20 dec 2021,
+ * Spigot version 1.18.1 released on 10 dec 2021, 1.18.2 on 6 mar 2022
+ * https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/commits/3e2dd2bc120754ea4db193e878050d0eb31a6894
+ */
+ List commentMethods = asList("getComments", "getInlineComments", "setComments", "setInlineComments");
+ for (final Method method : config.getClass().getMethods()) {
+ if (commentMethods.contains(method.getName()))
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/AutoWhitelistMigration.java b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/AutoWhitelistMigration.java
new file mode 100644
index 00000000..be45028f
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/AutoWhitelistMigration.java
@@ -0,0 +1,63 @@
+package voidpointer.spigot.voidwhitelist.config.migration;
+
+import org.bukkit.configuration.ConfigurationSection;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+
+import java.util.List;
+
+import static java.util.Arrays.asList;
+
+final class AutoWhitelistMigration extends AbstractMigration {
+ private static final List AUTO_WL_COMMENTS = asList(
+ "",
+ " When both whitelist and auto-whitelist are enabled, the plugin will automatically",
+ "add a joining player of selected group to the whitelist for the specified duration.",
+ "",
+ " A single player can only get automatically whitelisted \"max-repeats\" times.",
+ "So if it's set to 2, after the first period they will be able to get extra time.",
+ "* It won't work the second time IF they do not meet current strategy requirements.",
+ " Strategies select a group of players who will be automatically whitelisted",
+ "upon joining the server."
+ );
+ private static final List AUTO_WL_DURATION_COMMENTS = asList(
+ " Any value in range (-∞;0] will be treated as permanent whitelisting,",
+ "WHICH SHOULD NOT BE USED (because then what's the point in using a whitelist?)",
+ "",
+ " Any value that can not be parsed will result in disabling the automatic",
+ "whitelisting feature until the configuration is fixed and reloaded."
+ );
+ private static final List AUTO_WL_STRATEGY_COMMENTS = asList(
+ "all — simply every joining player if the number that they've been \"freely\" whitelisted",
+ " have yet to exceed the limiting \"max-repeats\" property.",
+ "",
+ "newcomers — only those players who have never player on this server before.",
+ "This strategy makes use of Bukkit's #hasPlayerBefore() method that checks",
+ "whether the server has any data on the given player. This will always",
+ "be true if you disable the property «players.disable-saving» in spigot.yml"
+ );
+
+ @Override public boolean isUpToDate(final ConfigurationSection config) {
+ /* basically just check whether the configuration has auto-whitelist
+ * section. Do not check whether it's valid or not - in that case we
+ * just blame the user, not going to fool-proof this stuff, it's easier
+ * to regenerate config.yml for them, than handling invalid auto-whitelist
+ * section just so NOBODY ever actually uses it. */
+ return config.isSet(WhitelistConfig.AUTO_WL_PATH);
+ }
+
+ @Override public void run(final ConfigurationSection config) {
+ config.set(WhitelistConfig.AUTO_WL_ENABLED_PATH, false);
+ config.set(WhitelistConfig.AUTO_WL_DURATION_PATH, "7d");
+ config.set(WhitelistConfig.AUTO_WL_STRATEGY_PATH, "all");
+
+ /* unset previous shitty unimplemented configuration */
+ config.set("auto-whitelist-new-players", null);
+ config.set("auto-whitelist-time", null);
+
+ if (supportsComments(config)) {
+ config.setComments(WhitelistConfig.AUTO_WL_PATH, AUTO_WL_COMMENTS);
+ config.setComments(WhitelistConfig.AUTO_WL_DURATION_PATH, AUTO_WL_DURATION_COMMENTS);
+ config.setComments(WhitelistConfig.AUTO_WL_STRATEGY_PATH, AUTO_WL_STRATEGY_COMMENTS);
+ }
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/ConfigMigration.java b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/ConfigMigration.java
new file mode 100644
index 00000000..5a4f2df2
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/ConfigMigration.java
@@ -0,0 +1,13 @@
+package voidpointer.spigot.voidwhitelist.config.migration;
+
+import org.bukkit.configuration.ConfigurationSection;
+
+public interface ConfigMigration {
+ default String getMigrationName() {
+ return getClass().getSimpleName();
+ }
+
+ boolean isUpToDate(final ConfigurationSection config);
+
+ void run(final ConfigurationSection config);
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/RepeatsLimitMigration.java b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/RepeatsLimitMigration.java
new file mode 100644
index 00000000..d9e9ae45
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/RepeatsLimitMigration.java
@@ -0,0 +1,37 @@
+package voidpointer.spigot.voidwhitelist.config.migration;
+
+import org.bukkit.configuration.ConfigurationSection;
+import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+
+import java.util.List;
+
+import static java.util.Arrays.asList;
+
+final class RepeatsLimitMigration extends AbstractMigration {
+ private static final String AUTO_WL_MAX_REPEATS_PATH = "auto-whitelist.max-repeats";
+ private static final List AUTO_WL_LIMIT_COMMENTS = asList(
+ " This property controls the limit for the number of automatic whitelisting.",
+ "",
+ " A value of zero will disable the auto whitelisting. Any negative number will",
+ "disable this property and players will be able to infinitely join the server",
+ "and get whitelisted every time."
+ );
+
+ @Override public boolean isUpToDate(final ConfigurationSection config) {
+ return config.isSet("limit");
+ }
+
+ @Override public void run(final ConfigurationSection config) {
+ /* During the development process of the auto-whitelist feature, "max-repeats"
+ * property was introduced and later, after a few pre-release builds were published,
+ * was renamed to "limit".
+ * So here we remove the max-repeats property if it's still there and create
+ * the new one. */
+ config.set(AUTO_WL_MAX_REPEATS_PATH, null);
+
+ config.set(WhitelistConfig.AUTO_WL_LIMIT_PATH, 1);
+
+ if (supportsComments(config))
+ config.setComments(WhitelistConfig.AUTO_WL_LIMIT_PATH, AUTO_WL_LIMIT_COMMENTS);
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/WhitelistConfigMigrationRepository.java b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/WhitelistConfigMigrationRepository.java
new file mode 100644
index 00000000..e7cf5afe
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/config/migration/WhitelistConfigMigrationRepository.java
@@ -0,0 +1,18 @@
+package voidpointer.spigot.voidwhitelist.config.migration;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Queue;
+
+public final class WhitelistConfigMigrationRepository {
+ public static Collection getAllMigrations() {
+ /* Migrations will run once when the server is loading and
+ * rarely if someone reloads the plugin, so we don't need
+ * to save or cache migrations anywhere, just create, send,
+ * execute and forget about it. */
+ final Queue migrations = new LinkedList<>();
+ migrations.add(new AutoWhitelistMigration());
+ migrations.add(new RepeatsLimitMigration());
+ return migrations;
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/date/Duration.java b/src/main/java/voidpointer/spigot/voidwhitelist/date/Duration.java
new file mode 100644
index 00000000..0bc656f0
--- /dev/null
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/date/Duration.java
@@ -0,0 +1,23 @@
+package voidpointer.spigot.voidwhitelist.date;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Date;
+import java.util.Optional;
+
+public final class Duration {
+ public static Optional ofEssentialsDate(final @NotNull String essentialsDate) {
+ //noinspection deprecation
+ final long millis = EssentialsDateParser.parseDate(essentialsDate);
+ if (millis == EssentialsDateParser.WRONG_DATE_FORMAT)
+ return Optional.empty();
+ return Optional.of(new Date(millis));
+ }
+
+ public static Optional exactMillis(final @NotNull String essentialsDate) {
+ final long millis = EssentialsDateParser.parseDate(essentialsDate, EssentialsDateParser.EXACT_MILLIS);
+ if (millis == EssentialsDateParser.WRONG_DATE_FORMAT)
+ return Optional.empty();
+ return Optional.of(millis);
+ }
+}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/date/EssentialsDateParser.java b/src/main/java/voidpointer/spigot/voidwhitelist/date/EssentialsDateParser.java
index d064720b..920ce15d 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/date/EssentialsDateParser.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/date/EssentialsDateParser.java
@@ -21,6 +21,7 @@
public final class EssentialsDateParser {
public static final long WRONG_DATE_FORMAT = -1;
+ static final boolean EXACT_MILLIS = true;
private static final Pattern DATE_PATTERN = Pattern.compile(
"(?:([0-9]+)\\s*y[a-z]*[,\\s]*)?"
@@ -33,7 +34,13 @@ public final class EssentialsDateParser {
Pattern.CASE_INSENSITIVE
);
+ /** @deprecated consider using {@link Duration#ofEssentialsDate(String)} instead */
+ @Deprecated
public static long parseDate(final String date) {
+ return parseDate(date, false);
+ }
+
+ static long parseDate(final String date, final boolean exactMillis) {
/*
* Just formatted copy-paste from Essentials DateUtil class
*
@@ -80,6 +87,8 @@ public static long parseDate(final String date) {
if (!found)
return WRONG_DATE_FORMAT;
Calendar c = new GregorianCalendar();
+ if (exactMillis)
+ c.setTimeInMillis(0);
if (years > 0)
c.add(Calendar.YEAR, years);
if (months > 0)
@@ -94,10 +103,6 @@ public static long parseDate(final String date) {
c.add(Calendar.MINUTE, minutes);
if (seconds > 0)
c.add(Calendar.SECOND, seconds);
- Calendar max = new GregorianCalendar();
- max.add(Calendar.YEAR, 10);
- if (c.after(max))
- return max.getTimeInMillis();
return c.getTimeInMillis();
}
}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistAddedEvent.java b/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistAddedEvent.java
index 95a9a8fd..53dc3cb7 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistAddedEvent.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistAddedEvent.java
@@ -19,7 +19,7 @@
import org.bukkit.event.HandlerList;
import org.checkerframework.checker.nullness.qual.NonNull;
import voidpointer.spigot.voidwhitelist.Whitelistable;
-import voidpointer.spigot.voidwhitelist.command.AddCommand;
+import voidpointer.spigot.voidwhitelist.command.whitelist.AddCommand;
/**
*
Called asynchronously when someone adds a {@link Whitelistable} entity.
@@ -27,7 +27,6 @@
*
Notice: this event doesn't get called if someone imported the whitelist.
*
* @see AddCommand
- * @see WhitelistImportEvent
*/
public final class WhitelistAddedEvent extends Event {
private static final HandlerList handlers = new HandlerList();
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistImportEvent.java b/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistImportEvent.java
deleted file mode 100644
index 06163f09..00000000
--- a/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistImportEvent.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- *
- * Copyright (C) 2022 Vasiliy Petukhov
- *
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
- */
-package voidpointer.spigot.voidwhitelist.event;
-
-import lombok.Getter;
-import org.bukkit.event.Event;
-import org.bukkit.event.HandlerList;
-import org.checkerframework.checker.nullness.qual.NonNull;
-import voidpointer.spigot.voidwhitelist.Whitelistable;
-import voidpointer.spigot.voidwhitelist.command.ImportJsonCommand;
-
-import java.util.Set;
-
-/**
- *
Called asynchronously when someone imported a whitelist storage.
- *
- *
Import actions do not call {@link WhitelistAddedEvent} for any
- * imported entity.
- *
- * @see ImportJsonCommand
- */
-public final class WhitelistImportEvent extends Event {
- private static final HandlerList handlers = new HandlerList();
-
- public static HandlerList getHandlerList() {
- return handlers;
- }
-
- /**
- * An unmodifiable {@link Set} of imported {@link Whitelistable} entities.
- */
- private @NonNull @Getter final Set imported;
-
- public WhitelistImportEvent(final @NonNull Set imported) {
- super(true);
- this.imported = imported;
- }
-
- @Override
- public @NonNull HandlerList getHandlers() {
- return handlers;
- }
-}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistReconnectEvent.java b/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistReconnectEvent.java
index 798271fb..6ae0f116 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistReconnectEvent.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistReconnectEvent.java
@@ -5,8 +5,8 @@
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.checkerframework.checker.nullness.qual.NonNull;
-import voidpointer.spigot.voidwhitelist.command.ReconnectCommand;
-import voidpointer.spigot.voidwhitelist.storage.WhitelistService.ReconnectResult;
+import voidpointer.spigot.voidwhitelist.command.whitelist.ReconnectCommand;
+import voidpointer.spigot.voidwhitelist.storage.WhitelistService.ConnectionResult;
/**
*
Called asynchronously after reconnecting to a database
@@ -21,12 +21,12 @@ public static HandlerList getHandlerList() {
return handlers;
}
- @Getter private final ReconnectResult result;
+ @Getter private final ConnectionResult result;
/** The {@link CommandSender} that ran the reconnect operation. */
@Getter private final CommandSender sender;
- public WhitelistReconnectEvent(final @NonNull ReconnectResult result, final @NonNull CommandSender sender) {
+ public WhitelistReconnectEvent(final @NonNull ConnectionResult result, final @NonNull CommandSender sender) {
super(true);
this.result = result;
this.sender = sender;
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistReloadEvent.java b/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistReloadEvent.java
index 955e44c3..286dac2b 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistReloadEvent.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/event/WhitelistReloadEvent.java
@@ -5,7 +5,7 @@
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.checkerframework.checker.nullness.qual.NonNull;
-import voidpointer.spigot.voidwhitelist.command.ReloadCommand;
+import voidpointer.spigot.voidwhitelist.command.whitelist.ReloadCommand;
/**
*
Called asynchronously after reloading plugin.
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/gui/AbstractGui.java b/src/main/java/voidpointer/spigot/voidwhitelist/gui/AbstractGui.java
index 4f171fd3..60622ee6 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/gui/AbstractGui.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/gui/AbstractGui.java
@@ -40,7 +40,7 @@ public abstract class AbstractGui {
@AutowiredLocale
private static LocaleLog localeLog;
@Getter
- @Autowired
+ @Autowired(mapId="whitelistService")
private static WhitelistService whitelistService;
@Getter
@Autowired
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/listener/LoginListener.java b/src/main/java/voidpointer/spigot/voidwhitelist/listener/LoginListener.java
index 224ef5a8..e3ee817c 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/listener/LoginListener.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/listener/LoginListener.java
@@ -15,6 +15,7 @@
package voidpointer.spigot.voidwhitelist.listener;
import lombok.RequiredArgsConstructor;
+import lombok.val;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -23,15 +24,19 @@
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.Plugin;
import org.checkerframework.checker.nullness.qual.NonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
import voidpointer.spigot.framework.di.Autowired;
import voidpointer.spigot.framework.localemodule.LocaleLog;
import voidpointer.spigot.framework.localemodule.annotation.AutowiredLocale;
+import voidpointer.spigot.voidwhitelist.TimesAutoWhitelisted;
import voidpointer.spigot.voidwhitelist.Whitelistable;
import voidpointer.spigot.voidwhitelist.config.WhitelistConfig;
+import voidpointer.spigot.voidwhitelist.message.KickReason;
import voidpointer.spigot.voidwhitelist.message.WhitelistMessage;
-import voidpointer.spigot.voidwhitelist.storage.WhitelistService;
+import voidpointer.spigot.voidwhitelist.storage.AutoWhitelistService;
import voidpointer.spigot.voidwhitelist.task.KickTaskScheduler;
+import java.util.Date;
import java.util.Optional;
import static org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST;
@@ -42,28 +47,74 @@
@RequiredArgsConstructor
public final class LoginListener implements Listener {
@AutowiredLocale private static LocaleLog locale;
- @Autowired private static WhitelistService whitelistService;
+ @Autowired(mapId="whitelistService")
+ private static AutoWhitelistService autoWhitelistService;
@Autowired private static WhitelistConfig whitelistConfig;
@Autowired private static KickTaskScheduler kickTaskScheduler;
- @EventHandler public void onAsyncPreLogin(final AsyncPlayerPreLoginEvent event) {
+ @EventHandler(priority=EventPriority.NORMAL)
+ public void onAsyncPreLogin(final AsyncPlayerPreLoginEvent event) {
+ /* This listener disallows login if the connecting user is not on the whitelist,
+ * and due to either configuration or exceeding auto-whitelist.max-repeats limit
+ * we cannot automatically add the user to the whitelist. */
if (!whitelistConfig.isWhitelistEnabled())
return;
- Optional whitelistable = whitelistService.find(event.getUniqueId()).join();
+ Optional user = autoWhitelistService.find(event.getUniqueId()).join();
+ Optional optionalKickReason = getKickReasonFor(user.orElse(null));
+ if (!optionalKickReason.isPresent())
+ return;
+
+ if (!whitelistConfig.isAutoWhitelistEnabled()
+ || whitelistConfig.getStrategyPredicate().negate().test(event.getUniqueId())
+ || (whitelistConfig.getAutoLimit() == 0)) {
+ disallow(event, optionalKickReason.get());
+ return;
+ }
+ val timesAutoWhitelisted = autoWhitelistService.getTimesAutoWhitelisted(event.getUniqueId()).join();
+ if (user.isPresent() && timesAutoWhitelisted.isPresent()
+ && timesAutoWhitelisted.get().isExceeded(whitelistConfig.getAutoLimit())) {
+ disallow(event, optionalKickReason.get());
+ return;
+ }
+ final Optional autoDuration = whitelistConfig.getAutoDuration();
+ if (!autoDuration.isPresent()) {
+ locale.warn("Could not apply auto-whitelist to user {0} because of invalid duration {1}",
+ event.getUniqueId(), whitelistConfig.getRawAutoDuration());
+ disallow(event, optionalKickReason.get());
+ return;
+ }
+ autoWhitelistService.add(event.getUniqueId(), event.getName(), autoDuration.get(),
+ timesAutoWhitelisted.map(TimesAutoWhitelisted::get).orElse(0) + 1).thenApplyAsync(whitelistable -> {
+ if (!whitelistable.isPresent()) {
+ locale.warn("Automatic whitelisting of {0} failed", event.getUniqueId());
+ return whitelistable;
+ }
+ locale.info("Automatically whitelisted {0} ({1}) until {2}", event.getUniqueId(), event.getName(),
+ autoDuration.get());
+ return whitelistable;
+ });
+ }
+
+ private Optional getKickReasonFor(final @Nullable Whitelistable whitelistable) {
+ if (whitelistable == null)
+ return Optional.of(NOT_ALLOWED);
+ else if (!whitelistable.isAllowedToJoin())
+ return Optional.of(EXPIRED);
+ else
+ return Optional.empty();
+ }
- if (!whitelistable.isPresent())
- event.disallow(KICK_WHITELIST, locale.localize(WhitelistMessage.of(NOT_ALLOWED)).getRawMessage());
- else if (!whitelistable.get().isAllowedToJoin())
- event.disallow(KICK_WHITELIST, locale.localize(WhitelistMessage.of(EXPIRED)).getRawMessage());
+ private void disallow(final AsyncPlayerPreLoginEvent event, final KickReason reason) {
+ event.disallow(KICK_WHITELIST, locale.localize(WhitelistMessage.of(reason)).getRawMessage());
}
@EventHandler(priority=EventPriority.MONITOR)
- public void onJoin(final PlayerJoinEvent event) {
+ public void scheduleKickOnJoin(final PlayerJoinEvent event) {
if (!whitelistConfig.isWhitelistEnabled())
return;
- whitelistService.find(event.getPlayer().getUniqueId()).thenAcceptAsync(whitelistable -> {
+ autoWhitelistService.find(event.getPlayer().getUniqueId()).thenAcceptAsync(whitelistable -> {
if (!whitelistable.isPresent()) {
locale.severe("No Whitelistable entity found for a player that passed PreLogin check {0}",
event.getPlayer().getUniqueId());
@@ -85,7 +136,7 @@ private void updateWhitelistableName(final Player player, final Whitelistable wh
assert player.getUniqueId().equals(whitelistable.getUniqueId())
: "UUID of the updating player must match Whitelistable";
whitelistable.setName(player.getName());
- whitelistService.update(whitelistable).thenAcceptAsync(updatedOptional ->
+ autoWhitelistService.update(whitelistable).thenAcceptAsync(updatedOptional ->
updatedOptional.ifPresent(updated -> removeCachedProfile(updated.getUniqueId())));
}
}
diff --git a/src/main/java/voidpointer/spigot/voidwhitelist/message/WhitelistMessage.java b/src/main/java/voidpointer/spigot/voidwhitelist/message/WhitelistMessage.java
index e5676474..5b32e8bd 100644
--- a/src/main/java/voidpointer/spigot/voidwhitelist/message/WhitelistMessage.java
+++ b/src/main/java/voidpointer/spigot/voidwhitelist/message/WhitelistMessage.java
@@ -28,17 +28,26 @@ public enum WhitelistMessage implements Message {
CONFIG_RELOADED("&aОбщие настройки перезагружены."),
DISABLED("&eWhitelist &cвыключен&e."),
ENABLED("&eWhitelist &aвключен&e."),
+
EXPORT_ONLY_FROM_DATABASE("&eЭкспорт доступен только из базы данных."),
EXPORT_GATHERING("&eСобираем данные на экспорт..."),
- EXPORT_PROCESSING("&eЭкспоритруем &6{gathered}&e собранных записей..."),
- EXPORT_FINISHED("&eЭкспорт завершён за &d{ms-spent}ms&e."),
- EXPORT_FAILURE("&cНе сохранить экспортированные данные."),
+ WHITELIST_EXPORT_PROCESSING("&eЭкспоритруем &6{total}&e игроков..."),
+ WHITELIST_EXPORT_FINISHED("&eЭкспорт белого списка завершён за &d{ms-spent}ms&e."),
+ WHITELIST_EXPORT_FAILURE("&cНе удалось сохранить экспортированных игроков."),
+ AUTO_WHITELIST_EXPORT_PROCESSING("&eЭкспортируем данные об автоматическом занесении в белый список &6{total}&e игроков..."),
+ AUTO_WHITELIST_EXPORT_FINISHED("&eЭкспорт данных об автоматическом занесении в белый список завершён за &d{ms-spent}ms&e."),
+ AUTO_WHITELIST_EXPORT_FAILURE("&cНе удалось сохранить данные об автоматическом занесении игроков в белый список."),
+
GUI_LOCALE_DOESNT_SUPPORT_RELOAD("&cТекущая GUI локаль не поддерживает перезагрузку."),
GUI_LOCALE_RELOADED("&aGUI локаль перезагружена."),
GUI_NOT_SUPPORTED("&cGUI не поддерживается на вашей версии MC. (минимально необходимая major версия: {major})"),
+
IMPORT_LOADED("&eЗагружено &6{loaded}&e записей из &6{storage}&e, импорт начат."),
IMPORT_ONLY_TO_DATABASE("&eИмпорт работает только из JSON в базу данных."),
- IMPORT_RESULT("&eИмпортировано &6{imported}&e из &6{loaded}&e за &d{ms-spent}ms&e."),
+ WHITELIST_IMPORT_RESULT("&eИмпортировано игроков: &6{imported}&e из &6{loaded}&e;\n" +
+ "&eДанных об автоматическом добавлении в белый список: &6{auto-imported}&e из &6{auto-loaded}&e.\n" +
+ "&eОбщее время импорта: &d{ms-spent}ms&e."),
+
INFO_NOT_WHITELISTED("&eИгрок &6«&c{player-details}&6» &cотсутствует &eв whitelist."),
INFO_WHITELISTED("&eИгрок &6«&c{player-details}&6» &aесть &eв whitelist."),
INFO_WHITELISTED_TEMP("&eИгрок &6«{player-details}&6» &aесть &eв whitelist, истекает &d{date}&e."),
@@ -55,7 +64,7 @@ public enum WhitelistMessage implements Message {
RECONNECT_FAIL_KICK("&cМы больше не можем проверить, есть ли Вы в Whitelist"),
STORAGE_METHOD_CHANGED("&eМетод хранения данных был изменён &6{old}&e->&6{new}&e."),
UUID_FAIL_TRY_OFFLINE("&cНе удалось запросить online UUID, попробуйте " +
- "\\(&6-offline &8&l(клик)) [hover{&6/whitelist {cmd} -offline {player} {date}}]" +
+ "\\(&6-offline &8&o&nклик) [hover{&6/whitelist {cmd} -offline {player} {date}}]" +
" [click.suggest{/whitelist {cmd} -offline {player} {date}}] "),
LOCALE_DOESNT_SUPPORT_RELOAD("&cТекущая локаль не поддерживает перезагрузку."),
LOCALE_RELOADED("&aЛокаль перезагружена."),
@@ -69,6 +78,55 @@ public enum WhitelistMessage implements Message {
+ "\\(&e/whitelist on|off) [click.suggest{/whitelist o}] &f— включить/выключить whitelist"),
WRONG_DATE_FORMAT("&cНеверный формат времени. Пример на 1 день, 15 часов и 45 минут &a1d15h45m"),
YOU_WERE_REMOVED("&cВас исключили из whitelist."),
+
+ // TODO add unique id display on hover effects
+
+ AUTO_UUID_FAIL_TRY_OFFLINE("&cНе удалось запросить UUID, попробуйте " +
+ "\\(&6-offline &8&o&n(клик)) [hover{&6/auto-whitelist {cmd} -offline {player}}]" +
+ " [click.suggest{/auto-whitelist {cmd} -offline {player}}] "),
+ AUTO_WHITELIST_NOT_ENOUGH_ARGS("&cНедостаточно аргументов. \\(&6/auto-whitelist help) [click.run{/auto-whitelist help}]"),
+ AUTO_WHITELIST_UNKNOWN_COMMAND("&cНеизвестная команда. \\(&6/auto-whitelist help) [click.run{/auto-whitelist help}]"),
+ AUTO_WHITELIST_HELP("\\(&e/auto-whitelist on|off) [click.suggest{/auto-whitelist o}] &f— включить/выключить auto-whitelist\n" +
+ "\\(&e/auto-whitelist is-on) [click.run{/auto-whitelist status}] &f— узнать, включен ли auto-whitelist\n" +
+ "\\(&e/auto-whitelist info &6) [click.suggest{/auto-whitelist info }] &f— узнать лимит игрока\n" +
+ "\\(&e/auto-whitelist set &6) [click.suggest{/auto-whitelist set }] &f— установить лимит для игрока\n" +
+ "\\(&e/auto-whitelist reset &6) [click.suggest{/auto-whitelist reset }] &f— сбросить лимит для игрока\n"+
+ "\\(&e/auto-whitelist get-limit) [click.run{/auto-whitelist get-limit}] &f— узнать лимит авто. добавлений\n" +
+ "\\(&e/auto-whitelist set-limit &6) [click.suggest{/auto-whitelist set-limit }] &f— установить лимит авто. добавлений\n" +
+ "\\(&e/auto-whitelist get-strategy) [click.run{/auto-whitelist get-strategy }] &f— узнать текущую стратегию фильтра игроков\n"+
+ "\\(&e/auto-whitelist set-strategy &6) [click.suggest{/auto-whitelist set-strategy }] &f— установить стратегию фильтра игроков\n" +
+ "\\(&e/auto-whitelist get-duration) [click.run{/auto-whitelist get-duration}] &f— узнать текущую длительность добавления в whitelist\n" +
+ "\\(&e/auto-whitelist set-duration &6