Changeset 292 in code for trunk/irc.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/irc.go

    r193 r292  
    177177}
    178178
    179 func (m *membership) String() string {
    180         if m == nil {
    181                 return ""
    182         }
    183         return string(m.Prefix)
     179// memberships always sorted by descending membership rank
     180type memberships []membership
     181
     182func (m *memberships) Add(availableMemberships []membership, newMembership membership) {
     183        l := *m
     184        i := 0
     185        for _, availableMembership := range availableMemberships {
     186                if i >= len(l) {
     187                        break
     188                }
     189                if l[i] == availableMembership {
     190                        if availableMembership == newMembership {
     191                                // we already have this membership
     192                                return
     193                        }
     194                        i++
     195                        continue
     196                }
     197                if availableMembership == newMembership {
     198                        break
     199                }
     200        }
     201        // insert newMembership at i
     202        l = append(l, membership{})
     203        copy(l[i+1:], l[i:])
     204        l[i] = newMembership
     205        *m = l
     206}
     207
     208func (m *memberships) Remove(oldMembership membership) {
     209        l := *m
     210        for i, currentMembership := range l {
     211                if currentMembership == oldMembership {
     212                        *m = append(l[:i], l[i+1:]...)
     213                        return
     214                }
     215        }
     216}
     217
     218func (m memberships) Format(dc *downstreamConn) string {
     219        if !dc.caps["multi-prefix"] {
     220                if len(m) == 0 {
     221                        return ""
     222                }
     223                return string(m[0].Prefix)
     224        }
     225        prefixes := make([]byte, len(m))
     226        for i, membership := range m {
     227                prefixes[i] = membership.Prefix
     228        }
     229        return string(prefixes)
    184230}
    185231
Note: See TracChangeset for help on using the changeset viewer.