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.

ChannelFanOutMutator.kt 1.3KB

12345678910111213141516171819202122232425262728293031323334353637
  1. package com.dmdirc.ktirc.events.mutators
  2. import com.dmdirc.ktirc.IrcClient
  3. import com.dmdirc.ktirc.events.*
  4. import com.dmdirc.ktirc.io.MessageEmitter
  5. /**
  6. * "Fans out" global events such as quits and nick changes to each channel a user is in.
  7. */
  8. internal class ChannelFanOutMutator : EventMutator {
  9. override fun mutateEvent(client: IrcClient, messageEmitter: MessageEmitter, event: IrcEvent) = sequence<IrcEvent> {
  10. yield(event)
  11. when (event) {
  12. is UserQuit -> handleQuit(client, event)
  13. is UserNickChanged -> handleNickChanged(client, event)
  14. }
  15. }.toList()
  16. private suspend fun SequenceScope<IrcEvent>.handleQuit(client: IrcClient, event: UserQuit) {
  17. client.channelState.forEach {
  18. if (it.users.contains(event.user.nickname)) {
  19. yield(ChannelQuit(event.metadata, event.user, it.name, event.reason))
  20. }
  21. }
  22. }
  23. private suspend fun SequenceScope<IrcEvent>.handleNickChanged(client: IrcClient, event: UserNickChanged) {
  24. client.channelState.forEach {
  25. it.users[event.user.nickname]?.let { chanUser ->
  26. chanUser.nickname = event.newNick
  27. yield(ChannelNickChanged(event.metadata, event.user, it.name, event.newNick))
  28. }
  29. }
  30. }
  31. }