mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 10:55:01 -04:00
remove more Util functions, bump kutil to 1.3
This commit is contained in:
parent
e3ee113b2b
commit
30da957baa
2
pom.xml
2
pom.xml
@ -457,7 +457,7 @@
|
||||
<dependency>
|
||||
<groupId>de.bixilon</groupId>
|
||||
<artifactId>kutil</artifactId>
|
||||
<version>1.1</version>
|
||||
<version>1.3</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
@ -19,6 +19,7 @@ import de.bixilon.kutil.concurrent.worker.tasks.Task
|
||||
import de.bixilon.kutil.file.watcher.FileWatcherService
|
||||
import de.bixilon.kutil.latch.CountUpAndDownLatch
|
||||
import de.bixilon.kutil.os.OSUtil
|
||||
import de.bixilon.kutil.reflection.ReflectionUtil.forceInit
|
||||
import de.bixilon.minosoft.assets.file.ResourcesAssetsUtil
|
||||
import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties
|
||||
import de.bixilon.minosoft.config.profile.GlobalProfileManager
|
||||
@ -43,8 +44,8 @@ import de.bixilon.minosoft.terminal.CLI
|
||||
import de.bixilon.minosoft.terminal.CommandLineArguments
|
||||
import de.bixilon.minosoft.terminal.RunConfiguration
|
||||
import de.bixilon.minosoft.util.GitInfo
|
||||
import de.bixilon.minosoft.util.KUtil
|
||||
import de.bixilon.minosoft.util.RenderPolling
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.YggdrasilUtil
|
||||
import de.bixilon.minosoft.util.logging.Log
|
||||
import de.bixilon.minosoft.util.logging.LogLevels
|
||||
@ -61,7 +62,7 @@ object Minosoft {
|
||||
@JvmStatic
|
||||
fun main(args: Array<String>) {
|
||||
CommandLineArguments.parse(args)
|
||||
Util.initUtilClasses()
|
||||
KUtil.initUtilClasses()
|
||||
MINOSOFT_ASSETS_MANAGER.load(CountUpAndDownLatch(0))
|
||||
|
||||
Log.log(LogMessageType.OTHER, LogLevels.INFO) { "Starting minosoft" }
|
||||
@ -123,7 +124,7 @@ object Minosoft {
|
||||
|
||||
taskWorker += Task(identifier = StartupTasks.STARTUP_PROGRESS, executor = { StartingDialog(START_UP_LATCH).show() }, dependencies = arrayOf(StartupTasks.LOAD_LANGUAGE_FILES, StartupTasks.INITIALIZE_JAVAFX))
|
||||
|
||||
Util.forceClassInit(Eros::class.java)
|
||||
Eros::class.java.forceInit()
|
||||
}
|
||||
taskWorker += Task(identifier = StartupTasks.LOAD_YGGDRASIL, executor = { YggdrasilUtil.load() })
|
||||
|
||||
|
@ -15,6 +15,7 @@ package de.bixilon.minosoft.assets.minecraft
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode
|
||||
import de.bixilon.kutil.latch.CountUpAndDownLatch
|
||||
import de.bixilon.kutil.string.StringUtil.format
|
||||
import de.bixilon.minosoft.assets.InvalidAssetException
|
||||
import de.bixilon.minosoft.assets.util.FileAssetsUtil
|
||||
import de.bixilon.minosoft.assets.util.FileUtil
|
||||
@ -26,7 +27,6 @@ import de.bixilon.minosoft.data.registries.versions.Version
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||
import de.bixilon.minosoft.util.KUtil.generalize
|
||||
import de.bixilon.minosoft.util.KUtil.toResourceLocation
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.json.Jackson
|
||||
import org.kamranzafar.jtar.TarEntry
|
||||
import org.kamranzafar.jtar.TarHeader
|
||||
@ -62,7 +62,7 @@ class JarAssetsManager(
|
||||
} else {
|
||||
var clientJar = FileUtil.safeReadFile(File(FileAssetsUtil.getPath(clientJarHash)), false)?.readZipArchive()
|
||||
if (clientJar == null) {
|
||||
val downloaded = FileAssetsUtil.downloadAndGetAsset(Util.formatString(profile.source.launcherPackages, mapOf(
|
||||
val downloaded = FileAssetsUtil.downloadAndGetAsset(profile.source.launcherPackages.format(mapOf(
|
||||
"fullHash" to clientJarHash,
|
||||
"filename" to "client.jar",
|
||||
)), false, FileAssetsUtil.HashTypes.SHA1)
|
||||
|
@ -19,6 +19,7 @@ import de.bixilon.kutil.concurrent.pool.ThreadPool
|
||||
import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable
|
||||
import de.bixilon.kutil.latch.CountUpAndDownLatch
|
||||
import de.bixilon.kutil.primitive.LongUtil.toLong
|
||||
import de.bixilon.kutil.string.StringUtil.format
|
||||
import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsManager
|
||||
import de.bixilon.minosoft.assets.util.FileAssetsUtil
|
||||
import de.bixilon.minosoft.assets.util.FileAssetsUtil.toAssetName
|
||||
@ -28,7 +29,6 @@ import de.bixilon.minosoft.config.StaticConfiguration
|
||||
import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile
|
||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.json.Jackson
|
||||
import de.bixilon.minosoft.util.logging.Log
|
||||
import de.bixilon.minosoft.util.logging.LogLevels
|
||||
@ -55,11 +55,10 @@ class IndexAssetsManager(
|
||||
private set
|
||||
|
||||
private fun downloadAssetsIndex(): Map<String, Any> {
|
||||
return Jackson.MAPPER.readValue(FileAssetsUtil.downloadAndGetAsset(Util.formatString(profile.source.mojangPackages,
|
||||
mapOf(
|
||||
"fullHash" to indexHash,
|
||||
"filename" to "$assetsVersion.json",
|
||||
)), hashType = FileAssetsUtil.HashTypes.SHA1).second, Jackson.JSON_MAP_TYPE)
|
||||
return Jackson.MAPPER.readValue(FileAssetsUtil.downloadAndGetAsset(profile.source.mojangPackages.format(mapOf(
|
||||
"fullHash" to indexHash,
|
||||
"filename" to "$assetsVersion.json",
|
||||
)), hashType = FileAssetsUtil.HashTypes.SHA1).second, Jackson.JSON_MAP_TYPE)
|
||||
}
|
||||
|
||||
fun verifyAsset(hash: String) {
|
||||
@ -67,11 +66,10 @@ class IndexAssetsManager(
|
||||
if (FileAssetsUtil.verifyAsset(hash, file, verify, hashType = FileAssetsUtil.HashTypes.SHA1)) {
|
||||
return
|
||||
}
|
||||
val url = Util.formatString(profile.source.minecraftResources,
|
||||
mapOf(
|
||||
"hashPrefix" to hash.substring(0, 2),
|
||||
"fullHash" to hash,
|
||||
))
|
||||
val url = profile.source.minecraftResources.format(mapOf(
|
||||
"hashPrefix" to hash.substring(0, 2),
|
||||
"fullHash" to hash,
|
||||
))
|
||||
Log.log(LogMessageType.ASSETS, LogLevels.VERBOSE) { "Downloading asset $url" }
|
||||
val downloadedHash = FileAssetsUtil.downloadAsset(url, hashType = FileAssetsUtil.HashTypes.SHA1)
|
||||
if (downloadedHash != hash) {
|
||||
|
@ -15,11 +15,13 @@ package de.bixilon.minosoft.assets.util
|
||||
|
||||
import com.github.luben.zstd.ZstdInputStream
|
||||
import com.github.luben.zstd.ZstdOutputStream
|
||||
import de.bixilon.kutil.array.ByteArrayUtil.toHex
|
||||
import de.bixilon.kutil.hex.HexUtil.isHexString
|
||||
import de.bixilon.kutil.random.RandomStringUtil.randomString
|
||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||
import de.bixilon.minosoft.terminal.RunConfiguration
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.KUtil
|
||||
import java.io.*
|
||||
import java.net.URL
|
||||
import java.nio.file.Files
|
||||
@ -47,7 +49,7 @@ object FileAssetsUtil {
|
||||
fun saveAndGet(stream: InputStream, compress: Boolean = true, get: Boolean = true, hashType: HashTypes = HashTypes.SHA256): Pair<String, ByteArray> {
|
||||
var tempFile: File
|
||||
do {
|
||||
tempFile = File(RunConfiguration.TEMPORARY_FOLDER + Util.generateRandomString(32))
|
||||
tempFile = File(RunConfiguration.TEMPORARY_FOLDER + KUtil.RANDOM.randomString(32))
|
||||
} while (tempFile.exists())
|
||||
tempFile.parentFile.apply {
|
||||
mkdirs()
|
||||
@ -80,7 +82,7 @@ object FileAssetsUtil {
|
||||
}
|
||||
}
|
||||
output.close()
|
||||
val hash = Util.byteArrayToHexString(digest.digest())
|
||||
val hash = digest.digest().toHex()
|
||||
|
||||
val file = File(getPath(hash))
|
||||
if (file.exists()) {
|
||||
@ -157,7 +159,7 @@ object FileAssetsUtil {
|
||||
}
|
||||
digest.update(buffer, 0, length)
|
||||
}
|
||||
val equals = hash == Util.byteArrayToHexString(digest.digest())
|
||||
val equals = hash == digest.digest().toHex()
|
||||
if (!equals) {
|
||||
file.delete()
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
|
||||
import de.bixilon.kutil.concurrent.time.TimeWorker
|
||||
import de.bixilon.kutil.concurrent.time.TimeWorkerTask
|
||||
import de.bixilon.kutil.file.FileUtil
|
||||
import de.bixilon.kutil.file.FileUtil.read
|
||||
import de.bixilon.minosoft.config.profile.profiles.Profile
|
||||
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager
|
||||
import de.bixilon.minosoft.config.profile.profiles.audio.AudioProfileManager
|
||||
@ -24,7 +25,6 @@ import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfileMan
|
||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||
import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash
|
||||
import de.bixilon.minosoft.terminal.RunConfiguration
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.json.Jackson
|
||||
import java.io.File
|
||||
|
||||
@ -74,7 +74,7 @@ object GlobalProfileManager {
|
||||
}
|
||||
|
||||
this.selectedProfiles.original.clear()
|
||||
this.selectedProfiles.original.putAll(Jackson.MAPPER.readValue(Util.readFile(file.path), SELECTED_PROFILES_TYPE))
|
||||
this.selectedProfiles.original.putAll(Jackson.MAPPER.readValue(file.read(), SELECTED_PROFILES_TYPE))
|
||||
} finally {
|
||||
selectedProfiles.lock.unlock()
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import com.google.common.collect.HashBiMap
|
||||
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
|
||||
import de.bixilon.kutil.exception.ExceptionUtil.tryCatch
|
||||
import de.bixilon.kutil.file.FileUtil
|
||||
import de.bixilon.kutil.file.FileUtil.read
|
||||
import de.bixilon.kutil.file.watcher.FileWatcher
|
||||
import de.bixilon.kutil.file.watcher.FileWatcherService
|
||||
import de.bixilon.kutil.primitive.IntUtil.toInt
|
||||
@ -16,7 +17,6 @@ import de.bixilon.minosoft.config.profile.profiles.Profile
|
||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||
import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash
|
||||
import de.bixilon.minosoft.terminal.RunConfiguration
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.json.Jackson
|
||||
import de.bixilon.minosoft.util.logging.Log
|
||||
import de.bixilon.minosoft.util.logging.LogLevels
|
||||
@ -238,7 +238,7 @@ interface ProfileManager<T : Profile> {
|
||||
fun readAndMigrate(path: String): Pair<Boolean, MutableMap<String, Any?>?> {
|
||||
var saveFile = false
|
||||
val json: MutableMap<String, Any?>?
|
||||
val jsonString = tryCatch(FileNotFoundException::class.java) { Util.readFile(path) }
|
||||
val jsonString = tryCatch(FileNotFoundException::class.java) { File(path).read() }
|
||||
if (jsonString != null) {
|
||||
json = Jackson.MAPPER.readValue(jsonString, Jackson.JSON_MAP_TYPE)!!
|
||||
val version = json["version"]?.toInt() ?: throw IllegalArgumentException("Can not find version attribute in profile: $path")
|
||||
|
@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore
|
||||
import com.fasterxml.jackson.annotation.JsonInclude
|
||||
import com.fasterxml.jackson.annotation.JsonProperty
|
||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||
import de.bixilon.kutil.random.RandomStringUtil.randomString
|
||||
import de.bixilon.minosoft.config.profile.ProfileManager
|
||||
import de.bixilon.minosoft.config.profile.profiles.Profile
|
||||
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager.backingDelegate
|
||||
@ -11,7 +12,7 @@ import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager
|
||||
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager.latestVersion
|
||||
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager.mapDelegate
|
||||
import de.bixilon.minosoft.data.accounts.Account
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.KUtil
|
||||
|
||||
/**
|
||||
* Profile for accounts
|
||||
@ -33,7 +34,7 @@ class AccountProfile(
|
||||
* This 128 length long string is generated randomly while the profile was created
|
||||
* Will be sent to mojang when logging in/refreshing an account
|
||||
*/
|
||||
var clientToken by delegate(Util.generateRandomString(128))
|
||||
var clientToken by delegate(KUtil.RANDOM.randomString(128))
|
||||
|
||||
/**
|
||||
* All accounts
|
||||
|
@ -5,7 +5,6 @@ import de.bixilon.kutil.json.JsonUtil.toJsonList
|
||||
import de.bixilon.kutil.uuid.UUIDUtil.trim
|
||||
import de.bixilon.minosoft.assets.util.FileUtil.readJsonObject
|
||||
import de.bixilon.minosoft.data.player.properties.textures.PlayerTextures
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import java.net.URL
|
||||
import java.util.*
|
||||
|
||||
@ -19,7 +18,7 @@ class PlayerProperties(
|
||||
|
||||
|
||||
fun fetch(uuid: UUID): PlayerProperties {
|
||||
val url = Util.formatString(URL, mapOf("uuid" to uuid.trim()))
|
||||
val url = URL.format(mapOf("uuid" to uuid.trim()))
|
||||
val data = URL(url).openStream().readJsonObject()
|
||||
|
||||
var textures: PlayerTextures? = null
|
||||
|
@ -12,9 +12,9 @@
|
||||
*/
|
||||
package de.bixilon.minosoft.data.registries
|
||||
|
||||
import de.bixilon.kutil.string.StringUtil.isLowercase
|
||||
import de.bixilon.minosoft.data.registries.registries.registry.Translatable
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import java.util.*
|
||||
|
||||
open class ResourceLocation(
|
||||
@ -77,7 +77,7 @@ open class ResourceLocation(
|
||||
// if (!ProtocolDefinition.RESOURCE_LOCATION_PATTERN.matcher(resourceLocation).matches()) {
|
||||
// throw new IllegalArgumentException(String.format("%s in not a valid resource location!", resourceLocation));
|
||||
// }
|
||||
return if (Util.doesStringContainsUppercaseLetters(resourceLocation)) {
|
||||
return if (!resourceLocation.isLowercase()) {
|
||||
// just a string but wrapped into a resourceLocation (like old plugin channels MC|BRAND or ...)
|
||||
LegacyResourceLocation(resourceLocation)
|
||||
} else ResourceLocation(resourceLocation)
|
||||
|
@ -1,12 +1,12 @@
|
||||
package de.bixilon.minosoft.data.registries.registries
|
||||
|
||||
import de.bixilon.kutil.string.StringUtil.format
|
||||
import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties
|
||||
import de.bixilon.minosoft.assets.util.FileAssetsUtil
|
||||
import de.bixilon.minosoft.assets.util.FileUtil
|
||||
import de.bixilon.minosoft.assets.util.FileUtil.readMBFMap
|
||||
import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile
|
||||
import de.bixilon.minosoft.data.registries.versions.Version
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.io.File
|
||||
@ -33,12 +33,10 @@ object RegistriesLoader {
|
||||
return FileUtil.readFile(file, false).readMBFMap().compoundCast() ?: throw IllegalStateException("Could not read pixlyzer data!")
|
||||
}
|
||||
|
||||
val savedHash = FileAssetsUtil.downloadAndGetAsset(Util.formatString(
|
||||
url,
|
||||
mapOf(
|
||||
"hashPrefix" to hash.substring(0, 2),
|
||||
"fullHash" to hash,
|
||||
)
|
||||
val savedHash = FileAssetsUtil.downloadAndGetAsset(url.format(mapOf(
|
||||
"hashPrefix" to hash.substring(0, 2),
|
||||
"fullHash" to hash,
|
||||
)
|
||||
), false, hashType = FileAssetsUtil.HashTypes.SHA1)
|
||||
if (savedHash.first != hash) {
|
||||
throw IllegalStateException("Data mismatch, expected $hash, got ${savedHash.first}")
|
||||
|
@ -20,7 +20,6 @@ import de.bixilon.minosoft.gui.eros.dialog.ErosErrorReport.Companion.report
|
||||
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.file
|
||||
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.hyperlink
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import javafx.animation.Animation
|
||||
import javafx.animation.KeyFrame
|
||||
import javafx.animation.Timeline
|
||||
@ -147,7 +146,7 @@ open class TextComponent(
|
||||
KeyFrame(Duration.millis(50.0), {
|
||||
val chars = text.text.toCharArray()
|
||||
for (i in chars.indices) {
|
||||
chars[i] = Util.getRandomChar(ProtocolDefinition.OBFUSCATED_CHARS)
|
||||
chars[i] = ProtocolDefinition.OBFUSCATED_CHARS.random()
|
||||
}
|
||||
text.text = String(chars)
|
||||
}),
|
||||
|
@ -14,7 +14,8 @@ package de.bixilon.minosoft.data.text.events
|
||||
|
||||
import de.bixilon.kutil.enums.EnumUtil
|
||||
import de.bixilon.kutil.enums.ValuesEnum
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.kutil.url.URLUtil.checkWeb
|
||||
import de.bixilon.kutil.url.URLUtil.toURL
|
||||
|
||||
class ClickEvent {
|
||||
val action: ClickEventActions
|
||||
@ -28,7 +29,7 @@ class ClickEvent {
|
||||
return
|
||||
}
|
||||
if (action == ClickEventActions.OPEN_URL) {
|
||||
Util.checkURL(value.toString())
|
||||
value.toString().toURL().checkWeb()
|
||||
}
|
||||
check(action != ClickEventActions.OPEN_CONFIRMATION) { "Can not use OPEN_CONFIRMATION in restricted mode!" }
|
||||
check(action != ClickEventActions.OPEN_FILE) { "Can not use OPEN_FILE in restricted mode!" }
|
||||
|
@ -19,6 +19,7 @@ import de.bixilon.kutil.exception.ExceptionUtil.toStackTrace
|
||||
import de.bixilon.kutil.exception.ExceptionUtil.tryCatch
|
||||
import de.bixilon.kutil.file.FileUtil.slashPath
|
||||
import de.bixilon.kutil.file.watcher.FileWatcherService
|
||||
import de.bixilon.kutil.hash.HashUtil.sha1
|
||||
import de.bixilon.kutil.os.OSUtil
|
||||
import de.bixilon.kutil.time.TimeUtil
|
||||
import de.bixilon.kutil.unit.UnitFormatter.formatBytes
|
||||
@ -33,7 +34,6 @@ import de.bixilon.minosoft.terminal.RunConfiguration
|
||||
import de.bixilon.minosoft.util.GitInfo
|
||||
import de.bixilon.minosoft.util.ShutdownManager
|
||||
import de.bixilon.minosoft.util.SystemInformation
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.logging.Log
|
||||
import de.bixilon.minosoft.util.logging.LogLevels
|
||||
import de.bixilon.minosoft.util.logging.LogMessageType
|
||||
@ -225,7 +225,7 @@ ${exception?.toStackTrace() ?: ""}
|
||||
${GitInfo.formatForCrashReport()}
|
||||
""".trimIndent()
|
||||
|
||||
val hash = Util.sha1(stack.toByteArray(StandardCharsets.UTF_8))
|
||||
val hash = stack.toByteArray(StandardCharsets.UTF_8).sha1()
|
||||
|
||||
return """
|
||||
$stack
|
||||
|
@ -1,10 +1,10 @@
|
||||
package de.bixilon.minosoft.gui.eros.main.play.server.card
|
||||
|
||||
import com.github.luben.zstd.ZstdOutputStream
|
||||
import de.bixilon.kutil.hash.HashUtil.sha256
|
||||
import de.bixilon.minosoft.assets.util.FileAssetsUtil
|
||||
import de.bixilon.minosoft.assets.util.FileUtil
|
||||
import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.Server
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import javafx.scene.image.Image
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
@ -22,7 +22,7 @@ object FaviconManager {
|
||||
return null
|
||||
}
|
||||
|
||||
fun Server.saveFavicon(favicon: ByteArray?, faviconHash: String = Util.sha256(favicon)) {
|
||||
fun Server.saveFavicon(favicon: ByteArray?, faviconHash: String = favicon!!.sha256()) {
|
||||
if (this.faviconHash == faviconHash) {
|
||||
return
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.util
|
||||
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
|
||||
import de.bixilon.kutil.concurrent.pool.ThreadPool
|
||||
import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable
|
||||
import de.bixilon.kutil.file.FileUtil.createParent
|
||||
import de.bixilon.kutil.file.FileUtil.slashPath
|
||||
import de.bixilon.kutil.time.TimeUtil
|
||||
import de.bixilon.minosoft.data.text.BaseComponent
|
||||
@ -26,7 +27,6 @@ import de.bixilon.minosoft.data.text.events.HoverEvent
|
||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||
import de.bixilon.minosoft.gui.rendering.system.base.PixelTypes
|
||||
import de.bixilon.minosoft.terminal.RunConfiguration
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import glm_.vec2.Vec2i
|
||||
import java.awt.image.BufferedImage
|
||||
import java.io.File
|
||||
@ -68,7 +68,7 @@ class ScreenshotTaker(
|
||||
}
|
||||
|
||||
val file = File(path)
|
||||
Util.createParentFolderIfNotExist(file)
|
||||
file.createParent()
|
||||
|
||||
ImageIO.write(bufferedImage, "png", file)
|
||||
|
||||
|
@ -12,6 +12,8 @@
|
||||
*/
|
||||
package de.bixilon.minosoft.protocol.packets.s2c.play
|
||||
|
||||
import de.bixilon.kutil.url.URLUtil.checkWeb
|
||||
import de.bixilon.kutil.url.URLUtil.toURL
|
||||
import de.bixilon.minosoft.data.text.ChatComponent
|
||||
import de.bixilon.minosoft.modding.event.events.ResourcePackRequestEvent
|
||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||
@ -19,13 +21,12 @@ import de.bixilon.minosoft.protocol.packets.c2s.play.ResourcePackStatusC2SP
|
||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
||||
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.logging.Log
|
||||
import de.bixilon.minosoft.util.logging.LogLevels
|
||||
import de.bixilon.minosoft.util.logging.LogMessageType
|
||||
|
||||
class ResourcepackRequestS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
|
||||
val url: String = Util.checkURL(buffer.readString())
|
||||
val url: String = buffer.readString().apply { toURL().checkWeb() }
|
||||
val hash: String = buffer.readString()
|
||||
val forced = if (buffer.versionId >= ProtocolVersions.V_20W45A) {
|
||||
buffer.readBoolean()
|
||||
|
@ -14,6 +14,7 @@ package de.bixilon.minosoft.protocol.protocol
|
||||
|
||||
import com.google.common.collect.HashBiMap
|
||||
import de.bixilon.kutil.latch.CountUpAndDownLatch
|
||||
import de.bixilon.kutil.string.StringUtil.getBetween
|
||||
import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatch
|
||||
import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.Server
|
||||
import de.bixilon.minosoft.config.profile.profiles.other.OtherProfileManager
|
||||
@ -22,7 +23,6 @@ import de.bixilon.minosoft.data.text.ChatComponent
|
||||
import de.bixilon.minosoft.gui.eros.main.play.server.type.types.LANServerType
|
||||
import de.bixilon.minosoft.modding.event.events.LANServerDiscoverEvent
|
||||
import de.bixilon.minosoft.modding.event.master.GlobalEventMaster
|
||||
import de.bixilon.minosoft.util.Util
|
||||
import de.bixilon.minosoft.util.logging.Log
|
||||
import de.bixilon.minosoft.util.logging.LogLevels
|
||||
import de.bixilon.minosoft.util.logging.LogMessageType
|
||||
@ -120,14 +120,14 @@ object LANServerListener {
|
||||
for (mustContain in BROADCAST_MUST_CONTAIN) {
|
||||
require(broadcast.contains(mustContain)) { "Broadcast is invalid!" }
|
||||
}
|
||||
var rawAddress = Util.getStringBetween(broadcast, PORT_START_STRING, PORT_END_STRING)
|
||||
var rawAddress = broadcast.getBetween(PORT_START_STRING, PORT_END_STRING)
|
||||
if (rawAddress.contains(":")) {
|
||||
// weird, just extract the port
|
||||
rawAddress = rawAddress.split(":").toTypedArray()[1]
|
||||
}
|
||||
val port = rawAddress.toInt()
|
||||
require(!(port < 0 || port > 65535)) { "Invalid port: $port" }
|
||||
val motd = Util.getStringBetween(broadcast, MOTD_START_STRING, MOTD_END_STRING)
|
||||
val motd = broadcast.getBetween(MOTD_START_STRING, MOTD_END_STRING)
|
||||
return Server(address = address.hostAddress + ":" + rawAddress, name = BaseComponent("LAN: #${SERVERS.size}: ", ChatComponent.of(motd)))
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,9 @@ import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||
import de.bixilon.kutil.collections.CollectionUtil.synchronizedListOf
|
||||
import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf
|
||||
import de.bixilon.kutil.collections.CollectionUtil.synchronizedSetOf
|
||||
import de.bixilon.kutil.concurrent.time.TimeWorker
|
||||
import de.bixilon.kutil.primitive.BooleanUtil.decide
|
||||
import de.bixilon.kutil.reflection.ReflectionUtil.forceInit
|
||||
import de.bixilon.kutil.reflection.ReflectionUtil.realName
|
||||
import de.bixilon.minosoft.data.entities.entities.Entity
|
||||
import de.bixilon.minosoft.data.inventory.ItemStack
|
||||
@ -29,7 +31,10 @@ import de.bixilon.minosoft.data.text.TextComponent
|
||||
import de.bixilon.minosoft.data.text.TextFormattable
|
||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||
import de.bixilon.minosoft.util.account.microsoft.MicrosoftOAuthUtils
|
||||
import de.bixilon.minosoft.util.json.Jackson
|
||||
import de.bixilon.minosoft.util.logging.Log
|
||||
import de.bixilon.minosoft.util.url.URLProtocolStreamHandlers
|
||||
import glm_.vec2.Vec2t
|
||||
import glm_.vec3.Vec3t
|
||||
import glm_.vec4.Vec4t
|
||||
@ -38,6 +43,7 @@ import java.util.*
|
||||
|
||||
|
||||
object KUtil {
|
||||
val RANDOM = Random()
|
||||
|
||||
fun bitSetOf(long: Long): BitSet {
|
||||
return BitSet.valueOf(longArrayOf(long))
|
||||
@ -229,4 +235,13 @@ object KUtil {
|
||||
userName = StringBuffer("nobody")
|
||||
groupName = StringBuffer("nobody")
|
||||
}
|
||||
|
||||
|
||||
fun initUtilClasses() {
|
||||
Log::class.java.forceInit()
|
||||
URLProtocolStreamHandlers::class.java.forceInit()
|
||||
MicrosoftOAuthUtils::class.java.forceInit()
|
||||
TimeWorker::class.java.forceInit()
|
||||
ShutdownManager::class.java.forceInit()
|
||||
}
|
||||
}
|
||||
|
@ -17,25 +17,22 @@ import com.google.gson.Gson;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import de.bixilon.kutil.concurrent.time.TimeWorker;
|
||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection;
|
||||
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer;
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
|
||||
import de.bixilon.minosoft.util.account.microsoft.MicrosoftOAuthUtils;
|
||||
import de.bixilon.minosoft.util.logging.Log;
|
||||
import de.bixilon.minosoft.util.url.URLProtocolStreamHandlers;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.zip.*;
|
||||
import java.util.zip.DataFormatException;
|
||||
import java.util.zip.Deflater;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.Inflater;
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
public final class Util {
|
||||
@ -115,61 +112,6 @@ public final class Util {
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static String sha1(byte[] data) {
|
||||
ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
|
||||
try {
|
||||
return sha1(inputStream);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String sha256(byte[] data) {
|
||||
ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
|
||||
try {
|
||||
return sha256(inputStream);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String sha1(InputStream inputStream) throws IOException {
|
||||
try {
|
||||
return hash(MessageDigest.getInstance("SHA-1"), inputStream);
|
||||
} catch (NoSuchAlgorithmException | FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static String hash(MessageDigest digest, InputStream inputStream) throws IOException {
|
||||
byte[] buffer = new byte[ProtocolDefinition.DEFAULT_BUFFER_SIZE];
|
||||
int length;
|
||||
while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {
|
||||
digest.update(buffer, 0, length);
|
||||
}
|
||||
return byteArrayToHexString(digest.digest());
|
||||
}
|
||||
|
||||
public static String sha256(InputStream inputStream) throws IOException {
|
||||
try {
|
||||
return hash(MessageDigest.getInstance("SHA-256"), inputStream);
|
||||
} catch (NoSuchAlgorithmException | FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static String byteArrayToHexString(byte[] b) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
for (byte value : b) {
|
||||
result.append(Integer.toString((value & 0xff) + 0x100, 16).substring(1));
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
public static String readReader(BufferedReader reader, boolean closeStream) throws IOException {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
String line;
|
||||
@ -186,52 +128,6 @@ public final class Util {
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
public static InputStreamReader getInputSteamFromZip(String fileName, ZipFile zipFile) throws IOException {
|
||||
return new InputStreamReader(zipFile.getInputStream(zipFile.getEntry(fileName)));
|
||||
}
|
||||
|
||||
public static String readFile(String fileName) throws IOException {
|
||||
FileReader reader = new FileReader(fileName);
|
||||
return readReader(new BufferedReader(reader), true);
|
||||
}
|
||||
|
||||
public static void copyStream(InputStream inputStream, OutputStream output) throws IOException {
|
||||
byte[] buffer = new byte[ProtocolDefinition.DEFAULT_BUFFER_SIZE];
|
||||
int length;
|
||||
while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {
|
||||
output.write(buffer, 0, length);
|
||||
}
|
||||
inputStream.close();
|
||||
output.close();
|
||||
}
|
||||
|
||||
|
||||
public static boolean createParentFolderIfNotExist(File file) {
|
||||
return file.getParentFile().mkdirs();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static String generateRandomString(int length) {
|
||||
StringBuilder sb = new StringBuilder(length);
|
||||
for (int i = 0; i < length; i++) {
|
||||
sb.append(getRandomChar(RANDOM_STRING_CHARS));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static char getRandomChar(char[] chars) {
|
||||
return chars[(RANDOM.nextInt(chars.length))];
|
||||
}
|
||||
|
||||
public static String getStringBetween(String search, String first, String second) {
|
||||
String result = search.substring(search.indexOf(first) + first.length());
|
||||
return result.substring(0, result.indexOf(second));
|
||||
}
|
||||
|
||||
public static boolean doesStringContainsUppercaseLetters(String string) {
|
||||
return !string.toLowerCase().equals(string);
|
||||
}
|
||||
|
||||
public static int getJsonReaderPosition(JsonReader jsonReader) {
|
||||
try {
|
||||
return JSON_READER_POS_FIELD.getInt(jsonReader) - JSON_READER_LINE_START_FIELD.getInt(jsonReader) + 1;
|
||||
@ -240,29 +136,6 @@ public final class Util {
|
||||
}
|
||||
}
|
||||
|
||||
public static String checkURL(String url) {
|
||||
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
||||
throw new IllegalArgumentException("Not a valid url:" + url);
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
public static <T> void forceClassInit(Class<T> clazz) {
|
||||
try {
|
||||
Class.forName(clazz.getName(), true, clazz.getClassLoader());
|
||||
} catch (ClassNotFoundException exception) {
|
||||
throw new RuntimeException(exception);
|
||||
}
|
||||
}
|
||||
|
||||
public static void initUtilClasses() {
|
||||
forceClassInit(Log.class);
|
||||
forceClassInit(URLProtocolStreamHandlers.class);
|
||||
forceClassInit(MicrosoftOAuthUtils.class);
|
||||
forceClassInit(TimeWorker.class);
|
||||
forceClassInit(ShutdownManager.class);
|
||||
}
|
||||
|
||||
public static Map<String, String> urlQueryToMap(String query) {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
for (String parameter : query.split("&")) {
|
||||
@ -289,14 +162,6 @@ public final class Util {
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
public static String formatString(String string, Map<String, Object> format) {
|
||||
String output = string;
|
||||
for (Map.Entry<String, Object> entry : format.entrySet()) {
|
||||
output = output.replace("${" + entry.getKey() + "}", entry.getValue().toString());
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Deprecated
|
||||
public static JsonObject readJsonFromStream(@NotNull InputStream stream, boolean close) throws IOException {
|
||||
|
Loading…
x
Reference in New Issue
Block a user