diff --git a/pom.xml b/pom.xml index 044db6d7..8c8e7e4d 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ voidpointer.spigot voidwhitelist - 0.9.5 + 1.0.0 jar VoidWhitelist 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 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