Changeset 478 in code for trunk/upstream.go
- Timestamp:
- Mar 24, 2021, 5:15:52 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/upstream.go
r469 r478 49 49 modes channelModes 50 50 creationTime string 51 Members m ap[string]*memberships51 Members membershipsCasemapMap 52 52 complete bool 53 53 detachTimer *time.Timer … … 87 87 registered bool 88 88 nick string 89 nickCM string 89 90 username string 90 91 realname string 91 92 modes userModes 92 channels map[string]*upstreamChannel93 channels upstreamChannelCasemapMap 93 94 supportedCaps map[string]string 94 95 caps map[string]bool … … 99 100 saslClient sasl.Client 100 101 saslStarted bool 102 103 casemapIsSet bool 101 104 102 105 // set of LIST commands in progress, per downstream … … 187 190 network: network, 188 191 user: network.user, 189 channels: make(map[string]*upstreamChannel),192 channels: upstreamChannelCasemapMap{newCasemapMap(0)}, 190 193 supportedCaps: make(map[string]string), 191 194 caps: make(map[string]bool), … … 214 217 215 218 func (uc *upstreamConn) getChannel(name string) (*upstreamChannel, error) { 216 ch , ok := uc.channels[name]217 if !ok{219 ch := uc.channels.Value(name) 220 if ch == nil { 218 221 return nil, fmt.Errorf("unknown channel %q", name) 219 222 } … … 223 226 func (uc *upstreamConn) isChannel(entity string) bool { 224 227 return strings.ContainsRune(uc.availableChannelTypes, rune(entity[0])) 228 } 229 230 func (uc *upstreamConn) isOurNick(nick string) bool { 231 return uc.nickCM == uc.network.casemap(nick) 225 232 } 226 233 … … 414 421 } else { // regular user message 415 422 target := entity 416 if target == uc.nick{423 if uc.isOurNick(target) { 417 424 target = msg.Prefix.Name 418 425 } 419 426 420 if ch, ok := uc.network.channels[target]; ok { 427 ch := uc.network.channels.Value(target) 428 if ch != nil { 421 429 if ch.Detached { 422 430 uc.handleDetachedMessage(msg.Prefix.Name, text, ch) … … 591 599 uc.logger.Printf("connection registered") 592 600 593 if len(uc.network.channels) > 0 {601 if uc.network.channels.Len() > 0 { 594 602 var channels, keys []string 595 for _, ch := range uc.network.channels { 603 for _, entry := range uc.network.channels.innerMap { 604 ch := entry.value.(*Channel) 596 605 channels = append(channels, ch.Name) 597 606 keys = append(keys, ch.Key) … … 635 644 var err error 636 645 switch parameter { 646 case "CASEMAPPING": 647 casemap, ok := parseCasemappingToken(value) 648 if !ok { 649 casemap = casemapRFC1459 650 } 651 uc.network.updateCasemapping(casemap) 652 uc.nickCM = uc.network.casemap(uc.nick) 653 uc.casemapIsSet = true 637 654 case "CHANMODES": 638 655 if !negate { … … 672 689 } 673 690 }) 691 case irc.ERR_NOMOTD, irc.RPL_ENDOFMOTD: 692 if !uc.casemapIsSet { 693 // upstream did not send any CASEMAPPING token, thus 694 // we assume it implements the old RFCs with rfc1459. 695 uc.casemapIsSet = true 696 uc.network.updateCasemapping(casemapRFC1459) 697 uc.nickCM = uc.network.casemap(uc.nick) 698 } 674 699 case "BATCH": 675 700 var tag string … … 717 742 718 743 me := false 719 if msg.Prefix.Name == uc.nick{744 if uc.isOurNick(msg.Prefix.Name) { 720 745 uc.logger.Printf("changed nick from %q to %q", uc.nick, newNick) 721 746 me = true 722 747 uc.nick = newNick 723 } 724 725 for _, ch := range uc.channels { 726 if memberships, ok := ch.Members[msg.Prefix.Name]; ok { 727 delete(ch.Members, msg.Prefix.Name) 728 ch.Members[newNick] = memberships 748 uc.nickCM = uc.network.casemap(uc.nick) 749 } 750 751 for _, entry := range uc.channels.innerMap { 752 ch := entry.value.(*upstreamChannel) 753 memberships := ch.Members.Value(msg.Prefix.Name) 754 if memberships != nil { 755 ch.Members.Delete(msg.Prefix.Name) 756 ch.Members.SetValue(newNick, memberships) 729 757 uc.appendLog(ch.Name, msg) 730 758 } … … 751 779 752 780 for _, ch := range strings.Split(channels, ",") { 753 if msg.Prefix.Name == uc.nick{781 if uc.isOurNick(msg.Prefix.Name) { 754 782 uc.logger.Printf("joined channel %q", ch) 755 uc.channels[ch] = &upstreamChannel{ 783 members := membershipsCasemapMap{newCasemapMap(0)} 784 members.casemap = uc.network.casemap 785 uc.channels.SetValue(ch, &upstreamChannel{ 756 786 Name: ch, 757 787 conn: uc, 758 Members: m ake(map[string]*memberships),759 } 788 Members: members, 789 }) 760 790 uc.updateChannelAutoDetach(ch) 761 791 … … 769 799 return err 770 800 } 771 ch.Members [msg.Prefix.Name] = &memberships{}801 ch.Members.SetValue(msg.Prefix.Name, &memberships{}) 772 802 } 773 803 … … 787 817 788 818 for _, ch := range strings.Split(channels, ",") { 789 if msg.Prefix.Name == uc.nick{819 if uc.isOurNick(msg.Prefix.Name) { 790 820 uc.logger.Printf("parted channel %q", ch) 791 if uch, ok := uc.channels[ch]; ok { 792 delete(uc.channels, ch) 821 uch := uc.channels.Value(ch) 822 if uch != nil { 823 uc.channels.Delete(ch) 793 824 uch.updateAutoDetach(0) 794 825 } … … 798 829 return err 799 830 } 800 delete(ch.Members,msg.Prefix.Name)831 ch.Members.Delete(msg.Prefix.Name) 801 832 } 802 833 … … 815 846 } 816 847 817 if u ser == uc.nick{848 if uc.isOurNick(user) { 818 849 uc.logger.Printf("kicked from channel %q by %s", channel, msg.Prefix.Name) 819 delete(uc.channels,channel)850 uc.channels.Delete(channel) 820 851 } else { 821 852 ch, err := uc.getChannel(channel) … … 823 854 return err 824 855 } 825 delete(ch.Members,user)856 ch.Members.Delete(user) 826 857 } 827 858 … … 832 863 } 833 864 834 if msg.Prefix.Name == uc.nick{865 if uc.isOurNick(msg.Prefix.Name) { 835 866 uc.logger.Printf("quit") 836 867 } 837 868 838 for _, ch := range uc.channels { 839 if _, ok := ch.Members[msg.Prefix.Name]; ok { 840 delete(ch.Members, msg.Prefix.Name) 869 for _, entry := range uc.channels.innerMap { 870 ch := entry.value.(*upstreamChannel) 871 if ch.Members.Has(msg.Prefix.Name) { 872 ch.Members.Delete(msg.Prefix.Name) 841 873 842 874 uc.appendLog(ch.Name, msg) … … 909 941 uc.appendLog(ch.Name, msg) 910 942 911 if ch, ok := uc.network.channels[name]; !ok || !ch.Detached { 943 c := uc.network.channels.Value(name) 944 if c == nil || !c.Detached { 912 945 uc.forEachDownstream(func(dc *downstreamConn) { 913 946 params := make([]string, len(msg.Params)) … … 965 998 } 966 999 if firstMode { 967 if c, ok := uc.network.channels[channel]; !ok || !c.Detached { 1000 c := uc.network.channels.Value(channel) 1001 if c == nil || !c.Detached { 968 1002 modeStr, modeParams := ch.modes.Format() 969 1003 … … 1062 1096 } 1063 1097 1064 ch , ok := uc.channels[name]1065 if !ok{1098 ch := uc.channels.Value(name) 1099 if ch == nil { 1066 1100 // NAMES on a channel we have not joined, forward to downstream 1067 1101 uc.forEachDownstreamByID(downstreamID, func(dc *downstreamConn) { … … 1091 1125 for _, s := range splitSpace(members) { 1092 1126 memberships, nick := uc.parseMembershipPrefix(s) 1093 ch.Members [nick] = memberships1127 ch.Members.SetValue(nick, memberships) 1094 1128 } 1095 1129 case irc.RPL_ENDOFNAMES: … … 1099 1133 } 1100 1134 1101 ch , ok := uc.channels[name]1102 if !ok{1135 ch := uc.channels.Value(name) 1136 if ch == nil { 1103 1137 // NAMES on a channel we have not joined, forward to downstream 1104 1138 uc.forEachDownstreamByID(downstreamID, func(dc *downstreamConn) { … … 1119 1153 ch.complete = true 1120 1154 1121 if c, ok := uc.network.channels[name]; !ok || !c.Detached { 1155 c := uc.network.channels.Value(name) 1156 if c == nil || !c.Detached { 1122 1157 uc.forEachDownstream(func(dc *downstreamConn) { 1123 1158 forwardChannel(dc, ch) … … 1273 1308 } 1274 1309 1275 weAreInvited := nick == uc.nick1310 weAreInvited := uc.isOurNick(nick) 1276 1311 1277 1312 uc.forEachDownstream(func(dc *downstreamConn) { … … 1396 1431 case irc.RPL_LUSERCLIENT, irc.RPL_LUSEROP, irc.RPL_LUSERUNKNOWN, irc.RPL_LUSERCHANNELS, irc.RPL_LUSERME: 1397 1432 // Ignore 1398 case irc.RPL_MOTDSTART, irc.RPL_MOTD , irc.RPL_ENDOFMOTD:1433 case irc.RPL_MOTDSTART, irc.RPL_MOTD: 1399 1434 // Ignore 1400 1435 case irc.RPL_LISTSTART: … … 1602 1637 func (uc *upstreamConn) register() { 1603 1638 uc.nick = uc.network.Nick 1639 uc.nickCM = uc.network.casemap(uc.nick) 1604 1640 uc.username = uc.network.GetUsername() 1605 1641 uc.realname = uc.network.GetRealname() … … 1706 1742 1707 1743 detached := false 1708 if ch , ok := uc.network.channels[entity]; ok{1744 if ch := uc.network.channels.Value(entity); ch != nil { 1709 1745 detached = ch.Detached 1710 1746 } 1711 1747 1712 delivered, ok := uc.network.delivered[entity] 1713 if !ok { 1714 lastID, err := uc.user.msgStore.LastMsgID(uc.network, entity, time.Now()) 1748 delivered := uc.network.delivered.Value(entity) 1749 entityCM := uc.network.casemap(entity) 1750 if delivered == nil { 1751 lastID, err := uc.user.msgStore.LastMsgID(uc.network, entityCM, time.Now()) 1715 1752 if err != nil { 1716 1753 uc.logger.Printf("failed to log message: failed to get last message ID: %v", err) … … 1719 1756 1720 1757 delivered = make(map[string]string) 1721 uc.network.delivered [entity] = delivered1758 uc.network.delivered.SetValue(entity, delivered) 1722 1759 1723 1760 for clientName, _ := range uc.network.offlineClients { … … 1734 1771 } 1735 1772 1736 msgID, err := uc.user.msgStore.Append(uc.network, entity , msg)1773 msgID, err := uc.user.msgStore.Append(uc.network, entityCM, msg) 1737 1774 if err != nil { 1738 1775 uc.logger.Printf("failed to log message: %v", err) … … 1755 1792 1756 1793 // Don't forward messages if it's a detached channel 1757 if ch, ok := uc.network.channels[target]; ok && ch.Detached { 1794 ch := uc.network.channels.Value(target) 1795 if ch != nil && ch.Detached { 1758 1796 return 1759 1797 } … … 1790 1828 1791 1829 func (uc *upstreamConn) updateChannelAutoDetach(name string) { 1792 if uch, ok := uc.channels[name]; ok { 1793 if ch, ok := uc.network.channels[name]; ok && !ch.Detached { 1794 uch.updateAutoDetach(ch.DetachAfter) 1795 } 1796 } 1797 } 1830 uch := uc.channels.Value(name) 1831 if uch == nil { 1832 return 1833 } 1834 ch := uc.network.channels.Value(name) 1835 if ch == nil || ch.Detached { 1836 return 1837 } 1838 uch.updateAutoDetach(ch.DetachAfter) 1839 }
Note:
See TracChangeset
for help on using the changeset viewer.