SatisfactoryPlusCalculator/factorygame/calculator/SatisfactoryCalculator.py
2024-01-28 14:12:46 +01:00

130 lines
5.2 KiB
Python

#!/usr/bin/env python3
import time
from collections import namedtuple
import click
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
Recipe = namedtuple("Recipe", ["result_count", "ingredients", "time"])
Ingredient = namedtuple("Ingredient", ["count", "name"])
@click.command()
@click.option("--result", type=str, required=True)
@click.option("--debug", is_flag=True, default=False, required=False)
def main(result: str, debug: bool):
if result:
firefox_options = Options()
if not debug:
firefox_options.add_argument("--headless")
browser = Firefox(options=firefox_options)
try:
browser.get("https://wiki.kyrium.space/")
browser.set_window_size(1600, 1015)
search_bar = browser.find_element(
By.CSS_SELECTOR, "nav input[placeholder='Search for an item...']"
)
search_bar.click()
search_bar.send_keys(result)
search_button = browser.find_element(By.CSS_SELECTOR, "nav button[type='submit']")
search_button.click()
browser.implicitly_wait(3)
choices = browser.find_elements(
By.CSS_SELECTOR, "body > div > .container:nth-child(1) a.items-center"
)
if not choices:
print("No wiki entries found for this result")
return
elif len(choices) > 1:
default_choice = 1
for choice_idx in range(1, len(choices) + 1):
recipe_choice = choices[choice_idx - 1]
name = recipe_choice.find_element(By.TAG_NAME, "img").get_attribute("alt")
if name.casefold() == result.casefold():
default_choice = choice_idx
print(f"{choice_idx}: {name}")
user_choice = input(f"Chose a recipe to continue… (default: {default_choice}) ")
if not user_choice:
user_choice = default_choice
else:
user_choice = int(user_choice)
choices[user_choice - 1].click()
else:
choices[0].click()
browser.find_element(By.CSS_SELECTOR, "button#\\3Ar1\\3A-tab-0").click()
recipes = browser.find_elements(By.CSS_SELECTOR, "#\\3Ar1\\3A-tabpanel-0 > div > div")
for recipe_idx in range(len(recipes)):
recipe = recipes[recipe_idx]
print(
"recipe",
recipe_idx,
"produced in:",
recipe.find_element(By.CSS_SELECTOR, ".flex-col > span > a").text,
)
ingredients = recipe.find_elements(
By.CSS_SELECTOR, f".flex-row > div:nth-child(1) > div:has(> a)"
)
for ingredient_idx in range(len(ingredients)):
ingredient = ingredients[ingredient_idx]
print(
"recipe",
recipe_idx,
"ingredient",
ingredient_idx,
"name:",
ingredient.find_element(By.TAG_NAME, "img").get_attribute("alt"),
)
print(
"recipe",
recipe_idx,
"ingredient",
ingredient_idx,
"count:",
ingredient.find_element(By.CSS_SELECTOR, ".text-xs:nth-child(2)").text,
)
print(
"recipe",
recipe_idx,
"ingredient",
ingredient_idx,
"time:",
ingredient.find_element(By.CSS_SELECTOR, ".text-xs:nth-child(3)").text,
)
results = recipe.find_elements(
By.CSS_SELECTOR, f".flex-row > div:nth-child(3) > div:has(> a)"
)
for result_idx in range(len(results)):
result = results[result_idx]
print(
"recipe",
recipe_idx,
"result",
result_idx,
"name:",
result.find_element(By.TAG_NAME, "img").get_attribute("alt"),
)
print(
"recipe",
recipe_idx,
"result",
result_idx,
"count:",
result.find_element(By.CSS_SELECTOR, ".text-xs:nth-child(2)").text,
)
print(
"recipe",
recipe_idx,
"result",
result_idx,
"time:",
result.find_element(By.CSS_SELECTOR, ".text-xs:nth-child(3)").text,
)
finally:
if not debug:
browser.quit()