Skip to content

Commit

Permalink
Merge pull request #12 from kwtc/chore/added-converter-for-remaining-…
Browse files Browse the repository at this point in the history
…dynamic-types

Added converters for remaining dynamic types
  • Loading branch information
kwtc authored Sep 9, 2023
2 parents 49c8aec + 931861c commit 378792c
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 37 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
Client project for retrieving products from Steam

> **Warning**
> This is work in progress
> This is work in progress but currently looking good, been through 130000ish out of 170000ish listings without failure
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Kwtc.Steam.Client.Converters;

/// <summary>
/// Converter capable of converting a number (or a string) to a string.
/// </summary>
public class NumberOrStringToStringConverter : JsonConverter<string>
{
public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return reader.TokenType switch
{
JsonTokenType.String => reader.GetString(),
JsonTokenType.Number => reader.GetInt32().ToString(),
_ => throw new ArgumentOutOfRangeException(nameof(reader))
};
}

public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
{
if (string.IsNullOrEmpty(value))
{
return;
}

writer.WriteStringValue(value);
}
}
40 changes: 40 additions & 0 deletions src/Kwtc.Steam.Client/Converters/SteamAppRequirementsConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using Kwtc.Steam.Client.Models.Details;

namespace Kwtc.Steam.Client.Converters;

public class SteamAppRequirementsConverter : JsonConverter<SteamAppRequirementsModel?>
{
public override SteamAppRequirementsModel? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.StartArray)
{
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndArray)
{
return null;
}
}
}

if (reader.TokenType == JsonTokenType.StartObject)
{
return JsonSerializer.Deserialize<SteamAppRequirementsModel>(ref reader, options);
}

throw new ArgumentOutOfRangeException(nameof(reader));
}

public override void Write(Utf8JsonWriter writer, SteamAppRequirementsModel? value, JsonSerializerOptions options)
{
if (value == null)
{
return;
}

writer.WriteStringValue(JsonSerializer.Serialize(value));
}
}
20 changes: 10 additions & 10 deletions src/Kwtc.Steam.Client/Kwtc.Steam.Client.csproj
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>11</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Flurl.Http" Version="3.2.4" />
</ItemGroup>
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>11</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Flurl.Http" Version="3.2.4"/>
</ItemGroup>

</Project>
48 changes: 22 additions & 26 deletions src/Kwtc.Steam.Client/Models/Details/SteamAppDetailDataModel.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
using Kwtc.Steam.Client.Converters;

namespace Kwtc.Steam.Client.Models.Details;

Expand All @@ -16,18 +17,19 @@ public class SteamAppDetailDataModel
public int? Id { get; set; }

[JsonPropertyName("required_age")]
[JsonConverter(typeof(NumberOrStringToStringConverter))]
public string? RequiredAge { get; set; }

[JsonPropertyName("is_free")]
public bool? IsFree { get; set; }

[JsonPropertyName("controller_support")]
public string? ControllerSupport { get; set; }

[JsonPropertyName("dlc")]
[JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
public IEnumerable<int>? Dlc { get; set; }

[JsonPropertyName("detailed_description")]
public string? DetailedDescription { get; set; }

Expand All @@ -45,52 +47,46 @@ public class SteamAppDetailDataModel

[JsonPropertyName("header_image")]
public string? HeaderImage { get; set; }

[JsonPropertyName("capsule_image")]
public string? CapsuleImage { get; set; }

[JsonPropertyName("capsule_imagev5")]
public string? CapsuleImageV5 { get; set; }

[JsonPropertyName("website")]
public string? Website { get; set; }

/// <summary>
/// This is dynamic because it can be an empty array (if not defined) or an object ¯\_(ツ)_/¯.
/// </summary>

[JsonPropertyName("pc_requirements")]
public dynamic? PcRequirements { get; set; }
[JsonConverter(typeof(SteamAppRequirementsConverter))]
public SteamAppRequirementsModel? PcRequirements { get; set; }

/// <summary>
/// This is dynamic because it can be an empty array (if not defined) or an object ¯\_(ツ)_/¯.
/// </summary>
[JsonPropertyName("mac_requirements")]
public dynamic? MacRequirements { get; set; }
[JsonConverter(typeof(SteamAppRequirementsConverter))]
public SteamAppRequirementsModel? MacRequirements { get; set; }

/// <summary>
/// This is dynamic because it can be an empty array (if not defined) or an object ¯\_(ツ)_/¯.
/// </summary>
[JsonPropertyName("linux_requirements")]
public dynamic? LinuxRequirements { get; set; }
[JsonConverter(typeof(SteamAppRequirementsConverter))]
public SteamAppRequirementsModel? LinuxRequirements { get; set; }

[JsonPropertyName("legal_notice")]
public string? LegalNotice { get; set; }

[JsonPropertyName("drm_notice")]
public string? DrmNotice { get; set; }

[JsonPropertyName("ext_user_account_notice")]
public string? ExistingUserAccountNotice { get; set; }

[JsonPropertyName("developers")]
public IEnumerable<string>? Developers { get; set; }

/// <summary>
/// Can actually contain a single empty string value (I'm guessing if the app is self published) ¯\_(ツ)_/¯.
/// Can actually contain a single empty string value or a string containing a whitespace (I'm guessing if the app is self published) ¯\_(ツ)_/¯.
/// </summary>
[JsonPropertyName("publishers")]
public IEnumerable<string>? Publishers { get; set; }

[JsonPropertyName("demos")]
public IEnumerable<SteamAppDemoDescriptionModel>? Demos { get; set; }

Expand All @@ -115,16 +111,16 @@ public class SteamAppDetailDataModel

[JsonPropertyName("screenshots")]
public IEnumerable<SteamAppScreenshotModel>? Screenshots { get; set; }

[JsonPropertyName("movies")]
public IEnumerable<SteamAppMovieModel>? Movies { get; set; }

[JsonPropertyName("recommendations")]
public SteamAppRecommendationsModel? Recommendations { get; set; }

[JsonPropertyName("achievements")]
public SteamAppAchievementsModel? Achievements { get; set; }

[JsonPropertyName("release_date")]
public SteamAppReleaseDateModel? ReleaseDate { get; set; }

Expand All @@ -133,10 +129,10 @@ public class SteamAppDetailDataModel

[JsonPropertyName("background")]
public string? BackgroundUrl { get; set; }

[JsonPropertyName("background_raw")]
public string? BackgroundUrlRaw { get; set; }

[JsonPropertyName("content_descriptors")]
public SteamAppContentDescriptorsModel? ContentDescriptors { get; set; }
}
}
12 changes: 12 additions & 0 deletions src/Kwtc.Steam.Client/Models/Details/SteamAppRequirementsModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;

namespace Kwtc.Steam.Client.Models.Details;

public class SteamAppRequirementsModel
{
[JsonPropertyName("minimum")]
public string Minimum { get; set; } = default!;

[JsonPropertyName("recommended")]
public string Recommended { get; set; } = default!;
}

0 comments on commit 378792c

Please sign in to comment.