Skip to content

Commit

Permalink
lots of improvements and bugfixes.
Browse files Browse the repository at this point in the history
  • Loading branch information
PBoki committed Nov 14, 2023
1 parent 7ef5e30 commit e469110
Show file tree
Hide file tree
Showing 18 changed files with 313 additions and 286 deletions.
22 changes: 14 additions & 8 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>tsp.headdb</groupId>
<artifactId>HeadDB</artifactId>
<version>5.0.0-rc.7</version>
<version>5.0.0-rc.8</version>
<packaging>jar</packaging>

<name>HeadDB</name>
Expand Down Expand Up @@ -55,13 +55,13 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<version>1.20.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>authlib</artifactId>
<version>1.5.21</version>
<version>4.0.43</version>
<scope>provided</scope>
</dependency>
<dependency>
Expand All @@ -75,20 +75,26 @@
<dependency>
<groupId>com.github.TheSilentPro</groupId>
<artifactId>NexusLib</artifactId>
<version>c01a0a0a7d</version>
<version>9d8b16b770</version>
</dependency>
<dependency>
<groupId>com.github.TheSilentPro</groupId>
<artifactId>Warehouse</artifactId>
<version>882b42fc75</version>
<version>b228e4f8b1</version>
</dependency>
<dependency>
<groupId>net.wesjd</groupId>
<artifactId>anvilgui</artifactId>
<version>1.7.0-SNAPSHOT</version>
<version>1.9.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.github.TheSilentPro</groupId>
<artifactId>HelperLite</artifactId>
<version>775582f23b</version>
</dependency>

<!-- Soft Dependencies -->
<!--suppress VulnerableLibrariesLocal -->
<dependency>
<groupId>com.github.MilkBowl</groupId>
<artifactId>VaultAPI</artifactId>
Expand All @@ -98,7 +104,7 @@
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.11.1</version>
<version>2.11.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
Expand Down Expand Up @@ -183,7 +189,7 @@
<additionalDependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<version>1.20.2-R0.1-SNAPSHOT</version>
</additionalDependency>
</additionalDependencies>
</configuration>
Expand Down
66 changes: 51 additions & 15 deletions src/main/java/tsp/headdb/HeadDB.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,25 @@
import tsp.headdb.core.storage.Storage;
import tsp.headdb.core.task.UpdateTask;
import tsp.headdb.core.util.HeadDBLogger;
import tsp.helperlite.HelperLite;
import tsp.helperlite.Schedulers;
import tsp.helperlite.scheduler.promise.Promise;
import tsp.helperlite.scheduler.task.Task;
import tsp.nexuslib.NexusPlugin;
import tsp.nexuslib.inventory.PaneListener;
import tsp.nexuslib.localization.TranslatableLocalization;
import tsp.nexuslib.util.PluginUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

public class HeadDB extends NexusPlugin {

Expand All @@ -27,22 +35,27 @@ public class HeadDB extends NexusPlugin {
private Storage storage;
private BasicEconomyProvider economyProvider;
private CommandManager commandManager;
private Task updateTask;

@Override
public void onStart(NexusPlugin nexusPlugin) {
instance = this;
HelperLite.init(this);

instance.saveDefaultConfig();
instance.logger = new HeadDBLogger(getConfig().getBoolean("debug"));
instance.logger.info("Loading HeadDB - " + instance.getDescription().getVersion());

new UpdateTask(getConfig().getLong("refresh", 86400L)).schedule(this);
instance.logger.info("Loaded " + loadLocalization() + " languages!");

instance.initStorage();
instance.initEconomy();

startUpdateTask();

new PaneListener(this);

// TODO: Commands helperlite
instance.commandManager = new CommandManager();
loadCommands();

Expand All @@ -66,8 +79,38 @@ public void onDisable() {
}
}
}

updateTask.stop();
}

private void startUpdateTask() {
updateTask = Schedulers.builder()
.async()
.every(getConfig().getLong("refresh", 86400L), TimeUnit.SECONDS)
.run(new UpdateTask());
}

private void ensureLatestVersion() {
Promise.start().thenApplyAsync(a -> {
try {
URLConnection connection = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + 84967).openConnection();
connection.setConnectTimeout(5000);
connection.setRequestProperty("User-Agent", this.getName() + "-VersionChecker");

return new BufferedReader(new InputStreamReader(connection.getInputStream())).readLine().equals(this.getDescription().getVersion());
} catch (IOException ex) {
return false;
}
}).thenAcceptAsync(latest -> {
if (latest) {
instance.logger.warning("There is a new update available for HeadDB on spigot!");
instance.logger.warning("Download: https://www.spigotmc.org/resources/84967");
}
});
}

