Bläddra i källkod

clean up RPL_CHANNELMODEIS logic (#2163)

Don't send RPL_CHANNELMODEIS for no-op changes to channel-user modes
tags/v2.14.0-rc1
Shivaram Lingamneni 4 veckor sedan
förälder
incheckning
1117680fdd
Inget konto är kopplat till bidragsgivarens mejladress
1 ändrade filer med 9 tillägg och 4 borttagningar
  1. 9
    4
      irc/modes.go

+ 9
- 4
irc/modes.go Visa fil

158
 
158
 
159
 	var alreadySentPrivError bool
159
 	var alreadySentPrivError bool
160
 
160
 
161
-	maskOpCount := 0
162
 	chname := channel.Name()
161
 	chname := channel.Name()
163
 	details := client.Details()
162
 	details := client.Details()
164
 
163
 
192
 		}
191
 		}
193
 	}
192
 	}
194
 
193
 
194
+	// should we send 324 RPL_CHANNELMODEIS? standard behavior is to send it for
195
+	// `MODE #channel`, i.e., an empty list of intended changes, but Ergo will
196
+	// also send it for no-op changes to zero-argument modes like +i
197
+	shouldSendModeIsLine := len(changes) == 0
198
+
195
 	for _, change := range changes {
199
 	for _, change := range changes {
196
 		if !hasPrivs(change) {
200
 		if !hasPrivs(change) {
197
 			if !alreadySentPrivError {
201
 			if !alreadySentPrivError {
203
 
207
 
204
 		switch change.Mode {
208
 		switch change.Mode {
205
 		case modes.BanMask, modes.ExceptMask, modes.InviteMask:
209
 		case modes.BanMask, modes.ExceptMask, modes.InviteMask:
206
-			maskOpCount += 1
207
 			if change.Op == modes.List {
210
 			if change.Op == modes.List {
208
 				channel.ShowMaskList(client, change.Mode, rb)
211
 				channel.ShowMaskList(client, change.Mode, rb)
209
 				continue
212
 				continue
313
 		default:
316
 		default:
314
 			// all channel modes with no args, e.g., InviteOnly, Secret
317
 			// all channel modes with no args, e.g., InviteOnly, Secret
315
 			if change.Op == modes.List {
318
 			if change.Op == modes.List {
319
+				shouldSendModeIsLine = true
316
 				continue
320
 				continue
317
 			}
321
 			}
318
 
322
 
319
 			if channel.flags.SetMode(change.Mode, change.Op == modes.Add) {
323
 			if channel.flags.SetMode(change.Mode, change.Op == modes.Add) {
320
 				applied = append(applied, change)
324
 				applied = append(applied, change)
325
+			} else {
326
+				shouldSendModeIsLine = true
321
 			}
327
 			}
322
 		}
328
 		}
323
 	}
329
 	}
337
 		channel.MarkDirty(includeFlags)
343
 		channel.MarkDirty(includeFlags)
338
 	}
344
 	}
339
 
345
 
340
-	// #649: don't send 324 RPL_CHANNELMODEIS if we were only working with mask lists
341
-	if len(applied) == 0 && !alreadySentPrivError && (maskOpCount == 0 || maskOpCount < len(changes)) {
346
+	if len(applied) == 0 && !alreadySentPrivError && shouldSendModeIsLine {
342
 		args := append([]string{details.nick, chname}, channel.modeStrings(client)...)
347
 		args := append([]string{details.nick, chname}, channel.modeStrings(client)...)
343
 		rb.Add(nil, client.server.name, RPL_CHANNELMODEIS, args...)
348
 		rb.Add(nil, client.server.name, RPL_CHANNELMODEIS, args...)
344
 		rb.Add(nil, client.server.name, RPL_CREATIONTIME, details.nick, chname, strconv.FormatInt(channel.createdTime.Unix(), 10))
349
 		rb.Add(nil, client.server.name, RPL_CREATIONTIME, details.nick, chname, strconv.FormatInt(channel.createdTime.Unix(), 10))

Laddar…
Avbryt
Spara