Skip to content

Commit 98fa7ec

Browse files
author
Justin Skiles
authored
Added endpoint for GetGameMapsPlaytime (#93)
1 parent 554b7c7 commit 98fa7ec

File tree

9 files changed

+193
-4
lines changed

9 files changed

+193
-4
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Steam.Models.CSGO
2+
{
3+
public enum GameMapsPlaytimeGameMode
4+
{
5+
Competitive,
6+
Casual
7+
}
8+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
namespace Steam.Models.CSGO
3+
{
4+
public enum GameMapsPlaytimeInterval
5+
{
6+
Day,
7+
Week,
8+
Month
9+
}
10+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Steam.Models.CSGO
2+
{
3+
public enum GameMapsPlaytimeMapGroup
4+
{
5+
Operation
6+
}
7+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System;
2+
3+
namespace Steam.Models.CSGO
4+
{
5+
public class GameMapsPlaytimeModel
6+
{
7+
public DateTime IntervalStartTimeStamp { get; set; }
8+
public string MapName { get; set; }
9+
public float RelativePercentage { get; set; }
10+
}
11+
}

src/Steam.UnitTests/CSGOServersTests.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,27 @@
11
using Microsoft.Extensions.Configuration;
2+
using Steam.Models.CSGO;
23
using SteamWebAPI2.Interfaces;
3-
using SteamWebAPI2.Utilities;
4-
using System;
5-
using System.Collections.Generic;
64
using System.Net.Http;
7-
using System.Text;
85
using System.Threading.Tasks;
96
using Xunit;
107

118
namespace Steam.UnitTests
129
{
1310
public class CSGOServersTests : BaseTest
1411
{
12+
[Fact]
13+
public async Task GetGameMapsPlaytimeAsync_Should_Succeed()
14+
{
15+
var steamInterface = factory.CreateSteamWebInterface<CSGOServers>(new HttpClient());
16+
var response = await steamInterface.GetGameMapsPlaytimeAsync(
17+
GameMapsPlaytimeInterval.Week,
18+
GameMapsPlaytimeGameMode.Competitive,
19+
GameMapsPlaytimeMapGroup.Operation
20+
);
21+
Assert.NotNull(response);
22+
Assert.NotNull(response.Data);
23+
}
24+
1525
[Fact]
1626
public async Task GetGameServerStatusAsync_Should_Succeed()
1727
{

src/SteamWebAPI2/AutoMapperConfiguration.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ public static void Initialize()
121121
CreateSteamWebResponseMap<SteamServerInfo, SteamServerInfoModel>(x);
122122
CreateSteamWebResponseMap<SteamApiListContainer, IReadOnlyCollection<SteamInterfaceModel>>(x);
123123
CreateSteamWebResponseMap<GoldenWrenchResultContainer, IReadOnlyCollection<GoldenWrenchModel>>(x);
124+
CreateSteamWebResponseMap<GameMapsPlaytimeContainer, IEnumerable<GameMapsPlaytimeModel>>(x);
124125

125126
#region Endpoint: DOTA2Econ
126127

@@ -551,6 +552,12 @@ public static void Initialize()
551552
src => Mapper.Map<ServerStatusResult, ServerStatusModel>(src.Result)
552553
);
553554

555+
x.CreateMap<GameMapsPlaytimeContainer, IEnumerable<GameMapsPlaytimeModel>>().ConvertUsing(
556+
src => Mapper.Map<IEnumerable<GameMapsPlaytime>, IEnumerable<GameMapsPlaytimeModel>>(src.Result.Playtimes)
557+
);
558+
x.CreateMap<GameMapsPlaytime, GameMapsPlaytimeModel>()
559+
.ForMember(dest => dest.IntervalStartTimeStamp, opts => opts.MapFrom(source => source.IntervalStartTimeStamp.ToDateTime()));
560+
554561
x.CreateMap<EconItem, EconItemModel>();
555562
x.CreateMap<EconItemAttribute, EconItemAttributeModel>();
556563
x.CreateMap<EconItemAttributeAccountInfo, EconItemAttributeAccountInfoModel>();

src/SteamWebAPI2/Interfaces/CSGOServers.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Steam.Models.CSGO;
22
using SteamWebAPI2.Models.CSGO;
33
using SteamWebAPI2.Utilities;
4+
using System.Collections.Generic;
45
using System.Threading.Tasks;
56

67
namespace SteamWebAPI2.Interfaces
@@ -23,6 +24,31 @@ public CSGOServers(ISteamWebRequest steamWebRequest, ISteamWebInterface steamWeb
2324
: steamWebInterface;
2425
}
2526

27+
/// <summary>
28+
/// Maps to the Steam Web API interface/method of ICSGOServers_730/GetGameMapsPlaytime/v1
29+
/// </summary>
30+
/// <returns></returns>
31+
public async Task<ISteamWebResponse<IEnumerable<GameMapsPlaytimeModel>>> GetGameMapsPlaytimeAsync(
32+
GameMapsPlaytimeInterval interval,
33+
GameMapsPlaytimeGameMode gameMode,
34+
GameMapsPlaytimeMapGroup mapGroup
35+
)
36+
{
37+
List<SteamWebRequestParameter> parameters = new List<SteamWebRequestParameter>();
38+
39+
parameters.AddIfHasValue(interval.ToString().ToLower(), "interval");
40+
parameters.AddIfHasValue(gameMode.ToString().ToLower(), "gamemode");
41+
parameters.AddIfHasValue(mapGroup.ToString().ToLower(), "mapgroup");
42+
43+
var steamWebResponse = await steamWebInterface.GetAsync<GameMapsPlaytimeContainer>("GetGameMapsPlaytime", 1, parameters);
44+
45+
var steamWebResponseModel = AutoMapperConfiguration.Mapper.Map<
46+
ISteamWebResponse<GameMapsPlaytimeContainer>,
47+
ISteamWebResponse<IEnumerable<GameMapsPlaytimeModel>>>(steamWebResponse);
48+
49+
return steamWebResponseModel;
50+
}
51+
2652
/// <summary>
2753
/// Maps to the Steam Web API interface/method of ICSGOServers_730/GetGameServersStatus/v1
2854
/// </summary>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Collections.Generic;
2+
using Newtonsoft.Json;
3+
using SteamWebAPI2.Utilities.JsonConverters;
4+
5+
namespace SteamWebAPI2.Models.CSGO
6+
{
7+
public class GameMapsPlaytime
8+
{
9+
public ulong IntervalStartTimeStamp { get; set; }
10+
public string MapName { get; set; }
11+
public float RelativePercentage { get; set; }
12+
}
13+
14+
public class GameMapsPlaytimeResult
15+
{
16+
public IEnumerable<GameMapsPlaytime> Playtimes { get; set; }
17+
}
18+
19+
public class GameMapsPlaytimeContainer
20+
{
21+
[JsonConverter(typeof(GameMapsPlaytimeConverter))]
22+
public GameMapsPlaytimeResult Result { get; set; }
23+
}
24+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Linq;
3+
using SteamWebAPI2.Models.CSGO;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Reflection;
7+
8+
namespace SteamWebAPI2.Utilities.JsonConverters
9+
{
10+
internal class GameMapsPlaytimeConverter : JsonConverter
11+
{
12+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
13+
{
14+
throw new NotImplementedException();
15+
}
16+
17+
/// <summary>
18+
/// Custom deserialization required because raw API response is awful. Instead of returning real JSON objects, the API
19+
/// returns an array of "keys" and a matrix of "rows". We need to match up the keys to the columns within the rows
20+
/// to figure out which value goes with which key.
21+
///
22+
/// Example response:
23+
///
24+
/// "Keys": ["Key 1", "Key 2", "Key 3"],
25+
/// "Rows": [
26+
/// ["A 1", "A 2", "A 3"],
27+
/// ["B 1", "B 2", "B 3"]
28+
/// ]
29+
/// </summary>
30+
/// <param name="reader"></param>
31+
/// <param name="objectType"></param>
32+
/// <param name="existingValue"></param>
33+
/// <param name="serializer"></param>
34+
/// <returns></returns>
35+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
36+
{
37+
if (reader.TokenType == JsonToken.Null)
38+
{
39+
return null;
40+
}
41+
42+
List<GameMapsPlaytime> playtimes = new List<GameMapsPlaytime>();
43+
44+
JObject o = JObject.Load(reader);
45+
46+
var keys = o["Keys"];
47+
var rows = o["Rows"];
48+
49+
foreach (var row in rows)
50+
{
51+
int columnIndex = 0;
52+
GameMapsPlaytime playtime = new GameMapsPlaytime();
53+
foreach (var value in row)
54+
{
55+
var key = keys[columnIndex];
56+
if (key.ToString() == "IntervalStartTimeStamp")
57+
{
58+
playtime.IntervalStartTimeStamp = ulong.Parse(value.ToString());
59+
}
60+
else if (key.ToString() == "MapName")
61+
{
62+
playtime.MapName = value.ToString();
63+
}
64+
else if (key.ToString() == "RelativePercentage")
65+
{
66+
playtime.RelativePercentage = float.Parse(value.ToString());
67+
}
68+
columnIndex++;
69+
}
70+
playtimes.Add(playtime);
71+
}
72+
73+
return new GameMapsPlaytimeResult()
74+
{
75+
Playtimes = playtimes
76+
};
77+
}
78+
79+
public override bool CanWrite { get { return false; } }
80+
81+
public override bool CanConvert(Type objectType)
82+
{
83+
return typeof(GameMapsPlaytimeResult).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo());
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)