Skip to content

Commit 65a9e8f

Browse files
committed
feat: added endpoint for latest and all stats
1 parent 446abaa commit 65a9e8f

10 files changed

Lines changed: 195 additions & 26 deletions

File tree

build.gradle

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,10 @@ dependencies {
7676
compileOnly("com.github.MilkBowl:VaultAPI:1.7") {
7777
exclude group: 'org.bukkit', module: 'bukkit'
7878
}
79-
implementation("javax.json.bind:javax.json.bind-api:1.0")
80-
implementation("org.eclipse:yasson:1.0")
81-
implementation("org.glassfish:javax.json:1.1")
82-
implementation("org.jboss.resteasy:resteasy-jaxrs:3.1.2.Final")
79+
8380
implementation("org.glassfish.jersey.containers:jersey-container-jdk-http:2.25")
84-
implementation("org.jboss.resteasy:resteasy-jaxb-provider:3.1.2.Final")
85-
implementation("org.jboss.resteasy:resteasy-servlet-initializer:3.1.2.Final")
81+
implementation("com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.7.5")
82+
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.2")
8683
implementation("org.hibernate:hibernate-core:5.3.23.Final")
8784
implementation("mysql:mysql-connector-java:8.0.27")
8885
implementation("com.google.inject:guice:4.0")

src/main/java/org/matrixnetwork/stats2/MatrixStats.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.matrixnetwork.stats2;
22

3+
import com.fasterxml.jackson.databind.ObjectMapper;
34
import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory;
45
import com.sun.net.httpserver.HttpServer;
56
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
@@ -12,12 +13,15 @@
1213
import org.bukkit.scheduler.BukkitRunnable;
1314
import org.bukkit.scheduler.BukkitTask;
1415
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
16+
import org.glassfish.jersey.message.GZipEncoder;
1517
import org.glassfish.jersey.server.ResourceConfig;
1618
import org.matrixnetwork.stats2.handler.StatsHandler;
19+
import org.matrixnetwork.stats2.listener.StatsListener;
1720
import org.matrixnetwork.stats2.rest.AuthResource;
1821
import org.matrixnetwork.stats2.rest.SkinResource;
1922
import org.matrixnetwork.stats2.rest.StatsResource;
2023
import org.matrixnetwork.stats2.rest.filter.CorsFilter;
24+
import org.matrixnetwork.stats2.util.JacksonFeature;
2125

2226
import java.net.URI;
2327
import java.util.List;
@@ -49,6 +53,8 @@ public void onEnable() {
4953
return;
5054
}
5155

56+
getServer().getPluginManager().registerEvents(new StatsListener(), this);
57+
5258
StatsHandler.init();
5359

5460
ResourceConfig rc = new ResourceConfig();
@@ -57,6 +63,8 @@ public void onEnable() {
5763
rc.register(SkinResource.class);
5864
rc.register(AuthResource.class);
5965
rc.register(CorsFilter.class);
66+
rc.register(new GZipEncoder());
67+
rc.register(JacksonFeature.class);
6068

6169
server = JdkHttpServerFactory.createHttpServer(
6270
URI.create( "http://localhost:8081/api" ), rc );

src/main/java/org/matrixnetwork/stats2/entity/MatrixPlayer.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,4 @@ public void setStats(List<PlayerStats> stats) {
6969
this.stats = stats;
7070
}
7171
//endregion
72-
73-
public JSONObject toJson() {
74-
JSONObject player = new JSONObject();
75-
JSONArray stats = new JSONArray();
76-
for (PlayerStats stat : getStats()) {
77-
stats.add(stat.toJSON());
78-
}
79-
player.put("username", username);
80-
player.put("uuid", uuid);
81-
player.put("org/matrixnetwork/stats2", stats);
82-
return player;
83-
}
8472
}

src/main/java/org/matrixnetwork/stats2/entity/PlayerStats.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.matrixnetwork.stats2.entity;
22

33

4+
import com.fasterxml.jackson.annotation.JsonFormat;
45
import org.json.simple.JSONObject;
56

67
import javax.persistence.*;

src/main/java/org/matrixnetwork/stats2/handler/StatsHandler.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,8 @@ public void run() {
4141

4242
if(player == null) {
4343
Session s = DataManager.getInstance().getSession();
44-
Transaction tra = s.beginTransaction();
4544

4645
player = (MatrixPlayer) s.merge(new MatrixPlayer(p.getUniqueId().toString(), p.getName()));
47-
tra.commit();
4846
}
4947

5048
double balance = MatrixStats.getEcon().getBalance(p);
@@ -75,6 +73,6 @@ public void run() {
7573

7674
}
7775
}
78-
}.runTaskTimer(MatrixStats.getPlugin(), 20*60*10, 20*60*10);
76+
}.runTaskTimer(MatrixStats.getPlugin(), 20*60, 20*60);
7977
}
8078
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.matrixnetwork.stats2.listener;
2+
3+
import org.bukkit.entity.Player;
4+
import org.bukkit.event.EventHandler;
5+
import org.bukkit.event.Listener;
6+
import org.bukkit.event.player.PlayerJoinEvent;
7+
import org.hibernate.Session;
8+
import org.hibernate.Transaction;
9+
import org.matrixnetwork.stats2.entity.MatrixPlayer;
10+
import org.matrixnetwork.stats2.manager.DataManager;
11+
12+
public class StatsListener implements Listener {
13+
@EventHandler
14+
public void onJoin(PlayerJoinEvent event) {
15+
Player p = event.getPlayer();
16+
MatrixPlayer player = DataManager.getInstance()
17+
.getMatrixPlayerByProperty("uuid", p.getUniqueId().toString());
18+
19+
if(player == null) {
20+
Session s = DataManager.getInstance().getSession();
21+
Transaction t = s.beginTransaction();
22+
s.merge(new MatrixPlayer(p.getUniqueId().toString(), p.getName()));
23+
t.commit();
24+
}
25+
}
26+
}

