Changeset 127 in code for trunk/upstream.go


Ignore:
Timestamp:
Mar 19, 2020, 11:29:03 PM (5 years ago)
Author:
delthas
Message:

Add WHO support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/upstream.go

    r125 r127  
    558558                        forwardChannel(dc, ch)
    559559                })
     560        case irc.RPL_WHOREPLY:
     561                var channel, username, host, server, nick, mode, trailing string
     562                if err := parseMessageParams(msg, nil, &channel, &username, &host, &server, &nick, &mode, &trailing); err != nil {
     563                        return err
     564                }
     565
     566                parts := strings.SplitN(trailing, " ", 2)
     567                if len(parts) != 2 {
     568                        return fmt.Errorf("received malformed RPL_WHOREPLY: wrong trailing parameter: %s", trailing)
     569                }
     570                realname := parts[1]
     571                hops, err := strconv.Atoi(parts[0])
     572                if err != nil {
     573                        return fmt.Errorf("received malformed RPL_WHOREPLY: wrong hop count: %s", parts[0])
     574                }
     575                hops++
     576
     577                trailing = strconv.Itoa(hops) + " " + realname
     578
     579                uc.forEachDownstream(func(dc *downstreamConn) {
     580                        channel := channel
     581                        if channel != "*" {
     582                                channel = dc.marshalChannel(uc, channel)
     583                        }
     584                        nick := dc.marshalNick(uc, nick)
     585                        dc.SendMessage(&irc.Message{
     586                                Prefix:  dc.srv.prefix(),
     587                                Command: irc.RPL_WHOREPLY,
     588                                Params:  []string{dc.nick, channel, username, host, server, nick, mode, trailing},
     589                        })
     590                })
     591        case irc.RPL_ENDOFWHO:
     592                var name string
     593                if err := parseMessageParams(msg, nil, &name); err != nil {
     594                        return err
     595                }
     596
     597                uc.forEachDownstream(func(dc *downstreamConn) {
     598                        name := name
     599                        if name != "*" {
     600                                // TODO: support WHO masks
     601                                name = dc.marshalEntity(uc, name)
     602                        }
     603                        dc.SendMessage(&irc.Message{
     604                                Prefix:  dc.srv.prefix(),
     605                                Command: irc.RPL_ENDOFWHO,
     606                                Params:  []string{dc.nick, name, "End of /WHO list."},
     607                        })
     608                })
    560609        case "PRIVMSG":
    561610                if msg.Prefix == nil {
Note: See TracChangeset for help on using the changeset viewer.