feat: update cache
This commit is contained in:
parent
f795d42564
commit
69bae936d6
22 changed files with 92 additions and 53 deletions
16
pom.xml
16
pom.xml
|
@ -138,9 +138,11 @@
|
|||
<include>net.wesjd:anvilgui</include>
|
||||
<include>xyz.xenondevs.invui:*</include>
|
||||
<include>com.github.jsixface:*</include>
|
||||
<include>com.fasterxml.jackson.dataformat</include>
|
||||
<include>com.fasterxml.jackson.core</include>
|
||||
<include>org.mariadb.jdbc</include>
|
||||
<include>com.fasterxml.jackson.dataformat:*</include>
|
||||
<include>com.fasterxml.jackson.core:*</include>
|
||||
<include>org.mariadb.jdbc:*</include>
|
||||
<include>redis.clients:*</include>
|
||||
<include>org.apache.commons:commons-pool2</include>
|
||||
</includes>
|
||||
</artifactSet>
|
||||
<relocations>
|
||||
|
@ -168,6 +170,14 @@
|
|||
<pattern>org.mariadb.jdbc</pattern>
|
||||
<shadedPattern>net.artelnatif.libs.mariadb</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>redis.clients</pattern>
|
||||
<shadedPattern>net.artelnatif.libs.redis</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>org.apache.commons.pool2</pattern>
|
||||
<shadedPattern>net.artelnatif.libs.pool2</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
<!-- Prevents breaking AnvilGUI's VersionWrapper. -->
|
||||
<minimizeJar>false</minimizeJar>
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
package xyz.atnrch.nicko.anvil;
|
||||
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.appearance.AppearanceManager;
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.i18n.I18N;
|
||||
import xyz.atnrch.nicko.i18n.I18NDict;
|
||||
import xyz.atnrch.nicko.mojang.MojangUtils;
|
||||
import net.wesjd.anvilgui.AnvilGUI;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.appearance.AppearanceManager;
|
||||
import xyz.atnrch.nicko.i18n.I18N;
|
||||
import xyz.atnrch.nicko.i18n.I18NDict;
|
||||
import xyz.atnrch.nicko.mojang.MojangUtils;
|
||||
import xyz.atnrch.nicko.storage.PlayerDataStore;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
@ -18,10 +19,12 @@ import java.util.List;
|
|||
public class AnvilManager {
|
||||
private final Player player;
|
||||
private final AppearanceManager appearanceManager;
|
||||
private final PlayerDataStore dataStore;
|
||||
|
||||
public AnvilManager(Player player) {
|
||||
this.player = player;
|
||||
this.appearanceManager = AppearanceManager.get(player);
|
||||
this.dataStore = NickoBukkit.getInstance().getDataStore();
|
||||
}
|
||||
|
||||
public void openNameThenSkinAnvil() {
|
||||
|
@ -47,6 +50,7 @@ public class AnvilManager {
|
|||
return Collections.singletonList(AnvilGUI.ResponseAction.replaceInputText("Invalid username!"));
|
||||
} else {
|
||||
appearanceManager.setName(snapshot.getText());
|
||||
dataStore.updateCache(player.getUniqueId(), appearanceManager.getProfile());
|
||||
openSkinAnvil();
|
||||
return Collections.singletonList(AnvilGUI.ResponseAction.close());
|
||||
}
|
||||
|
@ -67,6 +71,7 @@ public class AnvilManager {
|
|||
return Collections.singletonList(AnvilGUI.ResponseAction.replaceInputText("Invalid username!"));
|
||||
} else {
|
||||
appearanceManager.setName(snapshot.getText());
|
||||
dataStore.updateCache(player.getUniqueId(), appearanceManager.getProfile());
|
||||
final ActionResult actionResult = appearanceManager.updatePlayer(false, false);
|
||||
return sendResultAndClose(actionResult);
|
||||
}
|
||||
|
@ -87,6 +92,7 @@ public class AnvilManager {
|
|||
return Collections.singletonList(AnvilGUI.ResponseAction.replaceInputText("Invalid username!"));
|
||||
} else {
|
||||
appearanceManager.setSkin(snapshot.getText());
|
||||
dataStore.updateCache(player.getUniqueId(), appearanceManager.getProfile());
|
||||
final ActionResult actionResult = appearanceManager.updatePlayer(true, false);
|
||||
return sendResultAndClose(actionResult);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package xyz.atnrch.nicko.profile;
|
||||
package xyz.atnrch.nicko.appearance;
|
||||
|
||||
import com.comphenix.protocol.utility.MinecraftVersion;
|
||||
import com.comphenix.protocol.wrappers.*;
|
||||
|
@ -14,6 +14,7 @@ import xyz.atnrch.nicko.i18n.I18NDict;
|
|||
import xyz.atnrch.nicko.i18n.Locale;
|
||||
import xyz.atnrch.nicko.mojang.MojangAPI;
|
||||
import xyz.atnrch.nicko.mojang.MojangSkin;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import xyz.atnrch.nicko.storage.PlayerDataStore;
|
||||
import xyz.atnrch.nicko.storage.name.PlayerNameStore;
|
||||
import xyz.atnrch.nicko.wrapper.*;
|
||||
|
@ -24,7 +25,7 @@ import java.util.Optional;
|
|||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class ProfileManager {
|
||||
public class AppearanceManager {
|
||||
private final NickoProfile profile;
|
||||
private final Player player;
|
||||
private final UUID uuid;
|
||||
|
@ -32,24 +33,24 @@ public class ProfileManager {
|
|||
private final PlayerDataStore dataStore = instance.getDataStore();
|
||||
private final PlayerNameStore nameStore = instance.getNameStore();
|
||||
|
||||
private ProfileManager(UUID uuid) {
|
||||
private AppearanceManager(UUID uuid) {
|
||||
this.player = Bukkit.getPlayer(uuid);
|
||||
this.uuid = uuid;
|
||||
this.profile = dataStore.getData(uuid).orElse(NickoProfile.EMPTY_PROFILE.clone());
|
||||
}
|
||||
|
||||
private ProfileManager(String name) {
|
||||
private AppearanceManager(String name) {
|
||||
this.player = null;
|
||||
this.uuid = null;
|
||||
this.profile = dataStore.getOfflineData(name).orElse(NickoProfile.EMPTY_PROFILE.clone());
|
||||
}
|
||||
|
||||
public static ProfileManager get(Player player) {
|
||||
return new ProfileManager(player.getUniqueId());
|
||||
public static AppearanceManager get(Player player) {
|
||||
return new AppearanceManager(player.getUniqueId());
|
||||
}
|
||||
|
||||
public static ProfileManager get(String name) {
|
||||
return new ProfileManager(name);
|
||||
public static AppearanceManager get(String name) {
|
||||
return new AppearanceManager(name);
|
||||
}
|
||||
|
||||
public boolean hasData() {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package xyz.atnrch.nicko.gui.items.settings;
|
||||
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
package xyz.atnrch.nicko.gui.items.settings;
|
||||
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.i18n.Locale;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.i18n.I18N;
|
||||
import xyz.atnrch.nicko.i18n.I18NDict;
|
||||
import xyz.atnrch.nicko.i18n.Locale;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import xyz.atnrch.nicko.storage.PlayerDataStore;
|
||||
import xyz.xenondevs.invui.item.ItemProvider;
|
||||
import xyz.xenondevs.invui.item.builder.ItemBuilder;
|
||||
import xyz.xenondevs.invui.item.impl.AbstractItem;
|
||||
|
@ -21,13 +24,19 @@ public class LanguageCyclingItem {
|
|||
private final ItemProvider[] providers = getItems();
|
||||
|
||||
public AbstractItem get(Player player) {
|
||||
final Optional<NickoProfile> profile = NickoBukkit.getInstance().getDataStore().getData(player.getUniqueId());
|
||||
final PlayerDataStore dataStore = NickoBukkit.getInstance().getDataStore();
|
||||
final Optional<NickoProfile> profile = dataStore.getData(player.getUniqueId());
|
||||
if (profile.isPresent()) {
|
||||
final NickoProfile nickoProfile = profile.get();
|
||||
int localeOrdinal = nickoProfile.getLocale().ordinal();
|
||||
return CycleItem.withStateChangeHandler((observer, integer) -> {
|
||||
nickoProfile.setLocale(Locale.values()[integer]);
|
||||
observer.playSound(player, Sound.UI_BUTTON_CLICK, 1f, 0.707107f); // 0.707107 ~= C
|
||||
if (dataStore.updateCache(player.getUniqueId(), nickoProfile).isError()) {
|
||||
final I18N i18n = new I18N(player);
|
||||
player.sendMessage(i18n.translate(I18NDict.Event.Settings.ERROR));
|
||||
player.getOpenInventory().close();
|
||||
}
|
||||
}, localeOrdinal, providers);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
package xyz.atnrch.nicko.i18n;
|
||||
|
||||
import com.github.jsixface.YamlConfig;
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import org.bukkit.entity.Player;
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.appearance.AppearanceManager;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Optional;
|
||||
|
||||
public class I18N {
|
||||
private final MessageFormat formatter = new MessageFormat("");
|
||||
|
@ -56,8 +55,8 @@ public class I18N {
|
|||
|
||||
private Locale getPlayerLocale() {
|
||||
try {
|
||||
final Optional<NickoProfile> profile = instance.getDataStore().getData(player.getUniqueId());
|
||||
return !profile.isPresent() ? Locale.FALLBACK_LOCALE : profile.get().getLocale();
|
||||
final AppearanceManager appearanceManager = AppearanceManager.get(player);
|
||||
return !appearanceManager.hasData() ? Locale.FALLBACK_LOCALE : appearanceManager.getLocale();
|
||||
} catch (IllegalArgumentException exception) {
|
||||
instance.getLogger().severe("Invalid locale provided by " + player.getName() + ", defaulting to " + Locale.FALLBACK_LOCALE.getCode() + ".");
|
||||
return Locale.FALLBACK_LOCALE;
|
||||
|
|
|
@ -2,13 +2,13 @@ package xyz.atnrch.nicko.i18n;
|
|||
|
||||
public class I18NDict {
|
||||
public static class Event {
|
||||
public static final String EVENT_KEY = "event.";
|
||||
private static final String EVENT_KEY = "event.";
|
||||
|
||||
public static class Admin {
|
||||
public static final String ADMIN_KEY = EVENT_KEY + "admin.";
|
||||
private static final String ADMIN_KEY = EVENT_KEY + "admin.";
|
||||
|
||||
public static class Cache {
|
||||
public static final String CACHE_KEY = ADMIN_KEY + "cache.";
|
||||
private static final String CACHE_KEY = ADMIN_KEY + "cache.";
|
||||
|
||||
public static final String INVALIDATE_CACHE = CACHE_KEY + "invalidate_cache";
|
||||
public static final String INVALIDATE_ENTRY = CACHE_KEY + "invalidate_entry";
|
||||
|
@ -16,8 +16,14 @@ public class I18NDict {
|
|||
}
|
||||
}
|
||||
|
||||
public static class Settings {
|
||||
private static final String SETTINGS_KEY = EVENT_KEY + "settings.";
|
||||
|
||||
public static final String ERROR = SETTINGS_KEY + "error";
|
||||
}
|
||||
|
||||
public static class Appearance {
|
||||
public static final String APPEARANCE_KEY = EVENT_KEY + "appearance.";
|
||||
private static final String APPEARANCE_KEY = EVENT_KEY + "appearance.";
|
||||
|
||||
public static class Set {
|
||||
public static final String SET_KEY = APPEARANCE_KEY + "set.";
|
||||
|
@ -27,7 +33,7 @@ public class I18NDict {
|
|||
}
|
||||
|
||||
public static class Remove {
|
||||
public static final String REMOVE_KEY = APPEARANCE_KEY + "remove.";
|
||||
private static final String REMOVE_KEY = APPEARANCE_KEY + "remove.";
|
||||
|
||||
public static final String OK = REMOVE_KEY + "ok";
|
||||
public static final String MISSING = REMOVE_KEY + "missing";
|
||||
|
@ -35,7 +41,7 @@ public class I18NDict {
|
|||
}
|
||||
|
||||
public static class Restore {
|
||||
public static final String RESTORE_KEY = APPEARANCE_KEY + "restore.";
|
||||
private static final String RESTORE_KEY = APPEARANCE_KEY + "restore.";
|
||||
|
||||
public static final String OK = RESTORE_KEY + "ok";
|
||||
public static final String ERROR = RESTORE_KEY + "error";
|
||||
|
@ -46,7 +52,6 @@ public class I18NDict {
|
|||
public static class Error {
|
||||
public static final String GENERIC = "error.generic";
|
||||
public static final String PERMISSION = "error.permission";
|
||||
public static final String PLAYER_OFFLINE = "error.offline";
|
||||
public static final String CACHE = "error.cache";
|
||||
public static final String MOJANG_NAME = "error.mojang_name";
|
||||
public static final String MOJANG_SKIN = "error.mojang_skin";
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
package xyz.atnrch.nicko.placeholder;
|
||||
|
||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package xyz.atnrch.nicko.appearance;
|
||||
package xyz.atnrch.nicko.profile;
|
||||
|
||||
import xyz.atnrch.nicko.i18n.Locale;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package xyz.atnrch.nicko.storage;
|
||||
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
|
|
@ -3,7 +3,7 @@ package xyz.atnrch.nicko.storage;
|
|||
import org.bukkit.entity.Player;
|
||||
import xyz.atnrch.nicko.config.Configuration;
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import xyz.atnrch.nicko.i18n.I18NDict;
|
||||
import xyz.atnrch.nicko.mojang.MojangAPI;
|
||||
import xyz.atnrch.nicko.mojang.MojangUtils;
|
||||
|
@ -28,8 +28,17 @@ public class PlayerDataStore {
|
|||
this.cache = configuration.getRedisConfiguration().isEnabled() ? new RedisCache(configuration) : new MapCache();
|
||||
}
|
||||
|
||||
public ActionResult updateCache(UUID uuid, NickoProfile profile) {
|
||||
final Optional<NickoProfile> retrieved = getData(uuid);
|
||||
if (retrieved.isPresent()) {
|
||||
getCache().cache(uuid, profile);
|
||||
return ActionResult.ok();
|
||||
}
|
||||
return ActionResult.error(I18NDict.Error.CACHE);
|
||||
}
|
||||
|
||||
public Optional<NickoProfile> getData(UUID uuid) {
|
||||
if (storage.isError()) {
|
||||
if (storage.isError() || cache.isError()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package xyz.atnrch.nicko.storage;
|
||||
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
|
|
@ -4,7 +4,7 @@ import com.google.gson.Gson;
|
|||
import com.google.gson.GsonBuilder;
|
||||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import xyz.atnrch.nicko.i18n.I18NDict;
|
||||
import xyz.atnrch.nicko.storage.Storage;
|
||||
import xyz.atnrch.nicko.storage.StorageProvider;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package xyz.atnrch.nicko.storage.map;
|
||||
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import xyz.atnrch.nicko.storage.Cache;
|
||||
import xyz.atnrch.nicko.storage.CacheProvider;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package xyz.atnrch.nicko.storage.map;
|
||||
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import xyz.atnrch.nicko.storage.CacheProvider;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
|
|
@ -2,7 +2,7 @@ package xyz.atnrch.nicko.storage.sql;
|
|||
|
||||
import xyz.atnrch.nicko.config.Configuration;
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import xyz.atnrch.nicko.i18n.I18NDict;
|
||||
import xyz.atnrch.nicko.i18n.Locale;
|
||||
import xyz.atnrch.nicko.storage.Storage;
|
||||
|
|
|
@ -1,15 +1,16 @@
|
|||
error:
|
||||
generic: "Unknown error"
|
||||
generic: "An unknown error occurred."
|
||||
permission: "§cYou do not have the required permission."
|
||||
invalid_username: "§cThis is not a valid Minecraft username."
|
||||
mojang_name: "There is no Minecraft account with this name."
|
||||
mojang_skin: "This Minecraft account has no skin."
|
||||
offline: "§c{0} §fis offline!"
|
||||
cache: "Unable to get skin from the cache."
|
||||
sql: "SQL Error"
|
||||
json: "JSON Error"
|
||||
|
||||
event:
|
||||
settings:
|
||||
error: "§cUnable to update your settings. §7§o({0})"
|
||||
appearance:
|
||||
set:
|
||||
error: "§cUnable to apply your disguise. §7§o({0})"
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
error:
|
||||
generic: "Erreur inconnue"
|
||||
generic: "Une erreur inconnue c'est produite."
|
||||
permission: "§cVous ne possédez pas la permission."
|
||||
invalid_username: "§cLe pseudo n''est pas un pseudo Minecraft valide."
|
||||
mojang_name: "Un compte Minecraft avec ce nom n'existe pas."
|
||||
mojang_skin: "Ce compte Minecraft n'a pas de skin."
|
||||
offline: "§c{0} §fest hors-ligne!"
|
||||
cache: "Impossible de récupérer le skin depuis le cache."
|
||||
sql: "Erreur SQL"
|
||||
json: "Erreur JSON"
|
||||
|
|
|
@ -7,7 +7,7 @@ import xyz.atnrch.nicko.NickoBukkit;
|
|||
import xyz.atnrch.nicko.config.Configuration;
|
||||
import xyz.atnrch.nicko.config.DataSourceConfiguration;
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import org.junit.jupiter.api.*;
|
||||
|
||||
import java.util.Optional;
|
||||
|
|
|
@ -8,7 +8,7 @@ import xyz.atnrch.nicko.NickoBukkit;
|
|||
import xyz.atnrch.nicko.config.Configuration;
|
||||
import xyz.atnrch.nicko.config.DataSourceConfiguration;
|
||||
import xyz.atnrch.nicko.appearance.ActionResult;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import xyz.atnrch.nicko.i18n.Locale;
|
||||
|
||||
import java.util.Optional;
|
||||
|
|
|
@ -6,7 +6,7 @@ import be.seeseemelk.mockbukkit.entity.PlayerMock;
|
|||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.config.Configuration;
|
||||
import xyz.atnrch.nicko.config.DataSourceConfiguration;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
|
|
|
@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test;
|
|||
import xyz.atnrch.nicko.NickoBukkit;
|
||||
import xyz.atnrch.nicko.config.Configuration;
|
||||
import xyz.atnrch.nicko.config.DataSourceConfiguration;
|
||||
import xyz.atnrch.nicko.appearance.NickoProfile;
|
||||
import xyz.atnrch.nicko.profile.NickoProfile;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
|
|
Loading…
Reference in a new issue