Forward user mode changes in single-upstream mode
References: https://todo.sr.ht/~emersion/soju/20
This commit is contained in:
parent
2fe0a57e43
commit
0e9ef1f97c
@ -1102,6 +1102,13 @@ func (dc *downstreamConn) welcome() error {
|
|||||||
for _, msg := range generateIsupport(dc.srv.prefix(), dc.nick, isupport) {
|
for _, msg := range generateIsupport(dc.srv.prefix(), dc.nick, isupport) {
|
||||||
dc.SendMessage(msg)
|
dc.SendMessage(msg)
|
||||||
}
|
}
|
||||||
|
if uc := dc.upstream(); uc != nil {
|
||||||
|
dc.SendMessage(&irc.Message{
|
||||||
|
Prefix: dc.srv.prefix(),
|
||||||
|
Command: irc.RPL_UMODEIS,
|
||||||
|
Params: []string{dc.nick, string(uc.modes)},
|
||||||
|
})
|
||||||
|
}
|
||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: dc.srv.prefix(),
|
Prefix: dc.srv.prefix(),
|
||||||
Command: irc.ERR_NOMOTD,
|
Command: irc.ERR_NOMOTD,
|
||||||
@ -1601,11 +1608,15 @@ func (dc *downstreamConn) handleMessageRegistered(msg *irc.Message) error {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// TODO: only do this in multi-upstream mode
|
var userMode string
|
||||||
|
if uc := dc.upstream(); uc != nil {
|
||||||
|
userMode = string(uc.modes)
|
||||||
|
}
|
||||||
|
|
||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: dc.srv.prefix(),
|
Prefix: dc.srv.prefix(),
|
||||||
Command: irc.RPL_UMODEIS,
|
Command: irc.RPL_UMODEIS,
|
||||||
Params: []string{dc.nick, ""}, // TODO
|
Params: []string{dc.nick, userMode},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
39
upstream.go
39
upstream.go
@ -672,11 +672,11 @@ func (uc *upstreamConn) handleMessage(msg *irc.Message) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
uc.forEachDownstreamByID(downstreamID, func (dc *downstreamConn) {
|
uc.forEachDownstreamByID(downstreamID, func(dc *downstreamConn) {
|
||||||
dc.SendMessage(&irc.Message {
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: uc.srv.prefix(),
|
Prefix: uc.srv.prefix(),
|
||||||
Command: msg.Command,
|
Command: msg.Command,
|
||||||
Params: msg.Params,
|
Params: msg.Params,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
case "BATCH":
|
case "BATCH":
|
||||||
@ -932,8 +932,18 @@ func (uc *upstreamConn) handleMessage(msg *irc.Message) error {
|
|||||||
if name != uc.nick {
|
if name != uc.nick {
|
||||||
return fmt.Errorf("received MODE message for unknown nick %q", name)
|
return fmt.Errorf("received MODE message for unknown nick %q", name)
|
||||||
}
|
}
|
||||||
return uc.modes.Apply(modeStr)
|
|
||||||
// TODO: notify downstreams about user mode change?
|
if err := uc.modes.Apply(modeStr); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
uc.forEachDownstream(func(dc *downstreamConn) {
|
||||||
|
if dc.upstream() == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dc.SendMessage(msg)
|
||||||
|
})
|
||||||
} else { // channel mode change
|
} else { // channel mode change
|
||||||
ch, err := uc.getChannel(name)
|
ch, err := uc.getChannel(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -982,7 +992,14 @@ func (uc *upstreamConn) handleMessage(msg *irc.Message) error {
|
|||||||
if err := uc.modes.Apply(modeStr); err != nil {
|
if err := uc.modes.Apply(modeStr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// TODO: send RPL_UMODEIS to downstream connections when applicable
|
|
||||||
|
uc.forEachDownstream(func(dc *downstreamConn) {
|
||||||
|
if dc.upstream() == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dc.SendMessage(msg)
|
||||||
|
})
|
||||||
case irc.RPL_CHANNELMODEIS:
|
case irc.RPL_CHANNELMODEIS:
|
||||||
var channel string
|
var channel string
|
||||||
if err := parseMessageParams(msg, nil, &channel); err != nil {
|
if err := parseMessageParams(msg, nil, &channel); err != nil {
|
||||||
@ -1442,11 +1459,11 @@ func (uc *upstreamConn) handleMessage(msg *irc.Message) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
uc.forEachDownstreamByID(downstreamID, func (dc *downstreamConn) {
|
uc.forEachDownstreamByID(downstreamID, func(dc *downstreamConn) {
|
||||||
dc.SendMessage(&irc.Message {
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: uc.srv.prefix(),
|
Prefix: uc.srv.prefix(),
|
||||||
Command: msg.Command,
|
Command: msg.Command,
|
||||||
Params: msg.Params,
|
Params: msg.Params,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
case irc.RPL_LISTSTART:
|
case irc.RPL_LISTSTART:
|
||||||
|
Loading…
Reference in New Issue
Block a user