Skip to content

Commit e5e1c29

Browse files
committed
Journal monitor refactoring (to make event definitions more self contained).
1 parent b12888d commit e5e1c29

12 files changed

Lines changed: 245 additions & 206 deletions

Events/ExplorationDataPurchasedEvent.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using Utilities;
34

45
namespace EddiEvents
@@ -21,5 +22,14 @@ public ExplorationDataPurchasedEvent(DateTime timestamp, string system, long pri
2122
this.system = system;
2223
this.price = price;
2324
}
25+
26+
public static bool Handle ( DateTime timestamp, string line, IDictionary<string, object> data, ref List<Event> events, bool fromLogLoad )
27+
{
28+
if ( fromLogLoad ) { return true; } // Skip handling this during log loading
29+
var system = JsonParsing.getString(data, "System");
30+
var price = JsonParsing.getLong(data, "Cost");
31+
events.Add( new ExplorationDataPurchasedEvent( timestamp, system, price ) { raw = line, fromLoad = false } );
32+
return true;
33+
}
2434
}
2535
}

Events/ExplorationDataSoldEvent.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using Utilities;
45

56
namespace EddiEvents
@@ -30,5 +31,50 @@ public ExplorationDataSoldEvent(DateTime timestamp, List<string> systems, decima
3031
this.bonus = bonus;
3132
this.total = total;
3233
}
34+
35+
public static bool Handle ( DateTime timestamp, string edType, string line, IDictionary<string, object> data,
36+
ref List<Event> events, bool fromLogLoad )
37+
{
38+
if ( fromLogLoad ) { return true; } // Skip handling this during log loading
39+
40+
if ( edType == "MultiSellExplorationData" )
41+
{
42+
var systems = new List<string>();
43+
data.TryGetValue( "Discovered", out var val );
44+
var discovered = (List<object>)val;
45+
if ( discovered != null )
46+
{
47+
foreach ( var discoveredSystem in discovered.Cast<IDictionary<string, object>>() )
48+
{
49+
var system = JsonParsing.getString( discoveredSystem, "SystemName" );
50+
if ( !string.IsNullOrEmpty( system ) )
51+
{
52+
systems.Add( system );
53+
}
54+
}
55+
}
56+
57+
var reward = JsonParsing.getDecimal( data, "BaseValue" );
58+
var bonus = JsonParsing.getDecimal( data, "Bonus" );
59+
var total = JsonParsing.getDecimal( data, "TotalEarnings" );
60+
events.Add( new ExplorationDataSoldEvent( timestamp, systems, reward, bonus, total ) { raw = line, fromLoad = false } );
61+
return true;
62+
}
63+
64+
if ( edType == "SellExplorationData" )
65+
{
66+
data.TryGetValue( "Systems", out var val );
67+
var systems = ((List<object>)val)?.Cast<string>().ToList();
68+
//data.TryGetValue( "Discovered", out val );
69+
//var firsts = ((List<object>)val)?.Cast<string>().ToList();
70+
var reward = JsonParsing.getDecimal( data, "BaseValue" );
71+
var bonus = JsonParsing.getDecimal( data, "Bonus" );
72+
var total = JsonParsing.getDecimal( data, "TotalEarnings" );
73+
events.Add( new ExplorationDataSoldEvent( timestamp, systems, reward, bonus, total ) { raw = line, fromLoad = false } );
74+
return true;
75+
}
76+
77+
return false;
78+
}
3379
}
3480
}

Events/FSSDiscoveryScanEvent.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using Utilities;
34

45
namespace EddiEvents
@@ -32,5 +33,18 @@ public DiscoveryScanEvent(DateTime timestamp, decimal progress, int totalbodies,
3233
this.totalbodies = totalbodies;
3334
this.nonbodies = nonbodies;
3435
}
36+
37+
public static bool Handle ( DateTime timestamp, string line, IDictionary<string, object> data, ref List<Event> events, bool fromLogLoad )
38+
{
39+
// A journal error was introduced in Odyssey 4.0 Update 17
40+
// where FSSDiscoveryScan would report zero bodies and infinite progress.
41+
// Don't parse `Progress` unless `BodyCount` is greater than zero.
42+
43+
var bodyCount = JsonParsing.getInt(data, "BodyCount"); // total number of stellar bodies in system
44+
var nonBodyCount = JsonParsing.getInt(data, "NonBodyCount"); // total number of non-body signals found
45+
var progress = bodyCount > 0 ? JsonParsing.getDecimal(data, "Progress") : 0; // value from 0-1
46+
events.Add( new DiscoveryScanEvent( timestamp, progress, bodyCount, nonBodyCount ) { raw = line, fromLoad = fromLogLoad } );
47+
return true;
48+
}
3549
}
3650
}

