Skip to content

Commit e668f9c

Browse files
committed
feat: New endpoints added with season 2/2023.
1 parent 515e1e7 commit e668f9c

File tree

9 files changed

+227
-3
lines changed

9 files changed

+227
-3
lines changed

src/main/java/de/bausdorf/simracing/irdataapi/client/DataApiConstants.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,10 @@ public class DataApiConstants {
9090
public static final String GET_MEMBER_AWARDS_URL = "https://members-ng.iracing.com/data/member/awards";
9191
public static final String GET_TA_SEASON_RESULTS_URL = "https://members-ng.iracing.com/data/time_attack/member_season_results";
9292
public static final String GET_PARTICIPATION_CREDITS_URL = "https://members-ng.iracing.com/data/member/participation_credits";
93-
93+
public static final String GET_SPECTATOR_SUBSESSIONS_URL = "https://members-ng.iracing.com/data/season/spectator_subsessionids";
94+
public static final String GET_MEMBER_RECAP_URL = "https://members-ng.iracing.com/data/stats/member_recap";
9495
public static final List<String> SUPPORTED_ENDPOINTS = List.of(
95-
GET_MEMBERS_URL, GET_USERINFO_URL, GET_MEMBER_CHART_URL, GET_MEMBER_PROFILE_URL, GET_MEMBER_BEST_URL,
96+
GET_MEMBERS_URL, GET_USERINFO_URL, GET_MEMBER_CHART_URL, GET_MEMBER_PROFILE_URL, GET_MEMBER_BEST_URL, GET_MEMBER_RECAP_URL,
9697
GET_MEMBER_SUMMARY_URL, GET_MEMBER_YEARLY_URL, GET_MEMBER_CAREER_URL, GET_MEMBER_RECENT_RACES_URL, GET_MEMBER_DIVISION_URL, GET_MEMBER_AWARDS_URL,
9798
GET_DRIVER_STANDINGS_URL, GET_TEAM_STANDINGS_URL, GET_TT_STANDINGS_URL, GET_TT_RESULTS_URL, GET_QUALIFY_RESULTS_URL, GET_SUPERSESSION_STANDINGS_URL,
9899
GET_CARS_URL, GET_CAR_ASSETS_URL, GET_CAR_CLASSES_URL,
@@ -106,7 +107,7 @@ public class DataApiConstants {
106107
GET_CUST_LEAGUE_SESSIONS_URL, GET_LEAGUE_MEMBERSHIP_URL, GET_COMBINED_SESSIONS_URL, GET_DRIVABLE_SESSIONS_URL,
107108
SEARCH_LEAGUE_DIRECTORY_URL, GET_LEAGUE_POINT_SYSTEMS_URL, GET_LEAGUE_SEASONS_URL, GET_LEAGUE_SEASON_STANDINGS_URL, GET_LEAGUE_SESSIONS_URL,
108109
SEARCH_SERIES_RESULTS_URL, SEARCH_HOSTED_RESULTS_URL,
109-
GET_TA_SEASON_RESULTS_URL, GET_PARTICIPATION_CREDITS_URL
110+
GET_TA_SEASON_RESULTS_URL, GET_PARTICIPATION_CREDITS_URL, GET_SPECTATOR_SUBSESSIONS_URL
110111
);
111112

112113
// Date and time format constants for json deserialization

src/main/java/de/bausdorf/simracing/irdataapi/client/IrDataClient.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,4 +218,18 @@ public interface IrDataClient {
218218
Map<String, Object>[] getParticipationCredits();
219219

220220
Map<String, Object>[] getTimeAttackSeasonResults(@NonNull Long seasonId);
221+
222+
SpectatorSubsessionIdsDto getSpectatorSubsessionIds();
223+
224+
SpectatorSubsessionIdsDto getSpectatorSubsessionIds(@NonNull Long eventType);
225+
226+
SpectatorSubsessionIdsDto getSpectatorSubsessionIds(@Nullable Long[] eventTypes);
227+
228+
MemberRecapResultDto getMemberRecap();
229+
230+
MemberRecapResultDto getMemberRecap(@Nullable Long custId);
231+
232+
MemberRecapResultDto getMemberRecap(@Nullable Long custId, @Nullable Long year);
233+
234+
MemberRecapResultDto getMemberRecap(@Nullable Long custId, @Nullable Long year, @Nullable Long season);
221235
}

src/main/java/de/bausdorf/simracing/irdataapi/client/impl/IrDataClientImpl.java

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,6 +1233,82 @@ public Map<String, Object>[] getTimeAttackSeasonResults(Long seasonId) {
12331233
}
12341234
}
12351235

1236+
@Override
1237+
public SpectatorSubsessionIdsDto getSpectatorSubsessionIds() {
1238+
return getSpectatorSubsessionIds((Long[])null);
1239+
}
1240+
1241+
@Override
1242+
public SpectatorSubsessionIdsDto getSpectatorSubsessionIds(Long eventType) {
1243+
Long[] array = new Long[1];
1244+
array[0] = eventType;
1245+
return getSpectatorSubsessionIds(array);
1246+
}
1247+
1248+
@Override
1249+
public SpectatorSubsessionIdsDto getSpectatorSubsessionIds(Long[] eventTypes) {
1250+
try {
1251+
String uri = DataApiConstants.GET_SPECTATOR_SUBSESSIONS_URL;
1252+
if (eventTypes != null) {
1253+
uri += '?' + listParameterFromArray("event_types", eventTypes);
1254+
}
1255+
LinkResponseDto linkResponse = getLinkResponse(uri);
1256+
if (linkResponse != null) {
1257+
return getStructuredData(linkResponse.getLink(), new TypeReference<SpectatorSubsessionIdsDto>() {
1258+
});
1259+
}
1260+
throw new DataApiException(DataApiConstants.GET_SPECTATOR_SUBSESSIONS_URL + RETURNED_NULL_BODY);
1261+
} catch (IOException e) {
1262+
throw new DataApiException(e);
1263+
}
1264+
}
1265+
1266+
@Override
1267+
public MemberRecapResultDto getMemberRecap() {
1268+
return getMemberRecap(null, null, null);
1269+
}
1270+
1271+
@Override
1272+
public MemberRecapResultDto getMemberRecap(Long custId) {
1273+
return getMemberRecap(custId, null, null);
1274+
}
1275+
1276+
@Override
1277+
public MemberRecapResultDto getMemberRecap(Long custId, Long year) {
1278+
return getMemberRecap(custId, year, null);
1279+
}
1280+
1281+
@Override
1282+
public MemberRecapResultDto getMemberRecap(Long custId, Long year, Long season) {
1283+
try {
1284+
String uri = DataApiConstants.GET_MEMBER_RECAP_URL;
1285+
StringBuilder uriParameters = new StringBuilder();
1286+
if (custId != null) {
1287+
uriParameters.append("cust_id=").append(custId);
1288+
}
1289+
if (year != null) {
1290+
if (uriParameters.length() > 0) {
1291+
uriParameters.append('&');
1292+
}
1293+
uriParameters.append("year=").append(custId);
1294+
}
1295+
if (season != null) {
1296+
if (uriParameters.length() > 0) {
1297+
uriParameters.append('&');
1298+
}
1299+
uriParameters.append("season=").append(season);
1300+
}
1301+
LinkResponseDto linkResponse = getLinkResponse(uri + (uriParameters.length() > 0 ? '?' + uriParameters.toString() : ""));
1302+
if (linkResponse != null) {
1303+
return getStructuredData(linkResponse.getLink(), new TypeReference<MemberRecapResultDto>() {
1304+
});
1305+
}
1306+
throw new DataApiException(DataApiConstants.GET_MEMBER_RECAP_URL + RETURNED_NULL_BODY);
1307+
} catch (IOException e) {
1308+
throw new DataApiException(e);
1309+
}
1310+
}
1311+
12361312
public JsonNode getApiDocs() {
12371313
try {
12381314
return getStructuredData(DataApiConstants.GET_DOCS_URL, new TypeReference<JsonNode>() {
@@ -1295,6 +1371,17 @@ private static String uriWithCustIdParameter(@NonNull String baseUri, @NonNull L
12951371
return baseUri + CUST_ID_URL_PARAM + custId;
12961372
}
12971373

1374+
private static String listParameterFromArray(String parameterName, Long[] parameterValues) {
1375+
StringBuilder urlParameter = new StringBuilder(parameterName + '=');
1376+
for (int i = 0; i < parameterValues.length; i++) {
1377+
urlParameter.append(parameterValues[i].toString());
1378+
if (i + 1 < parameterValues.length) {
1379+
urlParameter.append(',');
1380+
}
1381+
}
1382+
return urlParameter.toString();
1383+
}
1384+
12981385
public static class StatefulRestTemplateInterceptor implements ClientHttpRequestInterceptor {
12991386
private List<String> cookie;
13001387

src/main/java/de/bausdorf/simracing/irdataapi/model/CarRefLongDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,6 @@ public class CarRefLongDto {
3939
private String carName;
4040
@JsonProperty("car_class_name")
4141
private String carClassName;
42+
@JsonProperty("car_image")
43+
private String carImage;
4244
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package de.bausdorf.simracing.irdataapi.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
import lombok.ToString;
7+
8+
@Data
9+
@NoArgsConstructor
10+
@ToString
11+
public class MemberRecapDto {
12+
@JsonProperty("starts")
13+
private Long starts;
14+
@JsonProperty("wins")
15+
private Long wins;
16+
@JsonProperty("top5")
17+
private Long top5;
18+
@JsonProperty("avg_start_position")
19+
private Long avgStartPosition;
20+
@JsonProperty("avg_finish_position")
21+
private Long avgFinishPosition;
22+
@JsonProperty("laps")
23+
private Long laps;
24+
@JsonProperty("laps_led")
25+
private Long lapsLed;
26+
@JsonProperty("favorite_car")
27+
private CarRefLongDto favoriteCar;
28+
@JsonProperty("favorite_track")
29+
private TrackRefDto favoriteTrack;
30+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package de.bausdorf.simracing.irdataapi.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
import lombok.ToString;
7+
8+
@Data
9+
@NoArgsConstructor
10+
@ToString
11+
public class MemberRecapResultDto {
12+
@JsonProperty("success")
13+
private Boolean success;
14+
@JsonProperty("year")
15+
private Long year;
16+
@JsonProperty("cust_id")
17+
private Long custId;
18+
@JsonProperty("season")
19+
private Long season;
20+
@JsonProperty("stats")
21+
private MemberRecapDto stats;
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package de.bausdorf.simracing.irdataapi.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@NoArgsConstructor
9+
public class SpectatorSubsessionIdsDto {
10+
@JsonProperty("event_types")
11+
private Long[] eventTypes;
12+
@JsonProperty("subsession_ids")
13+
private Long[] subsessionIds;
14+
@JsonProperty("success")
15+
private Boolean success;
16+
}

src/main/java/de/bausdorf/simracing/irdataapi/model/TrackRefDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,6 @@ public class TrackRefDto {
4141
private String category;
4242
@JsonProperty("category_id")
4343
private Long categoryId;
44+
@JsonProperty("track_logo")
45+
private String trackLogo;
4446
}

src/test/java/de/bausdorf/simracing/irdataapi/client/IrDataClientTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,56 @@ void testGetTimeAttackMemberResults() {
971971
assertNotNull(ta_results);
972972
}
973973

974+
@Test
975+
void testGetSpectatorSubsessionIds() {
976+
authenticate();
977+
SpectatorSubsessionIdsDto spectatorSubsessionIds = dataClient.getSpectatorSubsessionIds();
978+
assertNotNull(spectatorSubsessionIds);
979+
assertTrue(spectatorSubsessionIds.getSuccess());
980+
assertTrue(spectatorSubsessionIds.getSubsessionIds().length > 0);
981+
982+
spectatorSubsessionIds = dataClient.getSpectatorSubsessionIds(5L);
983+
assertNotNull(spectatorSubsessionIds);
984+
assertTrue(spectatorSubsessionIds.getSuccess());
985+
assertTrue(spectatorSubsessionIds.getSubsessionIds().length > 0);
986+
log.info("ID's for race");
987+
Arrays.stream(spectatorSubsessionIds.getSubsessionIds()).forEach(id -> log.info(id.toString()));
988+
989+
Long[] eventTypes = new Long[2];
990+
eventTypes[0] = 4L;
991+
eventTypes[1] = 5L;
992+
spectatorSubsessionIds = dataClient.getSpectatorSubsessionIds(eventTypes);
993+
assertNotNull(spectatorSubsessionIds);
994+
assertTrue(spectatorSubsessionIds.getSuccess());
995+
assertTrue(spectatorSubsessionIds.getSubsessionIds().length > 0);
996+
log.info("ID's for qualification and race");
997+
Arrays.stream(spectatorSubsessionIds.getSubsessionIds()).forEach(id -> log.info(id.toString()));
998+
}
999+
1000+
@Test
1001+
void testGetMemberRecap() {
1002+
authenticate();
1003+
MemberRecapResultDto memberRecapResult = dataClient.getMemberRecap();
1004+
assertNotNull(memberRecapResult);
1005+
assertTrue(memberRecapResult.getSuccess());
1006+
log.info("Current member recap: {}", memberRecapResult);
1007+
1008+
memberRecapResult = dataClient.getMemberRecap(372473L);
1009+
assertNotNull(memberRecapResult);
1010+
assertTrue(memberRecapResult.getSuccess());
1011+
log.info("Member {} recap: {}", 372473L, memberRecapResult);
1012+
1013+
memberRecapResult = dataClient.getMemberRecap(229120L, 2022L);
1014+
assertNotNull(memberRecapResult);
1015+
assertTrue(memberRecapResult.getSuccess());
1016+
log.info("Member {} recap for {}: {}", 229120L, 2022, memberRecapResult);
1017+
1018+
memberRecapResult = dataClient.getMemberRecap(229120L, 2022L, 4L);
1019+
assertNotNull(memberRecapResult);
1020+
assertTrue(memberRecapResult.getSuccess());
1021+
log.info("Member {} recap for {}/{}: {}", 229120L, 2022, 4, memberRecapResult);
1022+
}
1023+
9741024
@Test
9751025
void testInvalidAuthenticationAndReauthentication() {
9761026
LoginRequestDto dto = LoginRequestDto.builder()

0 commit comments

Comments
 (0)