Skip to content

Commit aaf2f03

Browse files
lambstreamdealloc
authored andcommitted
WIP Space station raw endpoint mapping
1 parent 797d844 commit aaf2f03

File tree

12 files changed

+141
-7
lines changed

12 files changed

+141
-7
lines changed

src/Helldivers-2-API/Controllers/ArrowHeadController.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,17 @@ public static async Task<IResult> Assignments(HttpContext context, ArrowHeadStor
7575

7676
return Results.Bytes(assignments, contentType: "application/json");
7777
}
78+
79+
/// <summary>
80+
/// Fetches THE specific <see cref="SpaceStation" /> (749875195).
81+
/// </summary>
82+
[ProducesResponseType<List<Assignment>>(StatusCodes.Status200OK)]
83+
[ProducesResponseType(StatusCodes.Status503ServiceUnavailable)]
84+
public static async Task<IResult> SpaceStation(HttpContext context, ArrowHeadStore store)
85+
{
86+
// TODO extract ID from route
87+
var spaceStation = await store.GetSpaceStations(749875195, context.RequestAborted);
88+
89+
return Results.Bytes(spaceStation, contentType: "application/json");
90+
}
7891
}

src/Helldivers-2-API/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@
255255
raw.MapGet("/api/Stats/war/801/summary", ArrowHeadController.Summary);
256256
raw.MapGet("/api/NewsFeed/801", ArrowHeadController.NewsFeed);
257257
raw.MapGet("/api/v2/Assignment/War/801", ArrowHeadController.Assignments);
258+
raw.MapGet("/api/v2/SpaceStation/War/801/749875195", ArrowHeadController.SpaceStation);
258259

259260
#endregion
260261

src/Helldivers-2-Core/Mapping/MappingContext.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public sealed class MappingContext
3131
/// <summary>The <see cref="Assignment" />s currently being mapped.</summary>
3232
public Dictionary<string, List<Assignment>> Assignments { get; private init; }
3333

34+
/// <summary>The <see cref="SpaceStation" />s currently being mapped.</summary>
35+
public Dictionary<string, List<SpaceStation>> SpaceStations { get; private init; }
36+
3437
/// <summary>
3538
/// A <see cref="DateTime" /> that represents the 'start' of the time in Helldivers 2.
3639
/// This accounts for the <see cref="Models.ArrowHead.WarInfo.StartDate" /> and <see cref="GameTimeDeviation" />.
@@ -44,14 +47,15 @@ public sealed class MappingContext
4447
public TimeSpan GameTimeDeviation { get; private init; }
4548