Events/MaterialCollectedEvent.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using EddiDataDefinitions;
22
using System;
3+
using System.Collections.Generic;
34
using Utilities;
45

56
namespace EddiEvents
@@ -30,5 +31,14 @@ public MaterialCollectedEvent(DateTime timestamp, Material material, int amount)
3031
this.amount = amount;
3132
this.edname = material?.edname;
3233
}
34+
35+
public static bool Handle ( DateTime timestamp, string line, IDictionary<string, object> data, ref List<Event> events, bool fromLogLoad )
36+
{
37+
if ( fromLogLoad ) { return true; } // Skip handling this during log loading
38+
var material = Material.FromEDName(JsonParsing.getString(data, "Name"));
39+
var amount = JsonParsing.getInt( data, "Count" );
40+
events.Add( new MaterialCollectedEvent( timestamp, material, amount ) { raw = line, fromLoad = false } );
41+
return true;
42+
}
3343
}
3444
}

Events/MaterialDiscardedEvent.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using EddiDataDefinitions;
22
using System;
3+
using System.Collections.Generic;
34
using Utilities;
45

56
namespace EddiEvents
@@ -30,5 +31,15 @@ public MaterialDiscardedEvent(DateTime timestamp, Material material, int amount)
3031
this.amount = amount;
3132
this.edname = material?.edname;
3233
}
34+
35+
public static bool Handle ( DateTime timestamp, string line, IDictionary<string, object> data, ref List<Event> events, bool fromLogLoad )
36+
{
37+
if ( fromLogLoad ) { return true; } // Skip handling this during log loading
38+
39+
var material = Material.FromEDName(JsonParsing.getString(data, "Name"));
40+
var amount = JsonParsing.getInt( data, "Count" );
41+
events.Add( new MaterialDiscardedEvent( timestamp, material, amount ) { raw = line, fromLoad = false } );
42+
return true;
43+
}
3344
}
3445
}

Events/MaterialDiscoveredEvent.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using EddiDataDefinitions;
22
using System;
3+
using System.Collections.Generic;
34
using Utilities;
45

56
namespace EddiEvents
@@ -18,5 +19,13 @@ public MaterialDiscoveredEvent(DateTime timestamp, Material material) : base(tim
1819
{
1920
this.name = material?.localizedName;
2021
}
22+
23+
public static bool Handle ( DateTime timestamp, string line, IDictionary<string, object> data, ref List<Event> events, bool fromLogLoad )
24+
{
25+
if ( fromLogLoad ) { return true; } // Skip handling this during log loading
26+
var material = Material.FromEDName(JsonParsing.getString(data, "Name"));
27+
events.Add( new MaterialDiscoveredEvent( timestamp, material ) { raw = line, fromLoad = false } );
28+
return true;
29+
}
2130
}
2231
}

Events/NavBeaconScanEvent.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using Utilities;
34

45
namespace EddiEvents
@@ -21,5 +22,14 @@ public NavBeaconScanEvent(DateTime timestamp, ulong systemAddress, int numbodies
2122
this.systemAddress = systemAddress;
2223
this.numbodies = numbodies;
2324
}
25+
26+
public static bool Handle ( DateTime timestamp, string line, IDictionary<string, object> data, ref List<Event> events, bool fromLogLoad )
27+
{
28+
if ( fromLogLoad ) { return true; } // Skip handling this during log loading
29+
var systemAddress = JsonParsing.getULong(data, "SystemAddress");
30+
var numbodies = JsonParsing.getInt( data, "NumBodies" );
31+
events.Add( new NavBeaconScanEvent( timestamp, systemAddress, numbodies ) { raw = line, fromLoad = false } );
32+
return true;
33+
}
2434
}
2535
}

Events/ScreenshotEvent.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using Utilities;
34

45
namespace EddiEvents
@@ -41,5 +42,21 @@ public ScreenshotEvent(DateTime timestamp, string filename, int width, int heigh
4142
this.longitude = longitude;
4243
this.latitude = latitude;
4344
}
45+
46+
public static bool Handle ( DateTime timestamp, string line, IDictionary<string, object> data, ref List<Event> events, bool fromLogLoad )
47+
{
48+
if ( fromLogLoad ) { return true; } // Skip handling this during log loading
49+
50+
var filename = JsonParsing.getString(data, "Filename");
51+
var width = JsonParsing.getInt( data, "Width" );
52+
var height = JsonParsing.getInt( data, "Height" );
53+
var system = JsonParsing.getString(data, "System");
54+
var body = JsonParsing.getString(data, "Body");
55+
var latitude = JsonParsing.getOptionalDecimal(data, "Latitude");
56+
var longitude = JsonParsing.getOptionalDecimal(data, "Longitude");
57+
58+
events.Add( new ScreenshotEvent( timestamp, filename, width, height, system, body, longitude, latitude ) { raw = line, fromLoad = false } );
59+
return true;
60+
}
4461
}
4562
}

