| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- from __future__ import annotations
- import collections
- import re
- import sys
- import typing
- import cache
- if typing.TYPE_CHECKING:
- import roi
- def main() -> None:
- mat = sys.argv[1]
- recipes: list[roi.Recipe] = cache.get('https://api.prunplanner.org/data/recipes/')
- companies = pmmg_monthly_report()
- print(mat, '→')
- wrought = (recipe for recipe in recipes
- if mat in (i['material_ticker'] for i in recipe['inputs']) and len(recipe['outputs']) == 1)
- output_mats = {}
- for recipe in sorted(wrought, key=lambda r: r['outputs'][0]['material_ticker']):
- (output,) = recipe['outputs']
- (input,) = (i for i in recipe['inputs'] if i['material_ticker'] == mat)
- ratio = input['material_amount'] / output['material_amount']
- output_mats[output['material_ticker']] = ratio
- print(f'\t{output["material_ticker"]:3}:', ratio)
- companies_produced = companies_consumed = companies_consumed_80 = 0
- into = dict.fromkeys(output_mats.keys(), 0)
- for company in companies.values():
- if (co_production := company.get(mat)) is None:
- continue
- companies_produced += 1
- consumed = 0
- for output_mat, per_run_consumption in output_mats.items():
- if co_consumption := company.get(output_mat):
- total_consumption = co_consumption['amount'] * per_run_consumption
- consumed += total_consumption
- into[output_mat] += total_consumption
- if consumed > 0:
- companies_consumed += 1
- if consumed > 0.8 * co_production['amount']:
- companies_consumed_80 += 1
- print(f'{companies_produced} companies producing')
- print(f'{companies_consumed} companies consuming their own production')
- print(f'{companies_consumed_80} companies consuming 80%+ of their own production')
- recipes_per_output = collections.defaultdict(int)
- for recipe in recipes:
- for output in recipe['outputs']:
- if output['material_ticker'] in into:
- recipes_per_output[output['material_ticker']] += 1
- for output_mat, total in sorted(into.items(), key=lambda kv: kv[1], reverse=True):
- alt = ''
- if (recipe_count := recipes_per_output[output_mat]) != 1:
- alt = f' ({recipe_count} recipes)'
- print(f'{output_mat:3}: {total:8,.0f}{alt}')
- def pmmg_monthly_report() -> dict[str, dict[str, CompanyOutput]]:
- report_constants = cache.get(
- 'https://raw.githubusercontent.com/PMMG-Products/pmmg-products.github.io/main/reports/src/staticData/constants.ts', json=False)
- # export const months = ["mar25", "apr25", ..., "dec25", "jan26"];
- match = re.search(r'export const months = \[(.*?)\];', report_constants)
- assert match
- months_str = match.group(1)
- months = [m.strip().strip('"') for m in months_str.split(',')]
- last_month = months[-1]
- print('getting report for', last_month)
- return cache.get(f'https://pmmg-products.github.io/reports/data/company-data-{last_month}.json')['individual']
- class CompanyOutput(typing.TypedDict):
- amount: int
- if __name__ == '__main__':
- main()
|