All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.freya02.botcommands.internal.parameters.resolvers.localization.LocalizationContextResolverFactories.kt Maven / Gradle / Ivy

package com.freya02.botcommands.internal.parameters.resolvers.localization

import com.freya02.botcommands.api.core.service.annotations.ResolverFactory
import com.freya02.botcommands.api.localization.annotations.LocalizationBundle
import com.freya02.botcommands.api.localization.context.AppLocalizationContext
import com.freya02.botcommands.api.localization.context.TextLocalizationContext
import com.freya02.botcommands.api.parameters.ParameterResolverFactory
import com.freya02.botcommands.api.parameters.ParameterWrapper
import com.freya02.botcommands.internal.*
import com.freya02.botcommands.internal.localization.LocalizationContextImpl
import com.freya02.botcommands.internal.parameters.resolvers.localization.LocalizationContextResolverFactories.getBaseLocalizationContext
import com.freya02.botcommands.internal.utils.ReflectionUtils.function
import net.dv8tion.jda.api.events.message.MessageReceivedEvent
import net.dv8tion.jda.api.interactions.Interaction
import kotlin.reflect.KClass
import kotlin.reflect.full.findAnnotation
import kotlin.reflect.full.valueParameters
import kotlin.reflect.jvm.jvmErasure

@ResolverFactory
internal class AppLocalizationContextResolverFactory : ParameterResolverFactory(
    AppLocalizationContextResolver::class,
    AppLocalizationContext::class
) {
    override fun get(parameter: ParameterWrapper) =
        AppLocalizationContextResolver(getBaseLocalizationContext(
            parameter, Interaction::class
        ))
}

@ResolverFactory
internal class TextLocalizationContextResolverFactory : ParameterResolverFactory(
    TextLocalizationContextResolver::class.java,
    TextLocalizationContext::class.java
) {
    override fun get(parameter: ParameterWrapper) =
        TextLocalizationContextResolver(getBaseLocalizationContext(
            parameter, Interaction::class, MessageReceivedEvent::class
        ))
}

internal object LocalizationContextResolverFactories {
    fun getBaseLocalizationContext(parameterWrapper: ParameterWrapper, vararg requiredEventTypes: KClass<*>): LocalizationContextImpl {
        val parameter = parameterWrapper.parameter ?: throwInternal("Tried to get localization context on a null parameter")
        val parameterFunction = parameter.function
        val annotation = parameter.findAnnotation()
            ?: throwUser(parameterFunction, "${parameter.type.jvmErasure.simpleName} parameters must be annotated with @${LocalizationBundle::class.simpleName}")

        val firstParamErasure = parameterFunction.valueParameters.first().type.jvmErasure
        requireUser(firstParamErasure.isSubclassOfAny(*requiredEventTypes), parameterFunction) {
            "${parameter.type.jvmErasure.simpleName} parameters only works with ${requiredEventTypes.joinToString(" or ")} as the first parameter"
        }

        return LocalizationContextImpl(
            localizationBundle = annotation.value,
            localizationPrefix = annotation.prefix.nullIfEmpty(),
            guildLocale = null,
            userLocale = null
        )
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy