Changeset 129 in code for trunk


Ignore:
Timestamp:
Mar 20, 2020, 9:11:27 AM (5 years ago)
Author:
delthas
Message:

Fix MODE downstream support

  • Fix replies without client as first argument
  • Replace wrong prefix check with a proper entity type check
Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r128 r129  
    151151}
    152152
    153 func (dc *downstreamConn) marshalEntity(uc *upstreamConn, name string) string {
    154         for _, r := range name {
    155                 switch r {
    156                 // TODO: support upstream ISUPPORT channel prefixes
    157                 case '#', '&', '+', '!':
    158                         return dc.marshalChannel(uc, name)
    159                 }
    160                 break
    161         }
    162         return dc.marshalNick(uc, name)
     153func (dc *downstreamConn) marshalEntity(uc *upstreamConn, entity string) string {
     154        if uc.isChannel(entity) {
     155                return dc.marshalChannel(uc, entity)
     156        }
     157        return dc.marshalNick(uc, entity)
    163158}
    164159
     
    853848                }
    854849        case "MODE":
    855                 if msg.Prefix == nil {
    856                         return fmt.Errorf("missing prefix")
    857                 }
    858 
    859850                var name string
    860851                if err := parseMessageParams(msg, &name); err != nil {
     
    867858                }
    868859
    869                 if msg.Prefix.Name != name {
    870                         uc, upstreamName, err := dc.unmarshalEntity(name)
    871                         if err != nil {
    872                                 return err
    873                         }
    874 
     860                uc, upstreamName, err := dc.unmarshalEntity(name)
     861                if err != nil {
     862                        return err
     863                }
     864
     865                if uc.isChannel(upstreamName) {
     866                        // TODO: handle MODE channel mode arguments
    875867                        if modeStr != "" {
    876868                                uc.SendMessage(&irc.Message{
     
    883875                                        return ircError{&irc.Message{
    884876                                                Command: irc.ERR_NOSUCHCHANNEL,
    885                                                 Params:  []string{name, "No such channel"},
     877                                                Params:  []string{dc.nick, name, "No such channel"},
    886878                                        }}
    887879                                }
     
    890882                                        Prefix:  dc.srv.prefix(),
    891883                                        Command: irc.RPL_CHANNELMODEIS,
    892                                         Params:  []string{name, string(ch.modes)},
     884                                        Params:  []string{dc.nick, name, string(ch.modes)},
    893885                                })
    894886                        }
     
    912904                                        Prefix:  dc.srv.prefix(),
    913905                                        Command: irc.RPL_UMODEIS,
    914                                         Params:  []string{""}, // TODO
     906                                        Params:  []string{dc.nick, ""}, // TODO
    915907                                })
    916908                        }
  • trunk/upstream.go

    r128 r129  
    135135}
    136136
     137func (uc *upstreamConn) isChannel(entity string) bool {
     138        for _, r := range entity {
     139                switch r {
     140                // TODO: support upstream ISUPPORT channel prefixes
     141                case '#', '&', '+', '!':
     142                        return true
     143                }
     144                break
     145        }
     146        return false
     147}
     148
    137149func (uc *upstreamConn) handleMessage(msg *irc.Message) error {
    138150        switch msg.Command {
     
    144156                return nil
    145157        case "MODE":
    146                 if msg.Prefix == nil {
    147                         return fmt.Errorf("missing prefix")
    148                 }
    149 
    150158                var name, modeStr string
    151159                if err := parseMessageParams(msg, &name, &modeStr); err != nil {
     
    153161                }
    154162
    155                 if name == msg.Prefix.Name { // user mode change
     163                if !uc.isChannel(name) { // user mode change
    156164                        if name != uc.nick {
    157                                 return fmt.Errorf("received MODE message for unknow nick %q", name)
     165                                return fmt.Errorf("received MODE message for unknown nick %q", name)
    158166                        }
    159167                        return uc.modes.Apply(modeStr)
    160168                } else { // channel mode change
     169                        // TODO: handle MODE channel mode arguments
    161170                        ch, err := uc.getChannel(name)
    162171                        if err != nil {
Note: See TracChangeset for help on using the changeset viewer.