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 lock(): admiral = get_token_admiral_or_error() admiralship = admiral.admiral_ships.filter_by(local_ship_num=int(request.values.get("api_ship_id"))).first() admiralship.heartlocked = True db.db.session.add(admiralship) db.db.session.commit() return svdata({})
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 change_position(): # TODO UNFUCK THIS CODE UP admiral = get_token_admiral_or_error() # Get request parameters fleet_id = int(request.values.get("api_id")) - 1 ship_id = int(request.values.get("api_ship_id")) - 1 ship_pos = int(request.values.get("api_ship_idx")) fleet = admiral.fleets.all()[fleet_id] fships = fleet.ships.all() print(ship_id, ship_pos) if ship_id == -2: # Delete ship. oldship = fships[ship_pos] oldship.local_fleet_num = None fships.remove(oldship) # Get the rest of the ships, and bump it down. for n, ship in enumerate(fships): if n > ship_id: ship.local_fleet_num -= 1 fships[n] = ship fleet.ships = fships elif len(fships) == ship_pos: # Append to the ships list if admiral.admiral_ships.filter_by(local_ship_num=ship_id).first() in fships: pass else: # Get the first ship, update the local fleet num, and append it to the fleet. nship = admiral.admiral_ships.filter_by(local_ship_num=ship_id).first() nship.local_fleet_num = ship_pos fships.append(nship) fleet.ships = fships else: # Get the original ship. original_ship = fships[ship_pos] # Get the new ship. new_ship = fleet.ships.filter_by(local_ship_num=ship_id).first() if new_ship is None: # BLEH original_ship.local_fleet_num = None original_ship.fleet_id = None db.session.add(original_ship) new_ship = admiral.admiral_ships.filter_by(local_ship_num=ship_id).first() new_ship.local_fleet_num = ship_pos fleet.ships.append(new_ship) db.session.add(fleet) db.session.commit() return svdata({}) # Do the bullshit swap. original_ship.local_fleet_num, new_ship.local_fleet_num = new_ship.local_fleet_num, original_ship.local_fleet_num # Eww, merge ships back into the admiral_ships table db.session.add(original_ship) db.session.add(new_ship) # Update the fleet. db.session.add(fleet) db.session.commit() return svdata({})
def build(): admiral = get_token_admiral_or_error() fuel = int(request.values.get("api_item1")) ammo = int(request.values.get("api_item2")) steel = int(request.values.get("api_item3")) baux = int(request.values.get("api_item4")) dock = int(request.values.get("api_kdock_id")) # -1 # For some reason, it doesn't need minusing one. ¯\_(ツ)_/¯ _DockHelper.craft_ship(fuel, ammo, steel, baux, admiral, dock) return svdata({})
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") new_admiral = AdmiralHelper.setup(shipid, admiral) db.db.session.add(new_admiral) db.db.session.commit() return svdata({'api_result_msg': 'shitty api is shitty', 'api_result': 1})
def lock(): """Heartlock/unheartlock a ship.""" admiral = get_token_admiral_or_error() admiralship = admiral.admiral_ships.filter_by(local_ship_num=int(request.values.get("api_ship_id")) - 1).first() locked = not admiralship.heartlocked admiralship.heartlocked = locked db.session.add(admiralship) db.session.commit() return svdata({"api_locked": int(locked)})
def build(): admiral = get_token_admiral_or_error() fuel = int(request.values.get("api_item1")) ammo = int(request.values.get("api_item2")) steel = int(request.values.get("api_item3")) baux = int(request.values.get("api_item4")) dock = int( request.values.get("api_kdock_id") ) # -1 # For some reason, it doesn't need minusing one. ¯\_(ツ)_/¯ DockHelper.craft_ship(fuel, ammo, steel, baux, admiral, dock) return svdata({})
def lock(): """Heartlock/unheartlock a ship.""" admiral = get_token_admiral_or_error() admiralship = admiral.admiral_ships.filter_by( local_ship_num=int(request.values.get("api_ship_id")) - 1).first() locked = not admiralship.heartlocked admiralship.heartlocked = locked db.session.add(admiralship) db.session.commit() return svdata({"api_locked": int(locked)})
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 get_admiral_sorties(): """ Gets Admiral's unlocked Sorties :return: A list containing dicts of KanColle Sortie info for the Admiral """ admiral = util.get_token_admiral_or_error() data = [] for admiral_sortie in admiral.sorties.all(): sortie = db.Sortie.query.filter_by(id=admiral_sortie.sortie_id).first() data.append({ 'api_id': sortie.level, 'api_cleared': admiral_sortie.cleared, 'api_exboss_flag': sortie.is_boss, 'api_defeat_count': admiral_sortie.defeat_count #Unnecessary if is not boss }) return data
def get_admiral_basic_info(): """ Gets the basic info for the admiral. :return: A dict containing the KanColle info for the admiral. """ admiral = util.get_token_admiral_or_error() return { 'api_member_id': admiral.id, 'api_nickname': admiral.user.nickname, 'api_nickname_id': admiral.user.id, 'api_active_flag': 1, 'api_starttime': 1430603452688, 'api_level': admiral.level, 'api_rank': admiral.rank, 'api_experience': admiral.experience, 'api_fleetname': None, 'api_comment': "", 'api_comment_id': "", 'api_max_chara': admiral.max_ships, 'api_max_slotitem': admiral.max_equips, 'api_max_kagu': admiral.max_furniture, 'api_playtime': 0, 'api_tutorial': 0, 'api_furniture': [int(x) for x in admiral.furniture.split(',')], 'api_count_deck': admiral.available_fleets, 'api_count_kdock': admiral.available_cdocks, 'api_count_ndock': admiral.available_rdocks, 'api_fcoin': admiral.furniture_coins, 'api_st_win': admiral.sortie_successes, 'api_st_lose': admiral.sortie_total - admiral.sortie_successes, 'api_ms_count': admiral.expedition_total, 'api_ms_success': admiral.expedition_successes, 'api_pt_win': admiral.pvp_successes, 'api_pt_lose': admiral.pvp_total - admiral.pvp_successes, 'api_pt_challenged': 0, 'api_pt_challenged_win': 0, # Disables the opening stuff, and skips straight to the game. 'api_firstflag': 1 if admiral.setup else 0, 'api_tutorial_progress': 100, 'api_pvp': [0, 0] }
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 get_admiral_furniture(): return [ int(x) for x in util.get_token_admiral_or_error().furniture.split(',') ]
def queststart(): admiral = get_token_admiral_or_error() quest_id = request.values.get("api_quest_id") AdmiralHelper.activate_quest(quest_id,admiral) QuestHelper.update_quest_progress(quest_id,admiral) return svdata({'api_result_msg': 'ok', 'api_result': 1})
def get_admiral_furniture(): return [int(x) for x in util.get_token_admiral_or_error().furniture.split(',')]
def generate_ship2(api_token): admiral = util.get_token_admiral_or_error(api_token)
def queststop(): admiral = get_token_admiral_or_error() quest_id = request.values.get("api_quest_id") AdmiralHelper.deactivate_quest(quest_id, admiral) return svdata({'api_result_msg': 'ok', 'api_result': 1})
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 clearitemget(): admiral = get_token_admiral_or_error() quest_id = request.values.get("api_quest_id") data = QuestHelper.complete_quest(admiral, quest_id) return svdata(data)
def change_position(): # TODO UNFUCK THIS CODE UP admiral = get_token_admiral_or_error() # Get request parameters fleet_id = int(request.values.get("api_id")) - 1 ship_id = int(request.values.get("api_ship_id")) - 1 ship_pos = int(request.values.get("api_ship_idx")) fleet = admiral.fleets.all()[fleet_id] fships = fleet.ships.all() print(ship_id, ship_pos) if ship_id == -2: # Delete ship. oldship = fships[ship_pos] oldship.local_fleet_num = None fships.remove(oldship) # Get the rest of the ships, and bump it down. for n, ship in enumerate(fships): if n > ship_id: ship.local_fleet_num -= 1 fships[n] = ship fleet.ships = fships elif len(fships) == ship_pos: # Append to the ships list if admiral.admiral_ships.filter_by( local_ship_num=ship_id).first() in fships: pass else: # Get the first ship, update the local fleet num, and append it to the fleet. nship = admiral.admiral_ships.filter_by( local_ship_num=ship_id).first() nship.local_fleet_num = ship_pos fships.append(nship) fleet.ships = fships else: # Get the original ship. original_ship = fships[ship_pos] # Get the new ship. new_ship = fleet.ships.filter_by(local_ship_num=ship_id).first() if new_ship is None: # BLEH original_ship.local_fleet_num = None original_ship.fleet_id = None db.session.add(original_ship) new_ship = admiral.admiral_ships.filter_by( local_ship_num=ship_id).first() new_ship.local_fleet_num = ship_pos fleet.ships.append(new_ship) db.session.add(fleet) db.session.commit() return svdata({}) # Do the bullshit swap. original_ship.local_fleet_num, new_ship.local_fleet_num = new_ship.local_fleet_num, original_ship.local_fleet_num # Eww, merge ships back into the admiral_ships table db.session.add(original_ship) db.session.add(new_ship) # Update the fleet. db.session.add(fleet) db.session.commit() return svdata({})
def clearitemget(): admiral = get_token_admiral_or_error() quest_id = request.values.get("api_quest_id") data = _QuestHelper.complete_quest(admiral, quest_id) return svdata(data)
def queststop(): admiral = get_token_admiral_or_error() quest_id = request.values.get("api_quest_id") _AdmiralHelper.deactivate_quest(quest_id, admiral) return svdata({'api_result_msg': 'ok', 'api_result': 1})
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