From dc710e2cabb4c7bc4967dc681a0472851989cc84 Mon Sep 17 00:00:00 2001 From: NovaFox161 Date: Fri, 19 Nov 2021 17:20:45 -0600 Subject: [PATCH] This should fix wizards not auto clearing after timeout --- .../discal/core/object/Wizard.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/src/main/kotlin/org/dreamexposure/discal/core/object/Wizard.kt b/core/src/main/kotlin/org/dreamexposure/discal/core/object/Wizard.kt index c5f4d68d..bda50040 100644 --- a/core/src/main/kotlin/org/dreamexposure/discal/core/object/Wizard.kt +++ b/core/src/main/kotlin/org/dreamexposure/discal/core/object/Wizard.kt @@ -1,12 +1,21 @@ package org.dreamexposure.discal.core.`object` import discord4j.common.util.Snowflake +import reactor.core.publisher.Flux +import java.time.Duration import java.time.Instant +import java.time.temporal.ChronoUnit import java.util.concurrent.ConcurrentHashMap class Wizard { private val active = ConcurrentHashMap() + init { + Flux.interval(Duration.ofMinutes(30)) + .map { removeOld() } + .subscribe() + } + fun get(id: Snowflake): T? { val p = active[id] if (p != null) p.lastEdit = Instant.now() @@ -16,4 +25,15 @@ class Wizard { fun start(pre: T): T? = active.put(pre.guildId, pre) fun remove(id: Snowflake): T? = active.remove(id) + + private fun removeOld() { + val toRemove = mutableListOf() + + active.forEach { + if (Instant.now().isAfter(it.value.lastEdit.plus(30, ChronoUnit.MINUTES))) { + toRemove.add(it.key) + } + } + toRemove.forEach { active.remove(it) } + } }