Changeset 458 in code for trunk/upstream.go


Ignore:
Timestamp:
Mar 15, 2021, 9:53:46 PM (4 years ago)
Author:
contact
Message:

Extract ISUPPORT CHANMODES/PREFIX to separate functions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/upstream.go

    r457 r458  
    629629                                switch parameter {
    630630                                case "CHANMODES":
    631                                         parts := strings.SplitN(value, ",", 5)
    632                                         if len(parts) < 4 {
    633                                                 return fmt.Errorf("malformed ISUPPORT CHANMODES value: %v", value)
     631                                        if err := uc.handleChanModes(value); err != nil {
     632                                                return err
    634633                                        }
    635                                         modes := make(map[byte]channelModeType)
    636                                         for i, mt := range []channelModeType{modeTypeA, modeTypeB, modeTypeC, modeTypeD} {
    637                                                 for j := 0; j < len(parts[i]); j++ {
    638                                                         mode := parts[i][j]
    639                                                         modes[mode] = mt
    640                                                 }
    641                                         }
    642                                         uc.availableChannelModes = modes
    643634                                case "CHANTYPES":
    644635                                        uc.availableChannelTypes = value
    645636                                case "PREFIX":
    646                                         if value == "" {
    647                                                 uc.availableMemberships = nil
    648                                         } else {
    649                                                 if value[0] != '(' {
    650                                                         return fmt.Errorf("malformed ISUPPORT PREFIX value: %v", value)
    651                                                 }
    652                                                 sep := strings.IndexByte(value, ')')
    653                                                 if sep < 0 || len(value) != sep*2 {
    654                                                         return fmt.Errorf("malformed ISUPPORT PREFIX value: %v", value)
    655                                                 }
    656                                                 memberships := make([]membership, len(value)/2-1)
    657                                                 for i := range memberships {
    658                                                         memberships[i] = membership{
    659                                                                 Mode:   value[i+1],
    660                                                                 Prefix: value[sep+i+1],
    661                                                         }
    662                                                 }
    663                                                 uc.availableMemberships = memberships
     637                                        if err := uc.handleMemberships(value); err != nil {
     638                                                return err
    664639                                        }
    665640                                case "NETWORK":
     
    14561431}
    14571432
     1433func (uc *upstreamConn) handleChanModes(s string) error {
     1434        parts := strings.SplitN(s, ",", 5)
     1435        if len(parts) < 4 {
     1436                return fmt.Errorf("malformed ISUPPORT CHANMODES value: %v", s)
     1437        }
     1438        modes := make(map[byte]channelModeType)
     1439        for i, mt := range []channelModeType{modeTypeA, modeTypeB, modeTypeC, modeTypeD} {
     1440                for j := 0; j < len(parts[i]); j++ {
     1441                        mode := parts[i][j]
     1442                        modes[mode] = mt
     1443                }
     1444        }
     1445        uc.availableChannelModes = modes
     1446        return nil
     1447}
     1448
     1449func (uc *upstreamConn) handleMemberships(s string) error {
     1450        if s == "" {
     1451                uc.availableMemberships = nil
     1452                return nil
     1453        }
     1454
     1455        if s[0] != '(' {
     1456                return fmt.Errorf("malformed ISUPPORT PREFIX value: %v", s)
     1457        }
     1458        sep := strings.IndexByte(s, ')')
     1459        if sep < 0 || len(s) != sep*2 {
     1460                return fmt.Errorf("malformed ISUPPORT PREFIX value: %v", s)
     1461        }
     1462        memberships := make([]membership, len(s)/2-1)
     1463        for i := range memberships {
     1464                memberships[i] = membership{
     1465                        Mode:   s[i+1],
     1466                        Prefix: s[sep+i+1],
     1467                }
     1468        }
     1469        uc.availableMemberships = memberships
     1470        return nil
     1471}
     1472
    14581473func (uc *upstreamConn) handleSupportedCaps(capsStr string) {
    14591474        caps := strings.Fields(capsStr)
Note: See TracChangeset for help on using the changeset viewer.