remove more Util functions, bump kutil to 1.3

This commit is contained in:
Bixilon 2021-12-29 19:17:33 +01:00
parent e3ee113b2b
commit 30da957baa
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
20 changed files with 72 additions and 192 deletions

View File

@ -457,7 +457,7 @@
<dependency>
<groupId>de.bixilon</groupId>
<artifactId>kutil</artifactId>
<version>1.1</version>
<version>1.3</version>
</dependency>
</dependencies>
</project>

View File

@ -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() })

View File

@ -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)

View File

@ -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) {

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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}")

View File

@ -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)
}),

View File

@ -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!" }

View File

@ -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

View File

@ -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
}

View File

@ -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)

View 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()

View File

@ -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)))
}

View File

@ -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()
}
}

View File

@ -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 {