Skip to content

Commit

Permalink
Fix #134 : Switch mpgstats API to new mlnstats API
Browse files Browse the repository at this point in the history
  • Loading branch information
axel3rd authored Dec 19, 2019
1 parent c08e447 commit 5d21093
Show file tree
Hide file tree
Showing 16 changed files with 95,239 additions and 41 deletions.
13 changes: 7 additions & 6 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,17 @@ Depending your championship, join data files set in attachment.
- From home : `GET /user/dashboard`
- From coach: `GET /league/[yourLeagueId]/coach`
- From transfer : `GET /league/[yourLeagueId]/transfer/buy`
- From mercato : `GET /league/[yourLeagueId]/mercato`

2. The [Players statistics](https://www.mpgstats.fr/) data, one JSon from:

- https://www.mpgstats.fr/json/customteam.json/Ligue-1
- https://www.mpgstats.fr/json/customteam.json/Ligue-2
- https://www.mpgstats.fr/json/customteam.json/Premier-League
- https://www.mpgstats.fr/json/customteam.json/Liga
- https://www.mpgstats.fr/json/customteam.json/Serie-A
- https://api.mlnstats.com/leagues/Ligue-1
- https://api.mlnstats.com/leagues/Ligue-2
- https://api.mlnstats.com/leagues/Premier-League
- https://api.mlnstats.com/leagues/Liga
- https://api.mlnstats.com/leagues/Serie-A

3. The [Players statistics](https://www.mpgstats.fr/) time update data : https://www.mpgstats.fr/json/leagues.json
3. The [Players statistics](https://www.mpgstats.fr/) time update data : https://api.mlnstats.com/builds

4. The [Injury / Suspended](https://www.equipeactu.fr/blessures-et-suspensions/fodbold/) data, one full HTML from:

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@

package org.blondin.mpg.root.model;

import java.util.Map;

import org.blondin.mpg.stats.model.Position;
import org.blondin.mpg.stats.model.StatsDay;

public class StatsDayOrPositionPlayer {

private Map<Integer, StatsDay> statsDay;
private Position position;

public Map<Integer, StatsDay> getStatsDay() {
return statsDay;
}

public void setStatsDay(Map<Integer, StatsDay> statsDay) {
this.statsDay = statsDay;
}

public Position getPosition() {
return position;
}

public void setPosition(Position position) {
this.position = position;
}
}
10 changes: 5 additions & 5 deletions src/main/java/org/blondin/mpg/stats/MpgStatsClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import org.blondin.mpg.stats.model.LeaguesRefresh;

/**
* Client for https://www.mpgstats.fr/
* Client for https://www.mpgstats.fr/ (Backend API is https://api.mlnstats.com/ since end of 2019)
*/
public class MpgStatsClient extends AbstractClient {

Expand All @@ -25,7 +25,7 @@ public static MpgStatsClient build(Config config) {

public static MpgStatsClient build(Config config, String urlOverride) {
MpgStatsClient client = new MpgStatsClient();
client.setUrl(StringUtils.defaultString(urlOverride, "https://www.mpgstats.fr/json"));
client.setUrl(StringUtils.defaultString(urlOverride, "https://api.mlnstats.com"));
client.setProxy(config.getProxy());
return client;
}
Expand All @@ -35,17 +35,17 @@ public synchronized Championship getStats(ChampionshipStatsType type) {
// FR : "Ligue-1" / EN : "Premier-League" / ES : "Liga"
// Call with infinite cache and verify timestamp after
LeaguesRefresh leaguesRefresh = getLeaguesRefresh();
Championship championship = get("customteam.json/" + type.getValue(), Championship.class, 0);
Championship championship = get("leagues/" + type.getValue(), Championship.class, 0);
if (championship.getDate().before(leaguesRefresh.getDate(championship.getInfos().getId()))) {
// Force refresh by using a mini cache time
championship = get("customteam.json/" + type.getValue(), Championship.class, 1);
championship = get("leagues/" + type.getValue(), Championship.class, 1);
}
cache.put(type, championship);
}
return cache.get(type);
}

protected synchronized LeaguesRefresh getLeaguesRefresh() {
return get("leagues.json", LeaguesRefresh.class, TIME_HOUR_IN_MILLI_SECOND);
return get("builds", LeaguesRefresh.class, TIME_HOUR_IN_MILLI_SECOND);
}
}
43 changes: 43 additions & 0 deletions src/main/java/org/blondin/mpg/stats/io/ListPlayerDeserializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.blondin.mpg.stats.io;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.blondin.mpg.stats.model.Player;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.node.ArrayNode;

public class ListPlayerDeserializer extends StdDeserializer<List<Player>> {

private static final long serialVersionUID = -7012195953299512960L;

public ListPlayerDeserializer() {
this(List.class);
}

protected ListPlayerDeserializer(Class<?> vc) {
super(vc);
}

@Override
public List<Player> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
JsonNode root = mapper.readTree(jp);
if (root.get(0) instanceof ArrayNode) {
List<Player> list = new ArrayList<>();
for (JsonNode node : root) {
list.add(mapper.readValue(node.get(1).traverse(), Player.class));
}
return list;
}
return Arrays.asList(mapper.readValue(root.traverse(), Player[].class));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.blondin.mpg.stats.io;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.ObjectUtils;
import org.blondin.mpg.root.model.StatsDayOrPositionPlayer;
import org.blondin.mpg.stats.model.Position;
import org.blondin.mpg.stats.model.StatsDay;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class StatsDayOrPositionPlayerDeserializer extends StdDeserializer<StatsDayOrPositionPlayer> {

private static final long serialVersionUID = -3878716532565320657L;

public StatsDayOrPositionPlayerDeserializer() {
this(StatsDayOrPositionPlayer.class);
}

protected StatsDayOrPositionPlayerDeserializer(Class<?> vc) {
super(vc);
}

@SuppressWarnings("unchecked")
@Override
public StatsDayOrPositionPlayer deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
Object o = ctxt.readValue(jp, Object.class);
StatsDayOrPositionPlayer sop = new StatsDayOrPositionPlayer();
if (o instanceof String) {
sop.setPosition(Position.getNameByValue((String) o));
} else if (o instanceof ArrayList<?>) {
Map<Integer, StatsDay> statsDay = new HashMap<>();
for (ArrayList<?> e : (ArrayList<ArrayList<?>>) o) {
Integer day = (Integer) e.get(0);
Map<String, Object> values = (Map<String, Object>) e.get(1);
statsDay.put(day, new StatsDay(Double.valueOf(ObjectUtils.defaultIfNull(values.get("n"), 0).toString()),
Integer.valueOf(ObjectUtils.defaultIfNull(values.get("g"), 0).toString())));
}
sop.setStatsDay(statsDay);
} else {
throw new UnsupportedOperationException("Object is not a 'Position' or 'StatsDay' array");
}
return sop;
}

}
3 changes: 3 additions & 0 deletions src/main/java/org/blondin/mpg/stats/model/Championship.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,19 @@
import java.util.List;

import org.blondin.mpg.root.exception.PlayerNotFoundException;
import org.blondin.mpg.stats.io.ListPlayerDeserializer;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

/**
* Championship (mpgstats)
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class Championship {

@JsonDeserialize(using = ListPlayerDeserializer.class)
@JsonProperty("p")
private List<Player> players = new ArrayList<>();

Expand Down
20 changes: 19 additions & 1 deletion src/main/java/org/blondin/mpg/stats/model/Player.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package org.blondin.mpg.stats.model;

import org.apache.commons.lang3.StringUtils;
import org.blondin.mpg.root.model.StatsDayOrPositionPlayer;
import org.blondin.mpg.stats.io.StatsDayOrPositionPlayerDeserializer;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

/**
* Player
Expand All @@ -15,7 +18,10 @@ public class Player {
private String firstName;
@JsonProperty("n")
private String lastName;
@JsonDeserialize(using = StatsDayOrPositionPlayerDeserializer.class)
@JsonProperty("p")
private StatsDayOrPositionPlayer statsDayOrPosition;
@JsonProperty("fp")
private Position position;
@JsonProperty("s")
private Stats stats;
Expand Down Expand Up @@ -45,11 +51,23 @@ public int getPrice() {
}

public Stats getStats() {
if (stats == null) {
stats = new Stats();
}
if (stats.getStatsDay() == null && statsDayOrPosition != null && statsDayOrPosition.getStatsDay() != null) {
stats.setStatsDay(statsDayOrPosition.getStatsDay());
}
return stats;
}

public Position getPosition() {
return position;
if (position != null) {
return position;
}
if (statsDayOrPosition.getPosition() != null) {
return statsDayOrPosition.getPosition();
}
throw new UnsupportedOperationException("No position found");
}

public double getEfficiency() {
Expand Down
17 changes: 12 additions & 5 deletions src/main/java/org/blondin/mpg/stats/model/Position.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@

package org.blondin.mpg.stats.model;

import java.util.Arrays;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonCreator;

public enum Position {

A("A"), M("M"), D("D"), G("G");
A(Arrays.asList("A")), M(Arrays.asList("M", "MD", "MO")), D(Arrays.asList("D", "DC", "DL")), G(Arrays.asList("G"));

private final List<String> values;

private final String value;
private Position(final List<String> values) {
this.values = values;

private Position(final String value) {
this.value = value;
}

@JsonCreator
public static Position getNameByValue(final String value) {
if (value == null) {
return null;
}
for (final Position s : Position.values()) {
if (s.value.equals(value)) {
if (s.values.contains(value)) {
return s;
}
}
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/org/blondin/mpg/stats/model/Stats.java
Original file line number Diff line number Diff line change
Expand Up @@ -124,4 +124,12 @@ void setCurrentSeasonDay(int currentSeasonDay) {
void setPreviousMaxSeasonDay(int previousMaxSeasonDay) {
this.previousMaxSeasonDay = previousMaxSeasonDay;
}

Map<Integer, StatsDay> getStatsDay() {
return statsDay;
}

void setStatsDay(Map<Integer, StatsDay> statsDay) {
this.statsDay = statsDay;
}
}
9 changes: 9 additions & 0 deletions src/main/java/org/blondin/mpg/stats/model/StatsDay.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@ public class StatsDay {
@JsonProperty("g")
private int goals;

public StatsDay() {
super();
}

public StatsDay(double average, int goals) {
this.average = average;
this.goals = goals;
}

public double getAverage() {
return average;
}
Expand Down
Loading

0 comments on commit 5d21093

Please sign in to comment.