Ejemplo n.º 1
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})
Ejemplo n.º 2
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})
Ejemplo n.º 3
0
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
Ejemplo n.º 4
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})
Ejemplo n.º 5
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})
Ejemplo n.º 6
0
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))
Ejemplo n.º 7
0
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))
Ejemplo n.º 8
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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
Archivo: manage.py Proyecto: fnzr/kcsrv
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))
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
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
Ejemplo n.º 15
0
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
Ejemplo n.º 16
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
Ejemplo n.º 17
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
Ejemplo n.º 18
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
Ejemplo n.º 19
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