- Timestamp:
- Mar 20, 2020, 9:11:27 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/downstream.go
r127 r128 946 946 Params: params, 947 947 }) 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 }) 948 986 case "PRIVMSG": 949 987 var targetsStr, text string -
trunk/irc.go
r125 r128 87 87 const stdMembershipPrefixes = "~&@%+" 88 88 89 func (m membership) String() string { 90 if m == 0 { 91 return "" 92 } 93 return string(m) 94 } 95 89 96 func parseMembershipPrefix(s string) (prefix membership, nick string) { 90 97 // TODO: any prefix from PREFIX RPL_ISUPPORT -
trunk/upstream.go
r127 r128 604 604 Prefix: dc.srv.prefix(), 605 605 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"}, 607 701 }) 608 702 })
Note:
See TracChangeset
for help on using the changeset viewer.