commit 09/02/2026

This commit is contained in:
2026-02-09 12:04:11 +07:00
parent 1790852242
commit eed96ca8c0
30 changed files with 2494 additions and 2388 deletions

View File

@@ -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 }