Changeset 281 in code for trunk/upstream.go


Ignore:
Timestamp:
Apr 30, 2020, 1:27:41 PM (5 years ago)
Author:
contact
Message:

Add upstream cap-notify support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/upstream.go

    r278 r281  
    299299                                return newNeedMoreParamsError(msg.Command)
    300300                        }
    301                         caps := strings.Fields(subParams[len(subParams)-1])
     301                        caps := subParams[len(subParams)-1]
    302302                        more := len(subParams) >= 2 && msg.Params[len(subParams)-2] == "*"
    303303
    304                         for _, s := range caps {
    305                                 kv := strings.SplitN(s, "=", 2)
    306                                 k := strings.ToLower(kv[0])
    307                                 var v string
    308                                 if len(kv) == 2 {
    309                                         v = kv[1]
    310                                 }
    311                                 uc.supportedCaps[k] = v
    312                         }
     304                        uc.handleSupportedCaps(caps)
    313305
    314306                        if more {
     
    316308                        }
    317309
    318                         requestCaps := make([]string, 0, 16)
    319                         for _, c := range []string{"message-tags", "batch", "labeled-response", "server-time", "away-notify"} {
    320                                 if _, ok := uc.supportedCaps[c]; ok {
    321                                         requestCaps = append(requestCaps, c)
    322                                 }
    323                         }
    324 
    325                         if uc.requestSASL() {
    326                                 requestCaps = append(requestCaps, "sasl")
    327                         }
    328 
    329                         if len(requestCaps) > 0 {
    330                                 uc.SendMessage(&irc.Message{
    331                                         Command: "CAP",
    332                                         Params:  []string{"REQ", strings.Join(requestCaps, " ")},
    333                                 })
    334                         }
     310                        uc.requestCaps()
    335311
    336312                        if uc.requestSASL() {
     
    358334                                        Command: "CAP",
    359335                                        Params:  []string{"END"},
     336                                })
     337                        }
     338
     339                        if uc.registered {
     340                                uc.forEachDownstream(func(dc *downstreamConn) {
     341                                        dc.updateSupportedCaps()
     342                                })
     343                        }
     344                case "NEW":
     345                        if len(subParams) < 1 {
     346                                return newNeedMoreParamsError(msg.Command)
     347                        }
     348                        uc.handleSupportedCaps(subParams[0])
     349                        uc.requestCaps()
     350                case "DEL":
     351                        if len(subParams) < 1 {
     352                                return newNeedMoreParamsError(msg.Command)
     353                        }
     354                        caps := strings.Fields(subParams[0])
     355
     356                        for _, c := range caps {
     357                                delete(uc.supportedCaps, c)
     358                                delete(uc.caps, c)
     359                        }
     360
     361                        if uc.registered {
     362                                uc.forEachDownstream(func(dc *downstreamConn) {
     363                                        dc.updateSupportedCaps()
    360364                                })
    361365                        }
     
    11911195}
    11921196
     1197func (uc *upstreamConn) handleSupportedCaps(capsStr string) {
     1198        caps := strings.Fields(capsStr)
     1199        for _, s := range caps {
     1200                kv := strings.SplitN(s, "=", 2)
     1201                k := strings.ToLower(kv[0])
     1202                var v string
     1203                if len(kv) == 2 {
     1204                        v = kv[1]
     1205                }
     1206                uc.supportedCaps[k] = v
     1207        }
     1208}
     1209
     1210func (uc *upstreamConn) requestCaps() {
     1211        var requestCaps []string
     1212        for _, c := range []string{"message-tags", "batch", "labeled-response", "server-time", "away-notify"} {
     1213                if _, ok := uc.supportedCaps[c]; ok && !uc.caps[c] {
     1214                        requestCaps = append(requestCaps, c)
     1215                }
     1216        }
     1217
     1218        if uc.requestSASL() && !uc.caps["sasl"] {
     1219                requestCaps = append(requestCaps, "sasl")
     1220        }
     1221
     1222        if len(requestCaps) > 0 {
     1223                uc.SendMessage(&irc.Message{
     1224                        Command: "CAP",
     1225                        Params:  []string{"REQ", strings.Join(requestCaps, " ")},
     1226                })
     1227        }
     1228}
     1229
    11931230func splitSpace(s string) []string {
    11941231        return strings.FieldsFunc(s, func(r rune) bool {
Note: See TracChangeset for help on using the changeset viewer.