Esempio n. 1
0
def get_characters():
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    get_account_res = my_api.GetCurrentBungieAccount()

    # Take values from request args- or default to stored values:
    membershipId = str(
        request.args.get(
            'membershipId',
            str(get_account_res["Response"]["destinyMemberships"][0]
                ["membershipId"])))
    membershipType = str(
        request.args.get(
            'membershipType',
            str(get_account_res["Response"]["destinyMemberships"][0]
                ["membershipType"])))

    get_characters_res = my_api.get_profile(membershipType, membershipId)

    if get_characters_res["ErrorStatus"] != "Success":
        flash(
            f"Bungies systems are down: {get_characters_res.get('message', {}).get('Message', {})}",
            "error")
        return redirect(url_for("public.home"))

    character_details = get_character_details_json(get_characters_res)

    return jsonify(character_details)
Esempio n. 2
0
def get_profile():
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    # TODO: Hardcoded values:
    # Take values from here: GetCurrentBungieAccount
    get_account_res = my_api.GetCurrentBungieAccount()

    membershipId = int(
        request.args.get(
            'membershipId',
            str(get_account_res["Response"]["destinyMemberships"][0]
                ["membershipId"])))
    membershipType = int(
        request.args.get(
            'membershipType',
            str(get_account_res["Response"]["destinyMemberships"][0]
                ["membershipType"])))

    # print(type(get_account_res))
    # print(get_account_res.json())
    membershipId = str(
        get_account_res["Response"]["destinyMemberships"][0]["membershipId"])
    membershipType = str(
        get_account_res["Response"]["destinyMemberships"][0]["membershipType"])
    get_profile_res = my_api.get_profile(membershipType, membershipId)

    return jsonify(get_profile_res)
Esempio n. 3
0
def get_pgcr(activityId):
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    activity = my_api.get_pgcr(activityId)

    return jsonify(activity)
Esempio n. 4
0
def get_current_bungie_account():
    print("get_current_bungie_account")
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()

    my_api = BungieApi(user)
    activity = my_api.GetCurrentBungieAccount()

    return jsonify(activity)
Esempio n. 5
0
def gambit(membershipType, membershipId, characterId):
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    get_profile_res = my_api.get_profile(membershipType, membershipId)
    if get_profile_res["ErrorStatus"] != "Success":
        flash("Bungies systems are down :(", "error")
        return redirect(url_for("public.home"))

    return render_template("auth/choose_focus.html")
Esempio n. 6
0
def get_activity():
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)
    # TODO: Hardcoded values:
    # Take values from here: GetCurrentBungieAccount
    activity = my_api.GetCurrentBungieAccount()
    # get_profile_res = my_api.get_activity_history(membershipType, membershipId)
    # activity = my_api.get_activity_history("2", "4611686018436136301", "2305843009260647150", mode=5, count=3)

    return jsonify(activity)
Esempio n. 7
0
def get_gambit(membershipType, membershipId, characterId):
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)
    get_profile_res = my_api.get_profile(membershipType, membershipId)

    activity = my_api.get_activity_history(membershipType,
                                           membershipId,
                                           characterId,
                                           mode=63,
                                           count=30)

    return jsonify(activity)
Esempio n. 8
0
def pvp(membershipType, membershipId, characterId):
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    get_profile_res = my_api.get_profile(membershipType, membershipId)
    if get_profile_res["ErrorStatus"] != "Success":
        flash(
            f"Bungies systems are down: {get_profile_res.get('message', {}).get('Message', {})}",
            "error")

        return redirect(url_for("public.home"))

    # character_details = get_character_details_json(get_profile_res)

    return render_template("auth/choose_focus.html")
Esempio n. 9
0
def character_select():
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    get_account_res = my_api.GetCurrentBungieAccount()
    # print(type(get_account_res))
    # print(get_account_res.json())
    # membershipId    = str(get_account_res.json()["Response"]["destinyMemberships"][0]["membershipId"])
    # membershipType  = str(get_account_res.json()["Response"]["destinyMemberships"][0]["membershipType"])
    # get_profile_res = my_api.get_profile(membershipType, membershipId)
    # # get_profile_res = my_api.character_select("2", "4611686018436136301")
    # character_details = get_character_details_json(get_profile_res)

    # return(jsonify(get_profile_res))

    # return render_template("auth/choose_account.html")
    return render_template("auth/choose_focus.html")
