You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ServerState.kt 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package com.dmdirc.ktirc.model
  2. import com.dmdirc.ktirc.io.CaseMapping
  3. import kotlin.reflect.KClass
  4. class ServerState(initialNickname: String) {
  5. var localNickname: String = initialNickname
  6. val features = ServerFeatureMap()
  7. }
  8. class ServerFeatureMap {
  9. private val features = HashMap<ServerFeature<*>, Any?>()
  10. @Suppress("UNCHECKED_CAST")
  11. operator fun <T : Any> get(feature: ServerFeature<T>) = features.getOrDefault(feature, feature.default) as? T? ?: feature.default
  12. operator fun set(feature: ServerFeature<*>, value: Any) {
  13. require(feature.type.isInstance(value))
  14. features[feature] = value
  15. }
  16. fun setAll(featureMap: ServerFeatureMap) = featureMap.features.forEach { feature, value -> features[feature] = value }
  17. fun reset(feature: ServerFeature<*>) = features.put(feature, null)
  18. }
  19. data class ModePrefixMapping(val modes: String, val prefixes: String) {
  20. fun isPrefix(char: Char) = prefixes.contains(char)
  21. fun getMode(prefix: Char) = modes[prefixes.indexOf(prefix)]
  22. fun getModes(prefixes: String) = String(prefixes.map(this::getMode).toCharArray())
  23. }
  24. sealed class ServerFeature<T : Any>(val name: String, val type: KClass<T>, val default: T? = null) {
  25. object ServerCaseMapping : ServerFeature<CaseMapping>("CASEMAPPING", CaseMapping::class, CaseMapping.Rfc)
  26. object ModePrefixes : ServerFeature<ModePrefixMapping>("PREFIX", ModePrefixMapping::class, ModePrefixMapping("ov", "@+"))
  27. object MaximumChannels : ServerFeature<Int>("CHANLIMIT", Int::class)
  28. object ChannelModes : ServerFeature<String>("CHANMODES", String::class)
  29. object MaximumChannelNameLength : ServerFeature<Int>("CHANNELLEN", Int::class, 200)
  30. object WhoxSupport : ServerFeature<Boolean>("WHOX", Boolean::class, false)
  31. }
  32. val serverFeatures: Map<String, ServerFeature<*>> by lazy {
  33. ServerFeature::class.nestedClasses.map { it.objectInstance as ServerFeature<*> }.associateBy { it.name }
  34. }