diff --git a/src/main/kotlin/com/shr4pnel/ferretirc/irc/Server.kt b/src/main/kotlin/com/shr4pnel/ferretirc/irc/Server.kt index c277744..6f7080e 100644 --- a/src/main/kotlin/com/shr4pnel/ferretirc/irc/Server.kt +++ b/src/main/kotlin/com/shr4pnel/ferretirc/irc/Server.kt @@ -6,10 +6,15 @@ import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.slf4j.logger import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterIsInstance +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onSubscription import kotlinx.coroutines.flow.takeWhile import org.slf4j.helpers.NOPLogger +import kotlin.reflect.KClass +import kotlin.reflect.cast class Server( private val msgBuffer: SharedFlow, @@ -24,10 +29,11 @@ class Server( var channels: Set = setOf() private set + val users = mutableListOf() + suspend fun fetchChannels(): Set { logger.debug { "Fetching IRC channels" } val buffer = mutableSetOf() - msgBuffer .onSubscription { outgoingMessages.send(ClientMessage.List()) } .filterIsInstance() @@ -40,4 +46,15 @@ class Server( fun fetchFeatures() { } + + suspend fun waitForNext( + kClass: KClass, + predicate: (T) -> Boolean = { true }, + onSuscribedLambda: suspend () -> Unit = {}, + ): T = + msgBuffer + .onSubscription { onSuscribedLambda() } + .filter { kClass.isInstance(it) } + .map { kClass.cast(it) } + .first(predicate) } diff --git a/src/main/kotlin/com/shr4pnel/ferretirc/net/MessageReader.kt b/src/main/kotlin/com/shr4pnel/ferretirc/net/MessageReader.kt index 263efab..c0b87f4 100644 --- a/src/main/kotlin/com/shr4pnel/ferretirc/net/MessageReader.kt +++ b/src/main/kotlin/com/shr4pnel/ferretirc/net/MessageReader.kt @@ -11,13 +11,8 @@ import io.ktor.utils.io.readLineStrict import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.slf4j.helpers.NOPLogger -import kotlin.reflect.KClass -import kotlin.reflect.cast class MessageReader(socket: Socket, scope: CoroutineScope, enableLogging: Boolean = false) : MessageIO(socket, scope) { private lateinit var receive: ByteReadChannel @@ -45,16 +40,4 @@ class MessageReader(socket: Socket, scope: CoroutineScope, enableLogging: Boolea } } } - - suspend fun waitForNext( - kClass: KClass, - predicate: (T) -> Boolean = { true }, - ): T { - return messageBuffer - .filter { - kClass.isInstance(it) - }.map { - kClass.cast(it) - }.first(predicate) - } }