Add suffixing for multi-upstream connections
This commit is contained in:
parent
1c41576988
commit
37e56a01b2
@ -119,10 +119,6 @@ func (dc *downstreamConn) prefix() *irc.Prefix {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dc *downstreamConn) marshalChannel(uc *upstreamConn, name string) string {
|
|
||||||
return name
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dc *downstreamConn) forEachNetwork(f func(*network)) {
|
func (dc *downstreamConn) forEachNetwork(f func(*network)) {
|
||||||
if dc.network != nil {
|
if dc.network != nil {
|
||||||
f(dc.network)
|
f(dc.network)
|
||||||
@ -154,12 +150,47 @@ func (dc *downstreamConn) upstream() *upstreamConn {
|
|||||||
return upstream
|
return upstream
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (dc *downstreamConn) marshalEntity(uc *upstreamConn, name string) string {
|
||||||
|
for _, r := range name {
|
||||||
|
switch r {
|
||||||
|
// TODO: support upstream ISUPPORT channel prefixes
|
||||||
|
case '#', '&', '+', '!':
|
||||||
|
return dc.marshalChannel(uc, name)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return dc.marshalNick(uc, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *downstreamConn) marshalChannel(uc *upstreamConn, name string) string {
|
||||||
|
if dc.upstream() != nil {
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
return name + "/" + uc.network.GetName()
|
||||||
|
}
|
||||||
|
|
||||||
func (dc *downstreamConn) unmarshalChannel(name string) (*upstreamConn, string, error) {
|
func (dc *downstreamConn) unmarshalChannel(name string) (*upstreamConn, string, error) {
|
||||||
if uc := dc.upstream(); uc != nil {
|
if uc := dc.upstream(); uc != nil {
|
||||||
return uc, name, nil
|
return uc, name, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: extract network name from channel name if dc.upstream == nil
|
network := ""
|
||||||
|
if i := strings.LastIndexByte(name, '/'); i >= 0 {
|
||||||
|
network = name[i+1:]
|
||||||
|
name = name[:i]
|
||||||
|
}
|
||||||
|
|
||||||
|
if network != "" {
|
||||||
|
var conn *upstreamConn
|
||||||
|
dc.forEachUpstream(func(uc *upstreamConn) {
|
||||||
|
if network != uc.network.GetName() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
conn = uc
|
||||||
|
})
|
||||||
|
return conn, name, nil
|
||||||
|
}
|
||||||
|
|
||||||
var channel *upstreamChannel
|
var channel *upstreamChannel
|
||||||
var err error
|
var err error
|
||||||
dc.forEachUpstream(func(uc *upstreamConn) {
|
dc.forEachUpstream(func(uc *upstreamConn) {
|
||||||
@ -187,15 +218,25 @@ func (dc *downstreamConn) marshalNick(uc *upstreamConn, nick string) string {
|
|||||||
if nick == uc.nick {
|
if nick == uc.nick {
|
||||||
return dc.nick
|
return dc.nick
|
||||||
}
|
}
|
||||||
|
if dc.upstream() != nil {
|
||||||
return nick
|
return nick
|
||||||
}
|
}
|
||||||
|
return nick + "/" + uc.network.GetName()
|
||||||
|
}
|
||||||
|
|
||||||
func (dc *downstreamConn) marshalUserPrefix(uc *upstreamConn, prefix *irc.Prefix) *irc.Prefix {
|
func (dc *downstreamConn) marshalUserPrefix(uc *upstreamConn, prefix *irc.Prefix) *irc.Prefix {
|
||||||
if prefix.Name == uc.nick {
|
if prefix.Name == uc.nick {
|
||||||
return dc.prefix()
|
return dc.prefix()
|
||||||
}
|
}
|
||||||
|
if dc.upstream() != nil {
|
||||||
return prefix
|
return prefix
|
||||||
}
|
}
|
||||||
|
return &irc.Prefix{
|
||||||
|
Name: prefix.Name + "/" + uc.network.GetName(),
|
||||||
|
User: prefix.User,
|
||||||
|
Host: prefix.Host,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (dc *downstreamConn) isClosed() bool {
|
func (dc *downstreamConn) isClosed() bool {
|
||||||
select {
|
select {
|
||||||
@ -259,8 +300,8 @@ func (dc *downstreamConn) writeMessages() error {
|
|||||||
msg = msg.Copy()
|
msg = msg.Copy()
|
||||||
switch msg.Command {
|
switch msg.Command {
|
||||||
case "PRIVMSG":
|
case "PRIVMSG":
|
||||||
// TODO: detect whether it's a user or a channel
|
msg.Prefix = dc.marshalUserPrefix(uc, msg.Prefix)
|
||||||
msg.Params[0] = dc.marshalChannel(uc, msg.Params[0])
|
msg.Params[0] = dc.marshalEntity(uc, msg.Params[0])
|
||||||
default:
|
default:
|
||||||
panic("expected to consume a PRIVMSG message")
|
panic("expected to consume a PRIVMSG message")
|
||||||
}
|
}
|
||||||
|
1
user.go
1
user.go
@ -160,7 +160,6 @@ func (u *user) run() {
|
|||||||
|
|
||||||
func (u *user) createNetwork(addr, nick string) (*network, error) {
|
func (u *user) createNetwork(addr, nick string) (*network, error) {
|
||||||
network := newNetwork(u, &Network{
|
network := newNetwork(u, &Network{
|
||||||
Name: addr,
|
|
||||||
Addr: addr,
|
Addr: addr,
|
||||||
Nick: nick,
|
Nick: nick,
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user