Changeset 128 in code for trunk/upstream.go


Ignore:
Timestamp:
Mar 20, 2020, 9:11:27 AM (5 years ago)
Author:
delthas
Message:

Add WHOIS support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/upstream.go

    r127 r128  
    604604                                Prefix:  dc.srv.prefix(),
    605605                                Command: irc.RPL_ENDOFWHO,
    606                                 Params:  []string{dc.nick, name, "End of /WHO list."},
     606                                Params:  []string{dc.nick, name, "End of WHO list"},
     607                        })
     608                })
     609        case irc.RPL_WHOISUSER:
     610                var nick, username, host, realname string
     611                if err := parseMessageParams(msg, nil, &nick, &username, &host, nil, &realname); err != nil {
     612                        return err
     613                }
     614
     615                uc.forEachDownstream(func(dc *downstreamConn) {
     616                        nick := dc.marshalNick(uc, nick)
     617                        dc.SendMessage(&irc.Message{
     618                                Prefix:  dc.srv.prefix(),
     619                                Command: irc.RPL_WHOISUSER,
     620                                Params:  []string{dc.nick, nick, username, host, "*", realname},
     621                        })
     622                })
     623        case irc.RPL_WHOISSERVER:
     624                var nick, server, serverInfo string
     625                if err := parseMessageParams(msg, nil, &nick, &server, &serverInfo); err != nil {
     626                        return err
     627                }
     628
     629                uc.forEachDownstream(func(dc *downstreamConn) {
     630                        nick := dc.marshalNick(uc, nick)
     631                        dc.SendMessage(&irc.Message{
     632                                Prefix:  dc.srv.prefix(),
     633                                Command: irc.RPL_WHOISSERVER,
     634                                Params:  []string{dc.nick, nick, server, serverInfo},
     635                        })
     636                })
     637        case irc.RPL_WHOISOPERATOR:
     638                var nick string
     639                if err := parseMessageParams(msg, nil, &nick); err != nil {
     640                        return err
     641                }
     642
     643                uc.forEachDownstream(func(dc *downstreamConn) {
     644                        nick := dc.marshalNick(uc, nick)
     645                        dc.SendMessage(&irc.Message{
     646                                Prefix:  dc.srv.prefix(),
     647                                Command: irc.RPL_WHOISOPERATOR,
     648                                Params:  []string{dc.nick, nick, "is an IRC operator"},
     649                        })
     650                })
     651        case irc.RPL_WHOISIDLE:
     652                var nick string
     653                if err := parseMessageParams(msg, nil, &nick, nil); err != nil {
     654                        return err
     655                }
     656
     657                uc.forEachDownstream(func(dc *downstreamConn) {
     658                        nick := dc.marshalNick(uc, nick)
     659                        params := []string{dc.nick, nick}
     660                        params = append(params, msg.Params[2:]...)
     661                        dc.SendMessage(&irc.Message{
     662                                Prefix:  dc.srv.prefix(),
     663                                Command: irc.RPL_WHOISIDLE,
     664                                Params:  params,
     665                        })
     666                })
     667        case irc.RPL_WHOISCHANNELS:
     668                var nick, channelList string
     669                if err := parseMessageParams(msg, nil, &nick, &channelList); err != nil {
     670                        return err
     671                }
     672                channels := strings.Split(channelList, " ")
     673
     674                uc.forEachDownstream(func(dc *downstreamConn) {
     675                        nick := dc.marshalNick(uc, nick)
     676                        channelList := make([]string, len(channels))
     677                        for i, channel := range channels {
     678                                prefix, channel := parseMembershipPrefix(channel)
     679                                channel = dc.marshalChannel(uc, channel)
     680                                channelList[i] = prefix.String() + channel
     681                        }
     682                        channels := strings.Join(channelList, " ")
     683                        dc.SendMessage(&irc.Message{
     684                                Prefix:  dc.srv.prefix(),
     685                                Command: irc.RPL_WHOISCHANNELS,
     686                                Params:  []string{dc.nick, nick, channels},
     687                        })
     688                })
     689        case irc.RPL_ENDOFWHOIS:
     690                var nick string
     691                if err := parseMessageParams(msg, nil, &nick); err != nil {
     692                        return err
     693                }
     694
     695                uc.forEachDownstream(func(dc *downstreamConn) {
     696                        nick := dc.marshalNick(uc, nick)
     697                        dc.SendMessage(&irc.Message{
     698                                Prefix:  dc.srv.prefix(),
     699                                Command: irc.RPL_ENDOFWHOIS,
     700                                Params:  []string{dc.nick, nick, "End of WHOIS list"},
    607701                        })
    608702                })
Note: See TracChangeset for help on using the changeset viewer.