From e18976ace3d5fcef34b252ef29b1dc60bca3a8a4 Mon Sep 17 00:00:00 2001 From: rdkartono Date: Mon, 9 Feb 2026 17:03:50 +0700 Subject: [PATCH] commit 09/02/2026 --- html/webpage/assets/js/languagelink.js | 26 +++--- html/webpage/assets/js/schedulebank.js | 108 +++++++++++++++++-------- html/webpage/assets/js/soundbank.js | 102 ++++++++++++++++++----- html/webpage/language.html | 5 +- html/webpage/soundbank.html | 5 +- src/Main.kt | 8 +- src/content/Language.kt | 44 +++++----- src/database/table/Table_Soundbank.kt | 41 ++++++++++ src/web/WebApp.kt | 9 ++- 9 files changed, 249 insertions(+), 99 deletions(-) diff --git a/html/webpage/assets/js/languagelink.js b/html/webpage/assets/js/languagelink.js index 51247b0..f7152cb 100644 --- a/html/webpage/assets/js/languagelink.js +++ b/html/webpage/assets/js/languagelink.js @@ -78,6 +78,7 @@ $(document).ready(function () { $('#languagebanktablebody').empty(); window.selectedlanguagerow = null; let $btnClear = $('#btnClear'); + let $btndefaultinit = $('#btnDefaultInit'); let $btnAdd = $('#btnAdd'); let $btnRemove = $('#btnRemove'); let $btnEdit = $('#btnEdit'); @@ -86,7 +87,6 @@ $(document).ready(function () { $btnRemove.prop('disabled', true); $btnEdit.prop('disabled', true); let APIURL = "LanguageLink/"; - let $findlanguage = $('#findlanguage'); let $modal = $('#languagemodal'); let $langid = $modal.find('#languagelinkindex'); let $langtag = $modal.find('#languagelinktag'); @@ -121,18 +121,6 @@ $(document).ready(function () { $cbChi.prop('checked', false); } - // $findlanguage.on('input', function () { - // let searchTerm = $findlanguage.val().toLowerCase(); - // if (searchTerm.length > 0) { - // window.selectedlanguagerow = null; - // let filtered = window.languagebankdata.filter(item => item.tag.toLowerCase().includes(searchTerm) || item.language.toLowerCase().includes(searchTerm)); - // fill_languagebanktablebody(filtered); - // } else { - // window.selectedlanguagerow = null; - // fill_languagebanktablebody(window.languagebankdata); - // } - // }); - reloadLanguageBank(APIURL); $btnClear.click(() => { DoClear(APIURL, "LanguageLink", (okdata) => { @@ -141,8 +129,18 @@ $(document).ready(function () { }, (errdata) => { alert("Error clear languageLink : " + errdata.message); }); - }); + $btndefaultinit.click(() => { + if (confirm("Default Init will clear existing data and create default language link data. Cotinue ?")){ + fetchAPI(APIURL + "DefaultInit", "POST", {}, null, (okdata) => { + reloadLanguageBank(APIURL); + alert("Success default init languageLink : " + okdata.message); + }, (errdata) => { + alert("Error default init languageLink : " + errdata.message); + }); + } + }); + $btnAdd.click(() => { // show modal with id 'languagemodal' $modal.modal('show'); diff --git a/html/webpage/assets/js/schedulebank.js b/html/webpage/assets/js/schedulebank.js index f04e7c6..0f0f936 100644 --- a/html/webpage/assets/js/schedulebank.js +++ b/html/webpage/assets/js/schedulebank.js @@ -34,7 +34,6 @@ function fill_schedulebanktablebody(vv) { dtScheduleBank.rows.add(vv); dtScheduleBank.draw(); - $('#schedulebanktable tbody').off('click').on('click', 'tr', function () { // if no data if (!dtScheduleBank) return; @@ -118,6 +117,8 @@ function reloadTimerBank(APIURL = "ScheduleBank/") { }); } +dayViewMode = 'all'; // all, everyday, monday, tuesday, wednesday, thursday, friday, saturday, sunday + $(document).ready(function () { console.log("schedulebank.js loaded successfully"); $('#schedulebanktablebody').empty(); @@ -134,6 +135,7 @@ $(document).ready(function () { if (dtScheduleBank === null) { dtScheduleBank = new DataTable('#schedulebanktable', { + dom: 'Bfrtip', data: [], pageLength: 25, columns: [ @@ -141,15 +143,60 @@ $(document).ready(function () { { title: "Description", data: "description" }, { title: "Day", data: "day" }, { title: "Time", data: "time" }, - { title: "Sound Path", data: "soundpath" }, + { title: "Message", data: "soundpath" }, { title: "Repeat", data: "repeat" }, { title: "Enable", data: "enable" }, { title: "Broadcast Zones", data: "broadcastZones" }, { title: "Language", data: "language" } - ] + ], + buttons: ['print', 'pdf', { + extend: 'collection', + text: 'View', + className: 'btn btn-outline-secondary', + buttons: [ + {text: 'All', className: 'btn btn-outline-primary', action() { dayViewMode = 'all'; dtScheduleBank.draw(); } }, + { text: 'Everyday', className: 'btn btn-outline-primary', action() { dayViewMode = 'everyday'; dtScheduleBank.draw(); } }, + { text: 'Monday', className: 'btn btn-outline-primary', action() { dayViewMode = 'monday'; dtScheduleBank.draw(); } }, + { text: 'Tuesday', className: 'btn btn-outline-primary', action() { dayViewMode = 'tuesday'; dtScheduleBank.draw(); } }, + { text: 'Wednesday', className: 'btn btn-outline-primary', action() { dayViewMode = 'wednesday'; dtScheduleBank.draw(); } }, + { text: 'Thursday', className: 'btn btn-outline-primary', action() { dayViewMode = 'thursday'; dtScheduleBank.draw(); } }, + { text: 'Friday', className: 'btn btn-outline-primary', action() { dayViewMode = 'friday'; dtScheduleBank.draw(); } }, + { text: 'Saturday', className: 'btn btn-outline-primary', action() { dayViewMode = 'saturday'; dtScheduleBank.draw(); } }, + { text: 'Sunday', className: 'btn btn-outline-primary', action() { dayViewMode = 'sunday'; dtScheduleBank.draw(); } }, + {text: 'Special Date', className: 'btn btn-outline-primary', action() { dayViewMode = 'specialdate'; dtScheduleBank.draw(); } } + ] + }] }); } + $.fn.dataTable.ext.search.push(function (settings, data, dataIndex, rowData) { + if (settings.nTable.id !== 'schedulebanktable') return true; + switch (dayViewMode) { + case 'everyday': + return rowData.day.toLowerCase() === 'everyday'; + case 'monday': + return rowData.day.toLowerCase() === 'monday'; + case 'tuesday': + return rowData.day.toLowerCase() === 'tuesday'; + case 'wednesday': + return rowData.day.toLowerCase() === 'wednesday'; + case 'thursday': + return rowData.day.toLowerCase() === 'thursday'; + case 'friday': + return rowData.day.toLowerCase() === 'friday'; + case 'saturday': + return rowData.day.toLowerCase() === 'saturday'; + case 'sunday': + return rowData.day.toLowerCase() === 'sunday'; + case 'specialdate': + // match dd/mm/yyyy format + return /^\d{2}\/\d{2}\/\d{4}$/.test(rowData.day); + default: + // 'all' include in here + return true; + } + }) + let $schedulemodal = $('#schedulemodal'); // text input @@ -244,38 +291,16 @@ $(document).ready(function () { if ($(this).is(':checked')) { $weeklyselect.prop('disabled', false); $scheduledate.prop('disabled', true); - } else { - $weeklyselect.prop('disabled', true); - } + } }); $schedulespecialdate.off('change').on('change', function () { if ($(this).is(':checked')) { $weeklyselect.prop('disabled', true); $scheduledate.prop('disabled', false); - } else { - $scheduledate.prop('disabled', true); - } + } }); - } - let $findschedule = $('#findschedule'); - // $findschedule.off('input').on('input', function () { - // let searchTerm = $findschedule.val().toLowerCase(); - // if (searchTerm.length > 0) { - // window.selectedschedulerow = null; - // let filtered = window.schedulebankdata.filter(item => - // item.description.toLowerCase().includes(searchTerm) - // || item.soundpath.toLowerCase().includes(searchTerm) - // || item.broadcastZones.toLowerCase().includes(searchTerm)); - // fill_schedulebanktablebody(filtered); - // } else { - // window.selectedschedulerow = null; - // fill_schedulebanktablebody(window.schedulebankdata); - // } - // }); - - reloadTimerBank(APIURL); reloadBroadcastZones(); getLanguages(); @@ -334,10 +359,11 @@ $(document).ready(function () { BroadcastZones: broadcastZones, Language: Language }; + console.log("Adding schedule: ", scheduleObj); fetchAPI(APIURL + "Add", "POST", {}, scheduleObj, (okdata) => { - alert("Success add schedule: " + okdata.message); reloadTimerBank(APIURL); + alert("Success add schedule: " + okdata.message); }, (errdata) => { alert("Error add schedule: " + errdata.message); }); @@ -363,6 +389,7 @@ $(document).ready(function () { broadcastZones: window.selectedschedulerow.broadcastZones, language: window.selectedschedulerow.language } + if (confirm(`Are you sure to delete schedule [${sr.index}] Description=${sr.description}?`)) { fetchAPI(APIURL + "DeleteByIndex/" + sr.index, "DELETE", {}, null, (okdata) => { reloadTimerBank(APIURL); @@ -387,6 +414,7 @@ $(document).ready(function () { BroadcastZones: window.selectedschedulerow.broadcastZones, Language: window.selectedschedulerow.language } + console.log("Editing schedule: ", sr); if (confirm(`Are you sure to edit schedule [${sr.index}] Description=${sr.Description}?`)) { $schedulemodal.modal('show'); clearScheduleModal(); @@ -399,12 +427,18 @@ $(document).ready(function () { $scheduleminute.val(minute.toString()); $schedulemessage.val(sr.Soundpath).trigger('change'); $schedulerepeat.val(sr.Repeat); - $scheduleenable.prop('checked', sr.Enable.toLowerCase() === 'true'); + $scheduleenable.prop('checked', sr.Enable); $languageselect.val(sr.Language.split(';')).trigger('change'); $schedulezones.val(sr.BroadcastZones.split(';')).trigger('change'); switch (sr.Day) { case 'Everyday': - $scheduleeveryday.click(); + // make the everyday radio button checked + $scheduleeveryday.prop('checked', true); + + $weeklyselect.val(null).trigger('change'); + $weeklyselect.prop('disabled', true); + + $scheduledate.prop('disabled', true); break; case 'Sunday': case 'Monday': @@ -413,15 +447,25 @@ $(document).ready(function () { case 'Thursday': case 'Friday': case 'Saturday': - $scheduleweekly.click(); + $scheduleweekly.prop('checked', true); + $weeklyselect.val(sr.Day).trigger('change'); + $weeklyselect.prop('disabled', false); + + $scheduledate.prop('disabled', true); break; default: + console.log("Assuming special date for Day: ", sr.Day); // check if the day is in format dd/mm/yyyy // and set the special date radio button and date input if (/^\d{2}\/\d{2}\/\d{4}$/.test(sr.Day)) { - $schedulespecialdate.click(); + $schedulespecialdate.prop('checked', true); + $scheduledate.val(Convert_string_to_input_date(sr.Day)); + $scheduledate.prop('disabled', false); + + $weeklyselect.val(null).trigger('change'); + $weeklyselect.prop('disabled', true); } } diff --git a/html/webpage/assets/js/soundbank.js b/html/webpage/assets/js/soundbank.js index 0cebe10..d9a4585 100644 --- a/html/webpage/assets/js/soundbank.js +++ b/html/webpage/assets/js/soundbank.js @@ -37,6 +37,11 @@ dtSoundbank = null; */ window.select2data = []; +$btnRemove = null; +$btnEdit = null; +$btnExport = null; +$btnfilecheck = null; + /** * Reload sound bank from server * @param {String} APIURL API URL endpoint, default "SoundBank/" @@ -62,7 +67,18 @@ function reloadSoundBank(APIURL = "SoundBank/") { */ function fill_soundbanktablebody(vv) { dtSoundbank.clear(); - if (!Array.isArray(vv) || vv.length === 0) return; + if (!Array.isArray(vv) || vv.length === 0) { + // kalau kosong, tidak bisa remove, edit, export dan filecheck + $btnRemove.prop('disabled', true); + $btnEdit.prop('disabled', true); + $btnExport.prop('disabled', true); + $btnfilecheck.prop('disabled', true); + return; + } else { + // kalau ada isi, bisa export dan filecheck, tapi remove dan edit tetap tergantung selection + $btnExport.prop('disabled', false); + $btnfilecheck.prop('disabled', false); + } dtSoundbank.rows.add(vv); dtSoundbank.draw(); @@ -77,8 +93,8 @@ function fill_soundbanktablebody(vv) { if ($(this).hasClass('row-selected')) { $(this).removeClass('row-selected').find('td').css('background-color', ''); window.selectedsoundrow = null; - $('#btnRemove').prop('disabled', true); - $('#btnEdit').prop('disabled', true); + $btnRemove.prop('disabled', true); + $btnEdit.prop('disabled', true); return; } @@ -87,8 +103,8 @@ function fill_soundbanktablebody(vv) { $(this).addClass('row-selected').find('td').css('background-color', '#ffeeba'); window.selectedsoundrow = selected.data(); - $('#btnRemove').prop('disabled', false); - $('#btnEdit').prop('disabled', false); + $btnRemove.prop('disabled', false); + $btnEdit.prop('disabled', false); }) $('#tablesize').text("Table Size: " + vv.length); @@ -146,7 +162,7 @@ function getFilenameFromPath(path) { } - +fileViewMode = 'all'; // all, valid, invalid $(document).ready(function () { console.log("soundbank.js loaded successfully"); @@ -154,9 +170,9 @@ $(document).ready(function () { window.selectedsoundrow = null; let $btnClear = $('#btnClear'); let $btnAdd = $('#btnAdd'); - let $btnRemove = $('#btnRemove'); - let $btnEdit = $('#btnEdit'); - let $btnExport = $('#btnExport'); + $btnRemove = $('#btnRemove'); + $btnEdit = $('#btnEdit'); + $btnExport = $('#btnExport'); let $btnImport = $('#btnImport'); $btnRemove.prop('disabled', true); $btnEdit.prop('disabled', true); @@ -171,9 +187,11 @@ $(document).ready(function () { let selected_category = null; let selected_language = null; let selected_voicetype = null; + $btnfilecheck = $('#btnFileCheck'); if (dtSoundbank === null) { dtSoundbank = new DataTable('#soundbanktable', { + dom: 'Bfrtip', data: [], pageLength: 25, columns: [ @@ -184,9 +202,29 @@ $(document).ready(function () { { title: "Language", data: "language" }, { title: "Type", data: "voiceType" }, { title: "Filename", data: "path" } - ] + ], + rowCallback: function (row, data) { + row.classList.toggle('table-danger', !!data.filemissing); + }, + buttons: ['print', 'pdf', { + extend: 'collection', + text: 'View', + className: 'btn btn-outline-secondary', + buttons: [ + { text: 'All Files', className: 'btn btn-outline-primary', action() { fileViewMode = 'all'; dtSoundbank.draw(); } }, + { text: 'Valid Files', className: 'btn btn-outline-success', action() { fileViewMode = 'valid'; dtSoundbank.draw(); } }, + { text: 'Invalid Files', className: 'btn btn-outline-danger', action() { fileViewMode = 'invalid'; dtSoundbank.draw(); } } + ] + }] }); } + $.fn.dataTable.ext.search.push(function (settings, data, dataIndex, rowData) { + if (settings.nTable.id !== 'soundbanktable') return true; + const isInvalid = !!rowData.filemissing; + if (fileViewMode === 'invalid') return isInvalid; + if (fileViewMode === 'valid') return !isInvalid; + return true; + }) /** @@ -219,17 +257,6 @@ $(document).ready(function () { } reloadSoundBank(APIURL); - // $('#findsoundbank').on('input', function () { - // let searchTerm = $(this).val().trim().toLowerCase(); - // if (searchTerm.length > 0) { - // window.selectedsoundrow = null; - // let filtered = window.soundbankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.tag.toLowerCase().includes(searchTerm) || item.path.toLowerCase().includes(searchTerm)); - // fill_soundbanktablebody(filtered); - // } else { - // window.selectedsoundrow = null; - // fill_soundbanktablebody(window.soundbankdata); - // } - // }); $btnClear.click(() => { DoClear(APIURL, "Soundbank", (okdata) => { reloadSoundBank(APIURL); @@ -447,4 +474,37 @@ $(document).ready(function () { alert("Error importing soundbank from XLSX : " + errdata.message); }); }); + $btnfilecheck.click(() => { + fetchAPI(APIURL + "FileCheck", "GET", {}, null, (okdata) => { + console.log(okdata); + let invalidList = Array.isArray(okdata.invalidfile) ? okdata.invalidfile : []; + let validList = Array.isArray(okdata.validfile) ? okdata.validfile : []; + const invalidSet = new Set(invalidList.map(f => f.path)); + dtSoundbank.rows().every(function () { + const d = this.data(); + d.filemissing = invalidSet.has(d.path); + this.data(d); // update row data + }); + + dtSoundbank.draw(false); + console.log(`File Check completed. ${validList.length} valid files, ${invalidList.length} invalid files.`); + if (validList.length === 0) { + if (invalidList.length === 0) { + alert("No soundbank files found on server."); + } else { + alert(`File Check completed. All ${invalidList.length} soundbank files are missing on server.`); + + } + } else { + if (invalidList.length === 0) { + alert(`File Check completed. All ${validList.length} soundbank files are present on server.`); + } else { + alert(`File Check completed. ${validList.length} soundbank files are present, ${invalidList.length} soundbank files are missing on server.`); + } + } + + }, (errdata) => { + alert("Error checking soundbank files : " + errdata.message); + }); + }); }); \ No newline at end of file diff --git a/html/webpage/language.html b/html/webpage/language.html index 3e34bb2..eef28ac 100644 --- a/html/webpage/language.html +++ b/html/webpage/language.html @@ -34,11 +34,12 @@
+
-
-
+
+
diff --git a/html/webpage/soundbank.html b/html/webpage/soundbank.html index ccad8e8..5b13cff 100644 --- a/html/webpage/soundbank.html +++ b/html/webpage/soundbank.html @@ -42,8 +42,9 @@
-
-
+
+
+
diff --git a/src/Main.kt b/src/Main.kt index 1b3ce4c..fa952f0 100644 --- a/src/Main.kt +++ b/src/Main.kt @@ -39,7 +39,7 @@ lateinit var audioPlayer: AudioPlayer val StreamerOutputs: MutableMap = HashMap() lateinit var udpreceiver: UDPReceiver lateinit var tcpreceiver: TCPReceiver -const val version = "0.0.28 (04/02/2026)" +const val version = "0.0.29 (09/02/2026)" // AAS 64 channels const val max_channel = 64 @@ -129,6 +129,12 @@ fun main(args: Array) { if ("--bypass-dongle" == str.lowercase()){ sdx.BypassDongle = true } + if (str.startsWith("--default-soundbank=")){ + val defaultsb = str.substringAfter("=") + val lang = Language.entries.find { it.value.equals(defaultsb, ignoreCase = true) } + Language.DEFAULT = lang ?: Language.INDONESIA + Logger.info { "Default soundbank language set to ${Language.DEFAULT.value} from command line argument" } + } } diff --git a/src/content/Language.kt b/src/content/Language.kt index 3d42603..d05d886 100644 --- a/src/content/Language.kt +++ b/src/content/Language.kt @@ -5,22 +5,22 @@ package content * * @property name The name of the language, as in Soundbank Database */ -@Suppress("unused") -enum class Language(name: String) { - INDONESIA("INDONESIA"), - ENGLISH("ENGLISH"), - LOCAL("LOCAL"), - JAPANESE("JAPANESE"), - CHINESE("CHINESE"), - ARABIC("ARABIC"), - DEFAULT(INDONESIA.name); // default language +enum class Language(val value: String, val googletts: String) { + INDONESIA(value="INDONESIA", googletts="id-ID"), + ENGLISH(value="ENGLISH", googletts="en-US"), + LOCAL(value="LOCAL", googletts=""), + JAPANESE(value="JAPANESE", googletts="ja-JP"), + CHINESE(value="CHINESE", googletts="zh-CN"), + ARABIC(value="ARABIC", googletts="ar-SA"); companion object{ + var DEFAULT: Language = INDONESIA + /** * Default language link string */ fun DefaultLanguageLink() : String { - return DEFAULT.name+";"+ENGLISH.name + return DEFAULT.value+";"+ENGLISH.value } /** @@ -28,12 +28,12 @@ enum class Language(name: String) { */ fun LanguageOrder() : List { return listOf( - INDONESIA.name, - LOCAL.name, - ENGLISH.name, - CHINESE.name, - JAPANESE.name, - ARABIC.name + INDONESIA.value, + LOCAL.value, + ENGLISH.value, + CHINESE.value, + JAPANESE.value, + ARABIC.value ) } fun from_GoogleTTSLanguage(lang: google.GoogleTTSLanguage) : Language { @@ -45,15 +45,9 @@ enum class Language(name: String) { google.GoogleTTSLanguage.Arabic -> ARABIC } } - fun from_GoogleTTSLanguage(code: String) : Language { - return when(code) { - "id-ID" -> INDONESIA - "en-US" -> ENGLISH - "ja-JP" -> JAPANESE - "zh-CN" -> CHINESE - "ar-SA" -> ARABIC - else -> INDONESIA - } + + fun from_GoogleTTSLanguage(code: String) : Language? { + return entries.find { it.googletts == code } } } } \ No newline at end of file diff --git a/src/database/table/Table_Soundbank.kt b/src/database/table/Table_Soundbank.kt index fe3d420..b00b766 100644 --- a/src/database/table/Table_Soundbank.kt +++ b/src/database/table/Table_Soundbank.kt @@ -5,6 +5,7 @@ import database.data.Soundbank import database.dbFunctions import org.apache.poi.xssf.usermodel.XSSFWorkbook import org.tinylog.Logger +import java.io.File import java.sql.Connection import java.util.function.Consumer @@ -236,6 +237,11 @@ class Table_Soundbank(connection: Connection) : dbFunctions("soundban .sorted() } + /** + * Find City by TAG + * @param tag the city tag to search for + * @return a list of Soundbank entries matching the city tag + */ fun Find_City_By_TAG(tag: String) : List { return List .filter {it.Category.equals(Category.City.name,true) } @@ -243,6 +249,11 @@ class Table_Soundbank(connection: Connection) : dbFunctions("soundban .distinctBy { it.TAG } } + /** + * Find Airline Name by TAG + * @param tag the airline code tag to search for + * @return a list of Soundbank entries matching the airline code tag + */ fun Find_AirlineName_By_TAG(tag: String) : List { return List .filter {it.Category.equals(Category.Airplane_Name.name,true) } @@ -305,4 +316,34 @@ class Table_Soundbank(connection: Connection) : dbFunctions("soundban .distinctBy { it.TAG } .sortedBy { it.TAG } } + + class FileCheckResult{ + var validfile = arrayListOf() + var invalidfile = arrayListOf() + } + + /** + * Check Soundbank path files existence + * @param cb callback with FileCheckResult containing valid and invalid files + */ + fun FileCheck(cb: Consumer){ + val result = FileCheckResult() + // file wav must at least 10 kb + val validfilesize = 10 * 1024; // 10 KB + + for (sb in List){ + if (sb.Path.isBlank()) { + result.invalidfile.add(sb) + continue + } + val file = File(sb.Path) + if (file.isFile && file.length() >= validfilesize) { + // file size should at leat 10 kb + result.validfile.add(sb) + } else { + result.invalidfile.add(sb) + } + } + cb.accept(result) + } } \ No newline at end of file diff --git a/src/web/WebApp.kt b/src/web/WebApp.kt index 4299b22..690acf6 100644 --- a/src/web/WebApp.kt +++ b/src/web/WebApp.kt @@ -243,7 +243,7 @@ class WebApp(val listenPort: Int, var userlist: List>, val val aa = js.get("autoadd")?.asText("add") ?: "add" Logger.info { "Starting TTS Soundbank Generation, VoiceType=$voicetype, Language" } ttsjob.GenerateSoundbank( - voicetype, Language.from_GoogleTTSLanguage(languagecode), + voicetype, Language.from_GoogleTTSLanguage(languagecode)!!, VoiceType.fromString(databasesource), VoiceType.fromString(targetas), fileoperation.fromString(fop), autoadd.fromString(aa) @@ -621,6 +621,11 @@ class WebApp(val listenPort: Int, var userlist: List>, val } } path("SoundBank") { + get("FileCheck"){ ctx -> + db.soundDB.FileCheck { result -> + ctx.result(objectmapper.writeValueAsString(result)) + } + } get("List") { ctx -> db.soundDB.Get({ ctx.result(MariaDB.ArrayListtoString(db.soundDB.List)) @@ -1070,7 +1075,7 @@ class WebApp(val listenPort: Int, var userlist: List>, val db.languageDB.Add(newvalue) } db.languageDB.Resort() - + ctx.result(objectmapper.writeValueAsString(resultMessage("OK"))) } post("Add") { // Parse JSON from request body