feat: update cache

This commit is contained in:
ineanto 2023-07-14 11:01:35 +02:00
parent f795d42564
commit 69bae936d6
22 changed files with 92 additions and 53 deletions

16
pom.xml
View file

@ -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>

View file

@ -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);
}

View file

@ -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() {

View file

@ -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;

View file

@ -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);
}

View file

@ -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;

View file

@ -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";

View file

@ -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;

View file

@ -1,4 +1,4 @@
package xyz.atnrch.nicko.appearance;
package xyz.atnrch.nicko.profile;
import xyz.atnrch.nicko.i18n.Locale;

View file

@ -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;

View file

@ -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();
}

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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})"

View file

@ -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"

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;