def export_commodities(self, data): commodities = [] for commodity in data['lastStarport'].get('commodities') or []: if category_map.get(commodity['categoryname'], True): # Check marketable commodities.append(OrderedDict([ ('name', commodity['name']), ('meanPrice', int(commodity['meanPrice'])), ('buyPrice', int(commodity['buyPrice'])), ('stock', int(commodity['stock'])), ('stockBracket', commodity['stockBracket']), ('sellPrice', int(commodity['sellPrice'])), ('demand', int(commodity['demand'])), ('demandBracket', commodity['demandBracket']), ])) if commodity['statusFlags']: commodities[-1]['statusFlags'] = commodity['statusFlags'] # Don't send empty commodities list - schema won't allow it if commodities: self.send(data['commander']['name'], { '$schemaRef' : 'http://schemas.elite-markets.net/eddn/commodity/3', 'message' : { 'systemName' : data['lastSystem']['name'], 'stationName' : data['lastStarport']['name'], 'commodities' : commodities, } })
def export_commodities(self, data, is_beta): commodities = [] for commodity in data['lastStarport'].get('commodities') or []: if (category_map.get(commodity['categoryname'], True) and # Check marketable not commodity.get('legality')): # check not prohibited commodities.append(OrderedDict([ ('name', commodity['name']), ('meanPrice', int(commodity['meanPrice'])), ('buyPrice', int(commodity['buyPrice'])), ('stock', int(commodity['stock'])), ('stockBracket', commodity['stockBracket']), ('sellPrice', int(commodity['sellPrice'])), ('demand', int(commodity['demand'])), ('demandBracket', commodity['demandBracket']), ])) if commodity['statusFlags']: commodities[-1]['statusFlags'] = commodity['statusFlags'] # Don't send empty commodities list - schema won't allow it if commodities: message = OrderedDict([ ('timestamp', time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(config.getint('querytime') or int(time.time())))), ('systemName', data['lastSystem']['name']), ('stationName', data['lastStarport']['name']), ('commodities', commodities), ]) if 'economies' in data['lastStarport']: message['economies'] = sorted([x for x in data['lastStarport'].get('economies', {}).itervalues()]) if 'prohibited' in data['lastStarport']: message['prohibited'] = sorted([x for x in data['lastStarport'].get('prohibited', {}).itervalues()]) self.send(data['commander']['name'], { '$schemaRef' : 'https://eddn.edcd.io/schemas/commodity/3' + (is_beta and '/test' or ''), 'message' : message, })
def export_commodities(self, data, is_beta): commodities = [] for commodity in data['lastStarport'].get('commodities') or []: if category_map.get(commodity['categoryname'], True): # Check marketable commodities.append(OrderedDict([ ('name', commodity['name']), ('meanPrice', int(commodity['meanPrice'])), ('buyPrice', int(commodity['buyPrice'])), ('stock', int(commodity['stock'])), ('stockBracket', commodity['stockBracket']), ('sellPrice', int(commodity['sellPrice'])), ('demand', int(commodity['demand'])), ('demandBracket', commodity['demandBracket']), ])) if commodity['statusFlags']: commodities[-1]['statusFlags'] = commodity['statusFlags'] # Don't send empty commodities list - schema won't allow it if commodities: self.send(data['commander']['name'], { '$schemaRef' : 'https://eddn.edcd.io/schemas/commodity/3' + (is_beta and '/test' or ''), 'message' : { 'systemName' : data['lastSystem']['name'], 'stationName' : data['lastStarport']['name'], 'commodities' : commodities, } })
def export_commodities(self, data, is_beta): commodities = [] for commodity in data['lastStarport'].get('commodities') or []: if (category_map.get(commodity['categoryname'], True) and # Check marketable not commodity.get('legality')): # check not prohibited commodities.append( OrderedDict([ ('name', commodity['name'].lower()), ('meanPrice', int(commodity['meanPrice'])), ('buyPrice', int(commodity['buyPrice'])), ('stock', int(commodity['stock'])), ('stockBracket', commodity['stockBracket']), ('sellPrice', int(commodity['sellPrice'])), ('demand', int(commodity['demand'])), ('demandBracket', commodity['demandBracket']), ])) if commodity['statusFlags']: commodities[-1]['statusFlags'] = commodity['statusFlags'] commodities.sort(key=lambda c: c['name']) if commodities and this.commodities != commodities: # Don't send empty commodities list - schema won't allow it message = OrderedDict([ ('timestamp', data['timestamp']), ('systemName', data['lastSystem']['name']), ('stationName', data['lastStarport']['name']), ('marketId', data['lastStarport']['id']), ('commodities', commodities), ]) if 'economies' in data['lastStarport']: message['economies'] = sorted([ x for x in ( data['lastStarport']['economies'] or {}).itervalues() ]) if 'prohibited' in data['lastStarport']: message['prohibited'] = sorted([ x for x in ( data['lastStarport']['prohibited'] or {}).itervalues() ]) self.send( data['commander']['name'], { '$schemaRef': 'https://eddn.edcd.io/schemas/commodity/3' + (is_beta and '/test' or ''), 'message': message, }) this.commodities = commodities
def addcommodities(data): if not data['lastStarport'].get('commodities'): return commodityfile = 'commodity.csv' commodities = {} # slurp existing if isfile(commodityfile): with open(commodityfile) as csvfile: reader = csv.DictReader(csvfile) for row in reader: key = row.pop('name') commodities[key] = row size_pre = len(commodities) for commodity in data['lastStarport'].get('commodities'): key = commodity_map.get(commodity['name']) or commodity['name'] new = { 'id' : commodity['id'], 'category' : category_map.get(commodity['categoryname']) or commodity['categoryname'], 'average' : commodity['cost_mean'].split('.')[0] } old = commodities.get(key) if old: if new['id'] != old['id'] or new['category'] != old['category']: raise AssertionError('%s: "%s"!="%s"' % (key, new, old)) elif new['average'] != old['average']: commodities[key] = new else: commodities[key] = new if len(commodities) > size_pre: if isfile(commodityfile): if isfile(commodityfile+'.bak'): os.unlink(commodityfile+'.bak') os.rename(commodityfile, commodityfile+'.bak') with open(commodityfile, 'wb') as csvfile: writer = csv.DictWriter(csvfile, ['id','category', 'name', 'average']) writer.writeheader() for key in commodities: commodities[key]['name'] = key for row in sorted(commodities.values(), key = lambda x: (x['category'], x['name'])): writer.writerow(row) print 'Added %d new commodities' % (len(commodities) - size_pre)
def addcommodities(data): if not data['lastStarport'].get('commodities'): return commodityfile = 'commodity.csv' commodities = {} # slurp existing if isfile(commodityfile): with open(commodityfile) as csvfile: reader = csv.DictReader(csvfile) for row in reader: key = row.pop('name') commodities[key] = row size_pre = len(commodities) for commodity in data['lastStarport'].get('commodities'): key = commodity_map.get(commodity['name']) or commodity['name'] new = { 'id' : commodity['id'], 'category' : category_map.get(commodity['categoryname']) or commodity['categoryname'], 'average' : commodity['cost_mean'].split('.')[0] } old = commodities.get(key) if old: if new != old: raise AssertionError('%s: "%s"!="%s"' % (key, new, old)) else: commodities[key] = new if len(commodities) > size_pre: if isfile(commodityfile): if isfile(commodityfile+'.bak'): os.unlink(commodityfile+'.bak') os.rename(commodityfile, commodityfile+'.bak') with open(commodityfile, 'wb') as csvfile: writer = csv.DictWriter(csvfile, ['id','category', 'name', 'average']) writer.writeheader() for key in commodities: commodities[key]['name'] = key for row in sorted(commodities.values(), key = lambda x: (x['category'], x['name'])): writer.writerow(row) print 'Added %d new commodities' % (len(commodities) - size_pre)
def export_commodities(self, data, is_beta): commodities = [] for commodity in data['lastStarport'].get('commodities') or []: if (category_map.get(commodity['categoryname'], True) and # Check marketable not commodity.get('legality')): # check not prohibited commodities.append(OrderedDict([ ('name', commodity['name'].lower()), ('meanPrice', int(commodity['meanPrice'])), ('buyPrice', int(commodity['buyPrice'])), ('stock', int(commodity['stock'])), ('stockBracket', commodity['stockBracket']), ('sellPrice', int(commodity['sellPrice'])), ('demand', int(commodity['demand'])), ('demandBracket', commodity['demandBracket']), ])) if commodity['statusFlags']: commodities[-1]['statusFlags'] = commodity['statusFlags'] commodities.sort(key = lambda c: c['name']) if commodities and this.commodities != commodities: # Don't send empty commodities list - schema won't allow it message = OrderedDict([ ('timestamp', data['timestamp']), ('systemName', data['lastSystem']['name']), ('stationName', data['lastStarport']['name']), ('marketId', data['lastStarport']['id']), ('commodities', commodities), ]) if 'economies' in data['lastStarport']: message['economies'] = sorted([x for x in (data['lastStarport']['economies'] or {}).itervalues()]) if 'prohibited' in data['lastStarport']: message['prohibited'] = sorted([x for x in (data['lastStarport']['prohibited'] or {}).itervalues()]) self.send(data['commander']['name'], { '$schemaRef' : 'https://eddn.edcd.io/schemas/commodity/3' + (is_beta and '/test' or ''), 'message' : message, }) this.commodities = commodities
def export_commodities(self, data: Mapping[str, Any], is_beta: bool) -> None: """ export_commodities updates EDDN with the commodities on the current (lastStarport) station. Once the send is complete, this.commodities is updated with the new data. :param data: a dict containing the starport data :param is_beta: whether or not we're currently in beta mode """ commodities: List[OrderedDictT[str, Any]] = [] for commodity in data['lastStarport'].get('commodities') or []: # Check 'marketable' and 'not prohibited' if (category_map.get(commodity['categoryname'], True) and not commodity.get('legality')): commodities.append( OrderedDict([ ('name', commodity['name'].lower()), ('meanPrice', int(commodity['meanPrice'])), ('buyPrice', int(commodity['buyPrice'])), ('stock', int(commodity['stock'])), ('stockBracket', commodity['stockBracket']), ('sellPrice', int(commodity['sellPrice'])), ('demand', int(commodity['demand'])), ('demandBracket', commodity['demandBracket']), ])) if commodity['statusFlags']: commodities[-1]['statusFlags'] = commodity['statusFlags'] commodities.sort(key=lambda c: c['name']) # This used to have a check `commodities and ` at the start so as to # not send an empty commodities list, as the EDDN Schema doesn't allow # it (as of 2020-09-28). # BUT, Fleet Carriers can go from having buy/sell orders to having # none and that really does need to be recorded over EDDN so that, e.g. # EDDB can update in a timely manner. if this.commodities != commodities: message: OrderedDictT[str, Any] = OrderedDict([ ('timestamp', data['timestamp']), ('systemName', data['lastSystem']['name']), ('stationName', data['lastStarport']['name']), ('marketId', data['lastStarport']['id']), ('commodities', commodities), ]) if 'economies' in data['lastStarport']: message['economies'] = sorted((x for x in ( data['lastStarport']['economies'] or {}).values()), key=lambda x: x['name']) if 'prohibited' in data['lastStarport']: message['prohibited'] = sorted(x for x in ( data['lastStarport']['prohibited'] or {}).values()) self.send( data['commander']['name'], { '$schemaRef': f'https://eddn.edcd.io/schemas/commodity/3{"/test" if is_beta else ""}', 'message': message, }) this.commodities = commodities