blob: e8abad8a9e2e999b2a5df220f7109e447cb2d283 (
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
|
package at.hannibal2.skyhanni.data
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.ConfigManager
import at.hannibal2.skyhanni.data.jsonobjects.local.MayorJson
import at.hannibal2.skyhanni.events.LorenzTickEvent
import at.hannibal2.skyhanni.utils.APIUtil
import at.hannibal2.skyhanni.utils.CollectionUtils.put
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.SimpleTimeMark
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 kotlin.time.Duration.Companion.minutes
class MayorElection {
private var lastUpdate = SimpleTimeMark.farPast()
private var dispatcher = Dispatchers.IO
companion object {
var rawMayorData: MayorJson? = null
var candidates = mapOf<Int, MayorJson.Candidate>()
var currentCandidate: MayorJson.Candidate? = null
fun isPerkActive(mayor: String, perk: String) = currentCandidate?.let { currentCandidate ->
currentCandidate.name == mayor && currentCandidate.perks.any { it.name == perk }
} ?: false
}
@SubscribeEvent
fun onTick(event: LorenzTickEvent) {
if (!LorenzUtils.onHypixel) return
if (event.repeatSeconds(3)) {
check()
}
}
private fun check() {
if (lastUpdate.passedSince() < 20.minutes) return
lastUpdate = SimpleTimeMark.now()
SkyHanniMod.coroutineScope.launch {
val url = "https://api.hypixel.net/v2/resources/skyblock/election"
val jsonObject = withContext(dispatcher) { APIUtil.getJSONResponse(url) }
rawMayorData = ConfigManager.gson.fromJson(jsonObject, MayorJson::class.java)
val data = rawMayorData ?: return@launch
val map = mutableMapOf<Int, MayorJson.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 mayor from old sb year?
if (nextMayorTime > System.currentTimeMillis()) {
currentYear--
}
currentCandidate = candidates[currentYear]
}
private fun MayorJson.Election.getPairs() = year + 1 to candidates.bestCandidate()
private fun List<MayorJson.Candidate>.bestCandidate() = maxBy { it.votes }
}
|