diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml new file mode 100644 index 0000000..91f9558 --- /dev/null +++ b/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/html/webpage/assets/img/green_circle.png b/html/webpage/assets/img/green_circle.png new file mode 100644 index 0000000..0e5d5bb Binary files /dev/null and b/html/webpage/assets/img/green_circle.png differ diff --git a/html/webpage/assets/img/red_circle.png b/html/webpage/assets/img/red_circle.png new file mode 100644 index 0000000..5c73ecf Binary files /dev/null and b/html/webpage/assets/img/red_circle.png differ diff --git a/html/webpage/assets/js/script.js b/html/webpage/assets/js/script.js index 636c33f..57cab44 100644 --- a/html/webpage/assets/js/script.js +++ b/html/webpage/assets/js/script.js @@ -1,38 +1,209 @@ -$(document).ready(function() { +$(document).ready(function () { document.title = "Automatic Announcement System" - + $('#onlineindicator').attr('src', '/assets/img/red_circle.png'); + + let soundbankdata = []; + let messagebankdata = []; + let languagebankdata = []; + let schedulebankdata = []; + let logdata = []; + + /** + * Fill soundbank table body with values + * @param {SoundBank[]} vv values to fill + */ + function fill_soundbanktablebody(vv) { + $('#soundbanktablebody').empty(); + vv.forEach(item => { + const row = ` + ${item.index} + ${item.description} + ${item.tag} + ${item.category} + ${item.language} + ${item.voiceType} + ${item.path} + `; + $('#soundbanktablebody').append(row); + }); + $('#tablesize').text("Table Size: " + vv.length); + } + + /** + * Fill messagebank table body with values + * @param {MessageBank[]} vv values to fill + */ + function fill_messagebanktablebody(vv) { + $('#messagebanktablebody').empty(); + vv.forEach(item => { + const row = ` + ${item.index} + ${item.description} + ${item.language} + ${item.aNN_ID} + ${item.voice_Type} + ${item.message_Detail} + ${item.message_TAGS} + `; + $('#messagebanktablebody').append(row); + }); + console.log("loaded " + vv.length + " messagebank items"); + } + + function fill_languagebanktablebody(vv) { + $('#languagebanktablebody').empty(); + vv.forEach(item => { + //TODO examine JSON structure + const row = ` + ${item.index} + ${item.description} + ${item.language} + ${item.aNN_ID} + ${item.voice_Type} + ${item.message_Detail} + ${item.message_TAGS} + `; + $('#languagebanktablebody').append(row); + }); + console.log("loaded " + vv.length + " languagebank items"); + } + + function fill_schedulebanktablebody(vv) { + $('#schedulebanktablebody').empty(); + //TODO examine JSON structure + vv.forEach(item => { + const row = ` + ${item.index} + ${item.description} + ${item.language} + ${item.aNN_ID} + ${item.voice_Type} + ${item.message_Detail} + ${item.message_TAGS} + `; + $('#schedulebanktablebody').append(row); + }); + console.log("loaded " + vv.length + " schedulebank items"); + } + + function fill_logtablebody(vv) { + $('#logtablebody').empty(); + vv.forEach(item => { + const row = ` + ${item.index} + ${item.date} + ${item.time} + ${item.description} + `; + $('#logtablebody').append(row); + }); + console.log("loaded " + vv.length + " log items"); + } + const ws = new WebSocket(window.location.pathname + '/ws'); ws.onopen = () => { console.log('WebSocket connection established'); + $('#onlineindicator').attr('src', '/assets/img/green_circle.png'); }; ws.onmessage = (event) => { let rep = JSON.parse(event.data); let cmd = rep.reply let data = rep.data; - if (cmd && cmd.length > 0){ - // console.log('Command:', cmd); - // console.log('Data:', data); - switch(cmd){ - case "getCPUStatus" : + if (cmd && cmd.length > 0) { + switch (cmd) { + case "getCPUStatus": $('#cpustatus').text("CPU Usage: " + data) break; - case "getMemoryStatus" : + case "getMemoryStatus": $('#ramstatus').text("Memory Usage: " + data) break; - case "getDiskStatus" : + case "getDiskStatus": $('#diskstatus').text("Disk Usage: " + data) break; - case "getNetworkStatus" : + case "getNetworkStatus": $('#networkstatus').text("Network Usage: " + data) break; + case "getSystemTime": + $('#datetimetext').text(data) + break; + case "getSoundBankList": + let $soundbankfilter = $('#findsoundbank'); + $soundbankfilter.empty(); + soundbankdata = []; + fill_soundbanktablebody(soundbankdata) + let xx = JSON.parse(data); + if (Array.isArray(xx) && xx.length > 0) { + soundbankdata = xx; + fill_soundbanktablebody(soundbankdata); + $soundbankfilter.prop('disabled', false); + $soundbankfilter.off('input').on('input', function () { + const filterText = $(this).val().toLowerCase(); + if (filterText.length === 0) { + fill_soundbanktablebody(soundbankdata); + return; + } else { + const filtered = soundbankdata.filter(item => + item.description && item.description.toLowerCase().startsWith(filterText) + ); + fill_soundbanktablebody(filtered); + } + + }); + } else { + $soundbankfilter.prop('disabled', true); + alert("No soundbank data available"); + } + break; + case "getMessageBankList": + messagebankdata = []; + fill_messagebanktablebody(messagebankdata); + let yy = JSON.parse(data); + if (Array.isArray(yy) && yy.length > 0) { + messagebankdata = yy; + fill_messagebanktablebody(messagebankdata); + } else alert("No messagebank data available"); + break; + case "getLanguageList": + languagebankdata = [] + fill_languagebanktablebody(languagebankdata); + let zz = JSON.parse(data); + if (Array.isArray(zz) && zz.length > 0) { + languagebankdata = zz; + fill_languagebanktablebody(languagebankdata); + } else alert("No language data available"); + break; + case "getTimerList": + schedulebankdata = [] + fill_schedulebanktablebody(schedulebankdata); + let aa = JSON.parse(data); + if (Array.isArray(aa) && aa.length > 0) { + schedulebankdata = aa; + fill_schedulebanktablebody(schedulebankdata); + } else alert("No schedule data available"); + break; + case "getLog": + let $logfilter = $('#searchfilter'); + logdata = []; + fill_logtablebody(logdata); + let bb = JSON.parse(data); + if (Array.isArray(bb) && bb.length > 0) { + logdata = bb; + fill_logtablebody(logdata); + } else alert("No log data available"); + break; + case "getSetting": + console.log("Setting:"); + console.log(data); + break; } } }; ws.onclose = () => { console.log('WebSocket connection closed'); + $('#onlineindicator').attr('src', '/assets/img/red_circle.png'); }; // ws.onerror = (error) => { // console.error('WebSocket error:', error); @@ -43,7 +214,7 @@ $(document).ready(function() { * @param {String} command command to send * @param {String} data data to send */ - function sendCommand(command, data){ + function sendCommand(command, data) { if (ws.readyState === WebSocket.OPEN) { ws.send(JSON.stringify({ command, data })); } else { @@ -51,43 +222,133 @@ $(document).ready(function() { } } - setInterval(()=>{ - $('#datetimetext').text(new Date().toLocaleString()); + setInterval(() => { sendCommand("getCPUStatus", "") sendCommand("getMemoryStatus", "") sendCommand("getDiskStatus", "") sendCommand("getNetworkStatus", "") + sendCommand("getSystemTime", "") }, 1000) let sidemenu = new bootstrap.Offcanvas('#offcanvas-menu'); - $('#showmenu').click(()=>{ + $('#showmenu').click(() => { sidemenu.show(); }) - $('#soundbanklink').click(()=>{ + $('#soundbanklink').click(() => { sidemenu.hide(); - $('#content').load('soundbank.html'); + $('#content').load('soundbank.html', function (response, status, xhr) { + if (status === "success") { + console.log("Soundbank content loaded successfully"); + sendCommand("getSoundBankList", ""); + + } else { + console.error("Error loading soundbank content:", xhr.status, xhr.statusText); + } + }); + }) - $('#messagebanklink').click(()=>{ + $('#messagebanklink').click(() => { sidemenu.hide(); - $('#content').load('messagebank.html'); + $('#content').load('messagebank.html', function (response, status, xhr) { + if (status === "success") { + console.log("Messagebank content loaded successfully"); + sendCommand("getMessageBankList", ""); + } else { + console.error("Error loading messagebank content:", xhr.status, xhr.statusText); + } + }); + }) - $('#languagelink').click(()=>{ + $('#languagelink').click(() => { sidemenu.hide(); - $('#content').load('language.html'); + $('#content').load('language.html', function (response, status, xhr) { + if (status === "success") { + console.log("Language content loaded successfully"); + sendCommand("getLanguageList", ""); + } else { + console.error("Error loading language content:", xhr.status, xhr.statusText); + } + }); }) - $('#timerlink').click(()=>{ + $('#timerlink').click(() => { sidemenu.hide(); - $('#content').load('timer.html'); + $('#content').load('timer.html', function (response, status, xhr) { + if (status === "success") { + console.log("Timer content loaded successfully"); + sendCommand("getTimerList", ""); + } else { + console.error("Error loading timer content:", xhr.status, xhr.statusText); + } + }); }) - $('#loglink').click(()=>{ + $('#loglink').click(() => { sidemenu.hide(); - $('#content').load('log.html'); + $('#content').load('log.html', function (response, status, xhr) { + if (status === "success") { + console.log("Log content loaded successfully"); + const $logdate = $('#logdate'); + const $searchfilter = $('#searchfilter'); + if (!$logdate.val()) { + const today = new Date(); + const dd = String(today.getDate()).padStart(2, '0'); + const mm = String(today.getMonth() + 1).padStart(2, '0'); + const yyyy = today.getFullYear(); + $logdate.val(`${yyyy}-${mm}-${dd}`); + } + $logdate.off('change').on('change', function () { + const selected = $(this).val(); + if (selected) { + const [year, month, day] = selected.split('-'); + const formatted = `${day}/${month}/${year}`; + sendCommand("getLog", logRequstData(formatted, $searchfilter.val())); + } + }); + const selected = $logdate.val(); + if (selected) { + const [year, month, day] = selected.split('-'); + const formatted = `${day}/${month}/${year}`; + sendCommand("getLog", logRequstData(formatted, $searchfilter.val())); + } + } else { + console.error("Error loading log content:", xhr.status, xhr.statusText); + } + }); + }) - $('#settinglink').click(()=>{ + $('#settinglink').click(() => { sidemenu.hide(); - $('#content').load('setting.html'); + $('#content').load('setting.html', function (response, status, xhr) { + if (status === "success") { + console.log("Setting content loaded successfully"); + sendCommand("getSetting", ""); + } else { + console.error("Error loading setting content:", xhr.status, xhr.statusText); + } + }); }) - $('#logoutlink').click(()=>{ + $('#logoutlink').click(() => { window.location.href = "login.html" }) + + + /** + * Create log Request Data + * @param {String} logdate in format dd/mm/yyyy + * @param {String} logfilter + * @returns JSON string of log Request data + */ + function logRequstData(logdate, logfilter) { + if (logdate && logdate.length > 0) { + const dateRegex = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/\d{4}$/; + if (dateRegex.test(logdate)) { + // logdate is valid + return JSON.stringify({ + date: logdate, + filter: logfilter + }) + } + + } + return "" + } }); \ No newline at end of file diff --git a/html/webpage/home.html b/html/webpage/home.html index 9a10c6e..bce5b87 100644 --- a/html/webpage/home.html +++ b/html/webpage/home.html @@ -60,7 +60,15 @@
-
+
+
+
+
+
+

CPU Status

diff --git a/html/webpage/language.html b/html/webpage/language.html index af707ab..5f6cf73 100644 --- a/html/webpage/language.html +++ b/html/webpage/language.html @@ -29,7 +29,7 @@ Filename - + Cell 1 Cell 2 diff --git a/html/webpage/log.html b/html/webpage/log.html index 4664016..3a79fb0 100644 --- a/html/webpage/log.html +++ b/html/webpage/log.html @@ -44,7 +44,7 @@ Description - + Cell 1 Cell 2 diff --git a/html/webpage/messagebank.html b/html/webpage/messagebank.html index 5dd1033..d563ee3 100644 --- a/html/webpage/messagebank.html +++ b/html/webpage/messagebank.html @@ -29,7 +29,7 @@ Message Tags - + Cell 1 Cell 2 diff --git a/html/webpage/soundbank.html b/html/webpage/soundbank.html index a584771..da10250 100644 --- a/html/webpage/soundbank.html +++ b/html/webpage/soundbank.html @@ -15,6 +15,25 @@

Sound Bank

+
+
+

Search

+
+
+
+
+
+

Table Length : N/A

+
+
+
+
+
+
+
+
+
+
@@ -29,7 +48,7 @@ - + @@ -52,20 +71,6 @@
Filename
Cell 1 Cell 2
-
-
-

Search

-
-
-
-
-
-
-
-
-
-
-
diff --git a/html/webpage/timer.html b/html/webpage/timer.html index 66326eb..d2a8fd3 100644 --- a/html/webpage/timer.html +++ b/html/webpage/timer.html @@ -29,7 +29,7 @@ Filename - + Cell 1 Cell 2 diff --git a/src/Main.kt b/src/Main.kt index 5447ca7..865b54a 100644 --- a/src/Main.kt +++ b/src/Main.kt @@ -1,20 +1,31 @@ import audio.AudioPlayer +import com.sun.jna.Platform import content.ContentCache +import database.MariaDB import org.tinylog.Logger +import oshi.util.GlobalConfig import web.WebApp fun main() { + if (Platform.isWindows()){ + // supaya OSHI bisa mendapatkan CPU usage di Windows seperti di Task Manager + GlobalConfig.set(GlobalConfig.OSHI_OS_WINDOWS_CPU_UTILITY,true) + } Logger.info("Application started" as Any) val audioPlayer = AudioPlayer(44100) // 44100 Hz sampling rate audioPlayer.InitAudio(1) val content = ContentCache() + val db = MariaDB() val web = WebApp(3030, listOf( Pair("admin", "password"), Pair("user", "password") - ) + ), db ) web.Start() + + + } diff --git a/src/codes/Somecodes.kt b/src/codes/Somecodes.kt index a004dda..b55e81d 100644 --- a/src/codes/Somecodes.kt +++ b/src/codes/Somecodes.kt @@ -1,20 +1,26 @@ package codes +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import oshi.SystemInfo import oshi.hardware.CentralProcessor import oshi.hardware.GlobalMemory import java.nio.file.Files import java.nio.file.Path +import java.time.format.DateTimeFormatter +import java.util.function.Consumer @Suppress("unused") class Somecodes { companion object { - + val current_directory : String = System.getProperty("user.dir") val si = SystemInfo() val processor: CentralProcessor = si.hardware.processor val memory : GlobalMemory = si.hardware.memory - + val datetimeformat1: DateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss") const val KB_threshold = 1024.0 const val MB_threshold = KB_threshold * 1024.0 @@ -36,8 +42,59 @@ class Somecodes { } } + /** + * Get Disk usage using OSHI library. + * @param path The path to check disk usage, defaults to the current working directory. + * @return A string representing the disk usage of the file system in a human-readable format. + */ + fun getDiskUsage(path: String = current_directory) : String { + return try{ + val p = Path.of(path).toFile() + if (p.exists() && p.isDirectory){ + val total = p.totalSpace + val free = p.freeSpace + val used = total - free + String.format("Total: %s, Used: %s, Free: %s, Usage: %.2f%%", + SizetoHuman(total), + SizetoHuman(used), + SizetoHuman(free), + (used.toDouble() / total * 100) + ) + } else throw Exception() + } catch (_ : Exception){ + "N/A" + } + } + fun getCPUUsage(cb : Consumer){ + CoroutineScope(Dispatchers.Default).launch { + val prev = processor.systemCpuLoadTicks + delay(1000) + val current = processor.systemCpuLoadTicks + + fun delta(t: CentralProcessor.TickType) = current[t.index] - prev[t.index] + + val idle = delta(CentralProcessor.TickType.IDLE) + delta(CentralProcessor.TickType.IOWAIT) + val busy = delta(CentralProcessor.TickType.USER) + delta(CentralProcessor.TickType.SYSTEM) + + delta(CentralProcessor.TickType.NICE) + delta(CentralProcessor.TickType.IRQ) + + delta(CentralProcessor.TickType.SOFTIRQ)+ delta(CentralProcessor.TickType.STEAL) + + val total = idle + busy + val usage = if (total > 0) { + (busy.toDouble() / total) * 100 + } else { + 0.0 + } + cb.accept(String.format("%.2f%%", usage)) + } + + } + + /** + * Get RAM usage using OSHI library. + * @return A string representing the total, used, and available memory in a human-readable format. + */ fun getMemoryUsage() : String{ val totalMemory = memory.total val availableMemory = memory.available diff --git a/src/database/LanguageLink.kt b/src/database/LanguageLink.kt new file mode 100644 index 0000000..552468e --- /dev/null +++ b/src/database/LanguageLink.kt @@ -0,0 +1,4 @@ +package database + +@Suppress("unused") +data class LanguageLink(val index: UInt, val TAG: String, val Language: String) diff --git a/src/database/MariaDB.kt b/src/database/MariaDB.kt index f312a37..816524b 100644 --- a/src/database/MariaDB.kt +++ b/src/database/MariaDB.kt @@ -1,5 +1,6 @@ package database +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext @@ -29,6 +30,8 @@ class MariaDB ( var connected : Boolean = false var SoundbankList : ArrayList = ArrayList() var MessagebankList : ArrayList = ArrayList() + var LanguageLinkList : ArrayList = ArrayList() + var SchedulebankList : ArrayList = ArrayList() companion object { fun ValidDate(date: String): Boolean { @@ -41,6 +44,22 @@ class MariaDB ( val regex = Regex("""^\d{2}:\d{2}:\d{2}$""") return regex.matches(time) } + + private val objectMapper = jacksonObjectMapper() + /** + * Convert SoundbankList, MessagebankList, LanguageLinkList, or SchedulebankList to a JSON String. + * @param list The ArrayList to convert to a String. + * @return A JSON String representation of the ArrayList. + */ + fun ArrayListtoString(list: ArrayList) : String{ + return try { + objectMapper.writeValueAsString(list.toArray()) + } catch (e: Exception) { + Logger.error("Error converting list to JSON: ${e.message}" as Any) + "[]" + } + + } } init { @@ -52,9 +71,9 @@ class MariaDB ( runBlocking { withContext(Dispatchers.IO){ Reload_Messagebank() - Logger.info { "Messagebank loaded" } Reload_Soundbank() - Logger.info { "Soundbank loaded" } + Reload_LanguageLink() + Reload_Schedulebank() } } @@ -63,6 +82,8 @@ class MariaDB ( Logger.info { "Loading MariaDB completed" } Logger.info { "Soundbank count: ${SoundbankList.size}" } Logger.info { "Messagebank count: ${MessagebankList.size}" } + Logger.info { "LanguageLink count: ${LanguageLinkList.size}" } + Logger.info { "Schedulebank count: ${SchedulebankList.size}" } } catch (e : Exception) { @@ -165,6 +186,54 @@ class MariaDB ( consumer.accept(logList) } + /** + * Reloads the ScheduleBank list from the database. + */ + private fun Reload_Schedulebank() { + SchedulebankList.clear() + try { + val statement = connection?.createStatement() + val resultSet = statement?.executeQuery("SELECT * FROM schedulebank") + while (resultSet?.next() == true) { + val schedulebank = ScheduleBank( + resultSet.getLong("index").toUInt(), + resultSet.getString("Description"), + resultSet.getString("Day"), + resultSet.getString("Time"), + resultSet.getString("Soundpath"), + resultSet.getInt("Repeat").toUByte(), + resultSet.getBoolean("Enable"), + resultSet.getString("BroadcastZones"), + resultSet.getString("Language") + ) + SchedulebankList.add(schedulebank) + } + } catch (e : Exception) { + Logger.error("Error fetching schedulebanks: ${e.message}" as Any) + } + } + + /** + * Reloads the language link list from the database. + */ + private fun Reload_LanguageLink() { + LanguageLinkList.clear() + try { + val statement = connection?.createStatement() + val resultSet = statement?.executeQuery("SELECT * FROM languagelink") + while (resultSet?.next() == true) { + val languageLink = LanguageLink( + resultSet.getLong("index").toUInt(), + resultSet.getString("TAG"), + resultSet.getString("Language") + ) + LanguageLinkList.add(languageLink) + } + } catch (e : Exception) { + Logger.error("Error fetching language links: ${e.message}" as Any) + } + } + /** * Reloads the soundbank list from the database. */ diff --git a/src/database/ScheduleBank.kt b/src/database/ScheduleBank.kt new file mode 100644 index 0000000..99d1269 --- /dev/null +++ b/src/database/ScheduleBank.kt @@ -0,0 +1,4 @@ +package database + +@Suppress("unused") +data class ScheduleBank(val index: UInt, val Description: String, val Day: String, val Time: String, val Soundpath: String, val Repeat: UByte, val Enable: Boolean, val BroadcastZones: String, val Language: String) diff --git a/src/web/WebApp.kt b/src/web/WebApp.kt index 87dc002..55684df 100644 --- a/src/web/WebApp.kt +++ b/src/web/WebApp.kt @@ -2,6 +2,7 @@ package web import codes.Somecodes import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import database.MariaDB import io.javalin.Javalin import io.javalin.apibuilder.ApiBuilder.before import io.javalin.apibuilder.ApiBuilder.get @@ -9,13 +10,13 @@ import io.javalin.apibuilder.ApiBuilder.path import io.javalin.apibuilder.ApiBuilder.post import io.javalin.apibuilder.ApiBuilder.ws import io.javalin.http.Context +import java.time.LocalDateTime @Suppress("unused") -class WebApp(val listenPort: Int, val userlist: List>) { +class WebApp(val listenPort: Int, val userlist: List>, val db: MariaDB) { var app : Javalin? = null - private val objectmapper = jacksonObjectMapper() - + val objectmapper = jacksonObjectMapper() fun Start() { app = Javalin.create { config -> @@ -55,35 +56,58 @@ class WebApp(val listenPort: Int, val userlist: List>) { path("home.html") { before { CheckUsers(it) } - ws("/ws") { it -> + ws("/ws") { ws -> // WebSocket endpoint for home - it.onClose { + ws.onClose { wsCloseContext -> // TODO Handle WebSocket close event - println("WebSocket closed: ${it.session.remoteAddress}") + println("WebSocket closed: ${wsCloseContext.session.remoteAddress}") } - it.onMessage { + ws.onMessage { wsMessageContext -> try{ - val cmd = objectmapper.readValue(it.message(), WebsocketCommand::class.java) + val cmd = objectmapper.readValue(wsMessageContext.message(), WebsocketCommand::class.java) when (cmd.command) { + "getSystemTime" ->{ + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command, LocalDateTime.now().format(Somecodes.datetimeformat1)))) + } "getCPUStatus" ->{ - //TODO Get CPU status - - it.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command,"OK"))) + Somecodes.getCPUUsage { vv -> + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command, vv))) + } } "getMemoryStatus" ->{ - // TODO Get Memory status - it.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command, Somecodes.getMemoryUsage()))) + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command, Somecodes.getMemoryUsage()))) } "getDiskStatus" ->{ - // TODO Get Disk status - it.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command,"OK"))) + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command, Somecodes.getDiskUsage()))) } "getNetworkStatus" ->{ // TODO Get Network status - it.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command,"OK"))) + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command,"OK"))) + } + "getSoundBankList" ->{ + println("getSoundBankList command received") + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command, MariaDB.ArrayListtoString(db.SoundbankList)))) + } + "getMessageBankList"->{ + println("getMessageBankList command received") + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command, MariaDB.ArrayListtoString(db.MessagebankList))) ) + } + "getLanguageList"->{ + println("getLanguageList command received") + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command, MariaDB.ArrayListtoString(db.LanguageLinkList)))) + } + "getTimerList"->{ + println("getTimerList command received") + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply(cmd.command, MariaDB.ArrayListtoString(db.SchedulebankList)))) + } + "getLog" ->{ + println("getLog command received") + } + "getSetting" ->{ + println("getSetting command received") } else -> { - it.send(objectmapper.writeValueAsString(WebsocketReply("error", "Unknown command: ${cmd.command}"))) + wsMessageContext.send(objectmapper.writeValueAsString(WebsocketReply("error", "Unknown command: ${cmd.command}"))) } } } catch (e: Exception){ @@ -91,30 +115,37 @@ class WebApp(val listenPort: Int, val userlist: List>) { } } - it.onConnect { + ws.onConnect { wsConnectContext -> // TODO Handle WebSocket connect event - println("WebSocket connected: ${it.session.remoteAddress}") + println("WebSocket connected: ${wsConnectContext.session.remoteAddress}") } } } path("soundbank.html") { before {CheckUsers(it)} + + } path("messagebank.html") { before { CheckUsers(it) } + } path("language.html") { before { CheckUsers(it) } + } path("log.html") { before { CheckUsers(it) } + } path("setting.html") { before { CheckUsers(it) } + } path("timer.html") { before { CheckUsers(it) } + } } }.start(listenPort) @@ -122,19 +153,13 @@ class WebApp(val listenPort: Int, val userlist: List>) { } fun CheckUsers(ctx: Context){ - println("Checking user session at ${ctx.req().requestURI}") val user = ctx.sessionAttribute("user") if (user == null) { - println("User not logged in, redirecting to login page") ctx.redirect("login.html") } - println("User is logged in: $user") val foundUser = userlist.find { it.first == user } if (foundUser==null) { - println("User not found in user list, redirecting to login page") ctx.redirect("login.html") - } else { - println("User found: $user") } }