Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // Copyright (c) 2012-2014 Jeremy Latt
  2. // Copyright (c) 2014-2015 Edmund Huber
  3. // Copyright (c) 2016 Daniel Oaks <daniel@danieloaks.net>
  4. // released under the MIT license
  5. package irc
  6. import (
  7. "fmt"
  8. "strings"
  9. "sync"
  10. )
  11. // ChannelNameMap is a map that converts channel names to actual channel objects.
  12. type ChannelNameMap struct {
  13. ChansLock sync.RWMutex
  14. Chans map[string]*Channel
  15. }
  16. // NewChannelNameMap returns a new ChannelNameMap.
  17. func NewChannelNameMap() *ChannelNameMap {
  18. var channels ChannelNameMap
  19. channels.Chans = make(map[string]*Channel)
  20. return &channels
  21. }
  22. // Get returns the given channel if it exists.
  23. func (channels *ChannelNameMap) Get(name string) *Channel {
  24. name, err := CasefoldChannel(name)
  25. if err == nil {
  26. channels.ChansLock.RLock()
  27. defer channels.ChansLock.RUnlock()
  28. return channels.Chans[name]
  29. }
  30. return nil
  31. }
  32. // Add adds the given channel to our map.
  33. func (channels *ChannelNameMap) Add(channel *Channel) error {
  34. channels.ChansLock.Lock()
  35. defer channels.ChansLock.Unlock()
  36. if channels.Chans[channel.nameCasefolded] != nil {
  37. return fmt.Errorf("%s: already set", channel.name)
  38. }
  39. channels.Chans[channel.nameCasefolded] = channel
  40. return nil
  41. }
  42. // Remove removes the given channel from our map.
  43. func (channels *ChannelNameMap) Remove(channel *Channel) error {
  44. channels.ChansLock.Lock()
  45. defer channels.ChansLock.Unlock()
  46. if channel != channels.Chans[channel.nameCasefolded] {
  47. return fmt.Errorf("%s: mismatch", channel.name)
  48. }
  49. delete(channels.Chans, channel.nameCasefolded)
  50. return nil
  51. }
  52. // Len returns how many channels we have.
  53. func (channels *ChannelNameMap) Len() int {
  54. channels.ChansLock.RLock()
  55. defer channels.ChansLock.RUnlock()
  56. return len(channels.Chans)
  57. }
  58. type ModeSet map[Mode]bool
  59. func (set ModeSet) String() string {
  60. if len(set) == 0 {
  61. return ""
  62. }
  63. strs := make([]string, len(set))
  64. index := 0
  65. for mode := range set {
  66. strs[index] = mode.String()
  67. index++
  68. }
  69. return strings.Join(strs, "")
  70. }
  71. type ClientSet map[*Client]bool
  72. func (clients ClientSet) Add(client *Client) {
  73. clients[client] = true
  74. }
  75. func (clients ClientSet) Remove(client *Client) {
  76. delete(clients, client)
  77. }
  78. func (clients ClientSet) Has(client *Client) bool {
  79. return clients[client]
  80. }
  81. type MemberSet map[*Client]ModeSet
  82. func (members MemberSet) Add(member *Client) {
  83. members[member] = make(ModeSet)
  84. }
  85. func (members MemberSet) Remove(member *Client) {
  86. delete(members, member)
  87. }
  88. func (members MemberSet) Has(member *Client) bool {
  89. _, ok := members[member]
  90. return ok
  91. }
  92. func (members MemberSet) HasMode(member *Client, mode Mode) bool {
  93. modes, ok := members[member]
  94. if !ok {
  95. return false
  96. }
  97. return modes[mode]
  98. }
  99. func (members MemberSet) AnyHasMode(mode Mode) bool {
  100. for _, modes := range members {
  101. if modes[mode] {
  102. return true
  103. }
  104. }
  105. return false
  106. }
  107. type ChannelSet map[*Channel]bool
  108. func (channels ChannelSet) Add(channel *Channel) {
  109. channels[channel] = true
  110. }
  111. func (channels ChannelSet) Remove(channel *Channel) {
  112. delete(channels, channel)
  113. }
  114. func (channels ChannelSet) First() *Channel {
  115. for channel := range channels {
  116. return channel
  117. }
  118. return nil
  119. }