File size: 2,281 Bytes
709c473
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
90
91
92
93
94
import time

from curl_cffi import requests

from models import Element, Pair, PendingPair


def raw_make_pair(

    first: str,

    second: str,

    headers: dict[str, str],

    *,

    timeout: float = 30,

) -> tuple[str, str | None, bool | None]:
    response = requests.Session(impersonate='chrome').get(
        "https://neal.fun/api/infinite-craft/pair",
        params={"first": first, "second": second},
        headers=headers,
        timeout=timeout * 1000,
    )
    response.raise_for_status()
    data = response.json()

    if "result" not in data:
        msg = f"Invalid response: {data!r}"
        raise ValueError(msg)

    return data["result"], data.get("emoji"), data.get("isNew")


def make_pair(

    pair: PendingPair,

    headers: dict[str, str],

    *,

    timeout: float = 30,

) -> Pair:
    result, emoji, is_new = raw_make_pair(
        pair.first.name,
        pair.second.name,
        headers,
        timeout=timeout,
    )
    return Pair(
        pair.first,
        pair.second,
        Element(result, emoji),
        is_new,
    )


def make_pair_exp_backoff(

    pair: PendingPair,

    headers: dict[str, str],

    *,

    timeout: float = 30,

) -> Pair:
    started_at = time.perf_counter()
    backoff = 1
    while True:
        exc = None
        try:
            eta = timeout - (time.perf_counter() - started_at)
            return make_pair(pair, headers, timeout=eta)
        except requests.RequestsError as e:
            if e.args and e.args[0].startswith("HTTP Error 500:"):
                raise  # don't bother retrying
            exc = e
        except Exception as e:
            exc = e

        eta = timeout - (time.perf_counter() - started_at)
        if eta < backoff:
            msg = f"Ran out of time while making the pair: {pair}"
            raise TimeoutError(msg) from exc

        time.sleep(backoff)
        backoff = min(backoff * 2, 60)


if __name__ == "__main__":
    import cloudflare

    headers = cloudflare.get_headers()

    pair = make_pair(
        PendingPair(
            Element(input("First Element: ")),
            Element(input("Second Element: ")),
        ),
        headers,
    )

    print(pair)