Commit 29/07/2025

This commit is contained in:
2025-07-29 11:57:24 +07:00
parent 4792e282d7
commit c076f31fcc
5 changed files with 113 additions and 11 deletions

View File

@@ -2,11 +2,13 @@
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="AiaStyle" enabled="false" level="TYPO" enabled_by_default="false" />
<inspection_tool class="FunctionName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="GrazieInspection" enabled="false" level="GRAMMAR_ERROR" enabled_by_default="false" />
<inspection_tool class="LanguageDetectionInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="LocalVariableName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="MethodNameSameAsClassName" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="PrivatePropertyName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="PropertyName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />

View File

@@ -5,4 +5,5 @@ import zello.ZelloClient
fun main() {
val z = ZelloClient.fromConsumerZello()
}

64
src/zello/LogonCommand.kt Normal file
View File

@@ -0,0 +1,64 @@
package zello
import com.fasterxml.jackson.annotation.JsonPropertyOrder
@Suppress("unused")
@JsonPropertyOrder(value=["command","seq","auth_token","refresh_token","username","password","channels","listen_only","version","platform_type","platform_name"])
class LogonCommand(val seq: Int, val auth_token: String?, val refresh_token: String?, val username: String?, val password: String?, val channels: Array<String>, val listen_only: Boolean?, val version: String?, val platform_type: String?, val platform_name:String?) {
val command: String = "logon"
companion object {
/**
* Creates a LogonCommand with the specified sequence number and channels.
* auth_token, refresh_token, username, password, listen_only, version, platform_type, platform_name are omitted
* @param seq The sequence number for the command.
* @param channels An array of channel names to log on to.
* @return A new instance of LogonCommand.
*/
fun create(seq: Int, channels: Array<String>): LogonCommand {
return LogonCommand(seq, null, null, null, null, channels, null, null, null, null)
}
/**
* Creates a LogonCommand with the specified sequence number, channels, and auth_token.
* refresh_token, username, password, listen_only, version, platform_type, platform_name are omitted
* @param seq The sequence number for the command.
* @param channels An array of channel names to log on to.
* @param auth_token API authentication token. If omitted refresh_token is required when connecting to consumer Zello
*
* See [Zello API](https://github.com/zelloptt/zello-channel-api/blob/master/API.md#authentication)
* @return A new instance of LogonCommand.
*/
fun create(seq: Int, channels: Array<String>, auth_token: String?): LogonCommand {
return LogonCommand(seq, auth_token, null, null, null, channels, null, null, null, null)
}
/**
* Creates a LogonCommand with the specified sequence number, channels, auth_token, username, and password.
* refresh_token, listen_only, version, platform_type, platform_name are omitted
* @param seq The sequence number for the command.
* @param channels An array of channel names to log on to.
* @param auth_token API authentication token. If omitted refresh_token is required when connecting to consumer Zello
* @param username Username for authentication.
* @param password Password for authentication.
* @return A new instance of LogonCommand.
*/
fun create(seq: Int, channels: Array<String>, auth_token: String?, username: String?, password: String?): LogonCommand {
return LogonCommand(seq, auth_token, null, username, password, channels, null, null, null, null)
}
/**
* Creates a LogonCommand with the specified sequence number, channels, auth_token, refresh_token, username, and password.
* listen_only, version, platform_type, platform_name are omitted
* @param seq The sequence number for the command.
* @param channels An array of channel names to log on to.
* @param auth_token API authentication token. If omitted refresh_token is required when connecting to consumer Zello
* @param refresh_token API refresh token. If omitted auth_token is required when connecting to consumer Zello.
* @param username Username for authentication.
* @param password Password for authentication.
* @return A new instance of LogonCommand.
*/
fun create(seq: Int, channels: Array<String>, auth_token: String?, refresh_token: String?, username: String?, password: String?): LogonCommand {
return LogonCommand(seq, auth_token, refresh_token, username, password, channels, null, null, null, null)
}
}
}

9
src/zello/LogonReply.kt Normal file
View File

@@ -0,0 +1,9 @@
package zello
@Suppress("unused")
class LogonReply {
var seq: Int = 0
var success : Boolean? = null
var refresh_token: String? = null
var error: String? = null
}

View File

@@ -2,11 +2,18 @@ package zello
import org.java_websocket.client.WebSocketClient
import org.java_websocket.handshake.ServerHandshake
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.lang.Exception
import java.net.URI
@Suppress("unused")
class ZelloClient(address : URI) : WebSocketClient(address) {
/**
* ZelloClient is a WebSocket client for connecting to Zello services.
* [Source](https://github.com/zelloptt/zello-channel-api/blob/master/API.md)
*
*/
class ZelloClient(val address : URI) {
companion object {
fun fromConsumerZello() : ZelloClient {
return ZelloClient(URI.create("wss://zello.io/ws"))
@@ -21,25 +28,44 @@ class ZelloClient(address : URI) : WebSocketClient(address) {
}
}
private var client : WebSocketClient? = null
// this key is temporary, valid only 30 days from 2025-07-29
// if need to create, from https://developers.zello.com/keys
private val developerKey : String = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJXa002Y21ScllYSjBiMjV2T2pFLi1yYjJ2THFRbUhYV3dKY2I2azl2TDdUMEtzRWZMRjcxZm5jcktTZ0s2ZE0iLCJleHAiOjE3NTY0MzIyMTIsImF6cCI6ImRldiJ9.ANK7BIS6WVVWsQRjcZXyGWrV2RodCUQD4WXWaA6E4Dlyy8bBCMFdbiKN2D7B_x729HQULailnfRhbXF4Avfg14qONdc1XE_0iGiPUO1kfUSgdd11QylOzjxy6FTKSeZmHOh65JZq2dIWxobCcva-RPvbR8TA656upHh32xrWv9zlU0N707FTca04kze0Iq-q-uC5EL82yK10FEvOPDX88MYy71QRYi8Qh_KbSyMcYAhe2bTsiyjm51ZH9ntkRHd0HNiaijNZI6-qXkkp5Soqmzh-bTtbbgmbX4BT3Qpz_IP3epaX3jl_Aq5DHxXwCsJ9FThif9um5D0TWVGQteR0cQ"
override fun onOpen(handshakedata: ServerHandshake?) {
TODO("Not yet implemented")
private val logger : Logger = LoggerFactory.getLogger(ZelloClient::class.java)
var isConnected : Boolean = false
fun Start(){
client = object : WebSocketClient(address) {
override fun onOpen(handshakedata: ServerHandshake?) {
logger.info("Connected to $address")
isConnected = true
}
override fun onMessage(message: String?) {
logger.info("Message received: $message")
}
override fun onClose(code: Int, reason: String?, remote: Boolean) {
logger.info("Closed from ${if (remote) "Remote side" else "Local side"}, Code=$code, Reason=$reason")
isConnected = false
}
override fun onError(ex: Exception?) {
logger.error("Error occurred: ${ex?.message}")
}
}
client?.connect()
}
override fun onMessage(message: String?) {
TODO("Not yet implemented")
fun Stop(){
client?.close()
}
override fun onClose(code: Int, reason: String?, remote: Boolean) {
TODO("Not yet implemented")
}
override fun onError(ex: Exception?) {
TODO("Not yet implemented")
}
}