Esempio n. 10
0
def account(membershipType, membershipId, characterId):
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    # get_profile_res = my_api.get_profile(membershipType, membershipId)
    # character_details = get_character_details_json(get_profile_res)

    return render_template("auth/choose_focus.html")
Esempio n. 11
0
def get_historical_stats_alltime(membershipType, membershipId, characterId):
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    get_profile_res = my_api.get_profile(membershipType, membershipId)
    character_details = get_character_details_json(get_profile_res)

    activity = my_api.get_historical_stats(membershipType,
                                           membershipId,
                                           characterId,
                                           daystart="",
                                           dayend="")

    # if daystart < new_date:
    #     print("daystart < new_date")
    print("Testing time delta:")

    return jsonify(activity)
Esempio n. 12
0
def get_raid(membershipType, membershipId, characterId):
    """
    Endpoint to get raid data from Bungie.net.
        Modes:
        Raid: 4
    """

    mode = int(request.args.get('game_mode', 4))

    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    activity = my_api.get_activity_history(membershipType,
                                           membershipId,
                                           characterId,
                                           mode=mode,
                                           count=30)

    return jsonify(activity)
Esempio n. 13
0
def get_pvp(membershipType, membershipId, characterId):
    """
    Endpoint to get PvP data from Bungie.net.
        Modes:
        10 :	"Control",
        12 :	"Clash",
        15 :	"CrimsonDoubles",
        19 :	"IronBanner",
        25 :	"AllMayhem",
        31 :	"Supremacy",
        37 :	"Survival",
        38 :	"Countdown",
        39 :	"TrialsOfTheNine",
        48 :	"Rumble",
        50 :	"Doubles",
        59 :	"Showdown",
        60 :	"Lockdown",
        61 :	"Scorched", #???
        65 :	"Breakthrough",
        67 :	"Salvage",
        80 :	"Elimination",
        84 :	"TrialsOfOsiris",
    """

    mode = int(request.args.get('gameMode', 5))
    season = int(request.args.get('season', CURRENT_SEASON))

    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    # get_profile_res = my_api.get_profile(membershipType, membershipId)
    # character_details = get_character_details_json(get_profile_res)

    activity = my_api.get_activity_history(membershipType,
                                           membershipId,
                                           characterId,
                                           mode=mode,
                                           count=30)

    return jsonify(activity)
Esempio n. 14
0
def get_historical_stats(membershipType, membershipId, characterId):
    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    # get_profile_res = my_api.get_profile(membershipType, membershipId)
    # character_details = get_character_details_json(get_profile_res)

    # TODO: Hardcoded AllPvP mode
    # season = 1
    mode = int(request.args.get('game_mode', 5))
    season = int(request.args.get('season', CURRENT_SEASON))

    activity_list = []
    season_start = datetime.strptime(SEASONS[season]['START'],
                                     "%Y-%m-%d %H:%M:%S")
    season_end = datetime.strptime(SEASONS[season]['END'], "%Y-%m-%d %H:%M:%S")
    month = 30
    # month           = 5 # Testing flow:
    current_date = datetime.utcnow()

    if season_end > current_date:
        day_end = current_date
    else:
        day_end = season_end
    day_start = day_end - timedelta(days=month)

    # print("Dates:")
    # print(day_start)
    # print(day_end)

    activity_list = []

    while True:
        if day_start < season_start:
            # Last request:
            day_start = season_start
            activity = my_api.get_historical_stats(membershipType,
                                                   membershipId,
                                                   characterId,
                                                   modes=mode,
                                                   daystart=day_start,
                                                   dayend=day_end,
                                                   periodType='Daily')
            found_activities = activity.get('Response',
                                            {}).get('allPvP',
                                                    {}).get('daily', False)
            if found_activities:
                for a in activity['Response']['allPvP']['daily']:
                    activity_list.append(a)

            break
        else:
            activity = my_api.get_historical_stats(membershipType,
                                                   membershipId,
                                                   characterId,
                                                   modes=mode,
                                                   daystart=day_start,
                                                   dayend=day_end,
                                                   periodType='Daily')
            if activity["ErrorStatus"] != "Success":
                flash(
                    f"Bungies systems are down: {activity.get('message', {}).get('Message', {})}",
                    "error")
                return redirect(url_for("public.home"))

            found_activities = activity['Response']['allPvP'].get(
                'daily', False)

            if found_activities:
                for a in activity['Response']['allPvP']['daily']:
                    activity_list.append(a)

            day_end = day_start - timedelta(seconds=1)
            day_start = day_start - timedelta(days=month)

    summarised_activity = summarize_historical_stats(activity_list)

    new_activity = {
        "Response": {
            'season': season,
            'mode': ACTIVITY_MODES[mode],
            'allPvP': {
                'daily': summarised_activity
            }
        }
    }

    return jsonify(new_activity)