src/main/java/org/matrixnetwork/stats2/manager/DataManager.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.matrixnetwork.stats2.entity.MatrixPlayer;
1010
import org.matrixnetwork.stats2.entity.PlayerStats;
1111

12+
import javax.persistence.criteria.CriteriaBuilder;
1213
import javax.persistence.criteria.CriteriaQuery;
1314
import javax.persistence.criteria.Root;
1415
import java.util.Properties;
@@ -79,4 +80,26 @@ public MatrixPlayer getMatrixPlayerByProperty(String propertyName, Object proper
7980
return player;
8081
}
8182
}
83+
84+
public PlayerStats getLastStatisticsOfPlayer(Long matrixPlayerId) {
85+
try(Session session = DataManager.getInstance().getSession()) {
86+
CriteriaBuilder cb = DataManager.getInstance().getSession().getCriteriaBuilder();
87+
88+
CriteriaQuery<PlayerStats> criteria = cb
89+
.createQuery(PlayerStats.class);
90+
91+
Root<PlayerStats> root = criteria.from(PlayerStats.class);
92+
93+
PlayerStats stats = session.createQuery(criteria.select(root)
94+
.where(
95+
cb.equal(root.get("matrixPlayer"), matrixPlayerId)
96+
)
97+
.orderBy(cb.desc(root.get("timeStamp"))))
98+
.setFirstResult(0)
99+
.setMaxResults(1)
100+
.list().get(0);
101+
102+
return stats;
103+
}
104+
}
82105
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.matrixnetwork.stats2.pojo;
2+
3+
import org.matrixnetwork.stats2.entity.PlayerStats;
4+
5+
import java.time.format.DateTimeFormatter;
6+
7+
public record PlayerStatsDTO(
8+
float exp,
9+
int foodLevel,
10+
double loc_x,
11+
double loc_y,
12+
double loc_z,
13+
double money,
14+
double health,
15+
String gamemode,
16+
String lastDamageCause,
17+
int remainingAir,
18+
String timeStamp,
19+
int guildRank,
20+
int threatTier,
21+
int sfLevel,
22+
int prestige
23+
) {
24+
public static PlayerStatsDTO from(PlayerStats stats) {
25+
return new PlayerStatsDTO(
26+
stats.getExp(),
27+
stats.getFoodLevel(),
28+
stats.getLoc_x(),
29+
stats.getLoc_y(),
30+
stats.getLoc_z(),
31+
stats.getMoney(),
32+
stats.getHealth(),
33+
stats.getGamemode(),
34+
stats.getLastDamageCause(),
35+
stats.getRemainingAir(),
36+
stats.getTimeStamp().format(DateTimeFormatter.ofPattern("yyyy-MM-dd@HH:mm")),
37+
stats.getGuildRank(),
38+
stats.getThreatTier(),
39+
stats.getSfLevel(),
40+
stats.getPrestige()
41+
);
42+
}
43+
}

src/main/java/org/matrixnetwork/stats2/rest/StatsResource.java

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,77 @@
11
package org.matrixnetwork.stats2.rest;
22

