Changeset 46 in code for trunk


Ignore:
Timestamp:
Feb 7, 2020, 12:08:27 PM (5 years ago)
Author:
contact
Message:

Handle downstream MODE messages

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r45 r46  
    247247                        uc.messages <- msg
    248248                })
     249        case "MODE":
     250                var name string
     251                if err := parseMessageParams(msg, &name); err != nil {
     252                        return err
     253                }
     254
     255                var modeStr string
     256                if len(msg.Params) > 1 {
     257                        modeStr = msg.Params[1]
     258                }
     259
     260                if msg.Prefix.Name != name {
     261                        ch, err := c.user.getChannel(name)
     262                        if err != nil {
     263                                return err
     264                        }
     265
     266                        if modeStr != "" {
     267                                ch.conn.messages <- msg
     268                        } else {
     269                                c.messages <- &irc.Message{
     270                                        Prefix:  c.srv.prefix(),
     271                                        Command: irc.RPL_CHANNELMODEIS,
     272                                        Params:  []string{ch.Name, string(ch.modes)},
     273                                }
     274                        }
     275                } else {
     276                        if name != c.nick {
     277                                return ircError{&irc.Message{
     278                                        Command: irc.ERR_USERSDONTMATCH,
     279                                        Params:  []string{c.nick, "Cannot change mode for other users"},
     280                                }}
     281                        }
     282
     283                        if modeStr != "" {
     284                                c.user.forEachUpstream(func(uc *upstreamConn) {
     285                                        uc.messages <- msg
     286                                })
     287                        } else {
     288                                c.messages <- &irc.Message{
     289                                        Prefix:  c.srv.prefix(),
     290                                        Command: irc.RPL_UMODEIS,
     291                                        Params:  []string{""}, // TODO
     292                                }
     293                        }
     294                }
    249295        default:
    250296                c.logger.Printf("unhandled message: %v", msg)
  • trunk/server.go

    r44 r46  
    5858        }
    5959        u.lock.Unlock()
     60}
     61
     62func (u *user) getChannel(name string) (*upstreamChannel, error) {
     63        var channel *upstreamChannel
     64        var err error
     65        u.forEachUpstream(func(uc *upstreamConn) {
     66                if err != nil {
     67                        return
     68                }
     69                if ch, ok := uc.channels[name]; ok {
     70                        if channel != nil {
     71                                err = fmt.Errorf("ambiguous channel name %q", name)
     72                        } else {
     73                                channel = ch
     74                        }
     75                }
     76        })
     77        if channel == nil {
     78                return nil, fmt.Errorf("unknown channel %q", name)
     79        }
     80        return channel, nil
    6081}
    6182
  • trunk/upstream.go

    r45 r46  
    1515type upstreamChannel struct {
    1616        Name      string
     17        conn      *upstreamConn
    1718        Topic     string
    1819        TopicWho  string
     
    127128                                return err
    128129                        }
    129 
    130                         c.user.forEachDownstream(func(dc *downstreamConn) {
    131                                 dc.messages <- msg
    132                         })
    133                 }
     130                }
     131
     132                c.user.forEachDownstream(func(dc *downstreamConn) {
     133                        dc.messages <- msg
     134                })
    134135        case "NOTICE":
    135136                c.logger.Print(msg)
     
    183184                                c.channels[ch] = &upstreamChannel{
    184185                                        Name:    ch,
     186                                        conn:    c,
    185187                                        Members: make(map[string]membership),
    186188                                }
Note: See TracChangeset for help on using the changeset viewer.