Changeset 463 in code for trunk


Ignore:
Timestamp:
Mar 15, 2021, 10:41:37 PM (4 years ago)
Author:
contact
Message:

Passthrough some ISUPPORT tokens

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r461 r463  
    8080        "extended-join": "",
    8181        "multi-prefix":  "",
     82}
     83
     84// passthroughIsupport is the set of ISUPPORT tokens that are directly passed
     85// through from the upstream server to downstream clients.
     86//
     87// This is only effective in single-upstream mode.
     88var passthroughIsupport = map[string]bool{
     89        "AWAYLEN":    true,
     90        "CHANLIMIT":  true,
     91        "CHANMODES":  true,
     92        "CHANNELLEN": true,
     93        "CHANTYPES":  true,
     94        "EXCEPTS":    true,
     95        "EXTBAN":     true,
     96        "HOSTLEN":    true,
     97        "INVEX":      true,
     98        "KICKLEN":    true,
     99        "MAXLIST":    true,
     100        "MAXTARGETS": true,
     101        "MODES":      true,
     102        "NETWORK":    true,
     103        "NICKLEN":    true,
     104        "PREFIX":     true,
     105        "SAFELIST":   true,
     106        "TARGMAX":    true,
     107        "TOPICLEN":   true,
     108        "USERLEN":    true,
    82109}
    83110
     
    881908        }
    882909
    883         if uc := dc.upstream(); uc != nil && uc.isupport["NETWORK"] != nil {
    884                 isupport = append(isupport, fmt.Sprintf("NETWORK=%v", *uc.isupport["NETWORK"]))
     910        if uc := dc.upstream(); uc != nil {
     911                for k := range passthroughIsupport {
     912                        v, ok := uc.isupport[k]
     913                        if !ok {
     914                                continue
     915                        }
     916                        if v != nil {
     917                                isupport = append(isupport, fmt.Sprintf("%v=%v", k, *v))
     918                        } else {
     919                                isupport = append(isupport, k)
     920                        }
     921                }
    885922        }
    886923
     
    905942                Params:  []string{dc.nick, dc.srv.Hostname, "soju", "aiwroO", "OovaimnqpsrtklbeI"},
    906943        })
    907         // TODO: other RPL_ISUPPORT tokens
    908         dc.SendMessage(&irc.Message{
    909                 Prefix:  dc.srv.prefix(),
    910                 Command: irc.RPL_ISUPPORT,
    911                 Params:  append(append([]string{dc.nick}, isupport...), "are supported"),
    912         })
     944        for _, msg := range generateIsupport(dc.srv.prefix(), dc.nick, isupport) {
     945                dc.SendMessage(msg)
     946        }
    913947        dc.SendMessage(&irc.Message{
    914948                Prefix:  dc.srv.prefix(),
  • trunk/irc.go

    r392 r463  
    1818)
    1919
    20 const maxMessageLength = 512
     20const (
     21        maxMessageLength = 512
     22        maxMessageParams = 15
     23)
    2124
    2225// The server-time layout, as defined in the IRCv3 spec.
     
    349352}
    350353
     354func generateIsupport(prefix *irc.Prefix, nick string, tokens []string) []*irc.Message {
     355        maxTokens := maxMessageParams - 2 // 2 reserved params: nick + text
     356
     357        var msgs []*irc.Message
     358        for len(tokens) > 0 {
     359                var msgTokens []string
     360                if len(tokens) > maxTokens {
     361                        msgTokens = tokens[:maxTokens]
     362                        tokens = tokens[maxTokens:]
     363                } else {
     364                        msgTokens = tokens
     365                        tokens = nil
     366                }
     367
     368                msgs = append(msgs, &irc.Message{
     369                        Prefix:  prefix,
     370                        Command: irc.RPL_ISUPPORT,
     371                        Params:  append(append([]string{nick}, msgTokens...), "are supported"),
     372                })
     373        }
     374
     375        return msgs
     376}
     377
    351378type joinSorter struct {
    352379        channels []string
  • trunk/upstream.go

    r462 r463  
    614614                        return err
    615615                }
     616
     617                var downstreamIsupport []string
    616618                for _, token := range msg.Params[1 : len(msg.Params)-1] {
    617619                        parameter := token
     
    659661                                return err
    660662                        }
    661                 }
     663
     664                        if passthroughIsupport[parameter] {
     665                                downstreamIsupport = append(downstreamIsupport, token)
     666                        }
     667                }
     668
     669                uc.forEachDownstream(func(dc *downstreamConn) {
     670                        if dc.network == nil {
     671                                return
     672                        }
     673                        msgs := generateIsupport(dc.srv.prefix(), dc.nick, downstreamIsupport)
     674                        for _, msg := range msgs {
     675                                dc.SendMessage(msg)
     676                        }
     677                })
    662678        case "BATCH":
    663679                var tag string
Note: See TracChangeset for help on using the changeset viewer.