You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
8.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import yaml
import json
import requests
from fluent.syntax import parse, ast
yaml.SafeLoader.add_multi_constructor("", lambda loader, tag_suffix, node: None)
# медицинские реагентов
MEDICINE_R = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/medicine.yml"
MEDICINE = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Recipes/Reactions/medicine.yml"
MEDICINE_LOCALISATION = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/medicine.ftl"
CHEMICALS_R = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/chemicals.yml"
CHEMICALS = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Recipes/Reactions/chemicals.yml"
CHEMICALS_LOCALISATION= "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/chemicals.ftl"
# элементы раздатчика химикатов
ELEMENTS_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/elements.yml"
ELEMENTS_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/elements.ftl"
# токсины
TOXINS = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/toxins.yml"
TOXINS_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/toxins.ftl"
# локализация наркотиков/наркотических препаратов
NARCOTICS_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/narcotics.ftl"
# газы
GASES_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/gases.yml"
GASES_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/gases.ftl"
# биология
BIOLOGY_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/biological.yml"
BIOLOGY_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/biological.ftl"
# ботаника
BOTANY = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/botany.yml"
BOTANY_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/botany.ftl"
# все съедобное и питьевое
FOOD = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml"
FOOD_R = "https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml"
INGREDIENTS_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml"
DRINKS_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml"
ALCOHOL_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml"
INGREDIENTS_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/consumable/food/ingredients.ftl"
ALCOHOL_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/consumable/drink/alcohol.ftl"
CONDIMENTS_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/consumable/food/condiments.ftl"
DRINKS_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/consumable/drink/drinks.ftl"
FOOD_LOCALISATION_URL = "https://github.com/SerbiaStrong-220/space-station-14/raw/master/Resources/Locale/ru-RU/reagents/meta/consumable/food/ingredients.ftl"
class Reagent:
def __init__(self, init_data: dict):
self.__name: str = init_data.get("name")
# self.__desc: str = init_data.get("desc")
self.__recipe: dict = init_data.get("reactants")
self.__product = init_data.get("products")
self.__category = init_data.get("category")
# raw значения которые обработаны
self.heat: bool = init_data.get("heat")
@property
def name(self):
return localise(self.__name).capitalize()
# @property
# def description(self):
# return localise(self.__desc)
@property
def recipe(self):
result = []
# Добавляем количество в итоге
react_res = self.__product
for i in react_res:
if i.lower() == self.__name.replace('reagent-name-','',1).replace('-','',1):
result.append(react_res[i])
# Добавляем категорию
print(self.__category)
result.append(self.__category)
if not self.__recipe:
return None
for item in self.__recipe:
# "Бикаридин": [ 2, ["Углерод", 1], ["Инапровалин", 1] ]
result.append([localise(item).capitalize(), self.__recipe[item]['amount']])
#print(result)
return result
def load_localisation():
data = {"elements": {}, "placeholders": {}}
elements_urls = [ELEMENTS_URL, REAGENTS_URL, TOXINS_URL, GASES_URL, FOOD_URL, DRINKS_URL, BIOLOGY_URL,
CONDIMENTS_URL, BOTANY_URL, ALCOHOL_URL, CHEMICALS_URL, INGREDIENTS_URL]
for url in elements_urls:
response = yaml.load(requests.get(url).content.decode("utf-8"), Loader=yaml.SafeLoader)
for i in response:
data["elements"][i["id"]] = {"name": i["name"], "desc": i["desc"]}
localisation_urls = [MEDICINE_LOCALISATION, ELEMENTS_LOCALISATION_URL, TOXINS_LOCALISATION_URL,
GASES_LOCALISATION_URL, DRINKS_LOCALISATION_URL, FOOD_LOCALISATION_URL,
CONDIMENTS_LOCALISATION_URL, BIOLOGY_LOCALISATION_URL, NARCOTICS_LOCALISATION_URL,
BOTANY_LOCALISATION_URL, ALCOHOL_LOCALISATION_URL, CHEMICALS_LOCALISATION,
INGREDIENTS_LOCALISATION_URL]
for url in localisation_urls:
response = requests.get(url).content.decode("utf-8")
for entry in parse(response).body:
if isinstance(entry, ast.Message):
data["placeholders"][entry.id.name] = entry.value.elements[0].value
with open("locale.json", mode="w", encoding="utf-8") as localisation_file:
json.dump(data, localisation_file, ensure_ascii=False, indent=2)
def localise(key: str) -> str:
with open("locale.json", mode="r", encoding="utf-8") as file:
data = json.load(file)
if "-" in key: # если это placeholder
return data["placeholders"].get(key, f"[p] {key}")
elif key in data["elements"]:
return localise(data["elements"][key]["name"])
else:
print('No localisation: ', key)
return f"[!] {key}"
# Показатель прогресса
from tqdm import tqdm
# Загрузить локализацию если нету файла
import os
if not os.path.exists('locale.json'):
load_localisation()
content = {}
def yml_load(url):
return yaml.load(requests.get(url).content.decode("utf-8"), Loader=yaml.SafeLoader)
def load_reagents(url,name):
for item in tqdm(yml_load(url), desc=name+'_reagents'):
content[item["id"]] = {"name": item["name"], "desc": item["desc"]}
def load_recipes(url,name):
global content
for item in tqdm(yml_load(url), desc=name+'_recipes'):
# print(item["id"])
if item["id"] not in content:
continue
content[item["id"]]["heat"] = "minTemp" in item
content[item["id"]]["reactants"] = {
element: {"amount": item["reactants"][element]["amount"], "reagent": element in content} for element in
item["reactants"]}
content[item["id"]]["products"] = item["products"]
content[item["id"]]["category"] = name
load_reagents(BOTANY, 'botany')
load_reagents(TOXINS, 'toxins')
load_reagents(MEDICINE_R, 'medicine')
# Не загружается?
load_reagents(CHEMICALS_R, 'chemicals')
#load_reagents(FOOD_R, 'food')
load_reagents(FOOD_R, 'food')
load_recipes(MEDICINE, 'medicine')
load_recipes(CHEMICALS, 'chemicals')
load_recipes(CHEMICALS, 'chemicals')
# TODO: Включать ли токсины без крафта? (некоторые имеют крафт)
reagents = [Reagent(init_data=content[item]) for item in content if "reactants" in content[item]]
db = {x.name: x.recipe for x in reagents}
from db import *
write_db(db)