diff --git a/EDPlayerJournal/Entries/Entry.cs b/EDPlayerJournal/Entries/Entry.cs
index c122891..c9b5659 100644
--- a/EDPlayerJournal/Entries/Entry.cs
+++ b/EDPlayerJournal/Entries/Entry.cs
@@ -30,6 +30,7 @@ public class Entry {
{ Events.MissionCompleted, typeof(MissionCompletedEntry) },
{ Events.MissionFailed, typeof(MissionFailedEntry) },
{ Events.MissionRedirected, typeof(MissionRedirectedEntry) },
+ { Events.Missions, typeof(MissionsEntry) },
{ Events.MultiSellExplorationData, typeof(MultiSellExplorationDataEntry) },
{ Events.RedeemVoucher, typeof(RedeemVoucherEntry) },
{ Events.SearchAndRescue, typeof(SearchAndRescueEntry) },
diff --git a/EDPlayerJournal/Entries/Events.cs b/EDPlayerJournal/Entries/Events.cs
index 62ad8ec..288a0d5 100644
--- a/EDPlayerJournal/Entries/Events.cs
+++ b/EDPlayerJournal/Entries/Events.cs
@@ -20,6 +20,7 @@ public class Events {
public static readonly string MissionCompleted = "MissionCompleted";
public static readonly string MissionFailed = "MissionFailed";
public static readonly string MissionRedirected = "MissionRedirected";
+ public static readonly string Missions = "Missions";
public static readonly string MultiSellExplorationData = "MultiSellExplorationData";
public static readonly string RedeemVoucher = "RedeemVoucher";
public static readonly string SearchAndRescue = "SearchAndRescue";
diff --git a/EDPlayerJournal/Entries/MissionsEntry.cs b/EDPlayerJournal/Entries/MissionsEntry.cs
new file mode 100644
index 0000000..c510894
--- /dev/null
+++ b/EDPlayerJournal/Entries/MissionsEntry.cs
@@ -0,0 +1,48 @@
+using Newtonsoft.Json.Linq;
+
+namespace EDPlayerJournal.Entries;
+
+public class MissionsEntry : Entry {
+ ///
+ /// List of currently active mission.
+ ///
+ public List Active { get; set; } = new List();
+
+ ///
+ /// List of failed missions, not yet discarded.
+ ///
+ public List Failed { get; set; } = new List();
+
+ ///
+ /// List of completed missions, not yet turned in.
+ ///
+ public List Complete { get; set; } = new List();
+
+ protected override void Initialise() {
+ JArray? arr;
+
+ arr = JSON.Value("Active");
+ if (arr != null) {
+ foreach (JObject item in arr.Children().OfType()) {
+ Mission m = Mission.FromMissionAccepted(item);
+ Active.Add(m);
+ }
+ }
+
+ arr = JSON.Value("Failed");
+ if (arr != null) {
+ foreach (JObject item in arr.Children().OfType()) {
+ Mission m = Mission.FromMissionAccepted(item);
+ Failed.Add(m);
+ }
+ }
+
+ arr = JSON.Value("Complete");
+ if (arr != null) {
+ foreach (JObject item in arr.Children().OfType()) {
+ Mission m = Mission.FromMissionAccepted(item);
+ Complete.Add(m);
+ }
+ }
+ }
+}
diff --git a/EDPlayerJournal/Mission.cs b/EDPlayerJournal/Mission.cs
index d8aa482..141a7cd 100644
--- a/EDPlayerJournal/Mission.cs
+++ b/EDPlayerJournal/Mission.cs
@@ -176,6 +176,11 @@ public class Mission : IComparable {
///
public string? Expiry { get; set; }
+ ///
+ /// Certain missions have an expires number. No one knows what that is.
+ ///
+ public ulong? Expires { get; set; }
+
///
/// Influence reward offered. This is for accepting missions only, see the
/// mission effects for actual effects once the mission is complete.
@@ -273,7 +278,8 @@ public class Mission : IComparable {
mission.Target = o.Value("Target");
mission.TargetLocalised = o.Value("Target_Localised");
- mission.Expiry = o.Value("Expiry")?.ToString();
+ mission.Expiry = o.Value("Expiry");
+ mission.Expires = o.Value("Expires");
mission.Wing = o.Value("Wing") ?? false;
mission.Name = o.Value("Name");
diff --git a/EDPlayerJournalTests/MissionTest.cs b/EDPlayerJournalTests/MissionTest.cs
index cc7ee35..fe346c8 100644
--- a/EDPlayerJournalTests/MissionTest.cs
+++ b/EDPlayerJournalTests/MissionTest.cs
@@ -118,4 +118,27 @@ public class MissionTest {
Assert.AreEqual(m.Influences["Salus Imperial Society"][1865919973739UL], "++");
Assert.AreEqual(m.Influences["Salus Imperial Society"][1733186884306UL], "++");
}
+
+ [TestMethod]
+ public void MissionsTest() {
+ string missionsstr = /*lang=json,strict*/ """{ "timestamp":"2022-11-15T12:40:45Z", "event":"Missions", "Active":[ { "MissionID":900147917, "Name":"Mission_Courier_name", "PassengerMission":false, "Expires":26848 }, { "MissionID":900148007, "Name":"Mission_Courier_name", "PassengerMission":false, "Expires":26848 } ], "Failed":[ ], "Complete":[ ] }""";
+
+ Entry? entry = Entry.Parse(missionsstr);
+
+ Assert.IsNotNull(entry);
+ Assert.IsInstanceOfType(entry, typeof(MissionsEntry));
+
+ MissionsEntry? missions = entry as MissionsEntry;
+
+ Assert.IsNotNull(missions);
+
+ Assert.AreEqual(missions.Active.Count, 2);
+ Assert.AreEqual(missions.Failed.Count, 0);
+ Assert.AreEqual(missions.Complete.Count, 0);
+
+ Mission m = missions.Active[0];
+ Assert.AreEqual(m.MissionID, 900147917UL);
+ Assert.AreEqual(m.Name, "Mission_Courier_name");
+ Assert.AreEqual(m.Expires, 26848UL);
+ }
}