4649
/// <summary>Initializes a new <see cref="MappingContext" />.</summary>
47-
internal MappingContext(WarId warId, WarInfo warInfo, Dictionary<string, WarStatus> warStatuses, WarSummary warSummary, Dictionary<string, List<NewsFeedItem>> newsFeeds, Dictionary<string, List<Assignment>> assignments)
50+
internal MappingContext(WarId warId, WarInfo warInfo, Dictionary<string, WarStatus> warStatuses, WarSummary warSummary, Dictionary<string, List<NewsFeedItem>> newsFeeds, Dictionary<string, List<Assignment>> assignments, Dictionary<string, List<SpaceStation>> spaceStations)
4851
{
4952
WarId = warId;
5053
WarInfo = warInfo;
5154
WarStatuses = warStatuses;
5255
WarSummary = warSummary;
5356
NewsFeeds = newsFeeds;
5457
Assignments = assignments;
58+
SpaceStations = spaceStations;
5559

5660
InvariantWarStatus = warStatuses.FirstOrDefault().Value
5761
?? throw new InvalidOperationException("No warstatus available");

src/Helldivers-2-Core/Mapping/V1/SpaceStationMapper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public IEnumerable<SpaceStation> MapToV1(MappingContext context, List<Planet> pl
2020
yield return Map(context, station, planets);
2121
}
2222

23-
private SpaceStation Map(MappingContext context, Helldivers.Models.ArrowHead.Status.SpaceStation raw, List<Planet> planets)
23+
private SpaceStation Map(MappingContext context, Helldivers.Models.ArrowHead.SpaceStation raw, List<Planet> planets)
2424
{
2525
var planet = planets.First(p => p.Index == raw.PlanetIndex);
2626

src/Helldivers-2-Core/Storage/ArrowHead/ArrowHeadStore.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public sealed class ArrowHeadStore
1414
private CultureDictionary<Memory<byte>> _statuses = null!;
1515
private CultureDictionary<Memory<byte>> _feeds = null!;
1616
private CultureDictionary<Memory<byte>> _assignments = null!;
17+
private CultureDictionary<Memory<byte>> _spaceStations = null!;
1718
private readonly TaskCompletionSource _syncState = new();
1819

1920
/// <summary>
@@ -25,7 +26,8 @@ public void UpdateRawStore(
2526
Memory<byte> warSummary,
2627
IEnumerable<KeyValuePair<string, Memory<byte>>> statuses,
2728
IEnumerable<KeyValuePair<string, Memory<byte>>> feeds,
28-
IEnumerable<KeyValuePair<string, Memory<byte>>> assignments
29+
IEnumerable<KeyValuePair<string, Memory<byte>>> assignments,
30+
IEnumerable<KeyValuePair<string, Memory<byte>>> spaceStations
2931
)
3032
{
3133
_warId = warId;
@@ -34,6 +36,7 @@ IEnumerable<KeyValuePair<string, Memory<byte>>> assignments
3436
_statuses = new(statuses);
3537
_feeds = new(feeds);
3638
_assignments = new(assignments);
39+
_spaceStations = new(spaceStations);
3740

3841
_syncState.TrySetResult();
3942
}
@@ -97,4 +100,15 @@ public async Task<Memory<byte>> GetAssignments(CancellationToken cancellationTok
97100

98101
return _assignments.Get();
99102
}
103+
104+
/// <summary>
105+
/// returns the raw payload for <see cref="SpaceStation" />s.
106+
/// </summary>
107+
public async Task<Memory<byte>> GetSpaceStations(int id, CancellationToken cancellationToken)
108+
{
109+
await _syncState.Task.WaitAsync(cancellationToken);
110+
111+
// TODO use ID to get relevant space station
112+
return _spaceStations.Get();
113+
}
100114
}

src/Helldivers-2-Core/StorageFacade.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,17 @@ public ValueTask UpdateStores(SteamNewsFeed feed)
2525
/// </summary>
2626
public async ValueTask UpdateStores(Memory<byte> rawWarId, Memory<byte> rawWarInfo,
2727
Dictionary<string, Memory<byte>> rawWarStatuses, Memory<byte> rawWarSummary,
28-
Dictionary<string, Memory<byte>> rawNewsFeeds, Dictionary<string, Memory<byte>> rawAssignments)
28+
Dictionary<string, Memory<byte>> rawNewsFeeds, Dictionary<string, Memory<byte>> rawAssignments,
29+
Dictionary<string, Memory<byte>> rawStations)
2930
{
3031
arrowHead.UpdateRawStore(
3132
rawWarId,
3233
rawWarInfo,
3334
rawWarSummary,
3435
rawWarStatuses,
3536
rawNewsFeeds,
36-
rawAssignments
37+
rawAssignments,
38+
rawStations
3739
);
3840

3941
var warId = DeserializeOrThrow(rawWarId, ArrowHeadSerializerContext.Default.WarId);
@@ -51,14 +53,19 @@ public async ValueTask UpdateStores(Memory<byte> rawWarId, Memory<byte> rawWarIn
5153
pair => pair.Key,
5254
pair => DeserializeOrThrow(pair.Value, ArrowHeadSerializerContext.Default.ListAssignment)
5355
);
56+
var spaceStations = rawAssignments.ToDictionary(
57+
pair => pair.Key,
58+
pair => DeserializeOrThrow(pair.Value, ArrowHeadSerializerContext.Default.ListSpaceStation)
59+
);
5460

5561
var context = new MappingContext(
5662
warId,
5763
warInfo,
5864
warStatuses,
5965
warSummary,
6066
newsFeeds,
61-
assignments
67+
assignments,
68+
spaceStations
6269
);
6370

6471
await v1.UpdateStores(context);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Helldivers.Models.ArrowHead.SpaceStations;
2+
3+
namespace Helldivers.Models.ArrowHead;
4+
5+
/// <summary>
6+
/// Represents an assignment given from Super Earth to the Helldivers.
7+
/// </summary>
8+
/// <param name="Id32">The unique identifier of the station.</param>
9+
/// <param name="PlanetIndex">The id of the planet it's currently orbiting</param>
10+
/// <param name="LastElectionId">The id of the previous planet election.</param>
11+
/// <param name="CurrentElectionId">The id of the current planet election.</param>
12+
/// <param name="NextElectionId">The id of the next planet election.</param>
13+
/// <param name="CurrentElectionEndWarTime">When the election for the next planet will end (in seconds relative to game start).</param>
14+
/// <param name="Flags">A set of flags, purpose currently unknown.</param>
15+
/// <param name="TacticalActions">The list of actions the space station crew can perform.</param>
16+
public sealed record SpaceStation(
17+
long Id32,
18+
int PlanetIndex,
19+
string LastElectionId,
20+
string CurrentElectionId,
21+
string NextElectionId,
22+
ulong CurrentElectionEndWarTime,
23+
int Flags,
24+
List<TacticalAction> TacticalActions
25+
);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace Helldivers.Models.ArrowHead.SpaceStations;
2+
3+
/// <summary>
4+
/// Represents the "Cost" of a tactical action
5+
/// </summary>
6+
/// <param name="Id"></param>
7+
/// <param name="ItemMixId"></param>
8+
/// <param name="TargetValue"></param>
9+
/// <param name="CurrentValue"></param>
10+
/// <param name="DeltaPerSecond"></param>
11+
/// <param name="MaxDonationAmmount"></param>
12+
/// <param name="MaxDonationPeriodSeconds"></param>
13+
public sealed record Cost(
14+
string Id,
15+
long ItemMixId,
16+
int TargetValue,
17+
int CurrentValue,
18+
int DeltaPerSecond,
19+
int MaxDonationAmmount,
20+
int MaxDonationPeriodSeconds
21+
);
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
namespace Helldivers.Models.ArrowHead.SpaceStations;
2+
3+
/// <summary>
4+
/// Represents information of a space station from the 'SpaceStation' endpoint returned by ArrowHead's API.
5+
/// </summary>
6+
/// <param name="Id32"></param>
7+
/// <param name="MediaId32"></param>
8+
/// <param name="Name"></param>
9+
/// <param name="Description"></param>
10+
/// <param name="StrategicDescription"></param>
11+
/// <param name="Status"></param>
12+
/// <param name="StatusExpireAtWarTimeSeconds"></param>
13+
/// <param name="Cost"></param>
14+
/// <param name="EffectIds"></param>
15+
/// <param name="ActiveEffectIds"></param>
16+
public sealed record TacticalAction(
17+
long Id32,
18+
long MediaId32,
19+
string Name,
20+
string Description,
21+
string StrategicDescription,
22+
int Status,
23+
int StatusExpireAtWarTimeSeconds,
24+
List<Cost> Cost,
25+
List<int> EffectIds,
26+
List<int> ActiveEffectIds
27+
);

src/Helldivers-2-Models/ArrowHeadSerializerContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ namespace Helldivers.Models;
1212
[JsonSerializable(typeof(NewsFeedItem))]
1313
[JsonSerializable(typeof(WarSummary))]
1414
[JsonSerializable(typeof(List<Assignment>))]
15+
[JsonSerializable(typeof(List<SpaceStation>))]
1516
[JsonSerializable(typeof(List<NewsFeedItem>))]
1617
[JsonSourceGenerationOptions(PropertyNameCaseInsensitive = true)]
1718
public sealed partial class ArrowHeadSerializerContext : JsonSerializerContext

0 commit comments

Comments
 (0)