Skip to content

Commit c122fdd

Browse files
committed
Add calcul logic and DB integration
1 parent 9bb30ea commit c122fdd

File tree

8 files changed

+360
-17
lines changed

8 files changed

+360
-17
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>me.loutreee</groupId>
88
<artifactId>statcraft</artifactId>
9-
<version>2.0.0</version>
9+
<version>2.1.0</version>
1010
<packaging>jar</packaging>
1111

1212
<name>statcraft</name>

src/main/java/me/loutreee/statCraft/NitriteBuilder.java

+4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ public static ObjectRepository<PlayerData> getPlayerRepository() {
2626
return playerRepository;
2727
}
2828

29+
public static Nitrite getDatabase() {
30+
return db;
31+
}
32+
2933
public static void close() {
3034
if (db != null) {
3135
db.close();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package me.loutreee.statCraft;
2+
3+
import org.bukkit.Material;
4+
import org.bukkit.entity.EntityType;
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
/**
9+
* Contient les stats d'un joueur (blocs minés, items craftés, mobs tués).
10+
*/
11+
public class PlayerStats {
12+
13+
private final String playerName;
14+
private final Map<String, Integer> blocksMined = new HashMap<>();
15+
private final Map<String, Integer> itemsCrafted = new HashMap<>();
16+
private final Map<String, Integer> mobsKilled = new HashMap<>();
17+
18+
public PlayerStats(String playerName) {
19+
this.playerName = playerName;
20+
}
21+
22+
public String getPlayerName() {
23+
return playerName;
24+
}
25+
26+
public Map<String, Integer> getBlocksMined() {
27+
return blocksMined;
28+
}
29+
30+
public Map<String, Integer> getItemsCrafted() {
31+
return itemsCrafted;
32+
}
33+
34+
public Map<String, Integer> getMobsKilled() {
35+
return mobsKilled;
36+
}
37+
38+
// Incrémente les compteurs lors des événements
39+
public void incrementBlock(Material blockType) {
40+
blocksMined.merge(blockType.toString(), 1, Integer::sum);
41+
}
42+
43+
public void incrementItem(Material itemType) {
44+
itemsCrafted.merge(itemType.toString(), 1, Integer::sum);
45+
}
46+
47+
public void incrementMob(EntityType mobType) {
48+
mobsKilled.merge(mobType.toString(), 1, Integer::sum);
49+
}
50+
51+
// Méthodes pour initialiser les compteurs à partir d'une Map
52+
public void setBlocksMined(Map<String, Integer> blocks) {
53+
blocksMined.clear();
54+
if(blocks != null) {
55+
blocksMined.putAll(blocks);
56+
}
57+
}
58+
59+
public void setItemsCrafted(Map<String, Integer> items) {
60+
itemsCrafted.clear();
61+
if(items != null) {
62+
itemsCrafted.putAll(items);
63+
}
64+
}
65+
66+
public void setMobsKilled(Map<String, Integer> mobs) {
67+
mobsKilled.clear();
68+
if(mobs != null) {
69+
mobsKilled.putAll(mobs);
70+
}
71+
}
72+
}

src/main/java/me/loutreee/statCraft/StatCraft.java

+156-15
Original file line numberDiff line numberDiff line change
@@ -2,82 +2,144 @@
22

33
import io.javalin.Javalin;
44
import io.javalin.http.staticfiles.Location;
5-
import org.bukkit.plugin.java.JavaPlugin;
6-
import org.bukkit.event.Listener;
5+
import org.bukkit.Bukkit;
6+
import org.bukkit.Material;
7+
import org.bukkit.Statistic;
8+
import org.bukkit.entity.EntityType;
9+
import org.bukkit.entity.Player;
710
import org.bukkit.event.EventHandler;
11+
import org.bukkit.event.Listener;
12+
import org.bukkit.event.block.BlockBreakEvent;
13+
import org.bukkit.event.entity.EntityDeathEvent;
14+
import org.bukkit.event.inventory.CraftItemEvent;
815
import org.bukkit.event.player.PlayerJoinEvent;
9-
import org.bukkit.entity.Player;
16+
import org.bukkit.event.player.PlayerQuitEvent;
17+
import org.bukkit.plugin.java.JavaPlugin;
1018
import org.bukkit.scheduler.BukkitRunnable;
19+
import org.dizitart.no2.collection.Document;
1120
import org.dizitart.no2.filters.FluentFilter;
1221
import org.dizitart.no2.repository.ObjectRepository;
1322

1423
import java.util.List;
24+
import java.util.Map;
1525

1626
public final class StatCraft extends JavaPlugin implements Listener {
1727

1828
private ObjectRepository<PlayerData> playerRepository;
1929
private Javalin app;
30+
private StatsManager statsManager;
2031

2132
@Override
2233
public void onEnable() {
23-
// Récupère le repository
34+
// Initialisation du StatsManager pour conserver les stats en mémoire
35+
statsManager = new StatsManager();
36+
37+
// Récupération du repository Nitrite pour PlayerData
2438
playerRepository = NitriteBuilder.getPlayerRepository();
39+
getServer().getPluginManager().registerEvents(this, this);
2540

26-
// Démarrage de Javalin avec les fichiers statiques (dossier /web dans les ressources)
41+
// Démarrage de Javalin pour servir l'API REST et les fichiers statiques
2742
app = Javalin.create(config -> {
2843
config.staticFiles.add(staticFileConfig -> {
29-
// Pour éviter toute interférence, on peut servir les fichiers statiques dans un chemin dédié
3044
staticFileConfig.directory = "/web"; // dossier dans le classpath
3145
staticFileConfig.location = Location.CLASSPATH;
32-
staticFileConfig.hostedPath = "/"; // servir les fichiers statiques sous /static
46+
staticFileConfig.hostedPath = "/";
3347
});
3448
}).start(27800);
3549

36-
// Instancier le service et le contrôleur pour enregistrer les endpoints
50+
// Instanciation du service et du contrôleur pour l'API REST
3751
PlayerService playerService = new PlayerService();
3852
new PlayerController(app, playerService);
3953

54+
// Enregistrement du contrôleur pour afficher toutes les stats via /api/allstats
55+
new StatsSnapshotController(app);
56+
4057
getLogger().info("API REST démarrée sur le port 27800");
4158
getLogger().info("Plugin StatCraft activé !");
4259

43-
// Planifie l'exécution de logAllPlayers() toutes les 5 secondes (100 ticks)
60+
// Tâche planifiée toutes les 30 secondes (600 ticks) :
61+
// log et insertion d'un snapshot pour tous les joueurs connectés
4462
new BukkitRunnable() {
4563
@Override
4664
public void run() {
4765
logAllPlayers();
66+
insertSnapshotsForAllPlayers();
4867
}
49-
}.runTaskTimer(this, 0L, 100L);
68+
}.runTaskTimer(this, 0L, 600L);
5069
}
5170

5271
@Override
5372
public void onDisable() {
5473
if (app != null) {
5574
app.stop();
5675
}
57-
// Ferme la base
5876
NitriteBuilder.close();
5977
getLogger().info("Plugin StatCraft désactivé !");
6078
}
6179

80+
// --------------------- EVENEMENTS ---------------------
81+
82+
// Incrémente le compteur de blocs minés
83+
@EventHandler
84+
public void onBlockBreak(BlockBreakEvent event) {
85+
Player player = event.getPlayer();
86+
Material blockType = event.getBlock().getType();
87+
statsManager.incrementBlockMined(player, blockType);
88+
getLogger().info(player.getName() + " a miné un bloc de " + blockType);
89+
}
90+
91+
// Incrémente le compteur d'items craftés (événement sur craft validé)
92+
@EventHandler
93+
public void onCraftItem(CraftItemEvent event) {
94+
if (event.getWhoClicked() instanceof Player player) {
95+
if (event.getInventory().getResult() != null) {
96+
Material craftedItem = event.getInventory().getResult().getType();
97+
statsManager.incrementItemCrafted(player, craftedItem);
98+
getLogger().info(player.getName() + " a crafté " + craftedItem);
99+
}
100+
}
101+
}
102+
103+
// Incrémente le compteur de mobs tués (si le tueur est un joueur)
104+
@EventHandler
105+
public void onEntityDeath(EntityDeathEvent event) {
106+
if (event.getEntity().getKiller() != null) {
107+
Player player = event.getEntity().getKiller();
108+
EntityType mobType = event.getEntityType();
109+
statsManager.incrementMobKilled(player, mobType);
110+
getLogger().info(player.getName() + " a tué " + mobType);
111+
}
112+
}
113+
114+
// Lorsqu'un joueur se connecte, on vérifie s'il est déjà dans le repository et on initialise ses stats en mémoire
62115
@EventHandler
63116
public void onPlayerJoin(PlayerJoinEvent event) {
64117
Player player = event.getPlayer();
65118
String playerName = player.getName();
66-
67-
// Vérifie si le joueur est déjà dans la base
68119
if (playerRepository.find(FluentFilter.where("name").eq(playerName)).toList().isEmpty()) {
69120
PlayerData data = new PlayerData(playerName);
70121
playerRepository.insert(data);
71122
getLogger().info("Joueur " + playerName + " ajouté à la base de données.");
72123
} else {
73124
getLogger().info("Joueur " + playerName + " déjà présent dans la base de données.");
74125
}
126+
// Initialisation des compteurs en mémoire à partir du dernier snapshot (si existant)
127+
statsManager.initializePlayerStats(player);
75128
}
76129

130+
// Lorsqu'un joueur se déconnecte, on insère immédiatement un snapshot pour ce joueur
131+
@EventHandler
132+
public void onPlayerQuit(PlayerQuitEvent event) {
133+
Player player = event.getPlayer();
134+
insertSnapshotForPlayer(player);
135+
getLogger().info("Snapshot inséré lors de la déconnexion de " + player.getName());
136+
}
137+
138+
// --------------------- METHODES UTILITAIRES ---------------------
139+
140+
// Affiche dans la console la liste des joueurs enregistrés dans le repository Nitrite
77141
public void logAllPlayers() {
78-
// Récupère tous les joueurs depuis le repository
79142
List<PlayerData> players = NitriteBuilder.getPlayerRepository().find().toList();
80-
81143
if (players.isEmpty()) {
82144
getLogger().info("Aucun joueur n'est enregistré dans la base de données.");
83145
} else {
@@ -87,4 +149,83 @@ public void logAllPlayers() {
87149
}
88150
}
89151
}
152+
153+
// Insère un snapshot pour TOUS les joueurs connectés (utilisé dans la tâche planifiée)
154+
public void insertSnapshotsForAllPlayers() {
155+
for (Player player : Bukkit.getOnlinePlayers()) {
156+
insertSnapshotForPlayer(player);
157+
}
158+
}
159+
160+
// Insère un snapshot pour un joueur spécifique
161+
public void insertSnapshotForPlayer(Player player) {
162+
StatsSnapshotService snapshotService = new StatsSnapshotService();
163+
String playerId = player.getName();
164+
getLogger().info("Insertion snapshot pour " + playerId);
165+
166+
// Récupération des stats en mémoire pour le joueur
167+
PlayerStats ps = statsManager.getPlayerStats(player.getUniqueId());
168+
if (ps == null) {
169+
getLogger().info(" - Aucune stat en mémoire pour " + playerId);
170+
return;
171+
}
172+
173+
// Log des détails pour chaque catégorie
174+
175+
// Blocs minés
176+
Map<String, Integer> blocksMap = ps.getBlocksMined();
177+
if (!blocksMap.isEmpty()) {
178+
int totalBlocks = 0;
179+
for (String blockType : blocksMap.keySet()) {
180+
int count = blocksMap.get(blockType);
181+
totalBlocks += count;
182+
getLogger().info(" - " + count + " " + blockType + " miné(s).");
183+
}
184+
getLogger().info(" -> Total blocs minés: " + totalBlocks);
185+
} else {
186+
getLogger().info(" - Aucun bloc miné récupéré.");
187+
}
188+
189+
// Items craftés
190+
Map<String, Integer> itemsMap = ps.getItemsCrafted();
191+
if (!itemsMap.isEmpty()) {
192+
int totalItems = 0;
193+
for (String itemType : itemsMap.keySet()) {
194+
int count = itemsMap.get(itemType);
195+
totalItems += count;
196+
getLogger().info(" - " + count + " " + itemType + " crafté(s).");
197+
}
198+
getLogger().info(" -> Total items craftés: " + totalItems);
199+
} else {
200+
getLogger().info(" - Aucun item crafté récupéré.");
201+
}
202+
203+
// Mobs tués
204+
Map<String, Integer> mobsMap = ps.getMobsKilled();
205+
if (!mobsMap.isEmpty()) {
206+
int totalMobs = 0;
207+
for (String mobType : mobsMap.keySet()) {
208+
int count = mobsMap.get(mobType);
209+
totalMobs += count;
210+
getLogger().info(" - " + count + " " + mobType + " tué(s).");
211+
}
212+
getLogger().info(" -> Total mobs tués: " + totalMobs);
213+
} else {
214+
getLogger().info(" - Aucun mob tué récupéré.");
215+
}
216+
217+
// Temps de jeu (en minutes)
218+
int playTime = player.getStatistic(Statistic.PLAY_ONE_MINUTE) / 1200;
219+
getLogger().info(" - Temps de jeu : " + playTime + " minutes.");
220+
221+
// Insertion du snapshot dans la base Nitrite
222+
snapshotService.insertPlayerSnapshot(
223+
ps.getPlayerName(),
224+
ps.getBlocksMined(),
225+
ps.getItemsCrafted(),
226+
ps.getMobsKilled(),
227+
playTime
228+
);
229+
getLogger().info("Snapshot inséré pour " + playerId);
230+
}
90231
}

0 commit comments

Comments
 (0)