Changeset 292 in code for trunk/upstream.go


Ignore:
Timestamp:
May 11, 2020, 10:25:49 AM (5 years ago)
Author:
delthas
Message:

Add support for multiple user channel memberships

User channel memberships are actually a set of memberships, not a single
value. This introduces memberships, a type representing a set of
memberships, stored as an array of memberships ordered by descending
rank.

This also adds multi-prefix to the permanent downstream and upstream
capabilities, so that we try to get all possible channel memberships.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/upstream.go

    r288 r292  
    2525        "labeled-response": true,
    2626        "message-tags":     true,
     27        "multi-prefix":     true,
    2728        "server-time":      true,
    2829}
     
    3738        modes        channelModes
    3839        creationTime string
    39         Members      map[string]*membership
     40        Members      map[string]*memberships
    4041        complete     bool
    4142}
     
    230231}
    231232
    232 func (uc *upstreamConn) parseMembershipPrefix(s string) (membership *membership, nick string) {
     233func (uc *upstreamConn) parseMembershipPrefix(s string) (ms *memberships, nick string) {
     234        memberships := make(memberships, 0, 4)
     235        i := 0
    233236        for _, m := range uc.availableMemberships {
    234                 if m.Prefix == s[0] {
    235                         return &m, s[1:]
    236                 }
    237         }
    238         return nil, s
     237                if i >= len(s) {
     238                        break
     239                }
     240                if s[i] == m.Prefix {
     241                        memberships = append(memberships, m)
     242                        i++
     243                }
     244        }
     245        return &memberships, s[i:]
    239246}
    240247
     
    645652
    646653                for _, ch := range uc.channels {
    647                         if membership, ok := ch.Members[msg.Prefix.Name]; ok {
     654                        if memberships, ok := ch.Members[msg.Prefix.Name]; ok {
    648655                                delete(ch.Members, msg.Prefix.Name)
    649                                 ch.Members[newNick] = membership
     656                                ch.Members[newNick] = memberships
    650657                                uc.appendLog(ch.Name, msg)
    651658                                uc.appendHistory(ch.Name, msg)
     
    674681                                        Name:    ch,
    675682                                        conn:    uc,
    676                                         Members: make(map[string]*membership),
     683                                        Members: make(map[string]*memberships),
    677684                                }
    678685
     
    940947                                members := splitSpace(members)
    941948                                for i, member := range members {
    942                                         membership, nick := uc.parseMembershipPrefix(member)
    943                                         members[i] = membership.String() + dc.marshalEntity(uc.network, nick)
     949                                        memberships, nick := uc.parseMembershipPrefix(member)
     950                                        members[i] = memberships.Format(dc) + dc.marshalEntity(uc.network, nick)
    944951                                }
    945952                                memberStr := strings.Join(members, " ")
     
    961968
    962969                for _, s := range splitSpace(members) {
    963                         membership, nick := uc.parseMembershipPrefix(s)
    964                         ch.Members[nick] = membership
     970                        memberships, nick := uc.parseMembershipPrefix(s)
     971                        ch.Members[nick] = memberships
    965972                }
    966973        case irc.RPL_ENDOFNAMES:
     
    11131120                                prefix, channel := uc.parseMembershipPrefix(channel)
    11141121                                channel = dc.marshalEntity(uc.network, channel)
    1115                                 channelList[i] = prefix.String() + channel
     1122                                channelList[i] = prefix.Format(dc) + channel
    11161123                        }
    11171124                        channels := strings.Join(channelList, " ")
Note: See TracChangeset for help on using the changeset viewer.