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.

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