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..535feec --- /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.*; +import java.util.stream.Collectors; + +public class Statistics extends Appliance { + record StatisticsResponse(List playerStatistics) { + record PlayerStatistics(String player, Map values) { + } + } + + record MaterialStatistic(String name, String material) { + } + + 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.getUniqueId().toString(), + statistics.categories().stream() + .map(s -> new AbstractMap.SimpleEntry<>(s, s.material().isBlank() + ? player.getStatistic(Statistic.valueOf(s.name)) + : player.getStatistic(Statistic.valueOf(s.name), Material.valueOf(s.material())) + )) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue + )) + )) + .toList(); + return new StatisticsResponse(statisticsList); + } + ); + } +}