From 1cce50ad2b20b96cc25ba32d5c79272fc406b920 Mon Sep 17 00:00:00 2001 From: Soren Zaiser Date: Sat, 13 Jan 2018 17:32:57 -0500 Subject: [PATCH 1/2] Added Parsers and Classes to access team rankings --- .idea/modules/TBA-API-V3.iml | 2 +- .idea/modules/TBA-API-V3_main.iml | 14 +-- .idea/modules/TBA-API-V3_test.iml | 12 +-- src/main/java/main/TBA.java | 13 +++ src/main/java/models/other/Media.java | 2 +- src/main/java/models/other/Ranking.java | 4 +- .../teams/status/TeamEventStatusAlliance.java | 4 +- .../teams/status/TeamEventStatusPlayoff.java | 13 ++- .../teams/status/TeamEventStatusRank.java | 4 +- src/main/java/requests/TeamRequest.java | 16 +++ src/main/java/utils/Parser.java | 98 +++++++++++++++++-- src/main/java/utils/Utils.java | 14 +++ 12 files changed, 160 insertions(+), 36 deletions(-) diff --git a/.idea/modules/TBA-API-V3.iml b/.idea/modules/TBA-API-V3.iml index 6e9f014..9262681 100644 --- a/.idea/modules/TBA-API-V3.iml +++ b/.idea/modules/TBA-API-V3.iml @@ -1,5 +1,5 @@ - + diff --git a/.idea/modules/TBA-API-V3_main.iml b/.idea/modules/TBA-API-V3_main.iml index cb28de3..27d51f8 100644 --- a/.idea/modules/TBA-API-V3_main.iml +++ b/.idea/modules/TBA-API-V3_main.iml @@ -1,5 +1,5 @@ - + @@ -9,16 +9,10 @@ - - - - - - - - - + + + \ No newline at end of file diff --git a/.idea/modules/TBA-API-V3_test.iml b/.idea/modules/TBA-API-V3_test.iml index fa8f454..f9d92f1 100644 --- a/.idea/modules/TBA-API-V3_test.iml +++ b/.idea/modules/TBA-API-V3_test.iml @@ -1,5 +1,5 @@ - + @@ -10,15 +10,7 @@ - - - - - - - - - + diff --git a/src/main/java/main/TBA.java b/src/main/java/main/TBA.java index fe4bfd4..744a7ff 100644 --- a/src/main/java/main/TBA.java +++ b/src/main/java/main/TBA.java @@ -6,6 +6,7 @@ import models.other.Media; import models.other.events.EventOPR; import models.other.teams.Robot; +import models.other.teams.status.TeamEventStatus; import models.simple.SEvent; import models.simple.SMatch; import models.simple.STeam; @@ -492,6 +493,18 @@ public String[] getTeamEventKeys(int number) { return tr.getTeamEventKeys(number); } + /** + * Mirror of: /team/{team_key}/event/{event_key}/status + * + * Gets a list of the event keys for all events this team has competed at. + * @param number the team's frc number + * @param eventKey TBA Event Key, eg 2016nytr + * @return TeamEventStatus[] that gets the competition rank and status of the team at the given event. + */ + public TeamEventStatus getTeamEventStatus(int number, String eventKey){ + return tr.getTeamEventStatus(number, eventKey); + } + /** * Mirror of: /team/{team_key}/events/{year} * diff --git a/src/main/java/models/other/Media.java b/src/main/java/models/other/Media.java index f96bad4..1da0b98 100644 --- a/src/main/java/models/other/Media.java +++ b/src/main/java/models/other/Media.java @@ -17,7 +17,7 @@ public class Media implements Serializable { /** * String type of the media element. */ - private String type; + private String[] type; /** * The key used to identify this media on the media site. */ diff --git a/src/main/java/models/other/Ranking.java b/src/main/java/models/other/Ranking.java index 0fd1c45..37543b8 100644 --- a/src/main/java/models/other/Ranking.java +++ b/src/main/java/models/other/Ranking.java @@ -20,7 +20,7 @@ public class Ranking implements Serializable { /** * The average match score during qualifications. Year specific. May be null if not relevant for a given year. */ - private long qualAverage; + private double qualAverage; /** * The team’s rank at the event as provided by FIRST. */ @@ -38,7 +38,7 @@ public class Ranking implements Serializable { /** * Additional year-specific information, may be null. See parent `sort_order_info` for details. */ - private long[] sortOrders; + private double[] sortOrders; /** * The team with this rank. */ diff --git a/src/main/java/models/other/teams/status/TeamEventStatusAlliance.java b/src/main/java/models/other/teams/status/TeamEventStatusAlliance.java index 5f3a546..e385149 100644 --- a/src/main/java/models/other/teams/status/TeamEventStatusAlliance.java +++ b/src/main/java/models/other/teams/status/TeamEventStatusAlliance.java @@ -15,7 +15,7 @@ public class TeamEventStatusAlliance { /** * Alliance number. */ - private int number; + private long number; /** * Backup status, may be null. */ @@ -23,5 +23,5 @@ public class TeamEventStatusAlliance { /** * Order the team was picked in the alliance from 0-2, with 0 being alliance captain. */ - private int pick; + private long pick; } diff --git a/src/main/java/models/other/teams/status/TeamEventStatusPlayoff.java b/src/main/java/models/other/teams/status/TeamEventStatusPlayoff.java index c09c7f1..522f759 100644 --- a/src/main/java/models/other/teams/status/TeamEventStatusPlayoff.java +++ b/src/main/java/models/other/teams/status/TeamEventStatusPlayoff.java @@ -1,6 +1,7 @@ package models.other.teams.status; import lombok.Data; +import models.other.WLTRecord; /** * @since 1.0.0 @@ -15,9 +16,17 @@ public class TeamEventStatusPlayoff { /** * Record in playoffs as a string in the format WINS-LOSSES-TIES. */ - private String record; + private WLTRecord record; + /** + * Record in current level of competition (e.g. QF, SF, F) as a string in the format WINS-LOSSES-TIES. + */ + private WLTRecord currentLevelRecord; /** * Current competition status for the playoffs. */ - private String[] status; + private String status; + /** + * The average match score during playoffs. Year specific. May be null if not relevant for a given year. + */ + private Long playoffAverage; } diff --git a/src/main/java/models/other/teams/status/TeamEventStatusRank.java b/src/main/java/models/other/teams/status/TeamEventStatusRank.java index 8645300..68d5104 100644 --- a/src/main/java/models/other/teams/status/TeamEventStatusRank.java +++ b/src/main/java/models/other/teams/status/TeamEventStatusRank.java @@ -12,8 +12,8 @@ public class TeamEventStatusRank { /** * Number of teams ranked. */ - private int numTeams; - private Ranking[] ranking; + private Long numTeams; + private Ranking ranking; /** * Ordered list of names corresponding to the elements of the `sort_orders` array. */ diff --git a/src/main/java/requests/TeamRequest.java b/src/main/java/requests/TeamRequest.java index a1af702..c0075e2 100644 --- a/src/main/java/requests/TeamRequest.java +++ b/src/main/java/requests/TeamRequest.java @@ -4,6 +4,7 @@ import models.other.Media; import models.other.District; import models.other.teams.Robot; +import models.other.teams.status.TeamEventStatus; import models.simple.SEvent; import models.simple.SMatch; import models.simple.STeam; @@ -11,6 +12,7 @@ import models.standard.Match; import models.standard.Team; import org.json.simple.JSONArray; +import org.json.simple.JSONObject; import utils.IO; import utils.Parser; import utils.Utils; @@ -233,6 +235,20 @@ public String[] getTeamEventKeys(int number) { return Utils.jsonArrayToStringArray(keys); } + /** + * Mirror of: /team/{team_key}/event/{event_key}/status + * + * Gets a list of the event keys for all events this team has competed at. + * @param number the team's frc number + * @param eventKey TBA Event Key, eg 2016nytr + * @return TeamEventStatus[] that gets the competition rank and status of the team at the given event. + */ + public TeamEventStatus getTeamEventStatus(int number, String eventKey){ + JSONObject status = (JSONObject) IO.doRequest("team/frc"+number+"/event/"+eventKey+"/status"); + if(status == null) throw new DataNotFoundException("Couldn't find any event status for team with number: frc"+number+" at event "+eventKey); + return parseTeamEventStatus(status); + } + /** * Mirror of: /team/{team_key}/events/{year} * diff --git a/src/main/java/utils/Parser.java b/src/main/java/utils/Parser.java index caadcfd..7bf5882 100644 --- a/src/main/java/utils/Parser.java +++ b/src/main/java/utils/Parser.java @@ -1,14 +1,11 @@ package utils; -import models.other.APIStatus; -import models.other.Award; -import models.other.AwardRecipient; -import models.other.Media; +import models.other.*; import models.other.events.EventOPR; import models.other.events.Webcast; import models.other.matches.MatchAlliance; -import models.other.District; import models.other.teams.Robot; +import models.other.teams.status.*; import models.simple.SEvent; import models.simple.SMatch; import models.simple.STeam; @@ -167,11 +164,100 @@ protected SEvent parseSEvent(Object object) { return e; } + protected TeamEventStatus parseTeamEventStatus(Object object){ + TeamEventStatus t = new TeamEventStatus(); + HashMap hash = (HashMap) object; + t.setQual(parseTeamEventStatusRank(hash.get("qual"))); + t.setAlliance(parseTeamEventStatusAlliance(hash.get("alliance"))); + t.setPlayoff(parseTeamEventStatusPlayoff(hash.get("playoff"))); + t.setAllianceStatus((String)hash.get("alliance_status_str")); + t.setPlayoffStatus((String)hash.get("playoff_status_str")); + t.setOverallStatus((String)hash.get("overall_status_str")); + return t; + } + + protected TeamEventStatusRank parseTeamEventStatusRank(Object object){ + TeamEventStatusRank t = new TeamEventStatusRank(); + HashMap hash = (HashMap) object; + t.setNumTeams(Utils.cleanLong(hash.get("num_teams"))); + t.setRanking(parseRanking(hash.get("ranking"))); + JSONArray sortOrderList = (JSONArray)hash.get("sort_order_info"); + SortInfo[] si = new SortInfo[sortOrderList.size()]; + for(int i = 0; i < sortOrderList.size(); i++) { + si[i] = parseSortInfo(sortOrderList.get(i)); + } + t.setSortOrderInfo(si); + return t; + } + + protected Ranking parseRanking(Object object){ + Ranking r = new Ranking(); + HashMap hash = (HashMap) object; + r.setDq(Utils.cleanLong(hash.get("dq"))); + r.setMatchesPlayed(Utils.cleanLong(hash.get("matches_played"))); + r.setQualAverage(Utils.cleanDouble(hash.get("qual_average"))); + r.setRank(Utils.cleanLong(hash.get("rank"))); + r.setQualificationsRecord(parseWLTRecord(hash.get("record"))); + r.setOverallRecord(null); + JSONArray sortOrders = (JSONArray)hash.get("sort_orders"); + r.setSortOrders(Utils.jsonArrayToDoublesArray(sortOrders)); + r.setTeamKey((String)hash.get("team_key")); + return r; + } + + protected WLTRecord parseWLTRecord(Object object){ + WLTRecord w = new WLTRecord(); + HashMap hash = (HashMap) object; + w.setLosses(Utils.cleanLong(hash.get("losses"))); + w.setWins(Utils.cleanLong(hash.get("wins"))); + w.setTies(Utils.cleanLong(hash.get("ties"))); + return w; + } + + protected SortInfo parseSortInfo(Object object){ + SortInfo s = new SortInfo(); + HashMap hash = (HashMap) object; + s.setName((String)hash.get("name")); + s.setPrecision(Utils.cleanLong(hash.get("precision"))); + return s; + } + + protected TeamEventStatusAlliance parseTeamEventStatusAlliance(Object object){ + TeamEventStatusAlliance t = new TeamEventStatusAlliance(); + HashMap hash = (HashMap) object; + t.setName((String)hash.get("name")); + t.setNumber(Utils.cleanLong(hash.get("number"))); + t.setBackup(parseTeamEventStatusAllianceBackup(hash.get("backup"))); + t.setPick(Utils.cleanLong(hash.get("pick"))); + return t; + } + + protected TeamEventStatusAllianceBackup parseTeamEventStatusAllianceBackup(Object object){ + TeamEventStatusAllianceBackup t = new TeamEventStatusAllianceBackup(); + HashMap hash = (HashMap) object; + if(hash == null)return null; + t.setOut((String)hash.get("out")); + t.setIn((String)hash.get("in")); + return t; + } + + protected TeamEventStatusPlayoff parseTeamEventStatusPlayoff(Object object){ + TeamEventStatusPlayoff t = new TeamEventStatusPlayoff(); + HashMap hash = (HashMap) object; + if(hash == null) return null; + t.setLevel((String)hash.get("level")); + t.setCurrentLevelRecord(parseWLTRecord(hash.get("current_level_record"))); + t.setRecord(parseWLTRecord(hash.get("record"))); + t.setStatus((String)hash.get("status")); + t.setPlayoffAverage(Utils.cleanLong(hash.get("playoff_average"))); + return t; + } + protected Media parseMedia(Object object) { Media media = new Media(); HashMap hash = (HashMap)object; media.setKey((String)hash.get("key")); - media.setType((String)hash.get("type")); + media.setType(Utils.jsonArrayToStringArray((JSONArray)hash.get("type"))); media.setForeignKey((String)hash.get("foreign_key")); media.setDetails((String)hash.get("details")); media.setPreferred(Utils.cleanBoolean(hash.get("preferred"))); diff --git a/src/main/java/utils/Utils.java b/src/main/java/utils/Utils.java index ae17661..5ea831b 100644 --- a/src/main/java/utils/Utils.java +++ b/src/main/java/utils/Utils.java @@ -29,4 +29,18 @@ public static String[] jsonArrayToStringArray(JSONArray jsonArray) { return toReturn; } + public static long[] jsonArrayToLongArray(JSONArray jsonArray){ + if(jsonArray == null) return null; + long[] toReturn = new long[jsonArray.size()]; + for(int i = 0; i < jsonArray.size(); i++) toReturn[i] = cleanLong(jsonArray.get(i)); + return toReturn; + } + + public static double[] jsonArrayToDoublesArray(JSONArray jsonArray){ + if(jsonArray == null) return null; + double[] toReturn = new double[jsonArray.size()]; + for(int i = 0; i < jsonArray.size(); i++) toReturn[i] = cleanDouble(jsonArray.get(i)); + return toReturn; + } + } From 6ab4b10c3b08ed0518e6e7dfe035c5658785ebee Mon Sep 17 00:00:00 2001 From: Soren Zaiser Date: Mon, 19 Mar 2018 08:46:32 -0500 Subject: [PATCH 2/2] Added support for incomplete events and started on loop --- .gitignore | 2 + .idea/libraries/libs.xml | 10 + .idea/modules/TBA-API-V3.iml | 1 + .idea/modules/TBA-API-V3_main.iml | 1 + .idea/modules/TBA-API-V3_test.iml | 1 + .idea/workspace.xml | 420 ++++++++++++++++++++ out/artifacts/TBA_API_V3_jar/TBA-API-V3.jar | Bin 0 -> 1929260 bytes src/main/java/utils/Parser.java | 6 +- 8 files changed, 440 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .idea/libraries/libs.xml create mode 100644 .idea/workspace.xml create mode 100644 out/artifacts/TBA_API_V3_jar/TBA-API-V3.jar diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd0ec54 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +*.class diff --git a/.idea/libraries/libs.xml b/.idea/libraries/libs.xml new file mode 100644 index 0000000..8faa3ad --- /dev/null +++ b/.idea/libraries/libs.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/TBA-API-V3.iml b/.idea/modules/TBA-API-V3.iml index 9262681..df3ef78 100644 --- a/.idea/modules/TBA-API-V3.iml +++ b/.idea/modules/TBA-API-V3.iml @@ -8,5 +8,6 @@ + \ No newline at end of file diff --git a/.idea/modules/TBA-API-V3_main.iml b/.idea/modules/TBA-API-V3_main.iml index 27d51f8..25eab92 100644 --- a/.idea/modules/TBA-API-V3_main.iml +++ b/.idea/modules/TBA-API-V3_main.iml @@ -14,5 +14,6 @@ + \ No newline at end of file diff --git a/.idea/modules/TBA-API-V3_test.iml b/.idea/modules/TBA-API-V3_test.iml index f9d92f1..9f22f7e 100644 --- a/.idea/modules/TBA-API-V3_test.iml +++ b/.idea/modules/TBA-API-V3_test.iml @@ -15,6 +15,7 @@ + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..8f2955c --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +