commit 28/08/2025
This commit is contained in:
43
src/Main.kt
43
src/Main.kt
@@ -2,6 +2,11 @@ import audio.AudioPlayer
|
|||||||
import com.sun.jna.Platform
|
import com.sun.jna.Platform
|
||||||
import content.ContentCache
|
import content.ContentCache
|
||||||
import database.MariaDB
|
import database.MariaDB
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.isActive
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import org.tinylog.Logger
|
import org.tinylog.Logger
|
||||||
import oshi.util.GlobalConfig
|
import oshi.util.GlobalConfig
|
||||||
import web.WebApp
|
import web.WebApp
|
||||||
@@ -17,6 +22,44 @@ fun main() {
|
|||||||
audioPlayer.InitAudio(1)
|
audioPlayer.InitAudio(1)
|
||||||
val content = ContentCache()
|
val content = ContentCache()
|
||||||
val db = MariaDB()
|
val db = MariaDB()
|
||||||
|
CoroutineScope(Dispatchers.Default).launch {
|
||||||
|
while (isActive){
|
||||||
|
delay(1000)
|
||||||
|
val broadcastzones = db.GetBroadcastZones()
|
||||||
|
// baca dulu queue paging, prioritas 1
|
||||||
|
db.Read_Queue_Paging().forEach {
|
||||||
|
// cek apakah queue paging ada broadcast zone nya
|
||||||
|
if (it.BroadcastZones.isNotBlank()) {
|
||||||
|
val zz = it.BroadcastZones.split(";")
|
||||||
|
// cek apakah semua target broadcast zone dari queue paging ada di dalam database broadcast zones
|
||||||
|
if (zz.all { z -> broadcastzones.any { bz -> bz.equals(z) } }){
|
||||||
|
// semua target broadcast zone valid, sekarang cek apakah semua target broadcast zone idle
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// ada broadcast zone yang tidak valid, delete from queue paging
|
||||||
|
db.Delete_Queue_Paging_by_index(it.index)
|
||||||
|
//TODO check log message yang benar
|
||||||
|
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to invalid broadcast zone")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// invalid broadcast zone, delete from queue paging
|
||||||
|
db.Delete_Queue_Paging_by_index(it.index)
|
||||||
|
// TODO check log message yang benar
|
||||||
|
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to empty broadcast zone")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// baca kemudian queue table, prioritas 2
|
||||||
|
db.Read_Queue_Table().forEach {
|
||||||
|
if (it.BroadcastZones.isNotBlank()) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// invalid broadcast zone, delete from queue table
|
||||||
|
db.Delete_Queue_Table_by_index(it.index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
val web = WebApp(3030,
|
val web = WebApp(3030,
|
||||||
listOf(
|
listOf(
|
||||||
Pair("admin", "password"),
|
Pair("admin", "password"),
|
||||||
|
|||||||
@@ -105,6 +105,34 @@ class MariaDB (
|
|||||||
connected = false
|
connected = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Log to database
|
||||||
|
* @param machine The machine name or identifier.
|
||||||
|
* @param description The description of the log entry.
|
||||||
|
*/
|
||||||
|
fun Add_Log(machine: String, description: String){
|
||||||
|
val currentDate = java.time.LocalDate.now()
|
||||||
|
val currentTime = java.time.LocalTime.now().withNano(0) // remove nanoseconds for cleaner format
|
||||||
|
val dateString = currentDate.format(java.time.format.DateTimeFormatter.ofPattern("dd/MM/yyyy"))
|
||||||
|
val timeString = currentTime.format(java.time.format.DateTimeFormatter.ofPattern("HH:mm:ss"))
|
||||||
|
|
||||||
|
try {
|
||||||
|
val statement = connection?.prepareStatement("INSERT INTO log (datenya, timenya, machine, description) VALUES (?, ?, ?, ?)")
|
||||||
|
statement?.setString(1, dateString)
|
||||||
|
statement?.setString(2, timeString)
|
||||||
|
statement?.setString(3, machine)
|
||||||
|
statement?.setString(4, description)
|
||||||
|
val rowsAffected = statement?.executeUpdate()
|
||||||
|
if (rowsAffected != null && rowsAffected > 0) {
|
||||||
|
Logger.info("Log added: [$dateString $timeString] [$machine] $description" as Any)
|
||||||
|
} else {
|
||||||
|
Logger.warn("No log entry added for: [$dateString $timeString] [$machine] $description" as Any)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error adding log entry: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get All Log from database
|
* Get All Log from database
|
||||||
* @param consumer A Consumer that will receive the list of logs
|
* @param consumer A Consumer that will receive the list of logs
|
||||||
@@ -213,6 +241,43 @@ class MariaDB (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a schedulebank entry by its index.
|
||||||
|
* @param index The index of the schedulebank entry to delete.
|
||||||
|
* @return True if the deletion was successful, false otherwise.
|
||||||
|
*/
|
||||||
|
fun Delete_Schedulebank_by_index(index: UInt) : Boolean {
|
||||||
|
try {
|
||||||
|
val statement = connection?.prepareStatement("DELETE FROM schedulebank WHERE `index` = ?")
|
||||||
|
statement?.setLong(1, index.toLong())
|
||||||
|
val rowsAffected = statement?.executeUpdate()
|
||||||
|
if (rowsAffected != null && rowsAffected > 0) {
|
||||||
|
Logger.info("Deleted $rowsAffected row(s) from schedulebank with index $index" as Any)
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
Logger.warn("No rows deleted from schedulebank with index $index" as Any)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error deleting from schedulebank with index $index: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all entries from the schedulebank table in the database and the local list.
|
||||||
|
*/
|
||||||
|
fun Clear_Schedulebank() {
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
// use TRUNCATE to reset auto increment index
|
||||||
|
statement?.executeUpdate("TRUNCATE TABLE schedulebank")
|
||||||
|
Logger.info("Schedulebank table cleared" as Any)
|
||||||
|
SchedulebankList.clear()
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error clearing schedulebank table: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reloads the language link list from the database.
|
* Reloads the language link list from the database.
|
||||||
*/
|
*/
|
||||||
@@ -234,6 +299,43 @@ class MariaDB (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a language link entry by its index.
|
||||||
|
* @param index The index of the language link entry to delete.
|
||||||
|
* @return True if the deletion was successful, false otherwise.
|
||||||
|
*/
|
||||||
|
fun Delete_LanguageLink_by_index(index: UInt) : Boolean {
|
||||||
|
try {
|
||||||
|
val statement = connection?.prepareStatement("DELETE FROM languagelink WHERE `index` = ?")
|
||||||
|
statement?.setLong(1, index.toLong())
|
||||||
|
val rowsAffected = statement?.executeUpdate()
|
||||||
|
if (rowsAffected != null && rowsAffected > 0) {
|
||||||
|
Logger.info("Deleted $rowsAffected row(s) from languagelink with index $index" as Any)
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
Logger.warn("No rows deleted from languagelink with index $index" as Any)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error deleting from languagelink with index $index: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all entries from the language link table in the database and the local list.
|
||||||
|
*/
|
||||||
|
fun Clear_LanguageLink() {
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
// use TRUNCATE to reset auto increment index
|
||||||
|
statement?.executeUpdate("TRUNCATE TABLE languagelink")
|
||||||
|
Logger.info("LanguageLink table cleared" as Any)
|
||||||
|
LanguageLinkList.clear()
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error clearing LanguageLink table: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reloads the soundbank list from the database.
|
* Reloads the soundbank list from the database.
|
||||||
*/
|
*/
|
||||||
@@ -260,6 +362,43 @@ class MariaDB (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a soundbank entry by its index.
|
||||||
|
* @param index The index of the soundbank entry to delete.
|
||||||
|
* @return True if the deletion was successful, false otherwise.
|
||||||
|
*/
|
||||||
|
fun Delete_Soundbank_by_index(index: UInt) : Boolean {
|
||||||
|
try {
|
||||||
|
val statement = connection?.prepareStatement("DELETE FROM soundbank WHERE `index` = ?")
|
||||||
|
statement?.setLong(1, index.toLong())
|
||||||
|
val rowsAffected = statement?.executeUpdate()
|
||||||
|
if (rowsAffected != null && rowsAffected > 0) {
|
||||||
|
Logger.info("Deleted $rowsAffected row(s) from soundbank with index $index" as Any)
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
Logger.warn("No rows deleted from soundbank with index $index" as Any)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error deleting from soundbank with index $index: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all entries from the soundbank table in the database and the local list.
|
||||||
|
*/
|
||||||
|
fun Clear_Soundbank() {
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
// use TRUNCATE to reset auto increment index
|
||||||
|
statement?.executeUpdate("TRUNCATE TABLE soundbank")
|
||||||
|
Logger.info("Soundbank table cleared" as Any)
|
||||||
|
SoundbankList.clear()
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error clearing soundbank table: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reloads the messagebank list from the database.
|
* Reloads the messagebank list from the database.
|
||||||
*/
|
*/
|
||||||
@@ -286,4 +425,229 @@ class MariaDB (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a messagebank entry by its index.
|
||||||
|
* @param index The index of the messagebank entry to delete.
|
||||||
|
* @return True if the deletion was successful, false otherwise.
|
||||||
|
*/
|
||||||
|
fun Delete_Messagebank_by_index(index: UInt) : Boolean {
|
||||||
|
try {
|
||||||
|
val statement = connection?.prepareStatement("DELETE FROM messagebank WHERE `index` = ?")
|
||||||
|
statement?.setLong(1, index.toLong())
|
||||||
|
val rowsAffected = statement?.executeUpdate()
|
||||||
|
if (rowsAffected != null && rowsAffected > 0) {
|
||||||
|
Logger.info("Deleted $rowsAffected row(s) from messagebank with index $index" as Any)
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
Logger.warn("No rows deleted from messagebank with index $index" as Any)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error deleting from messagebank with index $index: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all entries from the messagebank table in the database and the local list.
|
||||||
|
*/
|
||||||
|
fun Clear_Messagebank() {
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
// use TRUNCATE to reset auto increment index
|
||||||
|
statement?.executeUpdate("TRUNCATE TABLE messagebank")
|
||||||
|
Logger.info("Messagebank table cleared" as Any)
|
||||||
|
MessagebankList.clear()
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error clearing messagebank table: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads all entries from the queue_table in the database.
|
||||||
|
* @return A list of QueueTable entries.
|
||||||
|
*/
|
||||||
|
fun Read_Queue_Table() : List<QueueTable> {
|
||||||
|
val queueList = ArrayList<QueueTable>()
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
val resultSet = statement?.executeQuery("SELECT * FROM queue_table")
|
||||||
|
while (resultSet?.next() == true) {
|
||||||
|
val queueTable = QueueTable(
|
||||||
|
resultSet.getLong("index").toUInt(),
|
||||||
|
resultSet.getString("Date_Time"),
|
||||||
|
resultSet.getString("Source"),
|
||||||
|
resultSet.getString("Type"),
|
||||||
|
resultSet.getString("Message"),
|
||||||
|
resultSet.getString("SB_TAGS"),
|
||||||
|
resultSet.getString("BroadcastZones"),
|
||||||
|
resultSet.getInt("Repeat").toUInt(),
|
||||||
|
resultSet.getString("Language")
|
||||||
|
)
|
||||||
|
queueList.add(queueTable)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error fetching queue table: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return queueList
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a queue_table entry by its index.
|
||||||
|
* @param index The index of the queue_table entry to delete.
|
||||||
|
* @return True if the deletion was successful, false otherwise.
|
||||||
|
*/
|
||||||
|
fun Delete_Queue_Table_by_index(index: UInt) : Boolean {
|
||||||
|
try {
|
||||||
|
val statement = connection?.prepareStatement("DELETE FROM queue_table WHERE `index` = ?")
|
||||||
|
statement?.setLong(1, index.toLong())
|
||||||
|
val rowsAffected = statement?.executeUpdate()
|
||||||
|
if (rowsAffected != null && rowsAffected > 0) {
|
||||||
|
Logger.info("Deleted $rowsAffected row(s) from queue_table with index $index" as Any)
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
Logger.warn("No rows deleted from queue_table with index $index" as Any)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error deleting from queue_table with index $index: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all entries from the queue_table in the database.
|
||||||
|
*/
|
||||||
|
fun Clear_Queue_Table() {
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
// use TRUNCATE to reset auto increment index
|
||||||
|
statement?.executeUpdate("TRUNCATE TABLE queue_table")
|
||||||
|
Logger.info("Queue table cleared" as Any)
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error clearing queue table: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads all entries from the queue_paging in the database.
|
||||||
|
* @return A list of QueuePaging entries.
|
||||||
|
*/
|
||||||
|
fun Read_Queue_Paging() : List<QueuePaging>{
|
||||||
|
val queueList = ArrayList<QueuePaging>()
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
val resultSet = statement?.executeQuery("SELECT * FROM queue_paging")
|
||||||
|
while (resultSet?.next() == true) {
|
||||||
|
val queuePaging = QueuePaging(
|
||||||
|
resultSet.getLong("index").toUInt(),
|
||||||
|
resultSet.getString("Date_Time"),
|
||||||
|
resultSet.getString("Source"),
|
||||||
|
resultSet.getString("Type"),
|
||||||
|
resultSet.getString("Message"),
|
||||||
|
resultSet.getString("SB_TAGS"),
|
||||||
|
)
|
||||||
|
queueList.add(queuePaging)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error fetching queue paging: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return queueList
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a queue_paging entry by its index.
|
||||||
|
* @param index The index of the queue_paging entry to delete.
|
||||||
|
* @return True if the deletion was successful, false otherwise.
|
||||||
|
*/
|
||||||
|
fun Delete_Queue_Paging_by_index(index: UInt) : Boolean {
|
||||||
|
try {
|
||||||
|
val statement = connection?.prepareStatement("DELETE FROM queue_paging WHERE `index` = ?")
|
||||||
|
statement?.setLong(1, index.toLong())
|
||||||
|
val rowsAffected = statement?.executeUpdate()
|
||||||
|
if (rowsAffected != null && rowsAffected > 0) {
|
||||||
|
Logger.info("Deleted $rowsAffected row(s) from queue_paging with index $index" as Any)
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
Logger.warn("No rows deleted from queue_paging with index $index" as Any)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error deleting from queue_paging with index $index: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all entries from the queue_paging in the database.
|
||||||
|
*/
|
||||||
|
fun Clear_Queue_Paging(){
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
// use TRUNCATE to reset auto increment index
|
||||||
|
statement?.executeUpdate("TRUNCATE TABLE queue_paging")
|
||||||
|
Logger.info("Queue paging table cleared" as Any)
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error clearing queue paging table: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get All Broadcast Zones from database
|
||||||
|
* @return A list of BroadcastZones entries.
|
||||||
|
*/
|
||||||
|
fun GetBroadcastZones(): List<BroadcastZones> {
|
||||||
|
val zonesList = ArrayList<BroadcastZones>()
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
val resultSet = statement?.executeQuery("SELECT * FROM broadcast_zones")
|
||||||
|
while (resultSet?.next() == true) {
|
||||||
|
val zone = BroadcastZones(
|
||||||
|
resultSet.getLong("index").toUInt(),
|
||||||
|
resultSet.getString("description"),
|
||||||
|
resultSet.getString("SoundChannel"),
|
||||||
|
resultSet.getString("Box"),
|
||||||
|
resultSet.getString("Relay")
|
||||||
|
)
|
||||||
|
zonesList.add(zone)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error fetching broadcast zones: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return zonesList
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a broadcast_zones entry by its index.
|
||||||
|
* @param index The index of the broadcast_zones entry to delete.
|
||||||
|
* @return True if the deletion was successful, false otherwise.
|
||||||
|
*/
|
||||||
|
fun Delete_BroadcastZones_by_index(index: UInt) : Boolean {
|
||||||
|
try {
|
||||||
|
val statement = connection?.prepareStatement("DELETE FROM broadcast_zones WHERE `index` = ?")
|
||||||
|
statement?.setLong(1, index.toLong())
|
||||||
|
val rowsAffected = statement?.executeUpdate()
|
||||||
|
if (rowsAffected != null && rowsAffected > 0) {
|
||||||
|
Logger.info("Deleted $rowsAffected row(s) from broadcast_zones with index $index" as Any)
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
Logger.warn("No rows deleted from broadcast_zones with index $index" as Any)
|
||||||
|
}
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error deleting from broadcast_zones with index $index: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all entries from the broadcast_zones in the database.
|
||||||
|
*/
|
||||||
|
fun Clear_BroadcastZones() {
|
||||||
|
try {
|
||||||
|
val statement = connection?.createStatement()
|
||||||
|
// use TRUNCATE to reset auto increment index
|
||||||
|
statement?.executeUpdate("TRUNCATE TABLE broadcast_zones")
|
||||||
|
Logger.info("Broadcast zones table cleared" as Any)
|
||||||
|
} catch (e : Exception) {
|
||||||
|
Logger.error("Error clearing broadcast zones table: ${e.message}" as Any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user