// Loaders

private void initMetrics() {
Metrics metrics = new Metrics(this, 9152);

Expand All @@ -80,19 +123,8 @@ private void initMetrics() {
}));
}

private void ensureLatestVersion() {
PluginUtils.isLatestVersion(this, 84967, latest -> {
if (Boolean.FALSE.equals(latest)) {
instance.logger.warning("There is a new update available for HeadDB on spigot!");
instance.logger.warning("Download: https://www.spigotmc.org/resources/84967");
}
});
}

// Loaders

private void initStorage() {
storage = new Storage(getConfig().getInt("storage.threads"));
storage = new Storage();
storage.getPlayerStorage().init();
}

Expand Down Expand Up @@ -156,6 +188,10 @@ private void loadCommands() {

// Getters

public Optional<Task> getUpdateTask() {
return Optional.ofNullable(updateTask);
}

public Storage getStorage() {
return storage;
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/tsp/headdb/Metrics.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import tsp.headdb.core.storage.HeadDBThreadFactory;

import javax.net.ssl.HttpsURLConnection;
import java.io.*;
Expand Down Expand Up @@ -132,8 +133,7 @@ public static class MetricsBase {
/** The version of the Metrics class. */
public static final String METRICS_VERSION = "3.0.0";

private static final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1, task -> new Thread(task, "bStats-Metrics"));
private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(HeadDBThreadFactory.FACTORY);

private static final String REPORT_URL = "https://bStats.org/api/v2/data/%s";

Expand Down
19 changes: 11 additions & 8 deletions src/main/java/tsp/headdb/core/api/HeadAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import tsp.headdb.implementation.head.HeadDatabase;
import tsp.headdb.implementation.head.LocalHead;
import tsp.headdb.implementation.requester.HeadProvider;
import tsp.helperlite.scheduler.promise.Promise;

import javax.annotation.Nonnull;
import java.util.*;
Expand Down Expand Up @@ -163,14 +164,16 @@ public static Set<LocalHead> getLocalHeads() {
* @return {@link Set<Head> Favorite Heads}
*/
@Nonnull
public static List<Head> getFavoriteHeads(UUID player) {
List<Head> result = new ArrayList<>();
Optional<PlayerData> data = HeadDB.getInstance().getStorage().getPlayerStorage().get(player);
data.ifPresent(playerData -> playerData.favorites()
.forEach(texture -> getHeadByTexture(texture)
.ifPresent(result::add))
);
return result;
public static Promise<List<Head>> getFavoriteHeads(UUID player) {
return Promise.supplyingAsync(() -> {
List<Head> result = new ArrayList<>();
Optional<PlayerData> data = HeadDB.getInstance().getStorage().getPlayerStorage().get(player);
data.ifPresent(playerData -> playerData.favorites()
.forEach(texture -> getHeadByTexture(texture)
.ifPresent(result::add))
);
return result;
});
}

/**
Expand Down
7 changes: 1 addition & 6 deletions src/main/java/tsp/headdb/core/command/CommandMain.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package tsp.headdb.core.command;

import java.util.Arrays;
import net.wesjd.anvilgui.AnvilGUI;
import net.wesjd.anvilgui.AnvilGUI.Builder;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
Expand All @@ -24,10 +22,7 @@

import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;

public class CommandMain extends HeadDBCommand implements CommandExecutor, TabCompleter {
Expand Down
15 changes: 10 additions & 5 deletions src/main/java/tsp/headdb/core/command/CommandUpdate.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package tsp.headdb.core.command;

import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import tsp.headdb.HeadDB;
import tsp.headdb.core.api.HeadAPI;
import tsp.headdb.implementation.head.HeadResult;
import tsp.helperlite.scheduler.promise.Promise;

public class CommandUpdate extends SubCommand {

Expand All @@ -14,10 +15,14 @@ public CommandUpdate() {
@Override
public void handle(CommandSender sender, String[] args) {
getLocalization().sendMessage(sender, "updateDatabase");
HeadAPI.getDatabase().update((time, result) -> {
HeadDB.getInstance().getLog().debug("Database Updated! Heads: " + result.values().size() + " | Took: " + time + "ms");
Bukkit.getScheduler().runTask(HeadDB.getInstance(), () -> getLocalization().sendMessage(sender, "updateDatabaseDone", msg -> msg.replace("%size%", String.valueOf(result.values().size()))));
});
try (Promise<HeadResult> promise = HeadAPI.getDatabase().update()) {
promise.thenAcceptSync(result -> {
HeadDB.getInstance().getLog().debug("Database Updated! Heads: " + result.heads().values().size() + " | Took: " + result.elapsed() + "ms");
getLocalization().sendMessage(sender, "updateDatabaseDone", msg -> msg.replace("%size%", String.valueOf(result.heads().values().size())));
});
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}

}
10 changes: 5 additions & 5 deletions src/main/java/tsp/headdb/core/economy/BasicEconomyProvider.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package tsp.headdb.core.economy;

import org.bukkit.entity.Player;
import tsp.helperlite.scheduler.promise.Promise;

import java.math.BigDecimal;
import java.util.concurrent.CompletableFuture;

public interface BasicEconomyProvider {

CompletableFuture<Boolean> canPurchase(Player player, BigDecimal cost);
Promise<Boolean> canPurchase(Player player, BigDecimal cost);

CompletableFuture<Boolean> withdraw(Player player, BigDecimal amount);
Promise<Boolean> withdraw(Player player, BigDecimal amount);

default CompletableFuture<Boolean> purchase(Player player, BigDecimal amount) {
return canPurchase(player, amount).thenCompose(result -> result ? withdraw(player, amount) : CompletableFuture.completedFuture(false));
default Promise<Boolean> purchase(Player player, BigDecimal amount) {
return canPurchase(player, amount).thenComposeAsync(result -> result ? withdraw(player, amount) : Promise.completed(false));
}

void init();
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/tsp/headdb/core/economy/VaultProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;
import tsp.headdb.HeadDB;
import tsp.helperlite.scheduler.promise.Promise;

import java.math.BigDecimal;
import java.util.concurrent.CompletableFuture;

public class VaultProvider implements BasicEconomyProvider {

private Economy economy;

@Override
public CompletableFuture<Boolean> canPurchase(Player player, BigDecimal cost) {
public Promise<Boolean> canPurchase(Player player, BigDecimal cost) {
double effectiveCost = cost.doubleValue();
return CompletableFuture.supplyAsync(() -> economy.has(player, effectiveCost >= 0 ? effectiveCost : 0));
return Promise.supplyingAsync(() -> economy.has(player, effectiveCost >= 0 ? effectiveCost : 0));
}

@Override
public CompletableFuture<Boolean> withdraw(Player player, BigDecimal amount) {
public Promise<Boolean> withdraw(Player player, BigDecimal amount) {
double effectiveCost = amount.doubleValue();
return CompletableFuture.supplyAsync(() -> economy.withdrawPlayer(player, effectiveCost >= 0 ? effectiveCost : 0).transactionSuccess());
return Promise.supplyingAsync(() -> economy.withdrawPlayer(player, effectiveCost >= 0 ? effectiveCost : 0).transactionSuccess());
}


Expand Down
2 changes: 1 addition & 1 deletion src/main/java/tsp/headdb/core/storage/PlayerStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public Map<UUID, PlayerData> getPlayersMap() {

public void init() {
load().whenComplete((data, ex) -> {
for (PlayerData entry : data) {
for (PlayerData entry : data.orElse(new HashSet<>())) {
players.put(entry.uniqueId(), entry);
}

Expand Down
5 changes: 3 additions & 2 deletions src/main/java/tsp/headdb/core/storage/Storage.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package tsp.headdb.core.storage;

import tsp.headdb.HeadDB;
import tsp.helperlite.Schedulers;

import java.io.File;
import java.util.concurrent.Executor;
Expand All @@ -11,8 +12,8 @@ public class Storage {
private final Executor executor;
private final PlayerStorage playerStorage;

public Storage(int threads) {
executor = Executors.newFixedThreadPool(threads, HeadDBThreadFactory.FACTORY);
public Storage() {
executor = Schedulers.async();
validateDataDirectory();
playerStorage = new PlayerStorage(HeadDB.getInstance(), this);
}
Expand Down
Loading

0 comments on commit e469110

Please sign in to comment.