import json from datetime import datetime import Adam.util_info import utils as U from functools import cmp_to_key def compare_keys(key1, key2): if len(key1) < len(key2): return -1 elif len(key1) > len(key2): return 1 else: if key1 < key2: return -1 elif key1 > key2: return 1 else: return 0 key_cmp_func = cmp_to_key(compare_keys) def generate_next_key(current_key): if current_key[-1] != 'z': return current_key[:-1] + chr(ord(current_key[-1]) + 1) else: if current_key == 'z': return 'aa' else: return generate_next_key(current_key[:-1]) + 'a' def rename_item(item: str): if 'log' in item: return 'log' elif 'planks' in item: return 'planks' elif 'fence_gate' in item: return 'fence_gate' elif 'fence' in item: return 'fence' else: return item def rename_item_rev(item: str): if 'log' in item: return 'oak_log' elif 'planks' in item: return 'oak_planks' elif 'fence_gate' in item: return 'oak_fence_gate' elif 'fence' in item: return 'oak_fence' else: return item def translate_item_name_to_letter(name: str): return Adam.util_info.material_names_rev_dict[rename_item(name)] def translate_item_name_list_to_letter(name_list: list): return [translate_item_name_to_letter(item) for item in name_list] def translate_item_letter_to_name(letter: str): return Adam.util_info.material_names_dict[letter] def translate_action_name_to_letter(name: str): return Adam.util_info.action_names_rev_dict[name] def translate_action_letter_to_name(letter: str): if letter[:4] == 'move': return letter return Adam.util_info.action_names_dict[letter] def check_in_material(added_items: list, effect: str): for added_item in added_items: if translate_item_letter_to_name(effect) == rename_item(added_item): return True return False def check_len_valid(materials: list): for item in materials: if len(item) > 2: return False return True def get_inventory_number(inventory: dict, material: str): material_name = rename_item_rev(translate_item_letter_to_name(material)) if material_name in ['oak_log', 'oak_planks', 'stick', 'cobblestone', 'raw_iron', 'iron_ingot', 'diamond', 'raw_gold', 'gold_ingot']: inventory[material_name] = 32 else: inventory[material_name] = 1 return inventory def get_item_changes(start_item: dict, end_item: dict): consumed_items = [] added_items = [] for item, quantity in start_item.items(): if item not in end_item or end_item[item] < quantity: consumed_items.append(item) for item, quantity in end_item.items(): if item not in start_item or start_item[item] < quantity: added_items.append(item) return consumed_items, added_items def recorder(start_item: dict, end_item: dict, consumed_items: list, added_items: list, action_type: str, file_path: str): log_json_path = U.f_join(file_path, "log_data", action_type + ".json") log_dict = { 'Start item': start_item, 'End item': end_item, 'Action type': action_type, 'Consumed items': consumed_items, 'Added items': added_items, } try: with open(log_json_path, 'r') as file: try: logs = json.load(file) except json.JSONDecodeError: logs = [] except FileNotFoundError: logs = [] logs.append(log_dict) with open(log_json_path, 'w') as file: json.dump(logs, file, indent=4) def get_time(): now = datetime.now() return now.strftime("%Y-%m-%d-%H-%M-%S")