123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package irc
-
- import (
- "fmt"
- "strings"
- )
-
- // ISupportList holds a list of ISUPPORT tokens
- type ISupportList struct {
- Tokens map[string]*string
- CachedReply []string
- }
-
- // NewISupportList returns a new ISupportList
- func NewISupportList() *ISupportList {
- var il ISupportList
- il.Tokens = make(map[string]*string)
- il.CachedReply = make([]string, 0)
- return &il
- }
-
- // Add adds an RPL_ISUPPORT token to our internal list
- func (il *ISupportList) Add(name string, value string) {
- il.Tokens[name] = &value
- }
-
- // AddNoValue adds an RPL_ISUPPORT token that does not have a value
- func (il *ISupportList) AddNoValue(name string) {
- il.Tokens[name] = nil
- }
-
- // RegenerateCachedReply regenerates the cached RPL_ISUPPORT reply
- func (il *ISupportList) RegenerateCachedReply() {
- il.CachedReply = make([]string, 0)
- maxlen := 400 // Max length of a single ISUPPORT token line
- var length int // Length of the current cache
- var cache []string // Token list cache
-
- for name, value := range il.Tokens {
- var token string
- if value == nil {
- token = name
- } else {
- token = fmt.Sprintf("%s=%s", name, *value)
- }
-
- if len(token)+length <= maxlen {
- // account for the space separating tokens
- if len(cache) > 0 {
- length++
- }
- cache = append(cache, token)
- length += len(token)
- }
-
- if len(cache) == 13 || len(token)+length >= maxlen {
- il.CachedReply = append(il.CachedReply, strings.Join(cache, " "))
- cache = make([]string, 0)
- length = 0
- }
- }
-
- if len(cache) > 0 {
- il.CachedReply = append(il.CachedReply, strings.Join(cache, " "))
- }
- }
|