summaryrefslogtreecommitdiff
path: root/forgebot.sh
blob: c0e3cac13950bb18462dccd70a9ca20a2a7d4c96 (plain)
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
#!/bin/bash
# (C) Linnea Gräf 2023 BSD 2-Clause

# Software prerequisites:
# bash
# jq
# curl
# find

rm -fr "${DATA_DIR:-.}/repo"
git clone http://github.com/notenoughupdates/notenoughupdates-repo "${DATA_DIR:-.}/"repo --depth=1

function get_duration() {
    jq '.recipes[] | select(.type ="forge") | .duration * 1000' < "${DATA_DIR:-.}"/repo/items/$1.json
}


poll_forge_events() {
    atrocity_debug "Forge polling started"
while true; do
    for uuid in $(list_all_watched_accounts); do
        if ! atrocity_is_online; then
            return
        fi
        atrocity_debug UUID: $uuid
        processes="$(curl -H "Api-Key: $HYPIXEL_KEY" https://api.hypixel.net/v2/skyblock/profiles\?uuid=$uuid 2>/dev/null | tee api_response.json|
            jq '[.profiles[] | select(.members["'$uuid'"].forge.forge_processes.forge_1) | {"qf": .members["'$uuid'"].mining_core.nodes.forge_time,"fp": [.members["'$uuid'"].forge.forge_processes.forge_1[]], cutename: .cute_name}]')"
        atrocity_debug $processes
        mkdir -p "${DATA_DIR:-.}/"notificationdata
        touch "${DATA_DIR:-.}/"notificationdata/$uuid
        now=$(date +%s000)
        rm -f "${DATA_DIR:-.}/"messagedata
        echo "$processes"| jq -r '.[] | {qf: (.qf // 0), fp: .fp[], cutename: .cutename} | (if (.qf == 20) then "0.7" elif (.qf == 0) then "1" else (1 - (.qf * .5 + 10) / 100|tostring) end) + " " + .fp.id + " " + (.fp.startTime|tostring) + " " + (.fp.slot|tostring) + " " + (.cutename)' | while read qf id starttime slot cutename; do
            atrocity_debug ID: $id STARTTIME: $starttime SLOT: $slot
            doneat=$(($starttime + $(get_duration $id)))
            atrocity_debug DONEAT WITHOUT QF: $doneat
            doneat=$(bc <<<"$starttime + $qf*$(get_duration $id)"|sed s'/\..*//')
            atrocity_debug DONE: $doneat
            already_notified=$(grep $starttime "${DATA_DIR:-.}/"notificationdata/$uuid >/dev/null; echo $?)
            atrocity_debug NOTIFIED: $already_notified
            isready=$(($now > $doneat))
            atrocity_debug "$now > $doneat: $isready"
            if [[ $isready -eq 1 ]]; then
                atrocity_debug READY 
                echo $starttime >> "${DATA_DIR:-.}/"notificationdata/$uuid.new
                if [[ already_notified -eq 1 ]]; then
                    echo Your $id in $slot on $cutename is ready since "<t:$(($doneat / 1000)):R> (started <t:$(($starttime / 1000)):R>)" >>messagedata
                    atrocity_debug ADDED
                fi
            fi
            atrocity_debug ===============================
        done
        if [[ -f messagedata ]]; then
            echo Sending messagedata: 
            atrocity_debug "$(cat "${DATA_DIR:-.}/"messagedata)"
            jsondata="$(jq -n --arg body "$(list_watchers "$uuid"|sed -E 's|(.*)|<@\1>|';echo;cat "${DATA_DIR:-.}/"messagedata)" '{"content": $body}')"
            atrocity_rest POST "channels/$CHANNEL_ID/messages" "$jsondata"
            mv "${DATA_DIR:-.}/"notificationdata/$uuid.new "${DATA_DIR:-.}/"notificationdata/$uuid
        fi
        sleep 10
    done
    sleep 300
done
}