3+
import net.skinsrestorer.api.SkinsRestorerAPI;
34
import org.bukkit.entity.Player;
45
import org.hibernate.Session;
56
import org.hibernate.Transaction;
7+
import org.json.simple.JSONObject;
8+
import org.json.simple.parser.JSONParser;
69
import org.matrixnetwork.stats2.MatrixStats;
710
import org.matrixnetwork.stats2.entity.MatrixPlayer;
811
import org.matrixnetwork.stats2.manager.DataManager;
12+
import org.matrixnetwork.stats2.pojo.PlayerStatsDTO;
13+
import org.matrixnetwork.stats2.util.Auth;
914

10-
import javax.ws.rs.GET;
11-
import javax.ws.rs.Path;
12-
import javax.ws.rs.PathParam;
13-
import javax.ws.rs.Produces;
15+
import javax.ws.rs.*;
1416
import javax.ws.rs.core.MediaType;
1517
import javax.ws.rs.core.Response;
18+
import java.util.stream.Collectors;
1619

1720
@Path("/org/matrixnetwork/stats2")
1821
public class StatsResource {
22+
private JSONParser parser = new JSONParser();
23+
24+
@Produces(MediaType.APPLICATION_JSON)
25+
@Path("all")
26+
@GET
27+
public Response getStats(@HeaderParam("Authorization") String tokenStr) {
28+
if(tokenStr == null) {
29+
return Response.status(400).build();
30+
}
31+
32+
String username = Auth.getInstance().verifyToken(tokenStr);
33+
34+
if(username != null) {
35+
try {
36+
MatrixPlayer mp = DataManager.getInstance().getMatrixPlayerByProperty("username", username);
37+
return Response.ok(mp.getStats().stream()
38+
.map(PlayerStatsDTO::from)
39+
.collect(Collectors.toList())).build();
40+
} catch (Exception ex) {
41+
MatrixStats.getPlugin().getLogger().info(ex.toString());
42+
MatrixStats.getPlugin().getLogger().info(ex.getMessage());
43+
return Response.noContent().build();
44+
}
45+
}
46+
else {
47+
return Response.status(403).build();
48+
}
49+
}
50+
51+
@Produces(MediaType.APPLICATION_JSON)
52+
@Path("latest")
53+
@GET
54+
public Response getLatestStats(@HeaderParam("Authorization") String tokenStr) {
55+
if(tokenStr == null) {
56+
return Response.status(400).build();
57+
}
58+
DataManager dm = DataManager.getInstance();
59+
String username = Auth.getInstance().verifyToken(tokenStr);
60+
61+
if(username != null) {
62+
try {
63+
MatrixPlayer mp = dm.getMatrixPlayerByProperty("username", username);
64+
return Response.ok(PlayerStatsDTO.from(dm.getLastStatisticsOfPlayer(mp.getId()))).build();
65+
} catch (Exception ex) {
66+
MatrixStats.getPlugin().getLogger().info(ex.toString());
67+
MatrixStats.getPlugin().getLogger().info(ex.getMessage());
68+
return Response.noContent().build();
69+
}
70+
}
71+
else {
72+
return Response.status(403).build();
73+
}
74+
}
1975

2076
@Path("/{username}")
2177
@GET
@@ -33,7 +89,7 @@ public Response meet(@PathParam("username") String username) {
3389
t.commit();
3490
}
3591

36-
return Response.ok(mP.toJson().toJSONString()).build();
92+
return Response.ok(mP).build();
3793
}
3894
else {
3995
return Response.status(404).build();
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.matrixnetwork.stats2.util;
2+
3+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
4+
import com.fasterxml.jackson.jaxrs.base.JsonMappingExceptionMapper;
5+
import com.fasterxml.jackson.jaxrs.base.JsonParseExceptionMapper;
6+
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
7+
import org.glassfish.jersey.CommonProperties;
8+
9+
import javax.ws.rs.core.Feature;
10+
import javax.ws.rs.core.FeatureContext;
11+
import javax.ws.rs.ext.MessageBodyReader;
12+
import javax.ws.rs.ext.MessageBodyWriter;
13+
14+
public class JacksonFeature implements Feature {
15+
16+
public boolean configure( final FeatureContext context ) {
17+
18+
String postfix = '.' + context.getConfiguration().getRuntimeType().name().toLowerCase();
19+
20+
context.property( CommonProperties.MOXY_JSON_FEATURE_DISABLE + postfix, true );
21+
22+
context.register( JsonParseExceptionMapper.class );
23+
context.register( JsonMappingExceptionMapper.class );
24+
context.register( JacksonJsonProvider.class, MessageBodyReader.class, MessageBodyWriter.class );
25+
context.register(JavaTimeModule.class);
26+
27+
return true;
28+
}
29+
}

0 commit comments

Comments
 (0)