123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- package com.dmdirc.ktirc.events
-
- import com.dmdirc.ktirc.IrcClient
- import com.dmdirc.ktirc.model.ChannelState
- import com.dmdirc.ktirc.model.ChannelUser
- import com.dmdirc.ktirc.model.ServerFeature
- import com.dmdirc.ktirc.util.logger
-
- class ChannelStateHandler : EventHandler {
-
- private val log by logger()
-
- override suspend fun processEvent(client: IrcClient, event: IrcEvent) {
- when (event) {
- is ChannelJoined -> handleJoin(client, event)
- is ChannelNamesReceived -> handleNamesReceived(client, event)
- is ChannelNamesFinished -> handleNamesFinished(client, event)
- }
- }
-
- private fun handleJoin(client: IrcClient, event: ChannelJoined) {
- if (client.isLocalUser(event.user)) {
- log.info { "Joined new channel: ${event.channel}" }
- client.channelState += ChannelState(event.channel) { client.caseMapping }
- }
-
- client.channelState[event.channel]?.let { it.users += ChannelUser(event.user.nickname) }
- }
-
- private fun handleNamesReceived(client: IrcClient, event: ChannelNamesReceived) {
- val channel = client.channelState[event.channel] ?: return
-
- if (!channel.receivingUserList) {
- log.finer { "Started receiving names list for ${channel.name}" }
- channel.users.clear()
- channel.receivingUserList = true
- }
-
- val modePrefixes = client.serverState.features[ServerFeature.ModePrefixes]!!
- for (user in event.names) {
- user.takeWhile { modePrefixes.isPrefix(it) }.let { prefix ->
- channel.users += ChannelUser(user.substring(prefix.length), modePrefixes.getModes(prefix))
- }
- }
- }
-
- private fun handleNamesFinished(client: IrcClient, event: ChannelNamesFinished) {
- client.channelState[event.channel]?.let {
- it.receivingUserList = false
- log.finest { "Finished receiving names in ${event.channel}. Users: ${it.users.toList()}" }
- }
- }
-
- }
|