Changeset 119 in code for trunk/downstream.go


Ignore:
Timestamp:
Mar 18, 2020, 11:06:48 PM (5 years ago)
Author:
delthas
Message:

Add suffixing for multi-upstream connections

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r117 r119  
    120120}
    121121
    122 func (dc *downstreamConn) marshalChannel(uc *upstreamConn, name string) string {
    123         return name
    124 }
    125 
    126122func (dc *downstreamConn) forEachNetwork(f func(*network)) {
    127123        if dc.network != nil {
     
    155151}
    156152
     153func (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)
     163}
     164
     165func (dc *downstreamConn) marshalChannel(uc *upstreamConn, name string) string {
     166        if dc.upstream() != nil {
     167                return name
     168        }
     169        return name + "/" + uc.network.GetName()
     170}
     171
    157172func (dc *downstreamConn) unmarshalChannel(name string) (*upstreamConn, string, error) {
    158173        if uc := dc.upstream(); uc != nil {
     
    160175        }
    161176
    162         // TODO: extract network name from channel name if dc.upstream == nil
     177        network := ""
     178        if i := strings.LastIndexByte(name, '/'); i >= 0 {
     179                network = name[i+1:]
     180                name = name[:i]
     181        }
     182
     183        if network != "" {
     184                var conn *upstreamConn
     185                dc.forEachUpstream(func(uc *upstreamConn) {
     186                        if network != uc.network.GetName() {
     187                                return
     188                        }
     189                        conn = uc
     190                })
     191                return conn, name, nil
     192        }
     193
    163194        var channel *upstreamChannel
    164195        var err error
     
    188219                return dc.nick
    189220        }
    190         return nick
     221        if dc.upstream() != nil {
     222                return nick
     223        }
     224        return nick + "/" + uc.network.GetName()
    191225}
    192226
     
    195229                return dc.prefix()
    196230        }
    197         return prefix
     231        if dc.upstream() != nil {
     232                return prefix
     233        }
     234        return &irc.Prefix{
     235                Name: prefix.Name + "/" + uc.network.GetName(),
     236                User: prefix.User,
     237                Host: prefix.Host,
     238        }
    198239}
    199240
     
    260301                                switch msg.Command {
    261302                                case "PRIVMSG":
    262                                         // TODO: detect whether it's a user or a channel
    263                                         msg.Params[0] = dc.marshalChannel(uc, msg.Params[0])
     303                                        msg.Prefix = dc.marshalUserPrefix(uc, msg.Prefix)
     304                                        msg.Params[0] = dc.marshalEntity(uc, msg.Params[0])
    264305                                default:
    265306                                        panic("expected to consume a PRIVMSG message")
Note: See TracChangeset for help on using the changeset viewer.