Esempio n. 15
0
def pgcr_list(membershipType, membershipId, characterId):

    mode_arg = request.args.get('game_mode', 'pvp')

    game_mode_switch = {
        'pvp': 5,
        'trials': 84,
        'gambit': 63,
        'raid': 4,
        'nightfall': 46,
        'dungeon': 82,
    }
    game_mode = game_mode_switch[mode_arg]

    game_count = 10

    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    activity = my_api.get_activity_history(membershipType,
                                           membershipId,
                                           characterId,
                                           mode=game_mode,
                                           count=game_count)

    pgcr_list = []
    stat_list = []
    activities_res = activity["Response"].get("activities", None)
    if not activities_res:
        print("\n\n\nNo activities!!!")
        pgcr_list_res = {
            "Response": stat_list,
            "statusCode": 200,
            "ErrorStatus": "Success",
        }

        return jsonify(pgcr_list_res)

    for a in activity["Response"]["activities"]:
        pgcr_list.append(a["activityDetails"]["instanceId"])
    pgcr_res_list = []

    for index, instanceId in enumerate(pgcr_list):
        pgcr_res = my_api.get_pgcr(instanceId)
        pgcr_res_list.append(pgcr_res["Response"])

        for entry in pgcr_res["Response"]["entries"]:
            if entry["player"]["destinyUserInfo"][
                    "membershipId"] == membershipId:
                try:
                    avg_life = int(entry["values"]["activityDurationSeconds"]
                                   ["basic"]["value"] /
                                   entry["values"]["deaths"]["basic"]["value"])
                except ZeroDivisionError:
                    avg_life = int(666)
                stats = {
                    "count":
                    index,
                    "instanceId":
                    pgcr_res["Response"]["activityDetails"]["instanceId"],
                    "PGCR":
                    pgcr_res["Response"]["activityDetails"]["instanceId"],
                    "period":
                    pgcr_res["Response"]["period"],
                    "standing":
                    entry["standing"],
                    "activityDurationSeconds":
                    entry["values"]["activityDurationSeconds"]["basic"]
                    ["displayValue"],
                    "averageLifeTime":
                    avg_life,
                    "precisionKills":
                    entry["extended"]["values"]["precisionKills"]["basic"]
                    ["displayValue"],
                    "data":
                    entry,
                }

                # Add weapon definition to responses:
                try:
                    for index, weapons in enumerate(
                            entry["extended"].get("weapons")):
                        definition = get_definition(
                            "DestinyInventoryItemDefinition",
                            str(weapons["referenceId"]))
                        stats["data"]["extended"]["weapons"][index][
                            "definition"] = definition
                except:
                    continue
                stat_list.append(stats)

    pgcr_list_res = {
        "Response": stat_list,
        "statusCode": 200,
        "ErrorStatus": "Success",
    }

    return jsonify(pgcr_list_res)
