InactivityHandler.kt
package de.pflugradts.passbird.application.process.inactivity
import de.pflugradts.passbird.application.commandhandling.CommandBus
import de.pflugradts.passbird.application.commandhandling.command.QuitCommand
import de.pflugradts.passbird.application.commandhandling.command.QuitReason.INACTIVITY
import de.pflugradts.passbird.application.configuration.ReadableConfiguration
import de.pflugradts.passbird.application.util.SystemOperation
import java.util.concurrent.atomic.AtomicLong
class InactivityHandler constructor(
private val commandBus: CommandBus,
private val configuration: ReadableConfiguration,
private val inactivityTerminationSignal: InactivityTerminationSignal,
private val systemOperation: SystemOperation,
) {
private val inactivityLimitInMinutes get() = configuration.application.inactivityLimit.limitInMinutes
private val lastInteraction = AtomicLong(now())
private fun now() = systemOperation.clock.instant().epochSecond
fun registerInteraction() = lastInteraction.set(now())
fun checkInactivity() = run {
if ((now() - lastInteraction.get()) > (inactivityLimitInMinutes * 60)) {
inactivityTerminationSignal.request()
}
}
fun handlePendingTermination() {
if (inactivityTerminationSignal.consume()) {
commandBus.post(QuitCommand(quitReason = INACTIVITY))
}
}
}