raylu hai 2 meses
pai
achega
5d8b9f2516
Modificáronse 3 ficheiros con 34 adicións e 6 borrados
  1. 15 2
      dist/main.js
  2. 3 3
      dist/main.js.map
  3. 16 1
      src/main.ts

+ 15 - 2
dist/main.js

@@ -11,18 +11,31 @@ async function fetchData() {
   return { recipes, prices };
 }
 function render({ recipes, prices }) {
+  const priceMap = new Map;
+  for (const price of prices)
+    if (price.ExchangeCode == "PP7D_IC1")
+      priceMap.set(price.MaterialTicker, price.PriceAverage);
   const tbody = document.querySelector("tbody");
+  tbody.innerHTML = "";
   for (const recipe of recipes) {
     if (recipe.BuildingTicker !== "FRM")
       continue;
+    const runsPerDay = 1000 * 60 * 60 * 24 / recipe.TimeMs;
+    let costPerRun = 0;
+    for (const input of recipe.Inputs) {
+      const price = priceMap.get(input.Ticker);
+      if (price === undefined)
+        throw new Error(`missing price for ${input.Ticker}`);
+      costPerRun += price * input.Amount;
+    }
     const row = document.createElement("tr");
     row.innerHTML = `
 			<td>${recipe.RecipeName}</td>
-			<td></td>
+			<td>${(costPerRun * runsPerDay).toFixed(2)}</td>
 		`;
     tbody.appendChild(row);
   }
 }
 fetchData().then(render);
 
-//# debugId=87EA56A94163896264756E2164756E21
+//# debugId=2420FEED6C51286B64756E2164756E21

+ 3 - 3
dist/main.js.map

@@ -2,9 +2,9 @@
   "version": 3,
   "sources": ["../src/main.ts"],
   "sourcesContent": [
-    "interface Recipe {\n\tRecipeId: string;\n\tBuildingTicker: string;\n\tRecipeName: string;\n\tTimeMs: number;\n\tInputs: Array<{Ticker: string; Amount: number}>;\n\tOutputs: Array<{Ticker: string; Amount: number}>;\n}\n\ninterface Price {\n\tMaterialTicker: string;\n\tPriceAverage: number;\n}\n\nasync function fetchData(): Promise<{recipes: Recipe[]; prices: Price[]}> {\n\tconst [recipesResponse, exchangesResponse] = await Promise.all([\n\t\tfetch('https://api.prunplanner.org/data/recipes'),\n\t\tfetch('https://api.prunplanner.org/data/exchanges'),\n\t]);\n\tconst [recipes, prices] = await Promise.all([\n\t\trecipesResponse.json(),\n\t\texchangesResponse.json(),\n\t]);\n\treturn {recipes, prices};\n}\n\nfunction render({recipes, prices}: {recipes: Recipe[], prices: Price[]}) {\n\tconst tbody = document.querySelector('tbody') as HTMLTableSectionElement;\n\tfor (const recipe of recipes) {\n\t\tif (recipe.BuildingTicker !== 'FRM')\n\t\t\tcontinue;\n\t\tconst row = document.createElement('tr');\n\t\trow.innerHTML = `\n\t\t\t<td>${recipe.RecipeName}</td>\n\t\t\t<td></td>\n\t\t`;\n\t\ttbody.appendChild(row);\n\t}\n}\n\nfetchData().then(render);\n"
+    "interface Recipe {\n\tRecipeId: string;\n\tBuildingTicker: string;\n\tRecipeName: string;\n\tTimeMs: number;\n\tInputs: Array<{Ticker: string; Amount: number}>;\n\tOutputs: Array<{Ticker: string; Amount: number}>;\n}\n\ninterface Price {\n\tMaterialTicker: string;\n\tExchangeCode: string;\n\tPriceAverage: number;\n}\n\nasync function fetchData(): Promise<{recipes: Recipe[]; prices: Price[]}> {\n\tconst [recipesResponse, exchangesResponse] = await Promise.all([\n\t\tfetch('https://api.prunplanner.org/data/recipes'),\n\t\tfetch('https://api.prunplanner.org/data/exchanges'),\n\t]);\n\tconst [recipes, prices] = await Promise.all([\n\t\trecipesResponse.json(),\n\t\texchangesResponse.json(),\n\t]);\n\treturn {recipes, prices};\n}\n\nfunction render({recipes, prices}: {recipes: Recipe[], prices: Price[]}) {\n\tconst priceMap = new Map<string, number>();\n\tfor (const price of prices)\n\t\tif (price.ExchangeCode == 'PP7D_IC1')\n\t\t\tpriceMap.set(price.MaterialTicker, price.PriceAverage);\n\n\tconst tbody = document.querySelector('tbody') as HTMLTableSectionElement;\n\ttbody.innerHTML = '';\n\tfor (const recipe of recipes) {\n\t\tif (recipe.BuildingTicker !== 'FRM')\n\t\t\tcontinue;\n\t\tconst runsPerDay = 1000 * 60 * 60 * 24 / recipe.TimeMs;\n\t\tlet costPerRun = 0;\n\t\tfor (const input of recipe.Inputs) {\n\t\t\tconst price = priceMap.get(input.Ticker);\n\t\t\tif (price === undefined)\n\t\t\t\tthrow new Error(`missing price for ${input.Ticker}`);\n\t\t\tcostPerRun += price * input.Amount;\n\t\t}\n\t\tconst row = document.createElement('tr');\n\t\trow.innerHTML = `\n\t\t\t<td>${recipe.RecipeName}</td>\n\t\t\t<td>${(costPerRun * runsPerDay).toFixed(2)}</td>\n\t\t`;\n\t\ttbody.appendChild(row);\n\t}\n}\n\nfetchData().then(render);\n"
   ],
