aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/data/MayorElectionData.kt
blob: 70f30a02146573ba2dd6bb6ae9f554ed1da46880 (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
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
package at.hannibal2.skyhanni.data

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.utils.APIUtil
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.MayorData
import at.hannibal2.skyhanni.utils.MayorData.Candidate
import com.google.gson.GsonBuilder
import io.github.moulberry.moulconfig.observer.PropertyTypeAdapterFactory
import io.github.moulberry.notenoughupdates.util.SkyBlockTime
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import net.minecraftforge.fml.common.gameevent.TickEvent

class MayorElectionData {
    private var tick = 0
    private var lastUpdate = 0L

    private val gson = GsonBuilder().setPrettyPrinting()
        .registerTypeAdapterFactory(PropertyTypeAdapterFactory())
        .create()

    companion object {
        var rawMayorData: MayorData? = null
        var candidates = mapOf<Int, Candidate>()
        var currentCandidate: Candidate? = null

        fun isPerkActive(mayor: String, perk: String): Boolean {
            return currentCandidate?.let { currentCandidate ->
                currentCandidate.name == mayor && currentCandidate.perks.any { it.name == perk }
            } ?: false
        }

    }

    @SubscribeEvent
    fun onTick(event: TickEvent.ClientTickEvent) {
        if (event.phase != TickEvent.Phase.START) return
        if (!LorenzUtils.onHypixel) return

        tick++

        if (tick % 60 == 0) {
            check()
        }
    }

    private fun check() {
        if (System.currentTimeMillis() > lastUpdate + 60_000 * 5) {
            lastUpdate = System.currentTimeMillis()
            SkyHanniMod.coroutineScope.launch {
                val url = "https://api.hypixel.net/resources/skyblock/election"
                val jsonObject = withContext(Dispatchers.IO) { APIUtil.getJSONResponse(url) }
                rawMayorData = gson.fromJson(jsonObject, MayorData::class.java)
                val data = rawMayorData ?: return@launch
                val map = mutableMapOf<Int, Candidate>()
                map put data.mayor.election.getPairs()
                data.current?.let {
                    map put data.current.getPairs()
                }
                candidates = map
            }
        }

        checkCurrentMayor()
    }

    private fun checkCurrentMayor() {
        var currentYear = SkyBlockTime.now().year

        // The time in the current skyblock year when the election circle will restart
        val month = 3 // Late Spring
        val nextMayorTime = SkyBlockTime(currentYear, month, day = 27).toMillis()

        // Is it still the major from old sb year?
        if (nextMayorTime > System.currentTimeMillis()) {
            currentYear--
        }
        currentCandidate = candidates[currentYear]
    }

    private fun MayorData.Election.getPairs() = year + 1 to candidates.bestCandidate()

    private fun List<MayorData.Candidate>.bestCandidate() = maxBy { it.votes }

    private infix fun <K, V> MutableMap<K, V>.put(pairs: Pair<K, V>) {
        this[pairs.first] = pairs.second
    }
}