Changeset 540 in code for trunk/downstream.go


Ignore:
Timestamp:
May 25, 2021, 6:24:45 PM (4 years ago)
Author:
contact
Message:

Add support for IRCv3 setname

References: https://todo.sr.ht/~emersion/soju/41

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r537 r540  
    123123        "sasl":          "PLAIN",
    124124        "server-time":   "",
     125        "setname":       "",
    125126
    126127        "soju.im/bouncer-networks":        "",
     
    155156        "MAXTARGETS": true,
    156157        "MODES":      true,
     158        "NAMELEN":    true,
    157159        "NETWORK":    true,
    158160        "NICKLEN":    true,
     
    380382        if msg.Command == "JOIN" && !dc.caps["extended-join"] {
    381383                msg.Params = msg.Params[:1]
     384        }
     385        if msg.Command == "SETNAME" && !dc.caps["setname"] {
     386                return
    382387        }
    383388
     
    460465        case "TOPIC":
    461466                msg.Params[0] = dc.marshalEntity(net, msg.Params[0])
    462         case "QUIT":
     467        case "QUIT", "SETNAME":
    463468                // This space is intentionally left blank
    464469        default:
     
    867872                dc.nick = uc.nick
    868873                dc.nickCM = casemapASCII(dc.nick)
     874        }
     875}
     876
     877func (dc *downstreamConn) updateRealname() {
     878        if uc := dc.upstream(); uc != nil && uc.realname != dc.realname && dc.caps["setname"] {
     879                dc.SendMessage(&irc.Message{
     880                        Prefix:  dc.prefix(),
     881                        Command: "SETNAME",
     882                        Params:  []string{uc.realname},
     883                })
     884                dc.realname = uc.realname
    869885        }
    870886}
     
    10631079
    10641080        dc.updateNick()
     1081        dc.updateRealname()
    10651082        dc.updateSupportedCaps()
    10661083
     
    13431360                        dc.nick = nick
    13441361                        dc.nickCM = casemapASCII(dc.nick)
     1362                }
     1363        case "SETNAME":
     1364                var realname string
     1365                if err := parseMessageParams(msg, &realname); err != nil {
     1366                        return err
     1367                }
     1368
     1369                var storeErr error
     1370                var needUpdate []Network
     1371                dc.forEachNetwork(func(n *network) {
     1372                        // We only need to call updateNetwork for upstreams that don't
     1373                        // support setname
     1374                        if uc := n.conn; uc != nil && uc.caps["setname"] {
     1375                                uc.SendMessageLabeled(dc.id, &irc.Message{
     1376                                        Command: "SETNAME",
     1377                                        Params:  []string{realname},
     1378                                })
     1379
     1380                                n.Realname = realname
     1381                                if err := dc.srv.db.StoreNetwork(dc.user.ID, &n.Network); err != nil {
     1382                                        dc.logger.Printf("failed to store network realname: %v", err)
     1383                                        storeErr = err
     1384                                }
     1385                                return
     1386                        }
     1387
     1388                        record := n.Network // copy network record because we'll mutate it
     1389                        record.Realname = realname
     1390                        needUpdate = append(needUpdate, record)
     1391                })
     1392
     1393                // Walk the network list as a second step, because updateNetwork
     1394                // mutates the original list
     1395                for _, record := range needUpdate {
     1396                        if _, err := dc.user.updateNetwork(&record); err != nil {
     1397                                dc.logger.Printf("failed to update network realname: %v", err)
     1398                                storeErr = err
     1399                        }
     1400                }
     1401                if storeErr != nil {
     1402                        return ircError{&irc.Message{
     1403                                Command: "FAIL",
     1404                                Params:  []string{"SETNAME", "CANNOT_CHANGE_REALNAME", "Failed to update realname"},
     1405                        }}
     1406                }
     1407
     1408                if dc.upstream() == nil && dc.caps["setname"] {
     1409                        dc.SendMessage(&irc.Message{
     1410                                Prefix:  dc.prefix(),
     1411                                Command: "SETNAME",
     1412                                Params:  []string{realname},
     1413                        })
    13451414                }
    13461415        case "JOIN":
Note: See TracChangeset for help on using the changeset viewer.