TerraOceanPlugin/KotlinPlugin/src/main/kotlin/com/terraocean/plugin/bridge/WebSocket.kt

92 lines
2.9 KiB
Kotlin

package com.terraocean.plugin.bridge
import com.terraocean.plugin.Settings
import com.terraocean.plugin.Messages
import com.terraocean.plugin.instance
import hazae41.minecraft.kutils.bukkit.info
import hazae41.minecraft.kutils.bukkit.msg
import hazae41.minecraft.kutils.bukkit.schedule
import hazae41.minecraft.kutils.bukkit.warning
import okhttp3.*
import org.bukkit.Bukkit
import java.util.concurrent.TimeUnit
val client = OkHttpClient.Builder()
.readTimeout(0, TimeUnit.MILLISECONDS)
.build()
private var request = Request.Builder()
.url(Settings.socketURL)
.build()
lateinit var socket: WebSocket
internal var socketActive = false
private var wsFails = 0
fun establishConnection() {
socket = client.newWebSocket(request, WSListener())
}
fun processMessage(msg: List<String>) {
when (msg[0].toLowerCase()) {
"leave" -> {
Bukkit.getPlayer(msg[1])?.kickPlayer(Messages.kickVoiceChannel)
}
"vote" -> {
Bukkit.getOnlinePlayers().forEach { it.msg(Messages.voteNew) }
}
"votewarn" -> {
Bukkit.getPlayer(msg[1])?.sendMessage(Messages.voteWarn)
}
"votetimeout" -> {
Bukkit.getPlayer(msg[1])?.kickPlayer(Messages.voteTimeout)
}
"kick" -> {
Bukkit.getPlayer(msg[1])?.kickPlayer(Messages.voteKick)
}
"whitelistadd" -> {
instance.server.getOfflinePlayer(msg[1]).isWhitelisted = true
}
"whitelistremove" -> {
instance.server.run {
getPlayer(msg[1])?.kickPlayer(Messages.kickRemovedFromWhitelist)
getOfflinePlayer(msg[1]).isWhitelisted = false
}
}
"sync" -> {
Bukkit.getOnlinePlayers().map { it.name }.forEach(::queryUserJoin)
}
else -> instance.warning(
"Potentially out of date plugin. Unknown message: " + msg.joinToString(" ")
)
}
}
class WSListener : WebSocketListener() {
override fun onMessage(webSocket: WebSocket, text: String) {
processMessage(text.split(' ', limit = 2))
}
override fun onOpen(webSocket: WebSocket, response: Response) {
instance.info("Socket connection established to ${response.request.url}.")
socketActive = true
wsFails = 0
}
override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
Bukkit.getOnlinePlayers().forEach { it.kickPlayer(Messages.botConnectionLost) }
socketActive = false
}
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
if (wsFails < 5) {
wsFails++
instance.warning("WS Fail: ${t.message}")
instance.info("Reconnecting to socket...")
}
socketActive = false
instance.schedule(delay = 5, unit = TimeUnit.SECONDS) {
establishConnection()
}
}
}