From 2552c46d090bb9c3c92cb20104c835c1a4cb2b69 Mon Sep 17 00:00:00 2001
From: Jonathan Harris <jonathan@marginal.org.uk>
Date: Sun, 18 Feb 2018 02:35:37 +0000
Subject: [PATCH] Track Reputation and Statistics

---
 monitor.py       | 28 +++++++++++++++++++++-------
 plugins/inara.py |  9 +++++++++
 2 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/monitor.py b/monitor.py
index 179d07cc..de435069 100644
--- a/monitor.py
+++ b/monitor.py
@@ -113,7 +113,9 @@ class EDLogs(FileSystemEventHandler):
             'Raw'          : defaultdict(int),
             'Manufactured' : defaultdict(int),
             'Encoded'      : defaultdict(int),
-            'Rank'         : { 'Combat': None, 'Trade': None, 'Explore': None, 'Empire': None, 'Federation': None, 'CQC': None },
+            'Rank'         : {},
+            'Reputation'   : {},
+            'Statistics'   : {},
             'Role'         : None,	# Crew role - None, Idle, FireCon, FighterCon
             'Friends'      : set(),	# Online friends
             'ShipID'       : None,
@@ -322,7 +324,9 @@ class EDLogs(FileSystemEventHandler):
                     'Raw'          : defaultdict(int),
                     'Manufactured' : defaultdict(int),
                     'Encoded'      : defaultdict(int),
-                    'Rank'         : { 'Combat': None, 'Trade': None, 'Explore': None, 'Empire': None, 'Federation': None, 'CQC': None },
+                    'Rank'         : {},
+                    'Reputation'   : {},
+                    'Statistics'   : {},
                     'Role'         : None,
                     'Friends'      : set(),
                     'ShipID'       : None,
@@ -351,7 +355,9 @@ class EDLogs(FileSystemEventHandler):
                     'Captain'      : None,
                     'Credits'      : entry['Credits'],
                     'Loan'         : entry['Loan'],
-                    'Rank'         : { 'Combat': None, 'Trade': None, 'Explore': None, 'Empire': None, 'Federation': None, 'CQC': None },
+                    'Rank'         : {},
+                    'Reputation'   : {},
+                    'Statistics'   : {},
                     'Role'         : None,
                 })
             elif entry['event'] == 'NewCommander':
@@ -430,14 +436,22 @@ class EDLogs(FileSystemEventHandler):
                 self.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None
             elif entry['event'] in ['LeaveBody', 'SupercruiseEntry']:
                 self.planet = None
+
             elif entry['event'] in ['Rank', 'Promotion']:
-                for k,v in entry.iteritems():
-                    if k in self.state['Rank']:
-                        self.state['Rank'][k] = (v,0)
+                payload = dict(entry)
+                payload.pop('event')
+                payload.pop('timestamp')
+                for k,v in payload.iteritems():
+                    self.state['Rank'][k] = (v,0)
             elif entry['event'] == 'Progress':
                 for k,v in entry.iteritems():
-                    if self.state['Rank'].get(k) is not None:
+                    if k in self.state['Rank']:
                         self.state['Rank'][k] = (self.state['Rank'][k][0], min(v, 100))	# perhaps not taken promotion mission yet
+            elif entry['event'] in ['Reputation', 'Statistics']:
+                payload = dict(entry)
+                payload.pop('event')
+                payload.pop('timestamp')
+                self.state[entry['event']] = payload
 
             elif entry['event'] == 'Cargo':
                 self.state['Cargo'] = defaultdict(int)
diff --git a/plugins/inara.py b/plugins/inara.py
index e5392f6b..8873254e 100644
--- a/plugins/inara.py
+++ b/plugins/inara.py
@@ -181,6 +181,15 @@ def journal_entry(cmdr, is_beta, system, station, entry, state):
                                       ('rankValue', v[0]),
                                       ('rankProgress', v[1] / 100.0),
                                   ]))
+                for k,v in state['Reputation'].iteritems():
+                    if v is not None:
+                        add_event('setCommanderReputationMajorFaction', entry['timestamp'],
+                                  OrderedDict([
+                                      ('majorfactionName', k.lower()),
+                                      ('majorfactionReputation', v / 100.0),
+                                  ]))
+                add_event('setCommanderGameStatistics', entry['timestamp'], state['Statistics'])	# may be out of date
+
             elif entry['event'] == 'Promotion':
                 for k,v in state['Rank'].iteritems():
                     if k in entry: