From def5314f173a1ae6c5372b59d55c42af08855ec0 Mon Sep 17 00:00:00 2001
From: Jonathan Harris <github@marginal.org.uk>
Date: Thu, 1 Mar 2018 19:24:02 +0000
Subject: [PATCH] Handle MaterialTrade, TechnologyBroker and MissionCompleted
 events

MissionCompleted:MaterialsReward only supported from E:D 3.01.
---
 monitor.py | 31 ++++++++++++++++++++++---------
 1 file changed, 22 insertions(+), 9 deletions(-)

diff --git a/monitor.py b/monitor.py
index 1f583e77..c93dd915 100644
--- a/monitor.py
+++ b/monitor.py
@@ -469,15 +469,6 @@ class EDLogs(FileSystemEventHandler):
                 self.state['Cargo'][commodity] -= entry.get('Count', 1)
                 if self.state['Cargo'][commodity] <= 0:
                     self.state['Cargo'].pop(commodity)
-            elif entry['event'] == 'MissionCompleted':
-                for reward in entry.get('CommodityReward', []):
-                    commodity = self.canonicalise(reward['Name'])
-                    self.state['Cargo'][commodity] += reward.get('Count', 1)
-                for reward in entry.get('MaterialsReward', []):
-                    if 'Category' in reward:	# FIXME: Category not present in E:D 3.0
-                        material = self.canonicalise(reward['Name'])
-                        self.state[reward['Category']][material] += reward.get('Count', 1)
-
             elif entry['event'] == 'SearchAndRescue':
                 for item in entry.get('Items', []):
                     commodity = self.canonicalise(item['Name'])
@@ -505,6 +496,12 @@ class EDLogs(FileSystemEventHandler):
                             self.state[category][material] -= x['Count']
                             if self.state[category][material] <= 0:
                                 self.state[category].pop(material)
+            elif entry['event'] == 'MaterialTrade':
+                category = entry['TraderType'].capitalize()
+                self.state[category][entry['Paid']['Material']] -= entry['Paid']['Quantity']
+                if self.state[category][entry['Paid']['Material']] <= 0:
+                    self.state[category].pop(entry['Paid']['Material'])
+                self.state[category][entry['Received']['Material']] += entry['Received']['Quantity']
 
             elif entry['event'] == 'EngineerCraft' or (entry['event'] == 'EngineerLegacyConvert' and not entry.get('IsPreview')):
                 for category in ['Raw', 'Manufactured', 'Encoded']:
@@ -530,6 +527,15 @@ class EDLogs(FileSystemEventHandler):
                 else:
                     module['Engineering'].pop('ExperimentalEffect', None)
                     module['Engineering'].pop('ExperimentalEffect_Localised', None)
+
+            elif entry['event'] == 'MissionCompleted':
+                for reward in entry.get('CommodityReward', []):
+                    commodity = self.canonicalise(reward['Name'])
+                    self.state['Cargo'][commodity] += reward.get('Count', 1)
+                for reward in entry.get('MaterialsReward', []):
+                    if 'Category' in reward:	# Category not present in E:D 3.0
+                        material = self.canonicalise(reward['Name'])
+                        self.state[self.canonicalise(reward['Category']).capitalize()][material] += reward.get('Count', 1)
             elif entry['event'] == 'EngineerContribution':
                 commodity = self.canonicalise(entry.get('Commodity'))
                 if commodity:
@@ -543,6 +549,13 @@ class EDLogs(FileSystemEventHandler):
                             self.state[category][material] -= entry['Quantity']
                             if self.state[category][material] <= 0:
                                 self.state[category].pop(material)
+            elif entry['event'] == 'TechnologyBroker':
+                for thing in entry['Ingredients']:
+                    for category in ['Cargo', 'Raw', 'Manufactured', 'Encoded']:
+                        if thing['Name'] in self.state[category]:
+                            self.state[category][thing['Name']] -= entry['Count']
+                            if self.state[category][thing['Name']] <= 0:
+                                self.state[category].pop(thing['Name'])
 
             elif entry['event'] == 'JoinACrew':
                 self.state['Captain'] = entry['Captain']