
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