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.2KB

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