Mirror of github.com/gissleh/irc
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.

157 lines
3.3 KiB

6 years ago
6 years ago
  1. package irc
  2. import (
  3. "strings"
  4. "github.com/gissleh/irc/list"
  5. )
  6. // A Channel is a target that manages the userlist
  7. type Channel struct {
  8. id string
  9. name string
  10. userlist *list.List
  11. parted bool
  12. }
  13. // ID returns a unique ID for the channel target.
  14. func (channel *Channel) ID() string {
  15. return channel.id
  16. }
  17. // Kind returns "channel"
  18. func (channel *Channel) Kind() string {
  19. return "channel"
  20. }
  21. // Name gets the channel name
  22. func (channel *Channel) Name() string {
  23. return channel.name
  24. }
  25. func (channel *Channel) State() ClientStateTarget {
  26. return ClientStateTarget{
  27. Kind: "channel",
  28. Name: channel.name,
  29. Users: channel.userlist.Users(),
  30. }
  31. }
  32. // UserList gets the channel userlist
  33. func (channel *Channel) UserList() list.Immutable {
  34. return channel.userlist.Immutable()
  35. }
  36. // Parted returnes whether the channel has been parted
  37. func (channel *Channel) Parted() bool {
  38. return channel.parted
  39. }
  40. // AddHandler handles messages routed to this channel by the client's event loop
  41. func (channel *Channel) Handle(event *Event, client *Client) {
  42. switch event.Name() {
  43. case "packet.join":
  44. {
  45. // Support extended-join
  46. account := ""
  47. if accountArg := event.Arg(1); accountArg != "" && accountArg != "*" {
  48. account = accountArg
  49. }
  50. channel.userlist.Insert(list.User{
  51. Nick: event.Nick,
  52. User: event.User,
  53. Host: event.Host,
  54. Account: account,
  55. })
  56. }
  57. case "packet.part", "packet.quit":
  58. {
  59. channel.userlist.Remove(event.Nick)
  60. }
  61. case "packet.kick":
  62. {
  63. channel.userlist.Remove(event.Arg(1))
  64. }
  65. case "packet.nick":
  66. {
  67. channel.userlist.Rename(event.Nick, event.Arg(0))
  68. }
  69. case "packet.account":
  70. {
  71. newAccount := event.Arg(0)
  72. if newAccount != "*" && newAccount != "" {
  73. channel.userlist.Patch(event.Nick, list.UserPatch{Account: newAccount})
  74. } else {
  75. channel.userlist.Patch(event.Nick, list.UserPatch{ClearAccount: true})
  76. }
  77. }
  78. case "packet.away":
  79. {
  80. if event.Text != "" {
  81. channel.userlist.Patch(event.Nick, list.UserPatch{Away: event.Text})
  82. } else {
  83. channel.userlist.Patch(event.Nick, list.UserPatch{ClearAway: true})
  84. }
  85. }
  86. case "packet.chghost":
  87. {
  88. newUser := event.Arg(0)
  89. newHost := event.Arg(1)
  90. channel.userlist.Patch(event.Nick, list.UserPatch{User: newUser, Host: newHost})
  91. }
  92. case "packet.353": // NAMES
  93. {
  94. channel.userlist.SetAutoSort(false)
  95. tokens := strings.Split(event.Text, " ")
  96. for _, token := range tokens {
  97. channel.userlist.InsertFromNamesToken(token)
  98. }
  99. }
  100. case "packet.366": // End of NAMES
  101. {
  102. channel.userlist.SetAutoSort(true)
  103. }
  104. case "packet.mode":
  105. {
  106. isupport := client.ISupport()
  107. plus := false
  108. argIndex := 2
  109. for _, ch := range event.Arg(1) {
  110. if ch == '+' {
  111. plus = true
  112. continue
  113. }
  114. if ch == '-' {
  115. plus = false
  116. continue
  117. }
  118. arg := ""
  119. if isupport.ModeTakesArgument(ch, plus) {
  120. arg = event.Arg(argIndex)
  121. argIndex++
  122. }
  123. if isupport.IsPermissionMode(ch) {
  124. if plus {
  125. channel.userlist.AddMode(arg, ch)
  126. } else {
  127. channel.userlist.RemoveMode(arg, ch)
  128. }
  129. } else {
  130. // TODO: track non-permission modes
  131. }
  132. }
  133. }
  134. case "packet.privmsg", "ctcp.action":
  135. {
  136. if accountTag, ok := event.Tags["account"]; ok && accountTag != "" {
  137. channel.userlist.Patch(event.Nick, list.UserPatch{Account: accountTag})
  138. }
  139. }
  140. }
  141. }