Esempio n. 16
0
def put_pgcr(activityId):
    """
    Add a PGCR to the PGCR table and a reference to the PGCR in Users.pgcrs.
    The User has an allocation of stored PGCR's: pgcr_count
    """

    user = User.query.filter_by(
        bungieMembershipId=g.user.bungieMembershipId).first()
    my_api = BungieApi(user)

    pgcr_list = []
    status = None
    space = None
    exists = None

    pgcr_entries = PGCRs.query.join(User).filter(User.id == user.id).all()
    for e in pgcr_entries:
        pgcr_list.append(e.activityId)

    pgcr_count = user.pgcr_count
    pgcr_allocation = user.pgcr_allocation

    space = True if pgcr_count < pgcr_allocation else False
    exists = True if activityId in pgcr_list else False

    # print(f"space: {space} exists: {exists} activityId: {activityId}")

    if space and not exists:
        activity = my_api.get_pgcr(str(activityId))

        if activity["ErrorStatus"] == "Success":
            print(f"Adding PGCR: {activityId} for user: {user.unique_name}")
            status = True
            duration = 0
            for e in activity["Response"]["entries"]:
                if int(e["values"]["activityDurationSeconds"]["basic"]
                       ["value"]) > duration:
                    duration = int(e["values"]["activityDurationSeconds"]
                                   ["basic"]["value"])
            membershipType = activity["Response"]["activityDetails"][
                "membershipType"]
            mode = activity["Response"]["activityDetails"]["mode"]
            players = len(activity["Response"]["entries"])
            period = datetime.strptime(activity["Response"]["period"],
                                       "%Y-%m-%dT%H:%M:%SZ")

            pgcr = PGCRs.createPGCR(
                activityId=activityId,
                membershipType=membershipType,
                mode=mode,
                players=players,
                duration=duration,
                period=period,
            )
            user.pgcr_count += 1
            user.pgcrs.append(pgcr)
            db.session.add(pgcr)
            db.session.commit()

            response = {
                "errorStatus": "Success",
                "message": f"Stored: {activityId}",
                "activityId": activityId,
                "membershipType": membershipType,
                "mode": mode,
                "players": players,
                "duration": duration,
                "period": period,
                "user_has_room": space,
                "already_stored": exists,
                "pgcr_req_successful": status,
            }
            return jsonify(response)

        else:
            status = False

    response = {
        "errorStatus": "Fail",
        "message": "There was an error",
        "user_has_room": space,
        "already_stored": exists,
        "pgcr_req_successful": status,
    }

    return jsonify(response)
Esempio n. 17
0
def oauth_callback(provider):
    """ Callback URL for a given provider."""
    # flash("You are in the callback URL.", "info")

    # Get token from Bungie:
    oauth = OAuthSignin(provider).get_provider(provider)
    token_response = oauth.get_callback_url()
    print(token_response)

    # Handle CSRF error:
    if token_response is False:
        return render_template("401.html")

    if 'access_token' not in token_response.json():
        # print(token_response)
        # print(token_response.content)
        # print(token_response.json())
        return render_template("401.html")

    auth_headers = {}
    token_json = token_response.json()['access_token']
    membership_id = token_response.json()["membership_id"]
    auth_headers["X-API-Key"] = OAuthSignin(provider).api_key
    auth_headers["Authorization"] = 'Bearer ' + str(token_json)
    auth_headers["membership_id"] = str(membership_id)

    # Create and authorized session for making requests:
    auth_session = requests.Session()
    auth_session.headers = {
        "X-API-Key": auth_headers['X-API-Key'],
        'Authorization': auth_headers['Authorization']
    }

    # Get Bungie Profile:
    #  This gives membership type - which is needed for all subsequent calls.
    get_user_url = "https://www.bungie.net/Platform/User/" + "GetCurrentBungieAccount/"
    get_account_res = auth_session.get(get_user_url)

    user = User.query.filter_by(bungieMembershipId=membership_id).first()
    # print(user)
    # print(get_account_res.json()['Response'])
    if user is None:
        user = create_user(get_account_res.json(), token_response.json())
    else:
        print("Welcome back user.")
        user = update_user(user=user,
                           get_account_res=get_account_res.json(),
                           token_response=token_response.json())

    login_user(user)

    # flash("You are logged in.", "success")

    # Return the raw JSON content:
    # return jsonify(get_account_res.json())

    membershipId = get_account_res.json(
    )["Response"]["destinyMemberships"][0]["membershipId"]
    membershipType = get_account_res.json(
    )["Response"]["destinyMemberships"][0]["membershipType"]

    my_api = BungieApi(user)
    get_profile_res = my_api.get_profile(str(membershipType),
                                         str(membershipId))
    characterId = get_profile_res["Response"]["profile"]["data"][
        "characterIds"][0]

    # TODO:
    # Redirect to get_profile - > Get: membershipType destinyMembershipId
    # Redirect to chose_track/membershipType/destinyMembershipId.

    return redirect(
        url_for("auth.choose_focus",
                membershipType=membershipType,
                membershipId=membershipId,
                characterId=characterId))