File size: 2,985 Bytes
f7cecf3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import requests

BASE_URL = "https://fantasy.premierleague.com/api"
AFCON_GW = 16


def calculate_fts(transfers, first_gw, next_gw, fh_gws, wc_gws):
    """Exact logic ported from open-fpl-solver dev/solver.py"""
    n_transfers = {gw: 0 for gw in range(2, next_gw + 2)}
    for t in transfers:
        if t["event"] in n_transfers:
            n_transfers[t["event"]] += 1

    fts = {gw: 0 for gw in range(first_gw + 1, next_gw + 2)}
    fts[first_gw + 1] = 1

    for i in range(first_gw + 2, next_gw + 1):
        if i == AFCON_GW:
            fts[i] = 5
            continue
        if (i - 1) in fh_gws or (i - 1) in wc_gws:
            fts[i] = fts[i - 1]
            continue

        fts[i] = fts[i - 1] - n_transfers[i - 1]
        fts[i] = max(fts[i], 0)
        fts[i] += 1
        fts[i] = min(fts[i], 5)

    return fts.get(next_gw, 1)


def get_fpl_team_data(team_id: int):
    print(f"Executing strict open-fpl-solver logic for Team ID: {team_id}...")

    static = requests.get(f"{BASE_URL}/bootstrap-static/").json()
    element_to_type = {x["id"]: x["element_type"] for x in static["elements"]}
    next_gw = next(x["id"] for x in static["events"] if x["is_next"])
    start_prices = {
        x["id"]: x["now_cost"] - x["cost_change_start"] for x in static["elements"]
    }

    transfers = requests.get(f"{BASE_URL}/entry/{team_id}/transfers/").json()[::-1]
    history = requests.get(f"{BASE_URL}/entry/{team_id}/history/").json()

    chips = history["chips"]
    fh_gws = [x["event"] for x in chips if x["name"] == "freehit"]
    wc_gws = [x["event"] for x in chips if x["name"] == "wildcard"]

    first_gw = history["current"][0]["event"]
    first_gw_data = requests.get(
        f"{BASE_URL}/entry/{team_id}/event/{first_gw}/picks/"
    ).json()

    # Calculate exact purchase prices and ITB
    squad = {x["element"]: start_prices[x["element"]] for x in first_gw_data["picks"]}
    itb = 1000 - sum(squad.values())

    for t in transfers:
        if t["event"] in fh_gws:
            continue
        itb += t["element_out_cost"]
        itb -= t["element_in_cost"]
        if t["element_in"]:
            squad[t["element_in"]] = t["element_in_cost"]
        if t["element_out"] and t["element_out"] in squad:
            del squad[t["element_out"]]

    fts = calculate_fts(transfers, first_gw, next_gw, fh_gws, wc_gws)

    picks = []
    for player_id, purchase_price in squad.items():
        now_cost = next(
            x["now_cost"] for x in static["elements"] if x["id"] == player_id
        )
        diff = now_cost - purchase_price
        selling_price = purchase_price + (diff // 2) if diff > 0 else now_cost

        picks.append(
            {
                "id": player_id,
                "purchase_price": purchase_price / 10.0,
                "selling_price": selling_price / 10.0,
                "now_cost": now_cost / 10.0,
            }
        )

    return {"in_the_bank": itb / 10.0, "free_transfers": fts, "squad": picks}