Events/SignalDetectedEvent.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using EddiDataDefinitions;
22
using System;
3+
using System.Collections.Generic;
34
using Utilities;
45

56
namespace EddiEvents
@@ -59,5 +60,32 @@ public SignalDetectedEvent(DateTime timestamp, ulong systemAddress, SignalSource
5960
this.signalSource = source;
6061
this.unique = unique;
6162
}
63+
64+
public static bool Handle ( DateTime timestamp, string line, IDictionary<string, object> data, ref List<Event> events, bool fromLogLoad )
65+
{
66+
if ( fromLogLoad ) { return true; } // Skip handling this during log loading
67+
68+
var systemAddress = JsonParsing.getULong(data, "SystemAddress");
69+
70+
var source = EventParsing.SignalSource(data);
71+
source.systemAddress = systemAddress;
72+
73+
source.spawningFaction = EventParsing.FactionName( data, "SpawningFaction" ) ?? Superpower.None.localizedName; // the minor faction, if relevant
74+
source.SpawningPower = Power.FromEDName( JsonParsing.getString( data, "SpawningPower" ) ); // the Powerplay power, if relevant
75+
source.OpposingPower = Power.FromEDName( JsonParsing.getString( data, "OpposingPower" ) ); // the opposing Powerplay power, if relevant
76+
77+
var secondsRemaining = JsonParsing.getOptionalDecimal(data, "TimeRemaining"); // remaining lifetime in seconds, if relevant
78+
source.expiry = secondsRemaining is null ? (DateTime?)null : timestamp.AddSeconds( (double)secondsRemaining );
79+
80+
var spawningstate = JsonParsing.getString(data, "SpawningState");
81+
var normalizedSpawningState = spawningstate?.Replace("$FactionState_", "")?.Replace("_desc;", "");
82+
source.spawningState = FactionState.FromEDName( normalizedSpawningState ) ?? new FactionState();
83+
source.spawningState.fallbackLocalizedName = JsonParsing.getString( data, "SpawningState_Localised" );
84+
85+
source.threatLevel = JsonParsing.getOptionalInt( data, "ThreatLevel" ) ?? 0;
86+
87+
events.Add( new SignalDetectedEvent( timestamp, systemAddress, source ) { raw = line, fromLoad = false } );
88+
return true;
89+
}
6290
}
6391
}

Events/SurfaceSignalsEvent.cs

Lines changed: 66 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -46,37 +46,82 @@ public SurfaceSignalsEvent (DateTime timestamp, string detectionType, ulong? sys
4646
this.genera = genera ?? new List<OrganicGenus>();
4747
}
4848

