commit 24/09/2025

This commit is contained in:
2025-09-24 16:03:07 +07:00
parent 55f6a24cce
commit 1fcf64fd99
5 changed files with 269 additions and 30 deletions

View File

@@ -1,12 +1,18 @@
import audio.AudioPlayer
import barix.BarixConnection
import barix.TCP_Barix_Command_Server
import codes.Somecodes.Companion.Get_ANN_ID
import codes.Somecodes.Companion.ValidFile
import codes.Somecodes.Companion.dateformat1
import codes.Somecodes.Companion.timeformat2
import com.sun.jna.Platform
import content.ContentCache
import content.Language
import content.ScheduleDay
import content.VoiceType
import database.MariaDB
import database.Messagebank
import database.QueuePaging
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
@@ -34,25 +40,118 @@ fun main() {
audioPlayer.InitAudio(1)
val content = ContentCache()
val db = MariaDB()
// Coroutine untuk cek Paging Queue dan AAS Queue setiap detik
CoroutineScope(Dispatchers.Default).launch {
while (isActive) {
/**
* Fungsi untuk cek apakah semua broadcast zone valid
* @param bz List of broadcast zone (SoundChannel)
* @return true jika semua valid, false jika ada yang tidak valid
*/
fun AllBroadcastZonesValid(bz: List<String>): Boolean {
if (bz.isNotEmpty()){
val validchannels = bz
// check apakah tiap zone ada di database broadcast zones
.filter {
z1 -> db.BroadcastZoneList.find { z2 -> z2.SoundChannel==z1 } != null
}
// check apakah tiap zone ada di SoundChannelList dan Online
.filter {
z3 -> StreamerOutputs.any { sc -> sc.value.channel==z3 && sc.value.isOnline() }
}
// kalau jumlah valid channel sama dengan jumlah broadcast zone, berarti semua valid
return validchannels.size==bz.size
}
return false
}
/**
* Fungsi untuk cek apakah semua broadcast zone idle
* @param bz List of broadcast zone (SoundChannel)
* @return true jika semua idle, false jika ada yang tidak idle
*/
fun AllBroadcastZoneIdle(bz: List<String>): Boolean {
if (bz.isNotEmpty()){
return bz.all {
z1 -> StreamerOutputs.any { sc -> sc.value.channel==z1 && sc.value.isIdle() }
}
}
return false
}
// dipakai untuk ambil messagebank berdasarkan id
val urutan_bahasa = listOf(
Language.INDONESIA.name,
Language.LOCAL.name,
Language.ENGLISH.name,
Language.CHINESE.name,
Language.JAPANESE.name,
Language.ARABIC.name
)
// dipakai untuk pilih voice type, bisa diganti via web nanti
var selected_voice = VoiceType.VOICE_1.name
/**
* Fungsi untuk ambil messagebank berdasarkan ANN_ID, diurutkan berdasarkan urutan bahasa di urutan_bahasa
* @param id ANN_ID dari messagebank
* @return List of Messagebank
*/
fun Get_MessageBank_by_id(id: Int) : ArrayList<Messagebank>{
val mb_list = ArrayList<Messagebank>()
urutan_bahasa.forEach {
lang -> db.MessagebankList.find { mb -> mb.ANN_ID==id.toUInt() && mb.Language==lang && mb.Voice_Type==selected_voice }?.let {
mb_list.add(it)
}
}
return mb_list
}
jobloop@ while (isActive) {
delay(1000)
// baca dulu queue paging, prioritas 1
db.Read_Queue_Paging().forEach {
// cek apakah queue paging ada broadcast zone nya
if (it.BroadcastZones.isNotBlank()) {
// prioritas 1 , habisin queue paging
for(it in db.Read_Queue_Paging()){
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 -> db.BroadcastZoneList.any { bz -> bz.equals(z) } }) {
// semua target broadcast zone valid, sekarang cek apakah semua target broadcast zone idle
if (AllBroadcastZonesValid(zz)){
if (AllBroadcastZoneIdle(zz)){
if (it.Source=="PAGING"){
// nama file ada di Message
if (ValidFile(it.Message)){
val afi = audioPlayer.LoadAudioFile(it.Message)
zz.forEach {
z1 -> StreamerOutputs.values.find { it.channel==z1 }?.SendData(afi.bytes, {db.Add_Log("AAS", it) }, {db.Add_Log("AAS", it)} )
}
val logmessage = "Broadcast started PAGING with Filename '${it.Message}' to zones: ${it.BroadcastZones}"
Logger.info { logmessage}
db.Add_Log("AAS", logmessage)
db.Delete_Queue_Paging_by_index(it.index)
continue@jobloop
} else {
// file tidak valid, delete from queue paging
db.Delete_Queue_Paging_by_index(it.index)
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to invalid audio file" )
}
} else if (it.Source=="SHALAT"){
val ann_id = Get_ANN_ID(it.Message)
if (ann_id>0){
Get_MessageBank_by_id(ann_id).forEach {
}
} else{
// invalid ann_id, delete from queue paging
db.Delete_Queue_Paging_by_index(it.index)
db.Add_Log("AAS", "Cancelled Shalat message with index ${it.index} due to invalid ANN_ID" )
}
}
}
} else {
// ada broadcast zone yang tidak valid, delete from queue paging
db.Delete_Queue_Paging_by_index(it.index)
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to invalid broadcast zone"
)
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to invalid broadcast zone" )
}
} else {
// invalid broadcast zone, delete from queue paging
@@ -60,19 +159,25 @@ fun main() {
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()) {
val zz = it.BroadcastZones.split(";")
// cek apakah semua target broadcast zone dari queue table ada di dalam database broadcast zones
if (zz.all { z -> db.BroadcastZoneList.any { bz -> bz.equals(z) } }) {
// semua target broadcast zone valid, sekarang cek apakah semua target broadcast zone idle
// prioritas 2, habisin queue table
db.Read_Queue_Table().forEach {
if (it.BroadcastZones.isNotEmpty()){
val zz = it.BroadcastZones.split(";")
if (AllBroadcastZonesValid(zz)){
if (AllBroadcastZoneIdle(zz)){
if (it.Type=="SOUNDBANK"){
} else if (it.Type=="TIMER"){
}
}
} else {
// ada broadcast zone yang tidak valid, delete from queue table
db.Delete_Queue_Table_by_index(it.index)
db.Add_Log("AAS", "Cancelled table message with index ${it.index} due to invalid broadcast zone"
)
db.Add_Log("AAS", "Cancelled table message with index ${it.index} due to invalid broadcast zone")
}
} else {
// invalid broadcast zone, delete from queue table
@@ -80,6 +185,7 @@ fun main() {
db.Add_Log("AAS", "Cancelled table message with index ${it.index} due to empty broadcast zone")
}
}
}
}