1+ package dev.themeinerlp.attollo.service
2+
3+ import com.github.zafarkhaja.semver.Version
4+ import dev.themeinerlp.attollo.*
5+ import net.kyori.adventure.text.Component
6+ import net.kyori.adventure.text.event.ClickEvent
7+ import net.kyori.adventure.text.logger.slf4j.ComponentLogger
8+ import net.kyori.adventure.text.minimessage.MiniMessage
9+ import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder
10+ import org.bukkit.Bukkit
11+ import org.bukkit.entity.Player
12+ import org.slf4j.LoggerFactory
13+ import java.io.IOException
14+ import java.net.http.HttpClient
15+ import java.net.http.HttpResponse
16+
17+ class UpdateService (plugin : Attollo ) : Runnable {
18+ private val hangarClient = HttpClient .newBuilder().build()
19+ private val LOGGER = LoggerFactory .getLogger(UpdateService ::class .java)
20+ private val localVersion = Version .parse(plugin.pluginMeta.version)
21+ private var remoteVersion: Version ? = null
22+ private val scheduler = Bukkit .getScheduler().runTaskTimerAsynchronously(plugin, this , 0 , 20 * 60 * 60 * 3 )
23+ private val DOWNLOAD_URL = " https://hangar.papermc.io/OneLiteFeather/Attollo/versions/%s"
24+
25+
26+ override fun run () {
27+ val remoteVersion: Version ? = getNewerVersion()
28+ if (remoteVersion != null ) {
29+ this .remoteVersion = remoteVersion
30+ for (onlinePlayer in Bukkit .getOnlinePlayers()) {
31+ if (onlinePlayer.isOp || onlinePlayer.hasPermission(NOTIFY_UPDATE_PERMISSION )) {
32+ notifyPlayer(localVersion, remoteVersion, onlinePlayer)
33+ }
34+ }
35+ }
36+ }
37+
38+ fun notifyConsole (logger : ComponentLogger ) {
39+ if (this .remoteVersion != null && remoteVersion?.isHigherThan(this .localVersion) == true ) {
40+ logger.warn(
41+ MiniMessage .miniMessage().deserialize(
42+ NOTIFY_CONSOLE_UPDATE_MESSAGE ,
43+ Placeholder .component(" local_version" , Component .text(localVersion.toString())),
44+ Placeholder .component(" remote_version" , Component .text(remoteVersion.toString())),
45+ Placeholder .component(" download_url" , Component .text(DOWNLOAD_URL .format(remoteVersion.toString())))
46+ )
47+ )
48+ }
49+ }
50+
51+ fun notifyPlayer (player : Player ) {
52+ if (this .remoteVersion != null && remoteVersion?.isHigherThan(this .localVersion) == true ) {
53+ notifyPlayer(this .localVersion, this .remoteVersion, player)
54+ }
55+ }
56+
57+ private fun notifyPlayer (localVersion : Version , remoteVersion : Version ? , player : Player ) {
58+ player.sendMessage(
59+ MiniMessage .miniMessage().deserialize(
60+ NOTIFY_PLAYER_UPDATE_MESSAGE ,
61+ Placeholder .component(" local_version" , Component .text(localVersion.toString())),
62+ Placeholder .component(" remote_version" , Component .text(remoteVersion.toString())),
63+ Placeholder .styling(" download_url" , ClickEvent .openUrl(DOWNLOAD_URL .format(remoteVersion.toString())))
64+ )
65+ )
66+ }
67+
68+ private fun getNewerVersion (): Version ? {
69+ try {
70+ val httpResponse = hangarClient.send(
71+ LATEST_RELEASE_VERSION_REQUEST ,
72+ HttpResponse .BodyHandlers .ofString()
73+ )
74+ val remoteVersion = Version .parse(httpResponse.body())
75+ if (remoteVersion.isHigherThan(this .localVersion)) {
76+ return remoteVersion
77+ }
78+ } catch (e: IOException ) {
79+ LOGGER .error(" Something went wrong to check updates" , e)
80+ } catch (e: InterruptedException ) {
81+ LOGGER .error(" Something went wrong to check updates" , e)
82+ }
83+ return null
84+ }
85+
86+ fun shutdown () {
87+ hangarClient.shutdownNow()
88+ scheduler.cancel()
89+ }
90+ }
0 commit comments