Skip to content

Commit

Permalink
refactor: update mesagisto-client
Browse files Browse the repository at this point in the history
  • Loading branch information
Itsusinn committed Nov 8, 2022
1 parent 13a8ad5 commit dbc1101
Show file tree
Hide file tree
Showing 11 changed files with 117 additions and 99 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/pre-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: latest
prerelease: true
title: "Development Build/不稳定发行版"
title: "Unstable release/不稳定发行版"
files: |
packages/*.jar
LICENSE
8 changes: 3 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ group = "org.meowcat"
version = "1.4.0"
plugins {
java
kotlin("jvm") version "1.7.0"
kotlin("jvm") version "1.6.0"
id("com.github.johnrengelman.shadow") version "7.1.1"
id("io.itsusinn.pkg") version "1.2.2"
}
Expand Down Expand Up @@ -46,8 +46,7 @@ java {

dependencies {
pkgIn("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2")
pkgIn("io.nats:jnats:2.15.3")
pkgIn("org.mesagisto:mesagisto-client:1.5.2")
pkgIn("org.mesagisto:mesagisto-client:1.6.0-rc.1")
pkgIn("com.github.jknack:handlebars:4.3.0")
pkgIn("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3")
compileOnly("org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT")
Expand All @@ -62,8 +61,7 @@ tasks {
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
languageVersion = "1.5"
freeCompilerArgs = listOf("-Xinline-classes", "-Xopt-in=kotlin.RequiresOptIn")
freeCompilerArgs = listOf("-Xinline-classes", "-opt-in=kotlin.RequiresOptIn")
}
}
}
13 changes: 10 additions & 3 deletions src/main/kotlin/org/meowcat/mesagisto/kato/Config.kt
Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
package org.meowcat.mesagisto.kato

import org.bukkit.event.EventPriority
import org.mesagisto.client.Server
import java.util.*
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicInteger

data class RootConfig(
val serverName: String = "Server Name",
val channel: String = "your-channel",
val target: String = "target-name",
val nats: String = "nats://nats.mesagisto.org:4222",
val centers: ConcurrentHashMap<String, String> = ConcurrentHashMap<String, String>(1).apply { put("mesagisto", "wss://center.mesagisto.org") },
val cipher: CipherConfig = CipherConfig(),
val eventPriority: EventPriority = EventPriority.NORMAL,
val switch: SwitchConfig = SwitchConfig(),
val template: TemplateConfig = TemplateConfig()
)
val template: TemplateConfig = TemplateConfig(),
) {
fun roomId(): UUID {
return Server.roomId(channel)
}
}

data class CipherConfig(
val key: String = "default"
Expand Down
8 changes: 4 additions & 4 deletions src/main/kotlin/org/meowcat/mesagisto/kato/Extension.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.meowcat.mesagisto.kato

import org.meowcat.mesagisto.client.ILogger
import org.meowcat.mesagisto.client.LogLevel
import org.meowcat.mesagisto.client.Logger
import org.mesagisto.client.ILogger
import org.mesagisto.client.LogLevel
import org.mesagisto.client.Logger
import java.nio.ByteBuffer
import java.util.*
import java.util.logging.Level
Expand All @@ -17,7 +17,7 @@ fun Logger.bridgeToBukkit(impl: StdLogger) {
Level.WARNING -> LogLevel.WARN
Level.SEVERE -> LogLevel.ERROR
Level.OFF -> LogLevel.ERROR
else -> { LogLevel.TRACE }
else -> { LogLevel.INFO }
}
provider = object : ILogger {
override fun log(level: LogLevel, msg: String) {
Expand Down
31 changes: 19 additions & 12 deletions src/main/kotlin/org/meowcat/mesagisto/kato/Plugin.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
package org.meowcat.mesagisto.kato

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import org.bukkit.plugin.java.JavaPlugin
import org.meowcat.mesagisto.client.Logger
import org.meowcat.mesagisto.client.MesagistoConfig
import org.meowcat.mesagisto.client.Server
import org.meowcat.mesagisto.client.utils.ConfigKeeper
import org.meowcat.mesagisto.kato.handlers.Listener
import org.meowcat.mesagisto.kato.handlers.Receive
import org.meowcat.mesagisto.kato.platform.JvmPlugin
import org.mesagisto.client.Logger
import org.mesagisto.client.MesagistoConfig
import org.mesagisto.client.Server
import org.mesagisto.client.utils.ConfigKeeper
import java.io.File
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.io.path.Path
import kotlin.io.path.createDirectories

object Plugin : JvmPlugin(), CoroutineScope {
override val coroutineContext = EmptyCoroutineContext
private lateinit var bukkit: JavaPlugin

private var closed: Boolean = false
Expand All @@ -22,30 +25,34 @@ object Plugin : JvmPlugin(), CoroutineScope {
private val DATA_KEEPER = ConfigKeeper.create(File("plugins/mesagisto/data.yml").toPath()) { RootData() }
val CONFIG = CONFIG_KEEPER.value
val DATA = DATA_KEEPER.value
override suspend fun onLoad(bukkit: JavaPlugin): Result<Unit> = runCatching fn@{
override fun onLoad(bukkit: JavaPlugin): Result<Unit> = runCatching fn@{
Path("db_v2/bukkit").createDirectories()
this.bukkit = bukkit
Logger.bridgeToBukkit(Plugin.bukkit.logger)
CONFIG_KEEPER.save()
Template.init()
return@fn
}
override suspend fun onEnable() = runCatching fn@{
override fun onEnable() = runCatching {
if (closed) {
throw IllegalStateException("hot reload error")
}

MesagistoConfig.builder {
val config = MesagistoConfig.builder {
name = "bukkit"
natsAddress = CONFIG.nats
cipherKey = CONFIG.cipher.key
}.apply()
Receive.recover()
remotes = CONFIG.centers
packetHandler = Receive::packetHandler
sameSideDeliver = false
}
launch {
config.apply()
Receive.recover()
}
bukkit.server.pluginManager.registerEvents(Listener, bukkit)
Logger.info { "Mesagisto信使启用成功" }
}

override suspend fun onDisable() = runCatching {
override fun onDisable() = runCatching {
// attention!! before this term, zip(jar) is closed
// so, loading class before onDisable
DATA_KEEPER.save()
Expand Down
10 changes: 5 additions & 5 deletions src/main/kotlin/org/meowcat/mesagisto/kato/Template.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ object Template {
put("content", content)
}
val context = Context.newContext(module)
return Template.apply("message", context)
return apply("message", context)
}

fun renderJoin(player: String): String {
Expand All @@ -45,23 +45,23 @@ object Template {
put("player", player)
}
val context = Context.newContext(module)
return Template.apply("join", context)
return apply("join", context)
}
fun renderLeave(player: String): String {
val module = HashMap<String, String>(2)
module.apply {
put("player", player)
}
val context = Context.newContext(module)
return Template.apply("leave", context)
return apply("leave", context)
}
fun renderDeath(player: String, message: String): String {
val module = HashMap<String, String>(2)
module.apply {
put("message", message)
put("player", message)
put("player", player)
}
val context = Context.newContext(module)
return Template.apply("death", context)
return apply("death", context)
}
}
61 changes: 37 additions & 24 deletions src/main/kotlin/org/meowcat/mesagisto/kato/handlers/Receive.kt
Original file line number Diff line number Diff line change
@@ -1,43 +1,56 @@
package org.meowcat.mesagisto.kato.handlers

import io.nats.client.impl.NatsMessage
import org.bukkit.Bukkit
import org.meowcat.mesagisto.client.Base64
import org.meowcat.mesagisto.client.Server
import org.meowcat.mesagisto.client.data.Either
import org.meowcat.mesagisto.client.data.Message
import org.meowcat.mesagisto.client.data.MessageType
import org.meowcat.mesagisto.client.data.Packet
import org.meowcat.mesagisto.kato.Plugin
import org.meowcat.mesagisto.kato.Plugin.CONFIG
import org.meowcat.mesagisto.kato.Template.renderMessage
import org.mesagisto.client.Base64
import org.mesagisto.client.Logger
import org.mesagisto.client.Server
import org.mesagisto.client.data.Message
import org.mesagisto.client.data.MessageType
import org.mesagisto.client.data.Packet
import org.mesagisto.client.utils.ControlFlow
import org.mesagisto.client.utils.Either
import org.mesagisto.client.withCatch

object Receive {
suspend fun recover() {
Server.recv(CONFIG.target, CONFIG.channel) handler@{ msg, _ ->
return@handler mainHandler(msg as NatsMessage)
}
add(CONFIG.channel)
}
}
fun mainHandler(
message: NatsMessage
): Result<Unit> = runCatching {
when (val packet = Packet.fromCbor(message.data).getOrThrow()) {
is Either.Left -> {
leftSubHandler(packet.value).getOrThrow()
}
is Either.Right -> {
packet.value
suspend fun add(roomAddress: String) {
val roomId = Server.roomId(roomAddress)
Server.sub(roomId, "mesagisto")
}
suspend fun packetHandler(pkt: Packet): Result<ControlFlow<Packet, Unit>> = withCatch(Plugin.coroutineContext) fn@{
if (pkt.ctl != null) {
return@fn ControlFlow.Continue(Unit)
}
pkt.decrypt()
.onFailure {
Logger.warn { "数据解密失败" }
}
.onSuccess {
when (it) {
is Either.Left -> {
if (!it.value.from.contentEquals(CONFIG.target.toByteArray())) {
msgHandler(it.value, "mesagisto").onFailure { e -> Logger.error(e) }
}
}
is Either.Right -> return@fn ControlFlow.Break(pkt)
}
}
return@fn ControlFlow.Continue(Unit)
}
}
fun leftSubHandler(
message: Message
): Result<Unit> = runCatching fn@{
fun msgHandler(
message: Message,
server: String
): Result<Unit> = runCatching {
val senderName = with(message.profile) { nick ?: username ?: Base64.encodeToString(id) }
val msgList = message.chain.filterIsInstance<MessageType.Text>()
msgList.forEach {
val text = renderMessage(senderName, it.content)
Bukkit.broadcastMessage(text)
}
}

47 changes: 28 additions & 19 deletions src/main/kotlin/org/meowcat/mesagisto/kato/handlers/Send.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,24 @@ import org.bukkit.event.entity.PlayerDeathEvent
import org.bukkit.event.player.AsyncPlayerChatEvent
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerQuitEvent
import org.meowcat.mesagisto.client.Server
import org.meowcat.mesagisto.client.data.* // ktlint-disable no-wildcard-imports
import org.meowcat.mesagisto.client.toByteArray
import org.meowcat.mesagisto.kato.Plugin.CONFIG
import org.meowcat.mesagisto.kato.Plugin.DATA
import org.meowcat.mesagisto.kato.Template
import org.meowcat.mesagisto.kato.asBytes
import org.meowcat.mesagisto.kato.stripColor
import org.mesagisto.client.Server
import org.mesagisto.client.data.Message
import org.mesagisto.client.data.MessageType
import org.mesagisto.client.data.Packet
import org.mesagisto.client.data.Profile
import org.mesagisto.client.toByteArray
import org.mesagisto.client.utils.left


suspend fun send(
event: AsyncPlayerChatEvent
) {
val channel = CONFIG.channel
val roomId = CONFIG.roomId()
val msgId = DATA.idCounter.getAndIncrement()
val chain = listOf<MessageType>(
MessageType.Text(event.message.stripColor())
Expand All @@ -29,14 +34,15 @@ suspend fun send(
sender.playerListName.stripColor()
),
id = msgId.toByteArray(),
chain = chain
chain = chain,
from = CONFIG.target.toByteArray()
)
val packet = Packet.from(message.left())
Server.send(CONFIG.target, channel, packet)
val packet = Packet.new(roomId, message.left())
Server.send(packet, "mesagisto")
}
suspend fun sendPlayerJoin(event: PlayerJoinEvent) {
val roomId = CONFIG.roomId()
val servername = CONFIG.serverName
val channel = CONFIG.channel
val msgId = DATA.idCounter.getAndIncrement()
val chain = listOf<MessageType>(
MessageType.Text(Template.renderJoin(event.player.playerListName.stripColor()))
Expand All @@ -48,14 +54,15 @@ suspend fun sendPlayerJoin(event: PlayerJoinEvent) {
null
),
id = msgId.toByteArray(),
chain = chain
chain = chain,
from = CONFIG.target.toByteArray()
)
val packet = Packet.from(message.left())
Server.send(CONFIG.target, channel, packet)
val packet = Packet.new(roomId, message.left())
Server.send(packet, "mesagisto")
}
suspend fun sendPlayerLeave(event: PlayerQuitEvent) {
val roomId = CONFIG.roomId()
val servername = CONFIG.serverName
val channel = CONFIG.channel
val msgId = DATA.idCounter.getAndIncrement()
val chain = listOf<MessageType>(
MessageType.Text(Template.renderLeave(event.player.playerListName.stripColor()))
Expand All @@ -67,14 +74,15 @@ suspend fun sendPlayerLeave(event: PlayerQuitEvent) {
null
),
id = msgId.toByteArray(),
chain = chain
chain = chain,
from = CONFIG.target.toByteArray()
)
val packet = Packet.from(message.left())
Server.send(CONFIG.target, channel, packet)
val packet = Packet.new(roomId, message.left())
Server.send(packet, "mesagisto")
}
suspend fun sendPlayerDeath(event: PlayerDeathEvent) {
val roomId = CONFIG.roomId()
val servername = CONFIG.serverName
val channel = CONFIG.channel
val msgId = DATA.idCounter.getAndIncrement()
val chain = listOf<MessageType>(
MessageType.Text(Template.renderDeath(event.entity.playerListName, event.deathMessage.stripColor()))
Expand All @@ -86,8 +94,9 @@ suspend fun sendPlayerDeath(event: PlayerDeathEvent) {
null
),
id = msgId.toByteArray(),
chain = chain
chain = chain,
from = CONFIG.target.toByteArray()
)
val packet = Packet.from(message.left())
Server.send(CONFIG.target, channel, packet)
val packet = Packet.new(roomId, message.left())
Server.send(packet, "mesagisto")
}
Loading

0 comments on commit dbc1101

Please sign in to comment.