refactor: switch from metro to koin

Honestly metro looks too overcomplicated and I still don't know how to
use it properly. Switching to koin for now as I'm more comfortable with
it.
This commit is contained in:
Cilly Leang 2026-02-01 00:50:57 +11:00
parent 53abaccd21
commit 2725342c3f
Signed by: cilly
GPG key ID: 6500251E087653C9
23 changed files with 165 additions and 199 deletions

View file

@ -2,12 +2,7 @@ package moe.lava.neon.core
import com.russhwolf.settings.Settings
import com.russhwolf.settings.nullableString
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
@SingleIn(AppScope::class)
@Inject
class AppSettings {
private val settings = Settings()

View file

@ -1,9 +1,6 @@
package moe.lava.neon.core.api
import co.touchlab.kermit.Logger
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.plugins.HttpSend
@ -23,8 +20,6 @@ import kotlinx.serialization.json.JsonNamingStrategy
import moe.lava.neon.core.api.captcha.CaptchaRequest
import moe.lava.neon.core.api.captcha.CaptchaResponse
@SingleIn(AppScope::class)
@Inject
class ApiClient {
private val logger = Logger.withTag("neon.core.api/client")

View file

@ -1,21 +1,19 @@
package moe.lava.neon.core.api.gateway
import co.touchlab.kermit.Logger
import dev.zacsweers.metro.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.serialization.ExperimentalSerializationApi
import moe.lava.neon.core.di.EventHandlerGraph
import moe.lava.neon.core.api.gateway.handlers.EventHandlers
import moe.lava.neon.core.repository.AuthRepository
import kotlin.math.pow
import kotlin.time.Duration.Companion.seconds
@Inject
class GatewayHandler(
private val auth: AuthRepository,
private val handlers: EventHandlerGraph,
private val eventHandlers: EventHandlers,
) {
private val logger = Logger.withTag("neon.core.api.gateway/handler")
private val scope = CoroutineScope(Dispatchers.IO)
@ -35,7 +33,7 @@ class GatewayHandler(
session = GatewaySession.start(
token = token,
eventHandlers = handlers,
eventHandlers = eventHandlers,
resumeProps = resumeProps,
onSuccess = {
logger.d { "Successful session start" }

View file

@ -24,7 +24,7 @@ import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import moe.lava.neon.core.api.ApiConstants
import moe.lava.neon.core.api.ApiConstants.json
import moe.lava.neon.core.di.EventHandlerGraph
import moe.lava.neon.core.api.gateway.handlers.EventHandlers
import kotlin.random.Random
import kotlin.time.Duration.Companion.milliseconds
@ -33,7 +33,7 @@ private val logger = Logger.withTag("neon.core.api.gateway/session")
class GatewaySession private constructor(
private var ws: DefaultClientWebSocketSession,
private val token: String,
private val handlers: EventHandlerGraph,
private val handlers: EventHandlers,
private val scope: CoroutineScope,
private var resumeProps: ResumeProperties?,
private val onDestroy: (GatewayCloseReason, ResumeProperties?) -> Unit,
@ -46,7 +46,7 @@ class GatewaySession private constructor(
companion object {
suspend fun start(
token: String,
eventHandlers: EventHandlerGraph,
eventHandlers: EventHandlers,
client: HttpClient = HttpClient {
install(HttpCookies)
install(WebSockets)

View file

@ -3,3 +3,7 @@ package moe.lava.neon.core.api.gateway.handlers
import moe.lava.neon.core.api.gateway.Event
sealed interface Handler<T: Event.Incoming>
class EventHandlers(
val ready: ReadyHandler
)

View file

@ -1,13 +1,11 @@
package moe.lava.neon.core.api.gateway.handlers
import co.touchlab.kermit.Logger
import dev.zacsweers.metro.Inject
import moe.lava.neon.core.api.gateway.Event
import moe.lava.neon.core.api.gateway.ResumeProperties
private val logger = Logger.withTag("neon.core.api.events/ready")
@Inject
class ReadyHandler : Handler<Event.Ready> {
fun handle(event: Event.Ready, updateResumeProps: (ResumeProperties) -> Unit) {
logger.i { "Received payload $event" }

View file

@ -1,18 +0,0 @@
package moe.lava.neon.core.di
import dev.zacsweers.metro.GraphExtension
import moe.lava.neon.core.AppSettings
import moe.lava.neon.core.api.ApiClient
import moe.lava.neon.core.repository.AuthRepository
import moe.lava.neon.core.repository.UserRepository
@GraphExtension
interface AppGraph {
val api: ApiClient
val settings: AppSettings
val auth: AuthRepository
val users: UserRepository
val gatewayHandlers: EventHandlerGraph
}

View file

@ -0,0 +1,24 @@
package moe.lava.neon.core.di
import moe.lava.neon.core.AppSettings
import moe.lava.neon.core.api.ApiClient
import moe.lava.neon.core.api.gateway.GatewayHandler
import moe.lava.neon.core.api.gateway.handlers.EventHandlers
import moe.lava.neon.core.api.gateway.handlers.ReadyHandler
import moe.lava.neon.core.repository.AuthRepository
import moe.lava.neon.core.repository.UserRepository
import org.koin.dsl.module
import org.koin.plugin.module.dsl.single
val coreModule = module {
single<ApiClient>()
single<AppSettings>()
single<AuthRepository>()
single<UserRepository>()
single<GatewayHandler>()
single<ReadyHandler>()
single<EventHandlers>()
}

View file

@ -1,12 +0,0 @@
package moe.lava.neon.core.di
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesTo
import dev.zacsweers.metro.GraphExtension
import moe.lava.neon.core.api.gateway.handlers.ReadyHandler
@GraphExtension
@ContributesTo(AppScope::class)
interface EventHandlerGraph {
val ready: ReadyHandler
}

View file

@ -1,9 +1,6 @@
package moe.lava.neon.core.repository
import co.touchlab.kermit.Logger
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.header
@ -46,8 +43,6 @@ sealed class AuthResponse {
// data class MFARequested() : AuthResponse()
}
@Inject
@SingleIn(AppScope::class)
class AuthRepository(
private val settings: AppSettings,
private val api: ApiClient,

View file

@ -1,10 +1,4 @@
package moe.lava.neon.core.repository
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
@Inject
@SingleIn(AppScope::class)
class UserRepository {
}