|
@@ -65,19 +65,30 @@ func (cm *ChannelManager) Join(client *Client, name string, key string, isSajoin
|
65
|
65
|
return errNoSuchChannel
|
66
|
66
|
}
|
67
|
67
|
|
68
|
|
- cm.Lock()
|
69
|
|
- entry := cm.chans[casefoldedName]
|
70
|
|
- if entry == nil {
|
71
|
|
- registered := cm.registeredChannels[casefoldedName]
|
72
|
|
- entry = &channelManagerEntry{
|
73
|
|
- channel: NewChannel(server, name, registered),
|
74
|
|
- pendingJoins: 0,
|
|
68
|
+ channel := func() *Channel {
|
|
69
|
+ cm.Lock()
|
|
70
|
+ defer cm.Unlock()
|
|
71
|
+
|
|
72
|
+ entry := cm.chans[casefoldedName]
|
|
73
|
+ if entry == nil {
|
|
74
|
+ registered := cm.registeredChannels[casefoldedName]
|
|
75
|
+ // enforce OpOnlyCreation
|
|
76
|
+ if !registered && server.Config().Channels.OpOnlyCreation && !client.HasRoleCapabs("chanreg") {
|
|
77
|
+ return nil
|
|
78
|
+ }
|
|
79
|
+ entry = &channelManagerEntry{
|
|
80
|
+ channel: NewChannel(server, name, registered),
|
|
81
|
+ pendingJoins: 0,
|
|
82
|
+ }
|
|
83
|
+ cm.chans[casefoldedName] = entry
|
75
|
84
|
}
|
76
|
|
- cm.chans[casefoldedName] = entry
|
|
85
|
+ entry.pendingJoins += 1
|
|
86
|
+ return entry.channel
|
|
87
|
+ }()
|
|
88
|
+
|
|
89
|
+ if channel == nil {
|
|
90
|
+ return errNoSuchChannel
|
77
|
91
|
}
|
78
|
|
- entry.pendingJoins += 1
|
79
|
|
- channel := entry.channel
|
80
|
|
- cm.Unlock()
|
81
|
92
|
|
82
|
93
|
channel.EnsureLoaded()
|
83
|
94
|
channel.Join(client, key, isSajoin, rb)
|