commit 07/10/2025

This commit is contained in:
2025-10-07 13:30:27 +07:00
parent 748301a5cb
commit 1c72c7577f
13 changed files with 151 additions and 98 deletions

View File

@@ -50,42 +50,40 @@ class TCP_Android_Command_Server {
while (isActive) {
if (tcpserver.isClosed) break
try {
tcpserver.accept().use { socket ->
{
CoroutineScope(Dispatchers.IO).launch {
if (socket != null) {
// key is IP address only
val key: String = socket.inetAddress.hostAddress
socketMap[key] = socket
Logger.info { "Start communicating with $key" }
socket.getInputStream().let { din ->
{
while (isActive) {
if (din.available() > 0) {
val bb = ByteArray(din.available())
din.read(bb)
// B4A format, 4 bytes di depan adalah size
val str = String(bb, 4, bb.size - 4)
str.split("@").map { it.trim() }.filter { ValidString(it) }
.map { it.uppercase() }.forEach {
process_command(key,it) { reply ->
try {
socket.getOutputStream().write(String_to_Byte_Android(reply))
} catch (e: Exception) {
logcb.accept("Failed to send reply to $key, Message : ${e.message}")
}
}
}
val socket = tcpserver.accept()
CoroutineScope(Dispatchers.IO).launch {
if (socket != null) {
// key is IP address only
val key: String = socket.inetAddress.hostAddress
socketMap[key] = socket
Logger.info { "Start communicating with IPMT/IPM with IP $key" }
val din = socket.getInputStream()
val dout = socket.getOutputStream()
while (isActive) {
if (din.available() > 0) {
val bb = ByteArray(din.available())
din.read(bb)
// B4A format, 4 bytes di depan adalah size
val str = String(bb, 4, bb.size - 4)
println("Received from $key : $str")
str.split("@").map { it.trim() }.filter { ValidString(it) }
.forEach {
process_command(key,it) { reply ->
try {
println("Reply to $key : ${reply.length} bytes")
dout.write(String_to_Byte_Android(reply))
} catch (e: Exception) {
logcb.accept("Failed to send reply to $key, Message : $e")
}
}
}
}
logcb.accept("Finished communicatiing with $key")
socketMap.remove(key)
}
}
logcb.accept("Finished communicatiing with $key")
socketMap.remove(key)
}
}
} catch (ex: Exception) {
@@ -109,8 +107,8 @@ class TCP_Android_Command_Server {
*/
private fun String_to_Byte_Android(str: String): ByteArray {
if (ValidString(str)) {
val len = str.length
val bytes = str.toByteArray()
val bytes = str.toByteArray(Charsets.UTF_8)
val len = bytes.size
return ByteBuffer.allocate(len + 4)
.order(ByteOrder.LITTLE_ENDIAN)
.putInt(len)
@@ -128,14 +126,15 @@ class TCP_Android_Command_Server {
*/
private fun process_command(key: String, cmd: String, cb: Consumer<String>) {
Logger.info { "Command from $key : $cmd" }
val parts = cmd.split(";").map { it.trim() }.filter { it.isNotBlank() }.map { it.uppercase() }
val parts = cmd.split(";").map { it.trim() }.filter { it.isNotBlank() }
when (parts[0]) {
"GETLOGIN" -> {
// Android login request
val username = parts.getOrElse(1) { "" }
val password = parts.getOrElse(2) { "" }
if (ValidString(username) && ValidString(password)) {
if (db.userDB.List.any{it.username==username && it.password==password}) {
if (db.userDB.List.any{
it.username==username && it.password==password}) {
val existing = listUserLogin.find { it.ip == key}
if (existing!=null){
existing.username = username
@@ -236,10 +235,14 @@ class TCP_Android_Command_Server {
// pengiriman variabel ke Android
val username = parts.getOrElse(1) { "" }
if (ValidString(username)){
println("Initialize request from $key with username $username")
val userlogin = listUserLogin.find { it.username == username }
if (userlogin != null){
println("User $username found in listUserLogin")
val userdb = db.userDB.List.find { it.username == username }
if (userdb != null){
println("User $username found in userDB")
println(userdb)
val result = StringBuilder()
result.append("ZONE")
userdb.broadcastzones.split(";").map { it.trim() }.filter { it.isNotBlank() }.forEach {
@@ -268,56 +271,59 @@ class TCP_Android_Command_Server {
result.append("MSGTOTAL;").append(VARMESSAGES.size).append("@")
// VAR AP TOTAL
val VARAPTOTAL = mutableListOf<Soundbank>()
val sb_split = userdb.soundbank_tags.split(";").map { it.trim() }.filter { it.isNotBlank() }
sb_split.forEach {
val al_split = userdb.airline_tags.split(";").map { it.trim() }.filter { it.isNotBlank() }
al_split.forEach {
val sb = db.Find_Soundbank_AirplaneName(it).firstOrNull()
if (sb != null) VARAPTOTAL.add(sb)
}
result.append("VARAPTOTAL;").append(VARAPTOTAL.size).append("@")
// VAR CITY TOTAL
val VARCITYTOTAL = mutableListOf<Soundbank>()
sb_split.forEach {
val ct_split = userdb.city_tags.split(";").map { it.trim() }.filter { it.isNotBlank() }
ct_split.forEach {
val sb = db.Find_Soundbank_City(it).firstOrNull()
if (sb != null) VARCITYTOTAL.add(sb)
}
result.append("VARCITYTOTAL;").append(VARCITYTOTAL.size).append("@")
// VAR PLACES TOTAL
val VARPLACESTOTAL = mutableListOf<Soundbank>()
sb_split.forEach {
val sb = db.Find_Soundbank_Places(it).firstOrNull()
if (sb != null) VARPLACESTOTAL.add(sb)
}
// sb_split.forEach {
// val sb = db.Find_Soundbank_Places(it).firstOrNull()
// if (sb != null) VARPLACESTOTAL.add(sb)
// }
result.append("VARPLACESTOTAL;").append(VARPLACESTOTAL.size).append("@")
// VAR SHALAT TOTAL
val VARSHALATTOTAL = mutableListOf<Soundbank>()
sb_split.forEach {
val sb = db.Find_Soundbank_Shalat(it).firstOrNull()
if (sb != null) VARSHALATTOTAL.add(sb)
}
// sb_split.forEach {
// val sb = db.Find_Soundbank_Shalat(it).firstOrNull()
// if (sb != null) VARSHALATTOTAL.add(sb)
// }
result.append("VARSHALATTOTAL;").append(VARSHALATTOTAL.size).append("@")
// VAR SEQUENCE TOTAL
val VARSEQUENCETOTAL = mutableListOf<Soundbank>()
sb_split.forEach {
val sb = db.Find_Soundbank_Sequence(it).firstOrNull()
if (sb != null) VARSEQUENCETOTAL.add(sb)
}
// sb_split.forEach {
// val sb = db.Find_Soundbank_Sequence(it).firstOrNull()
// if (sb != null) VARSEQUENCETOTAL.add(sb)
// }
// VAR REASON TOTAL
val VARREASONTOTAL = mutableListOf<Soundbank>()
sb_split.forEach {
val sb = db.Find_Soundbank_Reason(it).firstOrNull()
if (sb != null) VARREASONTOTAL.add(sb)
}
// sb_split.forEach {
// val sb = db.Find_Soundbank_Reason(it).firstOrNull()
// if (sb != null) VARREASONTOTAL.add(sb)
// }
result.append("VARREASONTOTAL;").append(VARREASONTOTAL.size).append("@")
// VAR PROCEDURE TOTAL
val VARPROCEDURETOTAL = mutableListOf<Soundbank>()
sb_split.forEach {
val sb = db.Find_Soundbank_Procedure(it).firstOrNull()
if (sb != null) VARPROCEDURETOTAL.add(sb)
}
// sb_split.forEach {
// val sb = db.Find_Soundbank_Procedure(it).firstOrNull()
// if (sb != null) VARPROCEDURETOTAL.add(sb)
// }
result.append("VARPROCEDURETOTAL;").append(VARPROCEDURETOTAL.size).append("@")
// send to sender
cb.accept(result.toString())
println("Result so far: $result")
println("Result size: ${result.length} bytes")
result.clear()
//Append MSG, for Android only Indonesia and English
@@ -359,6 +365,8 @@ class TCP_Android_Command_Server {
result.append("VARPROCEDURE;").append(index).append(";").append(soundbank.TAG).append(";").append(soundbank.Description).append("@")
}
// send to sender
println("Final Result: $result")
println("Final Result size: ${result.length} bytes")
cb.accept(result.toString())
logcb.accept("All variables sent to $key with username $username")