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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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 UserAway -> handleAway(client, event)
  13. is UserQuit -> handleQuit(client, event)
  14. is UserNickChanged -> handleNickChanged(client, event)
  15. }
  16. }.toList()
  17. private suspend fun SequenceScope<IrcEvent>.handleQuit(client: IrcClient, event: UserQuit) {
  18. client.channelState.forEach {
  19. if (it.users.contains(event.user.nickname)) {
  20. yield(ChannelQuit(event.metadata, event.user, it.name, event.reason))
  21. }
  22. }
  23. }
  24. private suspend fun SequenceScope<IrcEvent>.handleAway(client: IrcClient, event: UserAway) {
  25. client.channelState.forEach {
  26. if (it.users.contains(event.user.nickname)) {
  27. yield(ChannelAway(event.metadata, event.user, it.name, event.message))
  28. }
  29. }
  30. }
  31. private suspend fun SequenceScope<IrcEvent>.handleNickChanged(client: IrcClient, event: UserNickChanged) {
  32. client.channelState.forEach {
  33. it.users[event.user.nickname]?.let { chanUser ->
  34. chanUser.nickname = event.newNick
  35. yield(ChannelNickChanged(event.metadata, event.user, it.name, event.newNick))
  36. }
  37. }
  38. }
  39. }