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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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[Name]*Channel
  13. func (channels ChannelNameMap) Get(name Name) *Channel {
  14. return channels[name.ToLower()]
  15. }
  16. func (channels ChannelNameMap) Add(channel *Channel) error {
  17. if channels[channel.name.ToLower()] != nil {
  18. return fmt.Errorf("%s: already set", channel.name)
  19. }
  20. channels[channel.name.ToLower()] = channel
  21. return nil
  22. }
  23. func (channels ChannelNameMap) Remove(channel *Channel) error {
  24. if channel != channels[channel.name.ToLower()] {
  25. return fmt.Errorf("%s: mismatch", channel.name)
  26. }
  27. delete(channels, channel.name.ToLower())
  28. return nil
  29. }
  30. type ChannelModeSet map[ChannelMode]bool
  31. func (set ChannelModeSet) String() string {
  32. if len(set) == 0 {
  33. return ""
  34. }
  35. strs := make([]string, len(set))
  36. index := 0
  37. for mode := range set {
  38. strs[index] = mode.String()
  39. index += 1
  40. }
  41. return strings.Join(strs, "")
  42. }
  43. type ClientSet map[*Client]bool
  44. func (clients ClientSet) Add(client *Client) {
  45. clients[client] = true
  46. }
  47. func (clients ClientSet) Remove(client *Client) {
  48. delete(clients, client)
  49. }
  50. func (clients ClientSet) Has(client *Client) bool {
  51. return clients[client]
  52. }
  53. type MemberSet map[*Client]ChannelModeSet
  54. func (members MemberSet) Add(member *Client) {
  55. members[member] = make(ChannelModeSet)
  56. }
  57. func (members MemberSet) Remove(member *Client) {
  58. delete(members, member)
  59. }
  60. func (members MemberSet) Has(member *Client) bool {
  61. _, ok := members[member]
  62. return ok
  63. }
  64. func (members MemberSet) HasMode(member *Client, mode ChannelMode) bool {
  65. modes, ok := members[member]
  66. if !ok {
  67. return false
  68. }
  69. return modes[mode]
  70. }
  71. func (members MemberSet) AnyHasMode(mode ChannelMode) bool {
  72. for _, modes := range members {
  73. if modes[mode] {
  74. return true
  75. }
  76. }
  77. return false
  78. }
  79. type ChannelSet map[*Channel]bool
  80. func (channels ChannelSet) Add(channel *Channel) {
  81. channels[channel] = true
  82. }
  83. func (channels ChannelSet) Remove(channel *Channel) {
  84. delete(channels, channel)
  85. }
  86. func (channels ChannelSet) First() *Channel {
  87. for channel := range channels {
  88. return channel
  89. }
  90. return nil
  91. }
  92. //
  93. // interfaces
  94. //
  95. type Identifiable interface {
  96. Id() Name
  97. Nick() Name
  98. }