Do not expose saving tasks to the api and change the way saving data is handled.

This commit is contained in:
Len 2024-06-18 10:40:31 +02:00
parent d1872f6e95
commit f6dd31ba33
11 changed files with 62 additions and 46 deletions

View File

@ -35,13 +35,7 @@ public interface User {
boolean allowTeleports();
void setAllowTeleports(boolean allowTeleports);
@ApiStatus.Internal
boolean saving();
@ApiStatus.Internal
void saving(boolean saving);
void allowTeleports(boolean allowTeleports);
Request request();

View File

@ -21,4 +21,6 @@ public interface UserManager {
User createNewUser(UUID uuid);
void saveAllUsers();
}

View File

@ -7,9 +7,7 @@ import com.alttd.essentia.listeners.PlayerListener;
import com.alttd.essentia.storage.StorageManager;
import com.alttd.essentia.storage.StorageProvider;
import com.alttd.essentia.storage.StorageType;
import com.alttd.essentia.storage.mysql.SQLStorageProvider;
import com.alttd.essentia.user.EssentiaUserManager;
import com.alttd.essentia.user.User;
import com.alttd.essentia.user.UserManager;
import lombok.Getter;
import org.bukkit.plugin.PluginManager;
@ -44,13 +42,7 @@ public class EssentiaPlugin extends JavaPlugin implements EssentiaAPI {
@Override
public void onDisable() {
getServer().getScheduler().cancelTasks(this);
for (User user : userManager().getUsers().values()) {
try {
storageProvider.save(user);
} catch (Exception e) {
e.printStackTrace();
}
}
userManager().saveAllUsers();
storageProvider().disable();
}
@ -86,7 +78,7 @@ public class EssentiaPlugin extends JavaPlugin implements EssentiaAPI {
}
void loadManagers() {
userManager = new EssentiaUserManager();
userManager = new EssentiaUserManager(this);
}
void loadStorageProvider() {

View File

@ -17,7 +17,7 @@ public class TeleportToggleCommand extends PlayerSubCommand {
@Override
protected boolean execute(Player player, User user, String... args) {
user.setAllowTeleports(!user.allowTeleports());
user.allowTeleports(!user.allowTeleports());
TagResolver placeholders = TagResolver.resolver(
Placeholder.parsed("toggle", BooleanUtils.toStringOnOff(user.allowTeleports()))
);

View File

@ -2,6 +2,7 @@ package com.alttd.essentia.listeners;
import com.alttd.essentia.EssentiaPlugin;
import com.alttd.essentia.configuration.Config;
import com.alttd.essentia.user.EssentiaUser;
import com.alttd.essentia.user.User;
import com.alttd.essentia.user.UserManager;
import org.bukkit.Location;
@ -84,7 +85,8 @@ public class PlayerListener implements Listener {
User user = userManager.getUser(player);
try {
plugin.storageProvider().save(user);
if (user instanceof EssentiaUser essentiaUser)
plugin.storageProvider().save(essentiaUser);
userManager.removeUser(player.getUniqueId());
} catch (Exception ignored) {}
}

View File

@ -46,7 +46,17 @@ public abstract class StorageProvider {
protected abstract EssentiaUser load(UUID uuid);
public abstract void save(@NotNull User user) throws Exception;
public void startSaving(EssentiaUser user) throws Exception {
if (user.saving() || !user.needsSaving()) return;
user.saving(true);
save(user);
user.saving(false);
user.needsSaving(false);
}
public abstract void save(@NotNull EssentiaUser user) throws Exception;
public abstract void delete(UUID uuid) throws Exception;
@ -54,17 +64,7 @@ public abstract class StorageProvider {
@Override
public void run() {
for (User user : plugin.userManager().getUsers().values()) {
try {
if (user.saving()) {
continue;
}
save(user);
} catch (Exception e) {
user.saving(false);
e.printStackTrace();
}
}
plugin.userManager().saveAllUsers();
}
}

View File

@ -4,7 +4,6 @@ import com.alttd.essentia.EssentiaPlugin;
import com.alttd.essentia.configuration.Config;
import com.alttd.essentia.storage.StorageProvider;
import com.alttd.essentia.user.EssentiaUser;
import com.alttd.essentia.user.User;
import org.jetbrains.annotations.NotNull;
import java.sql.PreparedStatement;
@ -140,7 +139,7 @@ public class SQLStorageProvider extends StorageProvider {
}
@Override
public void save(@NotNull User user) throws Exception {
public void save(@NotNull EssentiaUser user) throws Exception {
// might not be the best way if new fields are added...
// split into multiple tables - users, userdata, userhomes, ... ?
String sql = "INSERT INTO users" +

View File

@ -3,7 +3,6 @@ package com.alttd.essentia.storage.sqlite;
import com.alttd.essentia.EssentiaPlugin;
import com.alttd.essentia.storage.StorageProvider;
import com.alttd.essentia.user.EssentiaUser;
import com.alttd.essentia.user.User;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
@ -20,7 +19,7 @@ public class SQLiteStorageProvider extends StorageProvider {
}
@Override
public void save(@NotNull User user) throws Exception {
public void save(@NotNull EssentiaUser user) throws Exception {
}

View File

@ -3,7 +3,6 @@ package com.alttd.essentia.storage.yaml;
import com.alttd.essentia.EssentiaPlugin;
import com.alttd.essentia.storage.StorageProvider;
import com.alttd.essentia.user.EssentiaUser;
import com.alttd.essentia.user.User;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
@ -42,10 +41,7 @@ public class YamlStorageProvider extends StorageProvider {
}
@Override
public void save(@NotNull User user) throws Exception {
if (user.saving()) return;
user.saving(true);
public void save(@NotNull EssentiaUser user) throws Exception {
File configFile = new File(dataDirectory, user.getUUID() + ".yml");
YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile);
@ -57,7 +53,6 @@ public class YamlStorageProvider extends StorageProvider {
config.set("allow-teleports", user.allowTeleports());
config.save(configFile);
user.saving(false);
}
@Override

View File

@ -1,8 +1,6 @@
package com.alttd.essentia.user;
import com.alttd.essentia.request.Request;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Location;
import java.util.*;
@ -19,6 +17,7 @@ public class EssentiaUser implements User {
protected Request request;
private boolean saving;
private boolean needsSaving; // can we use a decorator for this to set it to true on every change?
private EssentiaUser(Builder builder) {
this.uuid = builder.uuid;
@ -45,6 +44,7 @@ public class EssentiaUser implements User {
return;
}
backLocation = location;
needsSaving = true;
}
@Override
@ -60,11 +60,13 @@ public class EssentiaUser implements User {
@Override
public void setHome(String name, Location location) {
homes.put(name, location);
needsSaving = true;
}
@Override
public void removeHome(String name) {
homes.remove(name);
needsSaving = true;
}
@Override
@ -95,20 +97,27 @@ public class EssentiaUser implements User {
}
@Override
public void setAllowTeleports(boolean allowTeleports) {
public void allowTeleports(boolean allowTeleports) {
this.allowTeleports = allowTeleports;
needsSaving = true;
}
@Override
public boolean saving() {
return saving;
}
@Override
public void saving(boolean saving) {
this.saving = saving;
}
public boolean needsSaving() {
return needsSaving;
}
public void needsSaving(boolean needsSaving) {
this.needsSaving = needsSaving;
}
@Override
public Request request() {
return request;

View File

@ -1,5 +1,6 @@
package com.alttd.essentia.user;
import com.alttd.essentia.EssentiaPlugin;
import org.bukkit.entity.Player;
import java.util.Map;
@ -8,8 +9,14 @@ import java.util.concurrent.ConcurrentHashMap;
public class EssentiaUserManager implements UserManager {
protected final EssentiaPlugin plugin;
private final Map<UUID, User> essentiaPlayers = new ConcurrentHashMap<>();
public EssentiaUserManager(EssentiaPlugin plugin) {
this.plugin = plugin;
}
@Override
public User getUser(Player player) {
return getUser(player.getUniqueId());
@ -50,4 +57,21 @@ public class EssentiaUserManager implements UserManager {
return new EssentiaUser.Builder().uuid(uuid).build();
}
@Override
public void saveAllUsers() {
for (User user : getUsers().values()) {
if (user instanceof EssentiaUser essentiaUser) {
try {
if (essentiaUser.saving() || !essentiaUser.needsSaving()) {
continue;
}
plugin.storageProvider().startSaving(essentiaUser);
} catch(Exception e){
essentiaUser.saving(false);
e.printStackTrace();
}
}
}
}
}