diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/Server.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/Server.kt index 12c8df7a1..f8bdc0a1f 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/Server.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/Server.kt @@ -33,12 +33,12 @@ class Server( /** * Server-address as string. May contain the port */ - var address by delegate(address) + var address by delegate(address) { check(it.isNotBlank()) { "Server address must not be blank!" } } /** * Server name (showed in eros) */ - var name by delegate(name) + var name by delegate(name) { check(it.message.isNotBlank()) { "Server name must not be blank!" } } /** * Profiles to use for the connection to the server. @@ -56,5 +56,5 @@ class Server( var forcedVersion by backingDelegate(getter = { Versions.getVersionByName(_forcedVersion) }, setter = { _forcedVersion = it?.name }) @get:JsonInclude(JsonInclude.Include.NON_DEFAULT) - var faviconHash: String? by delegate(null) + var faviconHash: String? by delegate(null) { if (it != null) check(it.length == 40) { "Not a valid sha1 hash!" } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt index 7d1c39b25..1fe716e42 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt @@ -26,6 +26,7 @@ import de.bixilon.minosoft.gui.eros.controller.EmbeddedJavaFXController import de.bixilon.minosoft.gui.eros.dialog.ServerModifyDialog import de.bixilon.minosoft.gui.eros.dialog.SimpleErosConfirmationDialog import de.bixilon.minosoft.gui.eros.dialog.connection.KickDialog +import de.bixilon.minosoft.gui.eros.main.play.server.card.FaviconManager.saveFavicon import de.bixilon.minosoft.gui.eros.main.play.server.card.ServerCard import de.bixilon.minosoft.gui.eros.main.play.server.card.ServerCardController import de.bixilon.minosoft.gui.eros.main.play.server.type.types.ServerType @@ -270,7 +271,7 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { server.forcedVersion = forcedVersion server.profiles = profiles.toMutableMap() if (server.address != address) { - serverCard.rawFavicon = null + server.faviconHash?.let { hash -> server.saveFavicon(null, hash) } server.address = address diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/FaviconManager.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/FaviconManager.kt new file mode 100644 index 000000000..e6c707134 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/FaviconManager.kt @@ -0,0 +1,45 @@ +package de.bixilon.minosoft.gui.eros.main.play.server.card + +import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.Server +import de.bixilon.minosoft.data.assets.AssetsUtil +import de.bixilon.minosoft.util.Util +import javafx.scene.image.Image +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.util.zip.GZIPInputStream +import java.util.zip.GZIPOutputStream + +object FaviconManager { + + val Server.favicon: Image? + get() { + val hash = this.faviconHash ?: return null + try { + val path = AssetsUtil.getAssetDiskPath(hash, true) + return Image(GZIPInputStream(FileInputStream(path))) + } catch (exception: Throwable) { + this.faviconHash = null + } + return null + } + + fun Server.saveFavicon(favicon: ByteArray?, faviconHash: String = Util.sha1(favicon)) { + if (this.faviconHash == faviconHash) { + return + } + this.faviconHash = faviconHash + val file = File(AssetsUtil.getAssetDiskPath(faviconHash, true)) + if (file.exists()) { + return + } + if (favicon == null) { + file.delete() // ToDo: Check if other servers are using it + return + } + val outputStream = GZIPOutputStream(FileOutputStream(file)) + outputStream.write(favicon) + outputStream.close() + + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCard.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCard.kt index 617ded065..a04115b0d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCard.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCard.kt @@ -22,7 +22,6 @@ import de.bixilon.minosoft.protocol.network.connection.status.StatusConnectionSt import de.bixilon.minosoft.util.KUtil.synchronizedMapOf import de.bixilon.minosoft.util.KUtil.synchronizedSetOf import de.bixilon.minosoft.util.collections.SynchronizedMap -import javafx.scene.image.Image class ServerCard( val server: Server, @@ -30,9 +29,6 @@ class ServerCard( var ping: StatusConnection? = null val connections: MutableSet = synchronizedSetOf() - var rawFavicon: ByteArray? = null - val favicon: Image? = null // ToDo: Image(ByteArrayInputStream(it)) - var statusReceiveInvoker: EventInvoker? = null set(value) { field = value diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCardController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCardController.kt index 234da6fbc..d2d387c7f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCardController.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCardController.kt @@ -19,6 +19,8 @@ import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.gui.eros.card.AbstractCardController import de.bixilon.minosoft.gui.eros.card.CardFactory import de.bixilon.minosoft.gui.eros.main.play.server.ServerListController +import de.bixilon.minosoft.gui.eros.main.play.server.card.FaviconManager.favicon +import de.bixilon.minosoft.gui.eros.main.play.server.card.FaviconManager.saveFavicon import de.bixilon.minosoft.gui.eros.modding.invoker.JavaFXEventInvoker import de.bixilon.minosoft.gui.eros.util.JavaFXUtil import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.ctext @@ -30,6 +32,7 @@ import de.bixilon.minosoft.modding.event.events.connection.status.StatusPongRece import de.bixilon.minosoft.util.KUtil.text import de.bixilon.minosoft.util.KUtil.thousands import de.bixilon.minosoft.util.KUtil.toResourceLocation +import de.bixilon.minosoft.util.task.pool.DefaultThreadPool import javafx.fxml.FXML import javafx.scene.control.Label import javafx.scene.image.Image @@ -74,7 +77,7 @@ class ServerCardController : AbstractCardController() { item.unregister() item.ping() - item.favicon?.let { faviconFX.image = it } + item.server.favicon?.let { faviconFX.image = it } item.statusReceiveInvoker = JavaFXEventInvoker.of { if (this.item != item || it.connection.error != null) { @@ -87,7 +90,7 @@ class ServerCardController : AbstractCardController() { faviconFX.image = it.status.favicon?.let { favicon -> Image(ByteArrayInputStream(favicon)) } ?: JavaFXUtil.MINOSOFT_LOGO - it.status.favicon?.let { favicon -> item.rawFavicon = favicon } + it.status.favicon?.let { favicon -> DefaultThreadPool += { item.server.saveFavicon(favicon) } } // ToDo: This is running every event? serverList?.onPingUpdate(item) } diff --git a/src/main/java/de/bixilon/minosoft/protocol/status/ServerStatus.kt b/src/main/java/de/bixilon/minosoft/protocol/status/ServerStatus.kt index 064890ee6..4a19e5c06 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/status/ServerStatus.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/status/ServerStatus.kt @@ -15,7 +15,6 @@ package de.bixilon.minosoft.protocol.status import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.util.KUtil.toInt -import de.bixilon.minosoft.util.Util import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast import java.util.* @@ -37,8 +36,6 @@ class ServerStatus( var favicon: ByteArray? = null private set - var faviconHash: String? = null - private set init { data["version"]?.compoundCast()?.let { @@ -55,7 +52,6 @@ class ServerStatus( data["favicon"]?.toString()?.let { val favicon = Base64.getDecoder().decode(it.replace("data:image/png;base64,", "").replace("\n", "")) - faviconHash = Util.sha1(favicon) this.favicon = favicon } }