1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- package com.dmdirc.ktirc.events.mutators
-
- import com.dmdirc.ktirc.IrcClient
- import com.dmdirc.ktirc.events.*
- import com.dmdirc.ktirc.io.MessageEmitter
-
- /**
- * "Fans out" global events such as quits and nick changes to each channel a user is in.
- */
- internal class ChannelFanOutMutator : EventMutator {
-
- override fun mutateEvent(client: IrcClient, messageEmitter: MessageEmitter, event: IrcEvent) = sequence<IrcEvent> {
- yield(event)
- when (event) {
- is UserAway -> handleAway(client, event)
- is UserQuit -> handleQuit(client, event)
- is UserNickChanged -> handleNickChanged(client, event)
- }
- }.toList()
-
-
- private suspend fun SequenceScope<IrcEvent>.handleQuit(client: IrcClient, event: UserQuit) {
- client.channelState.forEach {
- if (it.users.contains(event.user.nickname)) {
- yield(ChannelQuit(event.metadata, event.user, it.name, event.reason))
- }
- }
- }
-
- private suspend fun SequenceScope<IrcEvent>.handleAway(client: IrcClient, event: UserAway) {
- client.channelState.forEach {
- if (it.users.contains(event.user.nickname)) {
- yield(ChannelAway(event.metadata, event.user, it.name, event.message))
- }
- }
- }
-
- private suspend fun SequenceScope<IrcEvent>.handleNickChanged(client: IrcClient, event: UserNickChanged) {
- client.channelState.forEach {
- it.users[event.user.nickname]?.let { chanUser ->
- chanUser.nickname = event.newNick
- yield(ChannelNickChanged(event.metadata, event.user, it.name, event.newNick))
- }
- }
- }
-
- }
|