commit 09/02/2026
This commit is contained in:
@@ -24,14 +24,14 @@ import content.Category
|
||||
import content.Language
|
||||
import content.ScheduleDay
|
||||
import content.VoiceType
|
||||
import database.BroadcastZones
|
||||
import database.LanguageLink
|
||||
import database.data.BroadcastZones
|
||||
import database.data.LanguageLink
|
||||
import database.MariaDB
|
||||
import database.Messagebank
|
||||
import database.ScheduleBank
|
||||
import database.SoundChannel
|
||||
import database.Soundbank
|
||||
import database.UserDB
|
||||
import database.data.Messagebank
|
||||
import database.data.ScheduleBank
|
||||
import database.data.SoundChannel
|
||||
import database.data.Soundbank
|
||||
import database.data.UserDB
|
||||
import db
|
||||
import io.javalin.Javalin
|
||||
import io.javalin.apibuilder.ApiBuilder.*
|
||||
@@ -43,8 +43,8 @@ import java.nio.file.Files
|
||||
import java.time.LocalDateTime
|
||||
import codes.configKeys
|
||||
import config
|
||||
import database.LogSemiauto
|
||||
import database.QueueTable
|
||||
import database.data.LogSemiauto
|
||||
import database.data.QueueTable
|
||||
import google.GoogleTTS
|
||||
import google.autoadd
|
||||
import google.fileoperation
|
||||
@@ -128,7 +128,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
//it.sessionAttribute("user", user.first)
|
||||
it.cookie("aas-user", user.first)
|
||||
// Redirect to home page
|
||||
if (user.first== GetAdminUserFromConfig()){
|
||||
if (user.first == GetAdminUserFromConfig()) {
|
||||
it.redirect("homeadmin.html")
|
||||
} else {
|
||||
it.redirect("homeviewer.html")
|
||||
@@ -149,9 +149,10 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
val cmd =
|
||||
objectmapper.readValue(wsMessageContext.message(), WebsocketCommand::class.java)
|
||||
when (cmd.command) {
|
||||
"getAppVersion" ->{
|
||||
"getAppVersion" -> {
|
||||
SendReply(wsMessageContext, cmd.command, version)
|
||||
}
|
||||
|
||||
"getSystemTime" -> {
|
||||
|
||||
val systemtime = LocalDateTime.now().format(datetimeformat1)
|
||||
@@ -184,11 +185,19 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
}
|
||||
|
||||
"getMemoryStatus" -> {
|
||||
SendReply(wsMessageContext, cmd.command, objectmapper.writeValueAsString(Somecodes.getMemoryUsage()))
|
||||
SendReply(
|
||||
wsMessageContext,
|
||||
cmd.command,
|
||||
objectmapper.writeValueAsString(Somecodes.getMemoryUsage())
|
||||
)
|
||||
}
|
||||
|
||||
"getDiskStatus" -> {
|
||||
SendReply(wsMessageContext, cmd.command, objectmapper.writeValueAsString(Somecodes.getDiskUsage()))
|
||||
SendReply(
|
||||
wsMessageContext,
|
||||
cmd.command,
|
||||
objectmapper.writeValueAsString(Somecodes.getDiskUsage())
|
||||
)
|
||||
}
|
||||
|
||||
"getNetworkStatus" -> {
|
||||
@@ -223,8 +232,8 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
SendReply(wsMessageContext, cmd.command, objectmapper.writeValueAsString(reply))
|
||||
}
|
||||
|
||||
"start_generate_tts" ->{
|
||||
val js : JsonNode = objectmapper.readTree(cmd.data)
|
||||
"start_generate_tts" -> {
|
||||
val js: JsonNode = objectmapper.readTree(cmd.data)
|
||||
SendReply(wsMessageContext, cmd.command, "ok")
|
||||
val voicetype = js.get("voicetype")?.asText("Wavenet-A") ?: "Wavenet-A"
|
||||
val languagecode = js.get("languagecode")?.asText("id-ID") ?: "id-ID"
|
||||
@@ -232,21 +241,27 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
val targetas = js.get("targetas")?.asText("VOICE_2") ?: "VOICE_2"
|
||||
val fop = js.get("fileoperation")?.asText("overwrite") ?: "overwrite"
|
||||
val aa = js.get("autoadd")?.asText("add") ?: "add"
|
||||
Logger.info {"Starting TTS Soundbank Generation, VoiceType=$voicetype, Language"}
|
||||
ttsjob.GenerateSoundbank(voicetype, Language.from_GoogleTTSLanguage(languagecode),
|
||||
Logger.info { "Starting TTS Soundbank Generation, VoiceType=$voicetype, Language" }
|
||||
ttsjob.GenerateSoundbank(
|
||||
voicetype, Language.from_GoogleTTSLanguage(languagecode),
|
||||
VoiceType.fromString(databasesource),
|
||||
VoiceType.fromString(targetas), fileoperation.fromString(fop),
|
||||
autoadd.fromString(aa)){ progress, message ->
|
||||
SendReply(wsMessageContext, "tts_generate_progress", objectmapper.writeValueAsString(
|
||||
mapOf(
|
||||
"progress" to progress,
|
||||
"message" to message
|
||||
autoadd.fromString(aa)
|
||||
) { progress, message ->
|
||||
SendReply(
|
||||
wsMessageContext,
|
||||
"tts_generate_progress",
|
||||
objectmapper.writeValueAsString(
|
||||
mapOf(
|
||||
"progress" to progress,
|
||||
"message" to message
|
||||
)
|
||||
)
|
||||
))
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
"stop_generate_tts" ->{
|
||||
"stop_generate_tts" -> {
|
||||
SendReply(wsMessageContext, cmd.command, "ok")
|
||||
ttsjob.StopGenerate()
|
||||
|
||||
@@ -311,11 +326,19 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
}
|
||||
|
||||
"getMemoryStatus" -> {
|
||||
SendReply(wsMessageContext, cmd.command, objectmapper.writeValueAsString(Somecodes.getMemoryUsage()))
|
||||
SendReply(
|
||||
wsMessageContext,
|
||||
cmd.command,
|
||||
objectmapper.writeValueAsString(Somecodes.getMemoryUsage())
|
||||
)
|
||||
}
|
||||
|
||||
"getDiskStatus" -> {
|
||||
SendReply(wsMessageContext, cmd.command, objectmapper.writeValueAsString(Somecodes.getDiskUsage()))
|
||||
SendReply(
|
||||
wsMessageContext,
|
||||
cmd.command,
|
||||
objectmapper.writeValueAsString(Somecodes.getDiskUsage())
|
||||
)
|
||||
}
|
||||
|
||||
"getNetworkStatus" -> {
|
||||
@@ -367,7 +390,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
before {
|
||||
val user = CheckUsers(it)
|
||||
// only admin user can access soundbank page
|
||||
if (GetAdminUserFromConfig() != user){
|
||||
if (GetAdminUserFromConfig() != user) {
|
||||
it.redirect("overview.html")
|
||||
}
|
||||
}
|
||||
@@ -376,7 +399,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
before {
|
||||
val user = CheckUsers(it)
|
||||
// only admin user can access messagebank page
|
||||
if (GetAdminUserFromConfig() != user){
|
||||
if (GetAdminUserFromConfig() != user) {
|
||||
it.redirect("overview.html")
|
||||
}
|
||||
}
|
||||
@@ -397,7 +420,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
before {
|
||||
val user = CheckUsers(it)
|
||||
// only admin user can access settings page
|
||||
if (GetAdminUserFromConfig() != user){
|
||||
if (GetAdminUserFromConfig() != user) {
|
||||
it.redirect("overview.html")
|
||||
}
|
||||
}
|
||||
@@ -406,7 +429,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
before {
|
||||
val user = CheckUsers(it)
|
||||
// only admin user can access timer page
|
||||
if (GetAdminUserFromConfig() != user){
|
||||
if (GetAdminUserFromConfig() != user) {
|
||||
it.redirect("overview.html")
|
||||
}
|
||||
}
|
||||
@@ -415,7 +438,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
before {
|
||||
val user = CheckUsers(it)
|
||||
// only admin user can access file management page
|
||||
if (GetAdminUserFromConfig() != user){
|
||||
if (GetAdminUserFromConfig() != user) {
|
||||
it.redirect("overview.html")
|
||||
}
|
||||
}
|
||||
@@ -424,7 +447,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
before {
|
||||
val user = CheckUsers(it)
|
||||
// only admin user can access broadcast zones page
|
||||
if (GetAdminUserFromConfig() != user){
|
||||
if (GetAdminUserFromConfig() != user) {
|
||||
it.redirect("overview.html")
|
||||
}
|
||||
}
|
||||
@@ -441,7 +464,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
before {
|
||||
val user = CheckUsers(it)
|
||||
// only admin user can access user management page
|
||||
if (GetAdminUserFromConfig() != user){
|
||||
if (GetAdminUserFromConfig() != user) {
|
||||
it.redirect("overview.html")
|
||||
}
|
||||
}
|
||||
@@ -449,23 +472,26 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
path("api") {
|
||||
//TODO https://stackoverflow.com/questions/70002015/streaming-into-audio-element
|
||||
path("LiveAudio") {
|
||||
post{ ctx->
|
||||
val json : JsonNode = objectmapper.readTree(ctx.body())
|
||||
post { ctx ->
|
||||
val json: JsonNode = objectmapper.readTree(ctx.body())
|
||||
val broadcastzone = json.get("broadcastzone")?.asText("") ?: ""
|
||||
val command = json.get("command")?.asText("") ?: ""
|
||||
if (command == "Open" || command == "Close"){
|
||||
if (broadcastzone.isNotEmpty()){
|
||||
if (command == "Open" || command == "Close") {
|
||||
if (broadcastzone.isNotEmpty()) {
|
||||
val bc = Get_Barix_Connection_by_ZoneName(broadcastzone)
|
||||
if (bc!=null){
|
||||
if (bc != null) {
|
||||
val key = ctx.cookie("client-stream-id")
|
||||
if (command == "Open"){
|
||||
if (command == "Open") {
|
||||
// open command
|
||||
if (!key.isNullOrEmpty()){
|
||||
if (!key.isNullOrEmpty()) {
|
||||
// ada connection sebelumnya, kemungkinan reconnect
|
||||
val prev = WsContextMap[key]
|
||||
if (prev!=null){
|
||||
if (prev != null) {
|
||||
prev.bc?.Remove_Mp3_Consumer(key)
|
||||
prev.ws?.closeSession(WsCloseStatus.NORMAL_CLOSURE, "Reopen Live Audio Stream")
|
||||
prev.ws?.closeSession(
|
||||
WsCloseStatus.NORMAL_CLOSURE,
|
||||
"Reopen Live Audio Stream"
|
||||
)
|
||||
}
|
||||
WsContextMap.remove(key)
|
||||
ctx.cookie("client-stream-id", "")
|
||||
@@ -478,12 +504,15 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
|
||||
} else {
|
||||
// close command
|
||||
if (!key.isNullOrEmpty()){
|
||||
if (!key.isNullOrEmpty()) {
|
||||
// close connection
|
||||
val prev = WsContextMap[key]
|
||||
if (prev!=null){
|
||||
if (prev != null) {
|
||||
prev.bc?.Remove_Mp3_Consumer(key)
|
||||
prev.ws?.closeSession(WsCloseStatus.NORMAL_CLOSURE, "Close Live Audio Stream")
|
||||
prev.ws?.closeSession(
|
||||
WsCloseStatus.NORMAL_CLOSURE,
|
||||
"Close Live Audio Stream"
|
||||
)
|
||||
}
|
||||
WsContextMap.remove(key)
|
||||
ctx.cookie("client-stream-id", "")
|
||||
@@ -495,42 +524,42 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
} else ResultMessageString(ctx, 400, "Invalid command")
|
||||
|
||||
}
|
||||
ws("ws"){ wscontext ->
|
||||
ws("ws") { wscontext ->
|
||||
wscontext.onConnect {
|
||||
val key = it.cookie("client-stream-id")
|
||||
if (!key.isNullOrEmpty()){
|
||||
val lld = WsContextMap[key]
|
||||
if (lld!=null){
|
||||
if (!key.isNullOrEmpty()) {
|
||||
val lld = WsContextMap[key]
|
||||
if (lld != null) {
|
||||
it.enableAutomaticPings()
|
||||
lld.ws = it
|
||||
lld.bc?.Add_Mp3_Consumer(key){ mp3data->
|
||||
lld.bc?.Add_Mp3_Consumer(key) { mp3data ->
|
||||
try {
|
||||
if (it.session.isOpen){
|
||||
if (it.session.isOpen) {
|
||||
it.send(ByteBuffer.wrap(mp3data))
|
||||
}
|
||||
} catch (e: Exception){
|
||||
Logger.error {"Error sending LiveAudio mp3 data for key $key, Message: ${e.message}"}
|
||||
} catch (e: Exception) {
|
||||
Logger.error { "Error sending LiveAudio mp3 data for key $key, Message: ${e.message}" }
|
||||
}
|
||||
}
|
||||
} else {
|
||||
it.closeSession(WsCloseStatus.POLICY_VIOLATION, "WsContextMap key not found")
|
||||
Logger.info{"LiveAudio WebSocket connection rejected, WsContextMap key not found"}
|
||||
Logger.info { "LiveAudio WebSocket connection rejected, WsContextMap key not found" }
|
||||
}
|
||||
} else {
|
||||
it.closeSession(WsCloseStatus.POLICY_VIOLATION, "Invalid client-stream-id")
|
||||
Logger.info{"LiveAudio WebSocket connection rejected, invalid client-stream-id"}
|
||||
Logger.info { "LiveAudio WebSocket connection rejected, invalid client-stream-id" }
|
||||
}
|
||||
}
|
||||
wscontext.onClose {
|
||||
val key = it.cookie("client-stream-id")
|
||||
if (!key.isNullOrEmpty()){
|
||||
if (!key.isNullOrEmpty()) {
|
||||
val lld = WsContextMap[key]
|
||||
lld?.bc?.Remove_Mp3_Consumer(key)
|
||||
lld?.ws?.closeSession()
|
||||
lld?.bc = null
|
||||
lld?.ws= null
|
||||
lld?.ws = null
|
||||
WsContextMap.remove(key)
|
||||
Logger.info{"LiveAudio WebSocket closed for key $key"}
|
||||
Logger.info { "LiveAudio WebSocket closed for key $key" }
|
||||
|
||||
}
|
||||
|
||||
@@ -538,7 +567,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
wscontext.onError {
|
||||
val key = it.cookie("client-stream-id")
|
||||
val msg = it.error()?.message ?: ""
|
||||
Logger.info{"LiveAudio WebSocket error for key $key, Message: $msg"}
|
||||
Logger.info { "LiveAudio WebSocket error for key $key, Message: $msg" }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -595,7 +624,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
get("List") { ctx ->
|
||||
db.soundDB.Get({
|
||||
ctx.result(MariaDB.ArrayListtoString(db.soundDB.List))
|
||||
},{msgFail ->
|
||||
}, { msgFail ->
|
||||
ctx.status(500)
|
||||
.result(objectmapper.writeValueAsString(resultMessage(msgFail)))
|
||||
})
|
||||
@@ -623,11 +652,11 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Invalid Language")))
|
||||
}
|
||||
get("AirlineTags") { ctx ->
|
||||
val tags = db.Get_AirlineCode_Tags()
|
||||
val tags = db.soundDB.Get_AirlineCode_Tags()
|
||||
val value = db.soundDB.List
|
||||
.asSequence()
|
||||
.filter { f1 -> f1.Category.equals(Category.Airplane_Name.name,true) }
|
||||
.filter { f2 -> tags.any{t -> t.equals(f2.TAG,true)}}
|
||||
.filter { f1 -> f1.Category.equals(Category.Airplane_Name.name, true) }
|
||||
.filter { f2 -> tags.any { t -> t.equals(f2.TAG, true) } }
|
||||
.distinctBy { it.TAG }
|
||||
.sortedBy { it.TAG }
|
||||
.map { KeyValueMessage(it.TAG, it.Description) }
|
||||
@@ -831,7 +860,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
// get messagebank list
|
||||
db.messageDB.Get({
|
||||
ctx.result(MariaDB.ArrayListtoString(db.messageDB.List))
|
||||
},{msgFail ->
|
||||
}, { msgFail ->
|
||||
ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(msgFail)))
|
||||
})
|
||||
|
||||
@@ -867,8 +896,9 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
message_detail,
|
||||
message_tags
|
||||
)
|
||||
val existed = db.messageDB.List.any{ it.ANN_ID== mb.ANN_ID && it.Language == mb.Language && it.Voice_Type == mb.Voice_Type }
|
||||
if (!existed){
|
||||
val existed =
|
||||
db.messageDB.List.any { it.ANN_ID == mb.ANN_ID && it.Language == mb.Language && it.Voice_Type == mb.Voice_Type }
|
||||
if (!existed) {
|
||||
if (db.messageDB.Add(mb)) {
|
||||
db.messageDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
@@ -1026,11 +1056,21 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
db.languageDB.Get({
|
||||
// get language link list
|
||||
ctx.result(MariaDB.ArrayListtoString(db.languageDB.List))
|
||||
},{
|
||||
msgFail ->
|
||||
}, { msgFail ->
|
||||
ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(msgFail)))
|
||||
})
|
||||
|
||||
}
|
||||
post("DefaultInit") { ctx ->
|
||||
// clear languageDB and init with default values
|
||||
// default value : every CITY in soundDB will have language linked to
|
||||
db.languageDB.Clear()
|
||||
db.soundDB.Get_City_Tags().forEach { city ->
|
||||
val newvalue = LanguageLink(0u, city, Language.DefaultLanguageLink())
|
||||
db.languageDB.Add(newvalue)
|
||||
}
|
||||
db.languageDB.Resort()
|
||||
|
||||
}
|
||||
post("Add") {
|
||||
// Parse JSON from request body
|
||||
@@ -1179,8 +1219,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
db.scheduleDB.Get({
|
||||
// get timer list
|
||||
ctx.result(MariaDB.ArrayListtoString(db.scheduleDB.List))
|
||||
},{
|
||||
msgFail ->
|
||||
}, { msgFail ->
|
||||
ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(msgFail)))
|
||||
})
|
||||
// get timer list
|
||||
@@ -1388,8 +1427,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
get("List") { ctx ->
|
||||
db.userDB.Get({
|
||||
ctx.result(objectmapper.writeValueAsString(db.userDB.List))
|
||||
},{
|
||||
msgFail ->
|
||||
}, { msgFail ->
|
||||
ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(msgFail)))
|
||||
})
|
||||
|
||||
@@ -1416,54 +1454,73 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
// city, airline, messagebank_ann_id boleh kosong, untuk user yang paging saja
|
||||
// location juga optional
|
||||
// yang wajib ada adalah username, password, broadcastzones
|
||||
if (ValidStrings(username, password, broadcastzones ))
|
||||
{
|
||||
if (!db.Username_exists(username)) {
|
||||
if (ValidString(airline_tags)){
|
||||
if (ValidStrings(username, password, broadcastzones)) {
|
||||
if (!db.userDB.Username_exists(username)) {
|
||||
if (ValidString(airline_tags)) {
|
||||
// ada airline_tags, berarti harus di cek apakah ada di table soundbank
|
||||
// kalau tidak ada airline_tags, tidak perlu cek
|
||||
val atags = airline_tags.split(";").map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
val airlinetags = db.Get_AirlineCode_Tags()
|
||||
val airlinetags = db.soundDB.Get_AirlineCode_Tags()
|
||||
val missing_airlinetags = ArrayList<String>()
|
||||
atags.forEach { tag ->
|
||||
if (!airlinetags.any { it.equals(tag,true) }) {
|
||||
if (!airlinetags.any { it.equals(tag, true) }) {
|
||||
missing_airlinetags.add(tag)
|
||||
}
|
||||
}
|
||||
if (missing_airlinetags.isNotEmpty()){
|
||||
if (missing_airlinetags.isNotEmpty()) {
|
||||
ctx.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Airline tags not found in soundbank: ${missing_airlinetags.joinToString(", ")}")))
|
||||
.result(
|
||||
objectmapper.writeValueAsString(
|
||||
resultMessage(
|
||||
"Airline tags not found in soundbank: ${
|
||||
missing_airlinetags.joinToString(
|
||||
", "
|
||||
)
|
||||
}"
|
||||
)
|
||||
)
|
||||
)
|
||||
return@post
|
||||
}
|
||||
}
|
||||
if (ValidString(city_tags)){
|
||||
if (ValidString(city_tags)) {
|
||||
// ada city_tags, berarti harus di cek apakah ada di table soundbank
|
||||
// kalau tidak ada city_tags, tidak perlu cek
|
||||
val ctags = city_tags.split(";").map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
val citytags = db.Get_City_Tags()
|
||||
val citytags = db.soundDB.Get_City_Tags()
|
||||
val missing_citytags = ArrayList<String>()
|
||||
ctags.forEach { tag ->
|
||||
if (!citytags.any { it.equals(tag,true) }) {
|
||||
if (!citytags.any { it.equals(tag, true) }) {
|
||||
missing_citytags.add(tag)
|
||||
}
|
||||
}
|
||||
if (missing_citytags.isNotEmpty()){
|
||||
if (missing_citytags.isNotEmpty()) {
|
||||
ctx.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("City tags not found in soundbank: ${missing_citytags.joinToString(", ")}")))
|
||||
.result(
|
||||
objectmapper.writeValueAsString(
|
||||
resultMessage(
|
||||
"City tags not found in soundbank: ${
|
||||
missing_citytags.joinToString(
|
||||
", "
|
||||
)
|
||||
}"
|
||||
)
|
||||
)
|
||||
)
|
||||
return@post
|
||||
}
|
||||
|
||||
}
|
||||
if (ValidString(messagebank_ann_id)){
|
||||
if (ValidString(messagebank_ann_id)) {
|
||||
// ada messagebank_ann_id, berarti harus di cek apakah ada di table messagebank
|
||||
// kalau tidak ada messagebank_ann_id, tidak perlu cek
|
||||
val mbids = messagebank_ann_id.split(";")
|
||||
.map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
.mapNotNull { it.toUIntOrNull() }
|
||||
val mbankids = db.Get_MessageID_List()
|
||||
val mbankids = db.messageDB.Get_MessageID_List()
|
||||
if (!mbids.all { id -> mbankids.any { it == id } }) {
|
||||
ctx.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Some ANN_ID not found in Messagebank")))
|
||||
@@ -1475,16 +1532,26 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
val bzdesc =
|
||||
broadcastzones.split(";").map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
val bzlist = db.Get_BroadcastZone_List()
|
||||
val bzlist = db.broadcastDB.Get_BroadcastZone_List()
|
||||
val missing_broadcastzones = ArrayList<String>()
|
||||
bzdesc.forEach { bz ->
|
||||
if (!bzlist.any { it.equals(bz,true) }) {
|
||||
if (!bzlist.any { it.equals(bz, true) }) {
|
||||
missing_broadcastzones.add(bz)
|
||||
}
|
||||
}
|
||||
if (missing_broadcastzones.isNotEmpty()){
|
||||
if (missing_broadcastzones.isNotEmpty()) {
|
||||
ctx.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Broadcast zone tags not found in soundbank: ${missing_broadcastzones.joinToString(", ")}")))
|
||||
.result(
|
||||
objectmapper.writeValueAsString(
|
||||
resultMessage(
|
||||
"Broadcast zone tags not found in soundbank: ${
|
||||
missing_broadcastzones.joinToString(
|
||||
", "
|
||||
)
|
||||
}"
|
||||
)
|
||||
)
|
||||
)
|
||||
return@post
|
||||
}
|
||||
|
||||
@@ -1546,16 +1613,15 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
// city, airline, messagebank_ann_id boleh kosong, untuk user yang paging saja
|
||||
// location juga optional
|
||||
// yang wajib ada adalah username, password, broadcastzones
|
||||
if (ValidStrings(_username, _password, _broadcastzones))
|
||||
{
|
||||
if (ValidStrings(_username, _password, _broadcastzones)) {
|
||||
val _otherusername = db.userDB.List.find { xx ->
|
||||
xx.username.equals(
|
||||
_username,
|
||||
true
|
||||
) && xx.index != index
|
||||
}
|
||||
if (_otherusername!=null){
|
||||
Logger.info{"Found other username with same name: ${_otherusername.username} at index ${_otherusername.index}"}
|
||||
if (_otherusername != null) {
|
||||
Logger.info { "Found other username with same name: ${_otherusername.username} at index ${_otherusername.index}" }
|
||||
ctx.status(400).result(
|
||||
objectmapper.writeValueAsString(
|
||||
resultMessage("Username already exists for another user")
|
||||
@@ -1564,60 +1630,91 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
return@patch
|
||||
}
|
||||
|
||||
if (ValidString(_airline_tags)){
|
||||
if (ValidString(_airline_tags)) {
|
||||
// ada airline_tags, berarti harus di cek apakah ada di table soundbank
|
||||
// kalau tidak ada airline_tags, tidak perlu cek
|
||||
val atags = _airline_tags.split(";").map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
val airlinetags = db.Get_AirlineCode_Tags()
|
||||
val airlinetags = db.soundDB.Get_AirlineCode_Tags()
|
||||
val missing_airlinetags = ArrayList<String>()
|
||||
atags.forEach { tag ->
|
||||
if (!airlinetags.any { it.equals(tag,true) }) {
|
||||
if (!airlinetags.any { it.equals(tag, true) }) {
|
||||
missing_airlinetags.add(tag)
|
||||
}
|
||||
}
|
||||
if (missing_airlinetags.isNotEmpty()){
|
||||
if (missing_airlinetags.isNotEmpty()) {
|
||||
ctx.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Airline tags not found in soundbank: ${missing_airlinetags.joinToString(", ")}")))
|
||||
.result(
|
||||
objectmapper.writeValueAsString(
|
||||
resultMessage(
|
||||
"Airline tags not found in soundbank: ${
|
||||
missing_airlinetags.joinToString(
|
||||
", "
|
||||
)
|
||||
}"
|
||||
)
|
||||
)
|
||||
)
|
||||
return@patch
|
||||
}
|
||||
|
||||
}
|
||||
if (ValidString(_city_tags)){
|
||||
if (ValidString(_city_tags)) {
|
||||
// ada city_tags, berarti harus di cek apakah ada di table soundbank
|
||||
// kalau tidak ada city_tags, tidak perlu cek
|
||||
val ctags = _city_tags.split(";").map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
val citytags = db.Get_City_Tags()
|
||||
val citytags = db.soundDB.Get_City_Tags()
|
||||
val missing_citytags = ArrayList<String>()
|
||||
ctags.forEach { tag ->
|
||||
if (!citytags.any { it.equals(tag,true) }) {
|
||||
if (!citytags.any { it.equals(tag, true) }) {
|
||||
missing_citytags.add(tag)
|
||||
}
|
||||
}
|
||||
if (missing_citytags.isNotEmpty()){ ctx.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("City tags not found in soundbank: ${missing_citytags.joinToString(", ")}")))
|
||||
if (missing_citytags.isNotEmpty()) {
|
||||
ctx.status(400)
|
||||
.result(
|
||||
objectmapper.writeValueAsString(
|
||||
resultMessage(
|
||||
"City tags not found in soundbank: ${
|
||||
missing_citytags.joinToString(
|
||||
", "
|
||||
)
|
||||
}"
|
||||
)
|
||||
)
|
||||
)
|
||||
return@patch
|
||||
}
|
||||
|
||||
}
|
||||
if (ValidString(_messagebank_ann_id)){
|
||||
if (ValidString(_messagebank_ann_id)) {
|
||||
// ada messagebank_ann_id, berarti harus di cek apakah ada di table messagebank
|
||||
// kalau tidak ada messagebank_ann_id, tidak perlu cek
|
||||
val mbids = _messagebank_ann_id.split(";")
|
||||
.map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
.mapNotNull { it.toUIntOrNull() }
|
||||
val mbankids = db.Get_MessageID_List()
|
||||
val mbankids = db.messageDB.Get_MessageID_List()
|
||||
val missing_broadcastids = ArrayList<UInt>()
|
||||
mbids.forEach { mbid ->
|
||||
if (!mbankids.any { it == mbid }) {
|
||||
missing_broadcastids.add(mbid)
|
||||
}
|
||||
}
|
||||
if (missing_broadcastids.isNotEmpty()){
|
||||
if (missing_broadcastids.isNotEmpty()) {
|
||||
ctx.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("ANN_ID not found in Messagebank: ${missing_broadcastids.joinToString(", ")}")))
|
||||
.result(
|
||||
objectmapper.writeValueAsString(
|
||||
resultMessage(
|
||||
"ANN_ID not found in Messagebank: ${
|
||||
missing_broadcastids.joinToString(
|
||||
", "
|
||||
)
|
||||
}"
|
||||
)
|
||||
)
|
||||
)
|
||||
return@patch
|
||||
}
|
||||
|
||||
@@ -1625,16 +1722,26 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
|
||||
val bzdesc = _broadcastzones.split(";").map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
val bzlist = db.Get_BroadcastZone_List()
|
||||
val bzlist = db.broadcastDB.Get_BroadcastZone_List()
|
||||
val missing_broadcastzones = ArrayList<String>()
|
||||
bzdesc.forEach { bz ->
|
||||
if (!bzlist.any { it.equals(bz,true) }) {
|
||||
if (!bzlist.any { it.equals(bz, true) }) {
|
||||
missing_broadcastzones.add(bz)
|
||||
}
|
||||
}
|
||||
if (missing_broadcastzones.isNotEmpty()){
|
||||
if (missing_broadcastzones.isNotEmpty()) {
|
||||
ctx.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Broadcast zone tags not found in soundbank: ${missing_broadcastzones.joinToString(", ")}")))
|
||||
.result(
|
||||
objectmapper.writeValueAsString(
|
||||
resultMessage(
|
||||
"Broadcast zone tags not found in soundbank: ${
|
||||
missing_broadcastzones.joinToString(
|
||||
", "
|
||||
)
|
||||
}"
|
||||
)
|
||||
)
|
||||
)
|
||||
return@patch
|
||||
}
|
||||
|
||||
@@ -1741,9 +1848,9 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
val logfilter = get1.queryParam("filter") ?: ""
|
||||
if (ValiDateForLogHtml(logdate)) {
|
||||
val xlsxdata = if (ValidString(logfilter)) {
|
||||
db.Export_Log_XLSX(logdate.replace('-', '/'), logfilter)
|
||||
db.logDB.Export_Log_XLSX(logdate.replace('-', '/'), logfilter)
|
||||
} else {
|
||||
db.Export_Log_XLSX(logdate.replace('-', '/'), "")
|
||||
db.logDB.Export_Log_XLSX(logdate.replace('-', '/'), "")
|
||||
}
|
||||
if (xlsxdata != null) {
|
||||
get1.header(
|
||||
@@ -1766,8 +1873,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
get("List") { ctx ->
|
||||
db.broadcastDB.Get({
|
||||
ctx.result(MariaDB.ArrayListtoString(db.broadcastDB.List))
|
||||
},{
|
||||
msgFail ->
|
||||
}, { msgFail ->
|
||||
ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(msgFail)))
|
||||
})
|
||||
}
|
||||
@@ -1924,14 +2030,13 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
get("List") { ctx ->
|
||||
db.soundchannelDB.Get({
|
||||
ctx.result(MariaDB.ArrayListtoString(db.soundchannelDB.List))
|
||||
},{
|
||||
msgFail ->
|
||||
}, { msgFail ->
|
||||
ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(msgFail)))
|
||||
})
|
||||
|
||||
}
|
||||
get("SoundChannelDescriptions") {
|
||||
it.result(objectmapper.writeValueAsString(db.Get_SoundChannel_List()))
|
||||
it.result(objectmapper.writeValueAsString(db.soundchannelDB.Get_SoundChannel_List()))
|
||||
}
|
||||
delete("List") {
|
||||
// truncate sound channel table
|
||||
@@ -2060,8 +2165,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
get("List") { ctx ->
|
||||
db.queuepagingDB.Get({
|
||||
ctx.result(MariaDB.ArrayListtoString(db.queuepagingDB.List))
|
||||
},{
|
||||
msgFail ->
|
||||
}, { msgFail ->
|
||||
ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(msgFail)))
|
||||
})
|
||||
|
||||
@@ -2099,8 +2203,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
get("List") { ctx ->
|
||||
db.queuetableDB.Get({
|
||||
ctx.result(MariaDB.ArrayListtoString(db.queuetableDB.List))
|
||||
},{
|
||||
msgFail ->
|
||||
}, { msgFail ->
|
||||
ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(msgFail)))
|
||||
})
|
||||
|
||||
@@ -2424,7 +2527,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
}
|
||||
}
|
||||
}
|
||||
path("WebAccess"){
|
||||
path("WebAccess") {
|
||||
get {
|
||||
val value = object {
|
||||
val adminpass = _config.Get(configKeys.WEBAPP_ADMIN_PASSWORD.key)
|
||||
@@ -2432,19 +2535,25 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
}
|
||||
it.result(objectmapper.writeValueAsString(value))
|
||||
}
|
||||
post{
|
||||
val json : JsonNode = objectmapper.readTree(it.body())
|
||||
post {
|
||||
val json: JsonNode = objectmapper.readTree(it.body())
|
||||
val adminpass = json.get("adminpass").asText("")
|
||||
val viewerpass = json.get("viewerpass").asText("")
|
||||
if(ValidString(adminpass) && ValidString(viewerpass)){
|
||||
if (ValidString(adminpass) && ValidString(viewerpass)) {
|
||||
_config.Set(configKeys.WEBAPP_ADMIN_PASSWORD.key, adminpass)
|
||||
_config.Set(configKeys.WEBAPP_VIEWER_PASSWORD.key, viewerpass)
|
||||
_config.Save()
|
||||
Logger.info { "Changed Web Access Passwords" }
|
||||
// update userlist
|
||||
userlist = listOf(
|
||||
Pair(_config.Get(configKeys.WEBAPP_ADMIN_USERNAME.key), _config.Get(configKeys.WEBAPP_ADMIN_PASSWORD.key)),
|
||||
Pair(_config.Get(configKeys.WEBAPP_VIEWER_USERNAME.key), _config.Get(configKeys.WEBAPP_VIEWER_PASSWORD.key))
|
||||
Pair(
|
||||
_config.Get(configKeys.WEBAPP_ADMIN_USERNAME.key),
|
||||
_config.Get(configKeys.WEBAPP_ADMIN_PASSWORD.key)
|
||||
),
|
||||
Pair(
|
||||
_config.Get(configKeys.WEBAPP_VIEWER_USERNAME.key),
|
||||
_config.Get(configKeys.WEBAPP_VIEWER_PASSWORD.key)
|
||||
)
|
||||
)
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else {
|
||||
@@ -2469,7 +2578,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
config.staticFiles.add("/semiauto")
|
||||
config.jsonMapper(JavalinJackson(jacksonObjectMapper()))
|
||||
config.router.apiBuilder {
|
||||
before{
|
||||
before {
|
||||
//Logger.info{"${it.ip()} method ${it.method()} connect to ${it.path()}"}
|
||||
}
|
||||
path("/") {
|
||||
@@ -2494,7 +2603,12 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
it.cookie("semiauto-user", user.username)
|
||||
it.redirect("index.html")
|
||||
|
||||
db.logSemiAuto.Add(LogSemiauto.NewLog("SEMIAUTOWEB", "User logged in: ${user.username} from ip ${it.ip()}"))
|
||||
db.logSemiAuto.Add(
|
||||
LogSemiauto.NewLog(
|
||||
"SEMIAUTOWEB",
|
||||
"User logged in: ${user.username} from ip ${it.ip()}"
|
||||
)
|
||||
)
|
||||
} else ResultMessageString(it, 400, "Invalid username or password")
|
||||
} else ResultMessageString(it, 400, "Username or password cannot be empty")
|
||||
}
|
||||
@@ -2551,8 +2665,8 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
// sequences
|
||||
db.soundDB.List.filter { it.Category == Category.Sequence.name }
|
||||
.distinctBy { it.TAG }.forEach { xx ->
|
||||
result.sequences.add("${xx.TAG};${xx.Description}")
|
||||
}
|
||||
result.sequences.add("${xx.TAG};${xx.Description}")
|
||||
}
|
||||
// reasons
|
||||
db.soundDB.List.filter { it.Category == Category.Reason.name }.distinctBy { it.TAG }
|
||||
.forEach { xx ->
|
||||
@@ -2561,8 +2675,8 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
// procedures
|
||||
db.soundDB.List.filter { it.Category == Category.Procedure.name }
|
||||
.distinctBy { it.TAG }.forEach { xx ->
|
||||
result.procedures.add("${xx.TAG};${xx.Description}")
|
||||
}
|
||||
result.procedures.add("${xx.TAG};${xx.Description}")
|
||||
}
|
||||
// gates
|
||||
db.soundDB.List.filter { it.Category == Category.Gate.name }.distinctBy { it.TAG }
|
||||
.forEach { xx ->
|
||||
@@ -2571,16 +2685,21 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
// compensation
|
||||
db.soundDB.List.filter { it.Category == Category.Compensation.name }
|
||||
.distinctBy { it.TAG }.forEach { xx ->
|
||||
result.compensation.add("${xx.TAG};${xx.Description}")
|
||||
}
|
||||
result.compensation.add("${xx.TAG};${xx.Description}")
|
||||
}
|
||||
// greetings
|
||||
db.soundDB.List.filter { it.Category == Category.Greeting.name }
|
||||
.distinctBy { it.TAG }.forEach { xx ->
|
||||
result.greetings.add("${xx.TAG};${xx.Description}")
|
||||
}
|
||||
result.greetings.add("${xx.TAG};${xx.Description}")
|
||||
}
|
||||
|
||||
ctx.result(objectmapper.writeValueAsString(result))
|
||||
db.logSemiAuto.Add(LogSemiauto.NewLog("SEMIAUTOWEB", "Initialized Web variables for user: ${user.username}"))
|
||||
db.logSemiAuto.Add(
|
||||
LogSemiauto.NewLog(
|
||||
"SEMIAUTOWEB",
|
||||
"Initialized Web variables for user: ${user.username}"
|
||||
)
|
||||
)
|
||||
} else ResultMessageString(ctx, 400, "User not found")
|
||||
} else ResultMessageString(ctx, 400, "Username is empty")
|
||||
}
|
||||
@@ -2612,7 +2731,12 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
db.queuetableDB.Resort()
|
||||
Logger.info { "SemiAutoWeb added to queue table: $qt" }
|
||||
ctx.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
db.logSemiAuto.Add(LogSemiauto.NewLog("SEMIAUTOWEB", "Added to queue table: $qt"))
|
||||
db.logSemiAuto.Add(
|
||||
LogSemiauto.NewLog(
|
||||
"SEMIAUTOWEB",
|
||||
"Added to queue table: $qt"
|
||||
)
|
||||
)
|
||||
} else ResultMessageString(ctx, 500, "Failed to add to queue table")
|
||||
} else ResultMessageString(ctx, 400, "Broadcast zones cannot be empty")
|
||||
} else ResultMessageString(ctx, 400, "Tags cannot be empty")
|
||||
@@ -2626,9 +2750,9 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
val logfilter = get1.queryParam("filter") ?: ""
|
||||
if (ValiDateForLogHtml(logdate)) {
|
||||
val xlsxdata = if (ValidString(logfilter)) {
|
||||
db.Export_Log_XLSX(logdate.replace('-', '/'), logfilter)
|
||||
db.logDB.Export_Log_XLSX(logdate.replace('-', '/'), logfilter)
|
||||
} else {
|
||||
db.Export_Log_XLSX(logdate.replace('-', '/'), "")
|
||||
db.logDB.Export_Log_XLSX(logdate.replace('-', '/'), "")
|
||||
}
|
||||
if (xlsxdata != null) {
|
||||
get1.header(
|
||||
@@ -2652,7 +2776,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
println("Request log for date: $datelog")
|
||||
db.logSemiAuto.GetLogSemiAutoForHtml(datelog, null, {
|
||||
ctx.result(MariaDB.ArrayListtoString(it))
|
||||
},{ err ->
|
||||
}, { err ->
|
||||
ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(err)))
|
||||
})
|
||||
|
||||
@@ -2678,7 +2802,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
}
|
||||
}
|
||||
|
||||
fun CheckUsers(ctx: Context) : String? {
|
||||
fun CheckUsers(ctx: Context): String? {
|
||||
//val user = ctx.sessionAttribute<String?>("user")
|
||||
val user = ctx.cookie("aas-user")
|
||||
if (user == null) {
|
||||
@@ -2693,12 +2817,11 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
||||
return foundUser.first
|
||||
}
|
||||
|
||||
fun GetAdminUserFromConfig() : String{
|
||||
fun GetAdminUserFromConfig(): String {
|
||||
return config.Get(configKeys.WEBAPP_ADMIN_USERNAME.key)
|
||||
}
|
||||
|
||||
|
||||
|
||||
fun Get_Barix_Connection_by_ZoneName(zonename: String): BarixConnection? {
|
||||
if (ValidString(zonename)) {
|
||||
val bz = db.broadcastDB.List.find { it.description == zonename }
|
||||
|
||||
Reference in New Issue
Block a user