Changeset 140 in code for trunk


Ignore:
Timestamp:
Mar 25, 2020, 8:47:26 AM (5 years ago)
Author:
delthas
Message:

Add downstream NAMES support

NAMES reply for channels currently joined will be returned from cache;
requests for channels not joined will be forwarded from upstream.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/bridge.go

    r139 r140  
    2727
    2828        // TODO: rpl_topicwhotime
     29        sendNames(dc, ch)
     30}
    2931
     32func sendNames(dc *downstreamConn, ch *upstreamChannel) {
    3033        // TODO: send multiple members in each message
     34
     35        downstreamName := dc.marshalChannel(ch.conn, ch.Name)
     36
    3137        for nick, membership := range ch.Members {
    3238                s := membership.String() + dc.marshalNick(ch.conn, nick)
  • trunk/downstream.go

    r139 r140  
    914914                        })
    915915                }
     916        case "NAMES":
     917                if len(msg.Params) == 0 {
     918                        dc.SendMessage(&irc.Message{
     919                                Prefix:  dc.srv.prefix(),
     920                                Command: irc.RPL_ENDOFNAMES,
     921                                Params:  []string{dc.nick, "*", "End of /NAMES list"},
     922                        })
     923                        return nil
     924                }
     925
     926                channels := strings.Split(msg.Params[0], ",")
     927                for _, channel := range channels {
     928                        uc, upstreamChannel, err := dc.unmarshalEntity(channel)
     929                        if err != nil {
     930                                return err
     931                        }
     932
     933                        ch, ok := uc.channels[upstreamChannel]
     934                        if ok {
     935                                sendNames(dc, ch)
     936                        } else {
     937                                // NAMES on a channel we have not joined, ask upstream
     938                                uc.SendMessage(&irc.Message{
     939                                        Command: "NAMES",
     940                                        Params:  []string{upstreamChannel},
     941                                })
     942                        }
     943                }
    916944        case "WHO":
    917945                if len(msg.Params) == 0 {
     
    920948                                Prefix:  dc.srv.prefix(),
    921949                                Command: irc.RPL_ENDOFWHO,
    922                                 Params:  []string{dc.nick, "*", "End of /WHO list."},
     950                                Params:  []string{dc.nick, "*", "End of /WHO list"},
    923951                        })
    924952                        return nil
  • trunk/upstream.go

    r139 r140  
    652652                        return err
    653653                }
    654                 ch, err := uc.getChannel(name)
    655                 if err != nil {
    656                         return err
     654
     655                ch, ok := uc.channels[name]
     656                if !ok {
     657                        // NAMES on a channel we have not joined, forward to downstream
     658                        uc.forEachDownstream(func(dc *downstreamConn) {
     659                                channel := dc.marshalChannel(uc, name)
     660                                members := strings.Split(members, " ")
     661                                for i, member := range members {
     662                                        membership, nick := uc.parseMembershipPrefix(member)
     663                                        members[i] = membership.String() + dc.marshalNick(uc, nick)
     664                                }
     665                                memberStr := strings.Join(members, " ")
     666
     667                                dc.SendMessage(&irc.Message{
     668                                        Prefix:  dc.srv.prefix(),
     669                                        Command: irc.RPL_NAMREPLY,
     670                                        Params:  []string{dc.nick, statusStr, channel, memberStr},
     671                                })
     672                        })
     673                        return nil
    657674                }
    658675
     
    672689                        return err
    673690                }
    674                 ch, err := uc.getChannel(name)
    675                 if err != nil {
    676                         return err
     691
     692                ch, ok := uc.channels[name]
     693                if !ok {
     694                        // NAMES on a channel we have not joined, forward to downstream
     695                        uc.forEachDownstream(func(dc *downstreamConn) {
     696                                channel := dc.marshalChannel(uc, name)
     697
     698                                dc.SendMessage(&irc.Message{
     699                                        Prefix:  dc.srv.prefix(),
     700                                        Command: irc.RPL_ENDOFNAMES,
     701                                        Params:  []string{dc.nick, channel, "End of /NAMES list"},
     702                                })
     703                        })
     704                        return nil
    677705                }
    678706
Note: See TracChangeset for help on using the changeset viewer.