import json from typing import Dict import requests import adbutils from pydantic import BaseModel from module.luahook.exception import CrackerError class CrackApi: class ShipProperties(BaseModel): armor: float = -1 speed: float = -1 antiaircraft: float = -1 oxy_recovery_bench: float = -1 torpedo: float = -1 hit: float = -1 sonarRange: float = -1 attack_duration: float = -1 raid_distance: float = -1 oxy_recovery_surface: float = -1 oxy_recovery: float = -1 dodge: float = -1 luck: float = -1 reload: float = -1 oxy_cost: float = -1 durability: float = -1 air: float = -1 oxy_max: float = -1 cannon: float = -1 antisub: float = -1 class FakePlayerInfo(BaseModel): name: str = "" level: str = "" id: str = "" class ShipInfo(BaseModel): config_id: int emotion: int rarity: int level: int exp: int curr_star: int class GlobalSpeedupRate(BaseModel): rate: float class BetterGlobalSpeedupRate(BaseModel): rate: float class ExerciseMorePowerRate(BaseModel): rate: float def __init__(self, base_url, timeout=10): self.api_url = base_url self.timeout = timeout def get(self, path, **kwargs): args = [] for k, v in kwargs.items(): if v is None: continue args.append(f'{k}={v}') if args: url = f'{self.api_url}/{path}?{"&".join(args)}' else: url = f'{self.api_url}/{path}' try: response = requests.get(url, headers={ "Connection": "close", }, timeout=self.timeout) except requests.exceptions.Timeout: raise CrackerError('CrackApi request timeout') except Exception as e: raise CrackerError(f'CrackApi request error: {e}') if response.status_code != 200: raise CrackerError(f'CrackApi response error: {response.status_code}') return response def post(self, path, data=None): url = f'{self.api_url}/{path}' if data is not None and isinstance(data, dict): data_str = json.dumps(data) else: data_str = data try: response = requests.post(url, data=data_str, headers={ "Connection": "close", }, timeout=self.timeout) except requests.exceptions.Timeout: raise CrackerError('CrackApi request timeout') except Exception as e: raise CrackerError(f'CrackApi request error: {e}') if response.status_code != 200: raise CrackerError(f'CrackApi response error: {response.status_code}') def get_coin(self) -> int: response = self.get('get_coin') return int(response.text) def get_oil(self) -> int: response = self.get('get_oil') return int(response.text) def get_gems(self) -> int: response = self.get('get_gems') return int(response.text) def get_level(self) -> int: response = self.get('get_level') return int(response.text) def get_exp(self) -> int: response = self.get('get_exp') return int(response.text) def get_merit(self) -> int: response = self.get('get_merit') return int(response.text) def get_guild_coin(self) -> int: response = self.get('get_guild_coin') return int(response.text) def get_design_prt(self) -> int: response = self.get('get_design_prt') return int(response.text) def get_core_data(self) -> str: response = self.get('get_core_data') return response.text def get_medal(self) -> int: response = self.get('get_medal') return int(response.text) def get_pt(self) -> int: response = self.get('get_pt') return int(response.text) def get_specialized_core(self) -> int: response = self.get('get_specialized_core') return int(response.text) def get_curr_action_points(self) -> int: response = self.get('get_curr_action_points') return int(response.text) def scan_dock(self) -> Dict[int, ShipInfo]: response = self.get('scan_dock') json_data = json.loads(response.text) res = {} for k, v in json_data.items(): res[int(k)] = CrackApi.ShipInfo(**v) return res def scan_storage(self) -> Dict[int, int]: response = self.get('scan_storage') json_data = json.loads(response.text) res = {} for k, v in json_data.items(): res[int(k)] = int(v) return res def get_ship_info(self, ship_id: int) -> ShipInfo: response = self.get('get_ship_info', id=ship_id) json_data = json.loads(response.text) return CrackApi.ShipInfo(**json_data) def get_storage_item_count(self, item_id: int) -> int: response = self.get('get_storage_item_count', id=item_id) return int(response.text) def enable_gg_factor(self): self.post('enable_gg_factor') def disable_gg_factor(self): self.post('disable_gg_factor') def update_gg_factor(self, gg_factor: float): self.post('update_gg_factor', data={'factor': gg_factor}) def disable_all(self): self.post('disable_all') def enable_global_ship_properties_crack(self): self.post('enable_global_ship_properties_crack') def disable_global_ship_properties_crack(self): self.post('disable_global_ship_properties_crack') def update_global_ship_properties(self, ship_properties: ShipProperties): self.post('update_global_ship_properties', data=ship_properties.json()) def enable_fast_stage_move(self): self.post("enable_fast_stage_move") def disable_fast_stage_move(self): self.post("disable_fast_stage_move") def enable_remove_hard_mode_ship_properties_limit(self): self.post("enable_remove_hard_mode_ship_properties_limit") def disable_remove_hard_mode_ship_properties_limit(self): self.post("disable_remove_hard_mode_ship_properties_limit") def enable_remove_hard_mode_ship_type_limit(self): self.post("enable_remove_hard_mode_ship_type_limit") def disable_remove_hard_mode_ship_type_limit(self): self.post("disable_remove_hard_mode_ship_type_limit") def enable_remove_hard_mode_limit(self): self.post("enable_remove_hard_mode_limit") def disable_remove_hard_mode_limit(self): self.post("disable_remove_hard_mode_limit") def enable_fake_player(self): self.post("enable_fake_player") def disable_fake_player(self): self.post("disable_fake_player") def update_fake_player_info(self, fake_player_info: FakePlayerInfo): self.post("update_fake_player_info", data=fake_player_info.json()) def enable_no_bb_animation(self): self.post("enable_no_bb_animation") def disable_no_bb_animation(self): self.post("disable_no_bb_animation") def enable_no_emotion_warning(self): self.post("enable_no_emotion_warning") def disable_no_emotion_warning(self): self.post("disable_no_emotion_warning") def enable_opsi_fast_move(self): self.post("enable_opsi_fast_move") def disable_opsi_fast_move(self): self.post("disable_opsi_fast_move") def enable_global_speedup(self): self.post("enable_global_speedup") def update_global_speedup_rate(self, rate: GlobalSpeedupRate): self.post("update_global_speedup_rate", data=rate.json()) def disable_global_speedup(self): self.post("disable_global_speedup") def enable_better_global_speedup(self): self.post("enable_better_global_speedup") def update_better_global_speedup_rate(self, rate: BetterGlobalSpeedupRate): self.post("update_better_global_speedup_rate", data=rate.json()) def disable_better_global_speedup(self): self.post("disable_better_global_speedup") def is_alive(self): self.post("is_alive") def enable_exercise_more_power(self): self.post("enable_exercise_more_power") def update_exercise_more_power_rate(self, rate: ExerciseMorePowerRate): self.post("update_exercise_more_power_rate", data=rate.json()) def disable_exercise_more_power(self): self.post("disable_exercise_more_power") def enable_exercise_god_mode(self): self.post("enable_exercise_god_mode") def disable_exercise_god_mode(self): self.post("disable_exercise_god_mode") def enable_fast_wave(self): self.post("enable_fast_wave") def disable_fast_wave(self): self.post("disable_fast_wave") def enable_monster_kill_self(self): self.post("enable_monster_kill_self") def disable_monster_kill_self(self): self.post("disable_monster_kill_self") def enable_skip_battle_celebrate(self): self.post("enable_skip_battle_celebrate") def disable_skip_battle_celebrate(self): self.post("disable_skip_battle_celebrate")