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