diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/statistics/Statistics.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/statistics/Statistics.java new file mode 100644 index 0000000..8055558 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/statistics/Statistics.java @@ -0,0 +1,51 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.statistics; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Statistic; + +import java.util.*; + +public class Statistics extends Appliance { + record StatisticsResponse(List playerStatistics) { + record PlayerStatistics(String playerName, String playerUuid, List statistics) { + } + } + + record MaterialStatistic(String name, String material, int value) { + } + + record StatisticsRequest(List categories) { + } + + @Override + public void httpApi(HttpServer.ApiBuilder apiBuilder) { + apiBuilder.post( + "getStatistics", + StatisticsRequest.class, + (statistics, request) -> { + Main.instance().getLogger().info("API requested statistics"); + List statisticsList = Arrays.stream(Bukkit.getOfflinePlayers()) + .parallel() + .map(player -> new StatisticsResponse.PlayerStatistics( + player.getName(), + player.getUniqueId().toString(), + statistics.categories().stream() + .map(category -> { + String material = (category.material() == null || category.material().isBlank()) ? null : category.material(); + return new MaterialStatistic(category.name(), material, material == null + ? player.getStatistic(Statistic.valueOf(category.name())) + : player.getStatistic(Statistic.valueOf(category.name()), Material.valueOf(material)) + ); + }) + .toList() + )) + .toList(); + return new StatisticsResponse(statisticsList); + } + ); + } +}