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.

types.go 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Copyright (c) 2012-2014 Jeremy Latt
  2. // Copyright (c) 2014-2015 Edmund Huber
  3. // released under the MIT license
  4. package irc
  5. import (
  6. "fmt"
  7. "strings"
  8. )
  9. //
  10. // simple types
  11. //
  12. type ChannelNameMap map[string]*Channel
  13. func (channels ChannelNameMap) Get(name string) *Channel {
  14. name, err := CasefoldChannel(name)
  15. if err == nil {
  16. return channels[name]
  17. }
  18. return nil
  19. }
  20. func (channels ChannelNameMap) Add(channel *Channel) error {
  21. if channels[channel.nameCasefolded] != nil {
  22. return fmt.Errorf("%s: already set", channel.name)
  23. }
  24. channels[channel.nameCasefolded] = channel
  25. return nil
  26. }
  27. func (channels ChannelNameMap) Remove(channel *Channel) error {
  28. if channel != channels[channel.nameCasefolded] {
  29. return fmt.Errorf("%s: mismatch", channel.name)
  30. }
  31. delete(channels, channel.nameCasefolded)
  32. return nil
  33. }
  34. type ChannelModeSet map[ChannelMode]bool
  35. func (set ChannelModeSet) String() string {
  36. if len(set) == 0 {
  37. return ""
  38. }
  39. strs := make([]string, len(set))
  40. index := 0
  41. for mode := range set {
  42. strs[index] = mode.String()
  43. index += 1
  44. }
  45. return strings.Join(strs, "")
  46. }
  47. type ClientSet map[*Client]bool
  48. func (clients ClientSet) Add(client *Client) {
  49. clients[client] = true
  50. }
  51. func (clients ClientSet) Remove(client *Client) {
  52. delete(clients, client)
  53. }
  54. func (clients ClientSet) Has(client *Client) bool {
  55. return clients[client]
  56. }
  57. type MemberSet map[*Client]ChannelModeSet
  58. func (members MemberSet) Add(member *Client) {
  59. members[member] = make(ChannelModeSet)
  60. }
  61. func (members MemberSet) Remove(member *Client) {
  62. delete(members, member)
  63. }
  64. func (members MemberSet) Has(member *Client) bool {
  65. _, ok := members[member]
  66. return ok
  67. }
  68. func (members MemberSet) HasMode(member *Client, mode ChannelMode) bool {
  69. modes, ok := members[member]
  70. if !ok {
  71. return false
  72. }
  73. return modes[mode]
  74. }
  75. func (members MemberSet) AnyHasMode(mode ChannelMode) bool {
  76. for _, modes := range members {
  77. if modes[mode] {
  78. return true
  79. }
  80. }
  81. return false
  82. }
  83. type ChannelSet map[*Channel]bool
  84. func (channels ChannelSet) Add(channel *Channel) {
  85. channels[channel] = true
  86. }
  87. func (channels ChannelSet) Remove(channel *Channel) {
  88. delete(channels, channel)
  89. }
  90. func (channels ChannelSet) First() *Channel {
  91. for channel := range channels {
  92. return channel
  93. }
  94. return nil
  95. }
  96. //
  97. // interfaces
  98. //
  99. type Identifiable interface {
  100. Id() string
  101. Nick() string
  102. }