def slotset(): admiral = get_token_admiral_or_error() admiral_ship_id = request.values.get("api_id") admiral_item_id = request.values.get("api_item_id") slot = request.values.get("api_slot_idx") ShipHelper.change_ship_item(admiral_ship_id, admiral_item_id, slot) return svdata({'api_result_msg': 'ok', 'api_result': 1})
def slotset(): admiral = get_token_admiral_or_error() admiral_ship_id = request.values.get("api_id") admiral_item_id = request.values.get("api_item_id") slot = request.values.get("api_slot_idx") ShipHelper.change_ship_item(admiral_ship_id,admiral_item_id,slot) return svdata({'api_result_msg': 'ok', 'api_result': 1})
def craft_ship(fuel: int, ammo: int, steel: int, baux: int, admiral: db.Admiral, dockid: int): """ Crafts a ship from a recipe. :param fuel: The amount of fuel to use. :param ammo: The amount of ammo to use. :param steel: The amount of steel to use. :param baux: The amount of bauxite to use. :param admiral: The admiral object to use. :param dockid: The local dock id. :return: The v1 api data for a crafted ship. """ ship = get_ship_from_recipe(fuel, ammo, steel, baux) nship = ShipHelper.generate_new_ship(ship, active=False) nship.local_ship_num = len(admiral.admiral_ships.all()) # Change dock data. dockid = admiral.docks.all()[dockid] dockid = update_dock(dockid, fuel, ammo, steel, baux, nship) db.db.session.add(dockid) db.db.session.commit() admiral.admiral_ships.append(nship) db.db.session.add(admiral) api_data = { "api_ship_id": ship, "api_kdock": generate_dock_data(admiral_obj=admiral)['cdock'], "api_id": nship.local_ship_num, "api_slotitem": [], "api_ship": ShipHelper.generate_api_data(admiralid=admiral.id, original_ship=nship) } db.db.session.commit() return api_data
def firstship(): admiral = get_token_admiral_or_error() if admiral.setup: return svdata({'api_result_msg': "Nice try.", 'api_result': 200}) shipid = request.values.get("api_ship_id") ShipHelper.assign_ship(admiral, shipid) admiral.setup = True db.session.add(admiral) db.session.commit() return svdata({'api_result_msg': 'shitty api is shitty', 'api_result': 1})
def ship_add(admiral_id, ship_id): """ This is going to crash the game after 4 uses because tThe method adds a new fleet every time it's called. I could fix it, be we'll refactor most of this really soon, so I can't be bothered. """ admiral = db.session.query(Admiral).get(admiral_id) ship = db.session.query(Ship).get(ship_id) if ship is not None: ShipHelper.assign_ship(admiral, ship_id) db.session.commit() print("Ship {} added to Admiral {}".format(ship.name, admiral.id)) else: print("Ship id {} not found".format(ship_id))
def ship_add(admiral_id,ship_id): """ This is going to crash the game after 4 uses because tThe method adds a new fleet every time it's called. I could fix it, be we'll refactor most of this really soon, so I can't be bothered. """ admiral = db.session.query(Admiral).get(admiral_id) ship = db.session.query(Ship).get(ship_id) if ship is not None: ShipHelper.assign_ship(admiral,ship_id) db.session.commit() print("Ship {} added to Admiral {}".format(ship.name,admiral.id)) else: print("Ship id {} not found".format(ship_id))
def get_and_remove_ship(dockid: int, build=True): """ Used by the /getship APIv1 endpoint. Retrieves a ship from the specified dock and removes it. :param dockid: The specified dock ID. :param build: If the ship is being built or not. If false, it's repaired. :return: The v1 API data for the dock. """ admiral = util.get_token_admiral_or_error() try: dock = admiral.docks.all()[dockid] except IndexError: return None dock.fuel, dock.ammo, dock.steel, dock.baux, dock.cmats = 0, 0, 0, 0, 0 dock.ship.active = True if not build: dock.ship.current_hp = dock.ship.ship.hp_base if not dock.ship.ship.kai else dock.ship.ship.maxhp db.db.session.add(dock.ship) api_data = { "api_ship_id": dock.ship.ship.id, "api_kdock": generate_dock_data(admiral_obj=admiral)['cdock' if build else 'rdock'], "api_id": dock.ship.local_ship_num, "api_slotitem": [], "api_ship": ShipHelper.generate_api_data(admiralid=admiral.id, original_ship=dock.ship) } dock.ship = None dock.complete = None db.db.session.add(dock) db.db.session.commit() return api_data
def update_dock(dock: db.Dock, fuel: int=None, ammo: int=None, steel: int=None, baux: int=None, ship: db.AdmiralShip=None, build=True): """ Updates a dock with the correct values. Can be called just like ```update_dock(dock)``` to reset the dock. :param dock: The dock object to work on. :param fuel: The amount of fuel in the recipe. :param ammo: The amount of ammo in the recipe. :param steel: The amount of steel in the recipe. :param baux: The amount of Bauxite in the recipe. :param ship: The ship object to add to the dock. :return: """ dock.fuel = fuel dock.ammo = ammo dock.steel = steel dock.baux = baux if ship is not None: dock.cmats = 1 try: if build: ntime = util.millisecond_timestamp( datetime.datetime.now() + datetime.timedelta(minutes=ship.ship.buildtime)) else: ntime = util.millisecond_timestamp( datetime.datetime.now() + datetime.timedelta(minutes=ShipHelper.get_repair_time(ship))) except TypeError: ntime = util.millisecond_timestamp(datetime.datetime.now() + datetime.timedelta(minutes=22)) dock.complete = ntime else: dock.cmats = 0 dock.complete = 0 dock.ship = ship return dock
def setup(first_ship_id: int, admiral: db.Admiral): """ Sets up an admiral. This is for both APIv1 and APIv2. :param first_ship_id: The ID of the very first ship. :param admiral: The admiral object to setup. :return: The setup admiral. """ if admiral.setup: return # Create a new ship. ship = ShipHelper.generate_new_ship(first_ship_id, 0) # Assign ship the correct local ship number. ship.local_ship_num = len(admiral.admiral_ships.all()) # Create a new fleet. fleet = db.Fleet() # Add the ship to the first fleet. fleet.ships.append(ship) # Add the ship to the admiral admiral.admiral_ships.append(ship) # Add the fleet to the admiral admiral.fleets.append(fleet) # Give the admiral starting resources admiral.resources = "500,500,500,500,1,1,3,0" # Give the admiral some docks. docks = [db.Dock() for _ in range(8)] admiral.docks = docks # Return the admiral admiral.setup = True return admiral
def cheat_addship(id, admiral_id): """Give the specified admiral a ship.""" admiral = Admiral.query.filter_by(id=admiral_id).first() ship = ShipHelper.generate_new_ship(id, None) ship.local_ship_num = len(admiral.admiral_ships.all()) if admiral: admiral.admiral_ships.append(ship) db.session.add(admiral) db.session.commit() print("Added ship {}".format(ship.ship.name))
def ship3(): admiral = get_token_admiral_or_error() #No idea. #spi_sort_order = request.values.get('spi_sort_order') #spi_sort_order = request.values.get('api_sort_key') admiral_ship_id = request.values.get('api_shipid') data = { "api_ship_data":[ShipHelper.get_admiral_ship_api_data(admiral_ship_id)], "api_deck_data": AdmiralHelper.get_admiral_deck_api_data(admiral), "api_slot_data": ItemHelper.get_slottype_list(admiral=admiral) } return svdata(data)
def ship2(): """F**k ship2.""" ships = {'api_ship': []} admiral = get_token_admiral_or_error() admiral_ships = sorted(admiral.admiral_ships.all(), key=lambda x: x.local_ship_num) for num, ship in enumerate(admiral_ships): if not ship.active: continue assert isinstance(ship, AdmiralShip) ships['api_ship'].append(ShipHelper.generate_api_data(admiral.id, ship.local_ship_num)) return svdata(ships)
def craft_ship(fuel: int, ammo: int, steel: int, baux: int, admiral: db.Admiral, dock: int): ship = get_ship_from_recipe(fuel, ammo, steel, baux) nship = ShipHelper.generate_new_ship(ship, active=False) nship.local_ship_num = len(admiral.admiral_ships.all()) # Change dock data. dock = admiral.docks.all()[dock] dock = update_dock(dock, fuel, ammo, steel, baux, nship) db.db.session.add(dock) db.db.session.commit() admiral.admiral_ships.append(nship) db.db.session.add(admiral) api_data = { "api_ship_id": ship, "api_kdock": generate_dock_data(admiral_obj=admiral)['cdock'], "api_id": nship.local_ship_num, "api_slotitem": [], "api_ship": ShipHelper.generate_api_data(admiralid=admiral.id, original_ship=nship) } db.db.session.commit() return api_data
def setup(first_ship_id: int, admiral: db.Admiral): if admiral.setup: return # Create a new ship. ship = ShipHelper.generate_new_ship(first_ship_id, 0) # Assign ship the correct local ship number. ship.local_ship_num = len(admiral.admiral_ships.all()) # Create a new fleet. fleet = db.Fleet() # Add the ship to the first fleet. fleet.ships.append(ship) # Add the ship to the admiral admiral.admiral_ships.append(ship) # Add the fleet to the admiral admiral.fleets.append(fleet) # Give the admiral starting resources admiral.resources = "500,500,500,500,1,1,3,0" # Give the admiral some docks. docks = [db.Dock() for _ in range(8)] admiral.docks = docks # Return the admiral admiral.setup = True return admiral
def get_ship(dockid: int): admiral = util.get_token_admiral_or_error() try: dock = admiral.docks.all()[dockid] except IndexError: return None dock.fuel, dock.ammo, dock.steel, dock.baux, dock.cmats = 0, 0, 0, 0, 0 dock.ship.active = True db.db.session.add(dock.ship) api_data = { "api_ship_id": dock.ship.ship.id, "api_kdock": generate_dock_data(admiral_obj=admiral)['cdock'], "api_id": dock.ship.local_ship_num, "api_slotitem": [], "api_ship": ShipHelper.generate_api_data(admiralid=admiral.id, original_ship=dock.ship) } dock.ship = None dock.complete = None db.db.session.add(dock) db.db.session.commit() return api_data
def generate_port(api_token): # First, get the admiral. admiral = util.get_token_admiral_or_error(api_token) assert isinstance(admiral, db.Admiral) # Initial KanColle reply. port2 = { "api_result_msg": "成功", "api_result": 1, "api_data": {} } # TODO: Log entry port2["api_data"]['api_log'] = [ { "api_state": "0", "api_no": 0, "api_type": "1", "api_message": "ayy lmao" } ] # Background music? port2["api_data"]["api_p_bgm_id"] = 100 # This sets the parallel quest count. Don't know what higher values do, default is 5. # port2["api_data"]["api_parallel_quest_count"] = 5 # Combined flag? Event data probably. port2["api_data"]["api_combined_flag"] = 0 # API basic - a replica of api_get_member/basic basic = AdmiralHelper.get_admiral_basic_info() port2['api_data']['api_basic'] = util.merge_two_dicts(basic, { 'api_medals': 0, 'api_large_dock': 0 }) port2['api_data']['api_deck_port'] = [] count = 0 admiral_ships = sorted(admiral.admiral_ships.all(), key=lambda x: x.local_ship_num) # Fleets. for fleet in admiral.fleets.all(): count += 1 ships = [ship.local_ship_num+1 for ship in fleet.ships.all() if ship is not None] temp_dict = { # Unknown value, always zero for some reason. 'api_flagship': 0, # The Admiral ID, presumably. 'api_member_id': admiral.id, # The name of the fleet. 'api_name': fleet.name, # Unknown value, always empty. 'api_name_id': "", # The local fleet ID. 'api_id': count, # List of ships. "api_ship": ships + [-1] * (6 - len(ships)), # Mission data? "api_mission": [0, 0, 0, 0] } port2['api_data']['api_deck_port'].append(temp_dict) # Materials. port2['api_data']['api_material'] = [ {"api_id": n + 1, "api_member_id": admiral.id, "api_value": int(val)} for n, val in enumerate(admiral.resources.split(',')) ] # Ships! Yay! (said nobody) port2['api_data']['api_ship'] = [] # Generate the absolute clusterfuck. # count = 0 for num, ship in enumerate(admiral_ships): # count += 1 if not ship.active: continue assert isinstance(ship, db.AdmiralShip) port2['api_data']['api_ship'].append(ShipHelper.generate_api_data(admiral.id, ship.local_ship_num)) # Generate ndock. port2['api_data']['api_ndock'] = DockHelper.generate_dock_data(admiral)['rdock'] return port2
def generate_port(api_token): # First, get the admiral. admiral = util.get_token_admiral_or_error(api_token) assert isinstance(admiral, Admiral) # Initial KanColle reply. port2 = { "api_data": {} } # TODO: Log entry port2["api_data"]['api_log'] = [ { "api_state": "0", "api_no": 0, "api_type": "1", "api_message": "ayy lmao" } ] # Background music? port2["api_data"]["api_p_bgm_id"] = 100 # This sets the parallel quest count. Don't know what higher values do, default is 5. # I set it to ten because f**k the police port2["api_data"]["api_parallel_quest_count"] = 10 # Combined flag? Event data probably. port2["api_data"]["api_combined_flag"] = 0 # API basic - a replica of api_get_member/basic basic = AdmiralHelper.get_admiral_basic_info() port2['api_data']['api_basic'] = util.merge_two_dicts(basic, { 'api_medals': 0, 'api_large_dock': 0 }) port2['api_data']['api_deck_port'] = [] #AdmiralHelper.get_admiral_deck_api_data(admiral) count = 0 # Sort the admiral ships list. Not even sure if this is needed... # Fleets. for fleet in admiral.fleets.all(): count += 1 ships = [ship.local_ship_num+1 for ship in fleet.ships.all() if ship is not None] temp_dict = { # Unknown value, always zero for some reason. 'api_flagship': 0, # The Admiral ID, presumably. 'api_member_id': admiral.id, # The name of the fleet. 'api_name': fleet.name, # Unknown value, always empty. 'api_name_id': "", # The local fleet ID. 'api_id': count, # List of ships. "api_ship": ships + [-1] * (6 - len(ships)), # Mission data? "api_mission": [0, 0, 0, 0] } port2['api_data']['api_deck_port'].append(temp_dict) # Materials. port2['api_data']['api_material'] = AdmiralHelper.get_admiral_resources_api_data(admiral) port2['api_data']['api_ship'] = [] # Ship data, Luckily this is generated for us by a helper class. admiral_ships = sorted(admiral.admiral_ships.all(), key=lambda x: x.local_ship_num) for num, ship in enumerate(admiral_ships): if not ship.active: continue assert isinstance(ship, AdmiralShip) port2['api_data']['api_ship'].append(ShipHelper.get_admiral_ship_api_data(ship.id)) # Generate ndock. port2['api_data']['api_ndock'] = DockHelper.generate_dock_data(admiral)['rdock'] return port2
def generate_port(api_token): # First, get the admiral. admiral = util.get_token_admiral_or_error(api_token) assert isinstance(admiral, Admiral) # Initial KanColle reply. port2 = {"api_data": {}} # TODO: Log entry port2["api_data"]['api_log'] = [{ "api_state": "0", "api_no": 0, "api_type": "1", "api_message": "ayy lmao" }] # Background music? port2["api_data"]["api_p_bgm_id"] = 100 # This sets the parallel quest count. Don't know what higher values do, default is 5. # I set it to ten because f**k the police port2["api_data"]["api_parallel_quest_count"] = 10 # Combined flag? Event data probably. port2["api_data"]["api_combined_flag"] = 0 # API basic - a replica of api_get_member/basic basic = AdmiralHelper.get_admiral_basic_info() port2['api_data']['api_basic'] = util.merge_two_dicts( basic, { 'api_medals': 0, 'api_large_dock': 0 }) port2['api_data']['api_deck_port'] = [ ] #AdmiralHelper.get_admiral_deck_api_data(admiral) count = 0 # Sort the admiral ships list. Not even sure if this is needed... # Fleets. for fleet in admiral.fleets.all(): count += 1 ships = [ ship.local_ship_num + 1 for ship in fleet.ships.all() if ship is not None ] temp_dict = { # Unknown value, always zero for some reason. 'api_flagship': 0, # The Admiral ID, presumably. 'api_member_id': admiral.id, # The name of the fleet. 'api_name': fleet.name, # Unknown value, always empty. 'api_name_id': "", # The local fleet ID. 'api_id': count, # List of ships. "api_ship": ships + [-1] * (6 - len(ships)), # Mission data? "api_mission": [0, 0, 0, 0] } port2['api_data']['api_deck_port'].append(temp_dict) # Materials. port2['api_data'][ 'api_material'] = AdmiralHelper.get_admiral_resources_api_data(admiral) port2['api_data']['api_ship'] = [] # Ship data, Luckily this is generated for us by a helper class. admiral_ships = sorted(admiral.admiral_ships.all(), key=lambda x: x.local_ship_num) for num, ship in enumerate(admiral_ships): if not ship.active: continue assert isinstance(ship, AdmiralShip) port2['api_data']['api_ship'].append( ShipHelper.get_admiral_ship_api_data(ship.id)) # Generate ndock. port2['api_data']['api_ndock'] = DockHelper.generate_dock_data( admiral)['rdock'] return port2