Changeset 17 in code for trunk


Ignore:
Timestamp:
Feb 6, 2020, 5:07:35 PM (5 years ago)
Author:
contact
Message:

Handle MODE messages from upstream servers

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/upstream.go

    r16 r17  
    66        "io"
    77        "net"
     8        "strings"
    89
    910        "gopkg.in/irc.v3"
     
    1516)
    1617
     18type modeSet string
     19
     20func (ms modeSet) Has(c byte) bool {
     21        return strings.IndexByte(string(ms), c) >= 0
     22}
     23
     24func (ms *modeSet) Add(c byte) {
     25        if !ms.Has(c) {
     26                *ms += modeSet(c)
     27        }
     28}
     29
     30func (ms *modeSet) Del(c byte) {
     31        i := strings.IndexByte(string(*ms), c)
     32        if i >= 0 {
     33                *ms = (*ms)[:i] + (*ms)[i+1:]
     34        }
     35}
     36
     37func (ms *modeSet) Apply(s string) error {
     38        var plusMinus byte
     39        for i := 0; i < len(s); i++ {
     40                switch c := s[i]; c {
     41                case '+', '-':
     42                        plusMinus = c
     43                default:
     44                        switch plusMinus {
     45                        case '+':
     46                                ms.Add(c)
     47                        case '-':
     48                                ms.Del(c)
     49                        default:
     50                                return fmt.Errorf("malformed modestring %q: missing plus/minus", s)
     51                        }
     52                }
     53        }
     54        return nil
     55}
     56
    1757type upstreamConn struct {
    1858        upstream   *Upstream
     
    2161        srv        *Server
    2262        registered bool
     63        modes      modeSet
    2364
    2465        serverName            string
     
    3677                        Params:  []string{c.srv.Hostname},
    3778                })
     79        case "MODE":
     80                if len(msg.Params) < 2 {
     81                        return newNeedMoreParamsError(msg.Command)
     82                }
     83                if nick := msg.Params[0]; nick != c.upstream.Nick {
     84                        return fmt.Errorf("received MODE message for unknow nick %q", nick)
     85                }
     86                return c.modes.Apply(msg.Params[1])
    3887        case irc.RPL_WELCOME:
    3988                c.registered = true
Note: See TracChangeset for help on using the changeset viewer.