diff --git a/irc/channelmanager.go b/irc/channelmanager.go index c8af03f6..5d4f2cd7 100644 --- a/irc/channelmanager.go +++ b/irc/channelmanager.go @@ -117,23 +117,25 @@ func (cm *ChannelManager) Join(client *Client, name string, key string, isSajoin return errNoSuchChannel, "" } - channel, err := func() (*Channel, error) { + channel, err, newChannel := func() (*Channel, error, bool) { + var newChannel bool cm.Lock() defer cm.Unlock() if cm.purgedChannels.Has(casefoldedName) { - return nil, errChannelPurged + return nil, errChannelPurged, false } entry := cm.chans[casefoldedName] if entry == nil { registered := cm.registeredChannels.Has(casefoldedName) // enforce OpOnlyCreation - if !registered && server.Config().Channels.OpOnlyCreation && !client.HasRoleCapabs("chanreg") { - return nil, errInsufficientPrivs + if !registered && server.Config().Channels.OpOnlyCreation && + !(isSajoin || client.HasRoleCapabs("chanreg")) { + return nil, errInsufficientPrivs, false } // enforce confusables if !registered && (cm.chansSkeletons.Has(skeleton) || cm.registeredSkeletons.Has(skeleton)) { - return nil, errConfusableIdentifier + return nil, errConfusableIdentifier, false } entry = &channelManagerEntry{ channel: NewChannel(server, name, casefoldedName, registered), @@ -148,9 +150,10 @@ func (cm *ChannelManager) Join(client *Client, name string, key string, isSajoin entry.skeleton = skeleton } cm.chans[casefoldedName] = entry + newChannel = true } entry.pendingJoins += 1 - return entry.channel, nil + return entry.channel, nil, newChannel }() if err != nil { @@ -158,7 +161,7 @@ func (cm *ChannelManager) Join(client *Client, name string, key string, isSajoin } channel.EnsureLoaded() - err, forward = channel.Join(client, key, isSajoin, rb) + err, forward = channel.Join(client, key, isSajoin || newChannel, rb) cm.maybeCleanup(channel, true)