49-
public static bool Handle ( DateTime timestamp, string line, IDictionary<string, object> data,
50-
ref List<Event> events, bool fromLogLoad )
49+
public static bool Handle ( DateTime timestamp, string edType, string line, IDictionary<string, object> data, ref List<Event> events, bool fromLogLoad )
5150
{
5251
var systemAddress = JsonParsing.getULong(data, "SystemAddress");
5352
var bodyName = JsonParsing.getString(data, "BodyName");
5453
var bodyId = JsonParsing.getLong(data, "BodyID");
5554

5655
data.TryGetValue( "Signals", out var signalsVal );
5756
if ( signalsVal == null ) { return false; }
58-
59-
if ( bodyName.EndsWith( " Ring" ) )
57+
58+
if ( edType.Contains( "SAA", StringComparison.OrdinalIgnoreCase ) )
6059
{
61-
// This is the mining hotspots from a ring that we've mapped
62-
var hotspots = new List<CommodityAmount>();
63-
foreach ( var signal in ( (List<object>)signalsVal ).Cast<IDictionary<string, object>>() )
60+
if ( bodyName.EndsWith( " Ring" ) )
6461
{
65-
var commodityEdName = JsonParsing.getString(signal, "Type");
66-
var type = CommodityDefinition.FromEDName( commodityEdName ) ??
67-
throw new ArgumentException( $@"Unknown ring signal type: {commodityEdName}",
68-
nameof(commodityEdName) );
69-
type.fallbackLocalizedName = JsonParsing.getString( signal, "Type_Localised" );
70-
var amount = JsonParsing.getInt(signal, "Count");
71-
hotspots.Add( new CommodityAmount( type, amount ) );
62+
// This is the mining hotspots from a ring that we've mapped
63+
var hotspots = new List<CommodityAmount>();
64+
foreach ( var signal in ( (List<object>)signalsVal ).Cast<IDictionary<string, object>>() )
65+
{
66+
var commodityEdName = JsonParsing.getString( signal, "Type" );
67+
var type = CommodityDefinition.FromEDName( commodityEdName ) ??
68+
throw new ArgumentException( $@"Unknown ring signal type: {commodityEdName}",
69+
nameof(commodityEdName) );
70+
type.fallbackLocalizedName = JsonParsing.getString( signal, "Type_Localised" );
71+
var amount = JsonParsing.getInt( signal, "Count" );
72+
hotspots.Add( new CommodityAmount( type, amount ) );
73+
}
74+
hotspots = hotspots.OrderByDescending( h => h.amount ).ToList();
75+
events.Add( new RingHotspotsEvent( timestamp, systemAddress, bodyName, bodyId, hotspots )
76+
{
77+
raw = line, fromLoad = fromLogLoad
78+
} );
7279
}
73-
hotspots = hotspots.OrderByDescending( h => h.amount ).ToList();
80+
else
81+
{
82+
// This is surface signal sources from a body that we've mapped
83+
var surfaceSignals = new List<SignalAmount>();
84+
foreach ( var signal in ( (List<object>)signalsVal ).Cast<IDictionary<string, object>>() )
85+
{
86+
var signalSource = JsonParsing.getString( signal, "Type" );
87+
var source = SignalSource.FromEDName( signalSource ) ?? new SignalSource();
88+
var localizedName = JsonParsing.getString( data, "Type_Localised" );
89+
if ( !string.IsNullOrEmpty( localizedName ) && !localizedName.Contains( "$" ) )
90+
{
91+
source.fallbackLocalizedName = localizedName;
92+
}
7493

75-
events.Add( new RingHotspotsEvent( timestamp, systemAddress, bodyName, bodyId, hotspots ) { raw = line, fromLoad = fromLogLoad } );
94+
var amount = JsonParsing.getInt( signal, "Count" );
95+
surfaceSignals.Add( new SignalAmount( source, amount ) );
96+
}
97+
98+
surfaceSignals = surfaceSignals.OrderByDescending( s => s.amount ).ToList();
99+
100+
var genera = new List<OrganicGenus>();
101+
data.TryGetValue( "Genuses", out var genusesVal );
102+
if ( genusesVal != null )
103+
{
104+
foreach ( var genusVal in ( (List<object>)genusesVal ).Cast<IDictionary<string, object>>() )
105+
{
106+
var genusEdName = JsonParsing.getString( genusVal, "Genus" );
107+
var genus = OrganicGenus.FromEDName( genusEdName );
108+
if ( genus != null )
109+
{
110+
genus.fallbackLocalizedName = JsonParsing.getString( genusVal, "Genus_Localised" );
111+
genera.Add( genus );
112+
}
113+
}
114+
}
115+
events.Add( new SurfaceSignalsEvent( timestamp, "SAA", systemAddress, bodyName, bodyId,
116+
surfaceSignals, genera ) { raw = line, fromLoad = fromLogLoad } );
117+
}
118+
119+
return true;
76120
}
77-
else
121+
122+
if ( edType.Contains( "FSS", StringComparison.OrdinalIgnoreCase ) )
78123
{
79-
// This is surface signal sources from a body that we've mapped
124+
// These are surface signal sources from a body that we've scanned
80125
var surfaceSignals = new List<SignalAmount>();
81126
foreach ( var signal in ( (List<object>)signalsVal ).Cast<IDictionary<string, object>>() )
82127
{
@@ -91,27 +136,11 @@ public static bool Handle ( DateTime timestamp, string line, IDictionary<string,
91136
surfaceSignals.Add( new SignalAmount( source, amount ) );
92137
}
93138
surfaceSignals = surfaceSignals.OrderByDescending( s => s.amount ).ToList();
94-
95-
var genera = new List<OrganicGenus>();
96-
data.TryGetValue( "Genuses", out var genusesVal );
97-
if ( genusesVal != null )
98-
{
99-
foreach ( var genusVal in ((List<object>)genusesVal).Cast<IDictionary<string, object>>() )
100-
{
101-
var genusEdName = JsonParsing.getString( genusVal , "Genus" );
102-
var genus = OrganicGenus.FromEDName( genusEdName );
103-
if ( genus != null )
104-
{
105-
genus.fallbackLocalizedName = JsonParsing.getString( genusVal, "Genus_Localised" );
106-
genera.Add( genus );
107-
}
108-
}
109-
}
110-
111-
events.Add( new SurfaceSignalsEvent( timestamp, "SAA", systemAddress, bodyName, bodyId, surfaceSignals, genera ) { raw = line, fromLoad = fromLogLoad } );
139+
events.Add( new SurfaceSignalsEvent( timestamp, "FSS", systemAddress, bodyName, bodyId, surfaceSignals, null ) { raw = line, fromLoad = fromLogLoad } );
140+
return true;
112141
}
113142

114-
return true;
143+
return false;
115144
}
116145
}
117146
}

0 commit comments

Comments
 (0)