Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package irc
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. //
  7. // simple types
  8. //
  9. // add, remove, list modes
  10. type ModeOp rune
  11. func (op ModeOp) String() string {
  12. return string(op)
  13. }
  14. // user mode flags
  15. type UserMode rune
  16. func (mode UserMode) String() string {
  17. return string(mode)
  18. }
  19. type Phase uint
  20. type ReplyCode interface {
  21. String() string
  22. }
  23. type StringCode string
  24. func (code StringCode) String() string {
  25. return string(code)
  26. }
  27. type NumericCode uint
  28. func (code NumericCode) String() string {
  29. return fmt.Sprintf("%03d", code)
  30. }
  31. // channel mode flags
  32. type ChannelMode rune
  33. func (mode ChannelMode) String() string {
  34. return string(mode)
  35. }
  36. type ChannelNameMap map[string]*Channel
  37. func (channels ChannelNameMap) Get(name string) *Channel {
  38. return channels[strings.ToLower(name)]
  39. }
  40. func (channels ChannelNameMap) Add(channel *Channel) error {
  41. if channels[channel.name] != nil {
  42. return fmt.Errorf("%s: already set", channel.name)
  43. }
  44. channels[channel.name] = channel
  45. return nil
  46. }
  47. func (channels ChannelNameMap) Remove(channel *Channel) error {
  48. if channel != channels[channel.name] {
  49. return fmt.Errorf("%s: mismatch", channel.name)
  50. }
  51. delete(channels, channel.name)
  52. return nil
  53. }
  54. type ChannelModeSet map[ChannelMode]bool
  55. func (set ChannelModeSet) String() string {
  56. if len(set) == 0 {
  57. return ""
  58. }
  59. strs := make([]string, len(set))
  60. index := 0
  61. for mode := range set {
  62. strs[index] = mode.String()
  63. index += 1
  64. }
  65. return strings.Join(strs, "")
  66. }
  67. type ClientSet map[*Client]bool
  68. func (clients ClientSet) Add(client *Client) {
  69. clients[client] = true
  70. }
  71. func (clients ClientSet) Remove(client *Client) {
  72. delete(clients, client)
  73. }
  74. func (clients ClientSet) Has(client *Client) bool {
  75. return clients[client]
  76. }
  77. type MemberSet map[*Client]ChannelModeSet
  78. func (members MemberSet) Add(member *Client) {
  79. members[member] = make(ChannelModeSet)
  80. }
  81. func (members MemberSet) Remove(member *Client) {
  82. delete(members, member)
  83. }
  84. func (members MemberSet) Has(member *Client) bool {
  85. _, ok := members[member]
  86. return ok
  87. }
  88. func (members MemberSet) HasMode(member *Client, mode ChannelMode) bool {
  89. modes, ok := members[member]
  90. if !ok {
  91. return false
  92. }
  93. return modes[mode]
  94. }
  95. type ChannelSet map[*Channel]bool
  96. func (channels ChannelSet) Add(channel *Channel) {
  97. channels[channel] = true
  98. }
  99. func (channels ChannelSet) Remove(channel *Channel) {
  100. delete(channels, channel)
  101. }
  102. func (channels ChannelSet) First() *Channel {
  103. for channel := range channels {
  104. return channel
  105. }
  106. return nil
  107. }
  108. //
  109. // interfaces
  110. //
  111. type Identifier interface {
  112. Id() string
  113. Nick() string
  114. }
  115. type Replier interface {
  116. Reply(...string)
  117. }
  118. type Command interface {
  119. Code() StringCode
  120. Client() *Client
  121. SetCode(StringCode)
  122. SetClient(*Client)
  123. }
  124. type ServerCommand interface {
  125. Command
  126. HandleServer(*Server)
  127. }
  128. type AuthServerCommand interface {
  129. Command
  130. HandleAuthServer(*Server)
  131. }
  132. type RegServerCommand interface {
  133. Command
  134. HandleRegServer(*Server)
  135. }