Example #1
0
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
Example #2
0
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({})
Example #3
0
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})
Example #4
0
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})
Example #5
0
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({})
Example #6
0
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({})
Example #7
0
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})
Example #8
0
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)})
Example #9
0
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({})
Example #10
0
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)})
Example #11
0
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})
Example #12
0
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})
Example #13
0
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
Example #14
0
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
Example #15
0
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]
    }
Example #16
0
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]
    }
Example #17
0
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
Example #18
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
Example #19
0
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
Example #20
0
def get_admiral_furniture():
    return [
        int(x) for x in util.get_token_admiral_or_error().furniture.split(',')
    ]
Example #21
0
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})
Example #22
0
def get_admiral_furniture():
    return [int(x) for x in util.get_token_admiral_or_error().furniture.split(',')]
Example #23
0
def generate_ship2(api_token):
    admiral = util.get_token_admiral_or_error(api_token)
Example #24
0
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})
Example #25
0
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
Example #26
0
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)
Example #27
0
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({})
Example #28
0
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)
Example #29
0
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})
Example #30
0
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