-  "mappings": ";AAcA,eAAe,SAAS,GAAkD;AAAA,EACzE,OAAO,iBAAiB,qBAAqB,MAAM,QAAQ,IAAI;AAAA,IAC9D,MAAM,0CAA0C;AAAA,IAChD,MAAM,4CAA4C;AAAA,EACnD,CAAC;AAAA,EACD,OAAO,SAAS,UAAU,MAAM,QAAQ,IAAI;AAAA,IAC3C,gBAAgB,KAAK;AAAA,IACrB,kBAAkB,KAAK;AAAA,EACxB,CAAC;AAAA,EACD,OAAO,EAAC,SAAS,OAAM;AAAA;AAGxB,SAAS,MAAM,GAAE,SAAS,UAA+C;AAAA,EACxE,MAAM,QAAQ,SAAS,cAAc,OAAO;AAAA,EAC5C,WAAW,UAAU,SAAS;AAAA,IAC7B,IAAI,OAAO,mBAAmB;AAAA,MAC7B;AAAA,IACD,MAAM,MAAM,SAAS,cAAc,IAAI;AAAA,IACvC,IAAI,YAAY;AAAA,SACT,OAAO;AAAA;AAAA;AAAA,IAGd,MAAM,YAAY,GAAG;AAAA,EACtB;AAAA;AAGD,UAAU,EAAE,KAAK,MAAM;",
-  "debugId": "87EA56A94163896264756E2164756E21",
+  "mappings": ";AAeA,eAAe,SAAS,GAAkD;AAAA,EACzE,OAAO,iBAAiB,qBAAqB,MAAM,QAAQ,IAAI;AAAA,IAC9D,MAAM,0CAA0C;AAAA,IAChD,MAAM,4CAA4C;AAAA,EACnD,CAAC;AAAA,EACD,OAAO,SAAS,UAAU,MAAM,QAAQ,IAAI;AAAA,IAC3C,gBAAgB,KAAK;AAAA,IACrB,kBAAkB,KAAK;AAAA,EACxB,CAAC;AAAA,EACD,OAAO,EAAC,SAAS,OAAM;AAAA;AAGxB,SAAS,MAAM,GAAE,SAAS,UAA+C;AAAA,EACxE,MAAM,WAAW,IAAI;AAAA,EACrB,WAAW,SAAS;AAAA,IACnB,IAAI,MAAM,gBAAgB;AAAA,MACzB,SAAS,IAAI,MAAM,gBAAgB,MAAM,YAAY;AAAA,EAEvD,MAAM,QAAQ,SAAS,cAAc,OAAO;AAAA,EAC5C,MAAM,YAAY;AAAA,EAClB,WAAW,UAAU,SAAS;AAAA,IAC7B,IAAI,OAAO,mBAAmB;AAAA,MAC7B;AAAA,IACD,MAAM,aAAa,OAAO,KAAK,KAAK,KAAK,OAAO;AAAA,IAChD,IAAI,aAAa;AAAA,IACjB,WAAW,SAAS,OAAO,QAAQ;AAAA,MAClC,MAAM,QAAQ,SAAS,IAAI,MAAM,MAAM;AAAA,MACvC,IAAI,UAAU;AAAA,QACb,MAAM,IAAI,MAAM,qBAAqB,MAAM,QAAQ;AAAA,MACpD,cAAc,QAAQ,MAAM;AAAA,IAC7B;AAAA,IACA,MAAM,MAAM,SAAS,cAAc,IAAI;AAAA,IACvC,IAAI,YAAY;AAAA,SACT,OAAO;AAAA,UACN,aAAa,YAAY,QAAQ,CAAC;AAAA;AAAA,IAE1C,MAAM,YAAY,GAAG;AAAA,EACtB;AAAA;AAGD,UAAU,EAAE,KAAK,MAAM;",
+  "debugId": "2420FEED6C51286B64756E2164756E21",
   "names": []
 }

+ 16 - 1
src/main.ts

@@ -9,6 +9,7 @@ interface Recipe {
 
 interface Price {
 	MaterialTicker: string;
+	ExchangeCode: string;
 	PriceAverage: number;
 }
 
@@ -25,14 +26,28 @@ async function fetchData(): Promise<{recipes: Recipe[]; prices: Price[]}> {
 }
 
 function render({recipes, prices}: {recipes: Recipe[], prices: Price[]}) {
+	const priceMap = new Map<string, number>();
+	for (const price of prices)
+		if (price.ExchangeCode == 'PP7D_IC1')
+			priceMap.set(price.MaterialTicker, price.PriceAverage);
+
 	const tbody = document.querySelector('tbody') as HTMLTableSectionElement;
+	tbody.innerHTML = '';
 	for (const recipe of recipes) {
 		if (recipe.BuildingTicker !== 'FRM')
 			continue;
+		const runsPerDay = 1000 * 60 * 60 * 24 / recipe.TimeMs;
+		let costPerRun = 0;
+		for (const input of recipe.Inputs) {
+			const price = priceMap.get(input.Ticker);
+			if (price === undefined)
+				throw new Error(`missing price for ${input.Ticker}`);
+			costPerRun += price * input.Amount;
+		}
 		const row = document.createElement('tr');
 		row.innerHTML = `
 			<td>${recipe.RecipeName}</td>
-			<td></td>
+			<td>${(costPerRun * runsPerDay).toFixed(2)}</td>
 		`;
 		tbody.appendChild(row);
 	}