Changeset 128 in code


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

Add WHOIS support

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r127 r128  
    946946                        Params:  params,
    947947                })
     948        case "WHOIS":
     949                if len(msg.Params) == 0 {
     950                        return ircError{&irc.Message{
     951                                Command: irc.ERR_NONICKNAMEGIVEN,
     952                                Params:  []string{dc.nick, "No nickname given"},
     953                        }}
     954                }
     955
     956                var target, mask string
     957                if len(msg.Params) == 1 {
     958                        target = ""
     959                        mask = msg.Params[0]
     960                } else {
     961                        target = msg.Params[0]
     962                        mask = msg.Params[1]
     963                }
     964                // TODO: support multiple WHOIS users
     965                if i := strings.IndexByte(mask, ','); i >= 0 {
     966                        mask = mask[:i]
     967                }
     968
     969                // TODO: support WHOIS masks
     970                uc, upstreamNick, err := dc.unmarshalEntity(mask)
     971                if err != nil {
     972                        return err
     973                }
     974
     975                var params []string
     976                if target != "" {
     977                        params = []string{target, upstreamNick}
     978                } else {
     979                        params = []string{upstreamNick}
     980                }
     981
     982                uc.SendMessage(&irc.Message{
     983                        Command: "WHOIS",
     984                        Params:  params,
     985                })
    948986        case "PRIVMSG":
    949987                var targetsStr, text string
  • trunk/irc.go

    r125 r128  
    8787const stdMembershipPrefixes = "~&@%+"
    8888
     89func (m membership) String() string {
     90        if m == 0 {
     91                return ""
     92        }
     93        return string(m)
     94}
     95
    8996func parseMembershipPrefix(s string) (prefix membership, nick string) {
    9097        // TODO: any prefix from PREFIX RPL_ISUPPORT
  • 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.