raylu 2 weeks ago
parent
commit
c3e4a2be90
2 changed files with 62 additions and 6 deletions
  1. 51 0
      buy.py
  2. 11 6
      supply.py

+ 51 - 0
buy.py

@@ -0,0 +1,51 @@
+from __future__ import annotations
+
+import collections
+import dataclasses
+import typing
+
+import cache
+from config import config
+import supply
+
+if typing.TYPE_CHECKING:
+	import market
+
+def main() -> None:
+	raw_prices: typing.Mapping[str, market.RawPrice] = {p['MaterialTicker']: p
+			for p in cache.get('https://refined-prun.github.io/refined-prices/all.json') if p['ExchangeCode'] == 'IC1'}
+
+	planets = [supply.Planet(fio_burn) for fio_burn in cache.get('https://rest.fnar.net/fioweb/burn/user/' + config.username,
+			headers={'Authorization': config.fio_api_key})]
+	buy: dict[str, int] = collections.defaultdict(int)
+	for planet in planets:
+		for mat, amount in planet.buy_for_target(7).items():
+			buy[mat] += amount
+
+	materials: list[Material] = []
+	for mat, amount in buy.items():
+		price = raw_prices[mat]
+		if price['Bid'] is None or price['Ask'] is None:
+			print(mat, 'has no bid/ask')
+			continue
+		spread = price['Ask'] - price['Bid']
+		materials.append(Material(mat, amount=amount, spread=spread, total=spread * amount))
+	materials.sort(reverse=True)
+
+	print('mat  amount  total')
+	for m in materials:
+		print(f'{m.ticker:4} {m.amount:>6} {m.total:6.0f}')
+
+@dataclasses.dataclass(eq=False, slots=True)
+class Material:
+	ticker: str
+	amount: int
+	spread: float
+	total: float
+
+	def __lt__(self, o: Material) -> bool:
+		return self.total < o.total
+
+
+if __name__ == '__main__':
+	main()

+ 11 - 6
supply.py

@@ -64,7 +64,8 @@ def main() -> None:
 		buys: dict[str, dict[str, int]] = {}
 		iteration_weight = iteration_volume = 0
 		for planet in planets:
-			buy, weight_used, volume_used = planet.buy_for_target(materials, target_days)
+			buy = planet.buy_for_target(target_days)
+			weight_used, volume_used = shipping_used(materials, buy)
 			iteration_weight += weight_used
 			iteration_volume += volume_used
 			if iteration_weight > args.weight or iteration_volume > args.volume:
@@ -141,6 +142,13 @@ def get_fio_burn(planet_names: typing.Sequence[str]) -> typing.Iterator[FIOBurn]
 		else:
 			raise ValueError(name + ' not found')
 
+def shipping_used(materials: dict[str, Material], buy: dict[str, int]) -> tuple[float, float]:
+	weight = volume = 0
+	for ticker, amount in buy.items():
+		weight += amount * materials[ticker]['Weight']
+		volume += amount * materials[ticker]['Volume']
+	return weight, volume
+
 def cyan(text: str) -> str:
 	return '\033[36m' + text + '\033[0m'
 
@@ -173,8 +181,7 @@ class Planet:
 			c['net_consumption'] = net
 			self.net_consumption.append(c)
 
-	def buy_for_target(self, materials: dict[str, Material], target_days: float) -> tuple[dict[str, int], float, float]:
-		weight_used = volume_used = 0
+	def buy_for_target(self, target_days: float) -> dict[str, int]:
 		buy: dict[str, int] = {}
 		for consumption in self.net_consumption:
 			ticker = consumption['MaterialTicker']
@@ -183,9 +190,7 @@ class Planet:
 			days = avail / daily_consumption
 			if days < target_days:
 				buy[ticker] = math.ceil((target_days - days) * daily_consumption)
-				weight_used += buy[ticker] * materials[ticker]['Weight']
-				volume_used += buy[ticker] * materials[ticker]['Volume']
-		return buy, weight_used, volume_used
+		return buy
 
 class Amount(typing.TypedDict):
 	MaterialTicker: str