Handle downstream JOIN/PART with multiple channel names

Closes: https://todo.sr.ht/~emersion/soju/19
This commit is contained in:
Simon Ser 2020-03-25 11:32:44 +01:00
parent 21241c2009
commit 146906ef6b
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48

View File

@ -833,35 +833,37 @@ func (dc *downstreamConn) handleMessageRegistered(msg *irc.Message) error {
uc.SendMessage(msg)
})
case "JOIN", "PART":
var name string
if err := parseMessageParams(msg, &name); err != nil {
var names string
if err := parseMessageParams(msg, &names); err != nil {
return err
}
uc, upstreamName, err := dc.unmarshalEntity(name)
if err != nil {
return ircError{&irc.Message{
Command: irc.ERR_NOSUCHCHANNEL,
Params: []string{name, err.Error()},
}}
}
uc.SendMessage(&irc.Message{
Command: msg.Command,
Params: []string{upstreamName},
})
switch msg.Command {
case "JOIN":
err := dc.srv.db.StoreChannel(uc.network.ID, &Channel{
Name: upstreamName,
})
for _, name := range strings.Split(names, ",") {
uc, upstreamName, err := dc.unmarshalEntity(name)
if err != nil {
dc.logger.Printf("failed to create channel %q in DB: %v", upstreamName, err)
return ircError{&irc.Message{
Command: irc.ERR_NOSUCHCHANNEL,
Params: []string{name, err.Error()},
}}
}
case "PART":
if err := dc.srv.db.DeleteChannel(uc.network.ID, upstreamName); err != nil {
dc.logger.Printf("failed to delete channel %q in DB: %v", upstreamName, err)
uc.SendMessage(&irc.Message{
Command: msg.Command,
Params: []string{upstreamName},
})
switch msg.Command {
case "JOIN":
err := dc.srv.db.StoreChannel(uc.network.ID, &Channel{
Name: upstreamName,
})
if err != nil {
dc.logger.Printf("failed to create channel %q in DB: %v", upstreamName, err)
}
case "PART":
if err := dc.srv.db.DeleteChannel(uc.network.ID, upstreamName); err != nil {
dc.logger.Printf("failed to delete channel %q in DB: %v", upstreamName, err)
}
}
}
case "MODE":