ソースを参照

Add labeled-responses for MODE

tags/v0.11.0-beta
Daniel Oaks 6年前
コミット
16a55cbba8
1個のファイルの変更23行の追加15行の削除
  1. 23
    15
      irc/modes.go

+ 23
- 15
irc/modes.go ファイルの表示

326
 
326
 
327
 // MODE <target> [<modestring> [<mode arguments>...]]
327
 // MODE <target> [<modestring> [<mode arguments>...]]
328
 func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
328
 func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
329
+	rb := NewResponseBuffer(client)
330
+	rb.Label = GetLabel(msg)
331
+	defer rb.Send()
332
+
329
 	nickname, err := CasefoldName(msg.Params[0])
333
 	nickname, err := CasefoldName(msg.Params[0])
330
 	target := server.clients.Get(nickname)
334
 	target := server.clients.Get(nickname)
331
 	if err != nil || target == nil {
335
 	if err != nil || target == nil {
332
 		if len(msg.Params[0]) > 0 {
336
 		if len(msg.Params[0]) > 0 {
333
-			client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], client.t("No such nick"))
337
+			rb.Add(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], client.t("No such nick"))
334
 		}
338
 		}
335
 		return false
339
 		return false
336
 	}
340
 	}
340
 
344
 
341
 	if !hasPrivs {
345
 	if !hasPrivs {
342
 		if len(msg.Params) > 1 {
346
 		if len(msg.Params) > 1 {
343
-			client.Send(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't change modes for other users"))
347
+			rb.Add(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't change modes for other users"))
344
 		} else {
348
 		} else {
345
-			client.Send(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't view modes for other users"))
349
+			rb.Add(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't view modes for other users"))
346
 		}
350
 		}
347
 		return false
351
 		return false
348
 	}
352
 	}
357
 
361
 
358
 		// alert for unknown mode changes
362
 		// alert for unknown mode changes
359
 		for char := range unknown {
363
 		for char := range unknown {
360
-			client.Send(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me"))
364
+			rb.Add(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me"))
361
 		}
365
 		}
362
 		if len(unknown) == 1 && len(changes) == 0 {
366
 		if len(unknown) == 1 && len(changes) == 0 {
363
 			return false
367
 			return false
368
 	}
372
 	}
369
 
373
 
370
 	if len(applied) > 0 {
374
 	if len(applied) > 0 {
371
-		client.Send(nil, client.nickMaskString, "MODE", targetNick, applied.String())
375
+		rb.Add(nil, client.nickMaskString, "MODE", targetNick, applied.String())
372
 	} else if hasPrivs {
376
 	} else if hasPrivs {
373
-		client.Send(nil, target.nickMaskString, RPL_UMODEIS, targetNick, target.ModeString())
377
+		rb.Add(nil, target.nickMaskString, RPL_UMODEIS, targetNick, target.ModeString())
374
 		if client.flags[LocalOperator] || client.flags[Operator] {
378
 		if client.flags[LocalOperator] || client.flags[Operator] {
375
 			masks := server.snomasks.String(client)
379
 			masks := server.snomasks.String(client)
376
 			if 0 < len(masks) {
380
 			if 0 < len(masks) {
377
-				client.Send(nil, target.nickMaskString, RPL_SNOMASKIS, targetNick, masks, client.t("Server notice masks"))
381
+				rb.Add(nil, target.nickMaskString, RPL_SNOMASKIS, targetNick, masks, client.t("Server notice masks"))
378
 			}
382
 			}
379
 		}
383
 		}
380
 	}
384
 	}
476
 }
480
 }
477
 
481
 
478
 // ApplyChannelModeChanges applies a given set of mode changes.
482
 // ApplyChannelModeChanges applies a given set of mode changes.
479
-func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, changes ModeChanges) ModeChanges {
483
+func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, changes ModeChanges, rb *ResponseBuffer) ModeChanges {
480
 	// so we only output one warning for each list type when full
484
 	// so we only output one warning for each list type when full
481
 	listFullWarned := make(map[Mode]bool)
485
 	listFullWarned := make(map[Mode]bool)
482
 
486
 
521
 		if !hasPrivs(change) {
525
 		if !hasPrivs(change) {
522
 			if !alreadySentPrivError {
526
 			if !alreadySentPrivError {
523
 				alreadySentPrivError = true
527
 				alreadySentPrivError = true
524
-				client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
528
+				rb.Add(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
525
 			}
529
 			}
526
 			continue
530
 			continue
527
 		}
531
 		}
543
 			case Add:
547
 			case Add:
544
 				if channel.lists[change.mode].Length() >= client.server.Limits().ChanListModes {
548
 				if channel.lists[change.mode].Length() >= client.server.Limits().ChanListModes {
545
 					if !listFullWarned[change.mode] {
549
 					if !listFullWarned[change.mode] {
546
-						client.Send(nil, client.server.name, ERR_BANLISTFULL, client.Nick(), channel.Name(), change.mode.String(), client.t("Channel list is full"))
550
+						rb.Add(nil, client.server.name, ERR_BANLISTFULL, client.Nick(), channel.Name(), change.mode.String(), client.t("Channel list is full"))
547
 						listFullWarned[change.mode] = true
551
 						listFullWarned[change.mode] = true
548
 					}
552
 					}
549
 					continue
553
 					continue
608
 
612
 
609
 // MODE <target> [<modestring> [<mode arguments>...]]
613
 // MODE <target> [<modestring> [<mode arguments>...]]
610
 func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
614
 func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
615
+	rb := NewResponseBuffer(client)
616
+	rb.Label = GetLabel(msg)
617
+	defer rb.Send()
618
+
611
 	channelName, err := CasefoldChannel(msg.Params[0])
619
 	channelName, err := CasefoldChannel(msg.Params[0])
612
 	channel := server.channels.Get(channelName)
620
 	channel := server.channels.Get(channelName)
613
 
621
 
614
 	if err != nil || channel == nil {
622
 	if err != nil || channel == nil {
615
-		client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, msg.Params[0], client.t("No such channel"))
623
+		rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, msg.Params[0], client.t("No such channel"))
616
 		return false
624
 		return false
617
 	}
625
 	}
618
 
626
 
626
 
634
 
627
 		// alert for unknown mode changes
635
 		// alert for unknown mode changes
628
 		for char := range unknown {
636
 		for char := range unknown {
629
-			client.Send(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me"))
637
+			rb.Add(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me"))
630
 		}
638
 		}
631
 		if len(unknown) == 1 && len(changes) == 0 {
639
 		if len(unknown) == 1 && len(changes) == 0 {
632
 			return false
640
 			return false
633
 		}
641
 		}
634
 
642
 
635
 		// apply mode changes
643
 		// apply mode changes
636
-		applied = channel.ApplyChannelModeChanges(client, msg.Command == "SAMODE", changes)
644
+		applied = channel.ApplyChannelModeChanges(client, msg.Command == "SAMODE", changes, rb)
637
 	}
645
 	}
638
 
646
 
639
 	// save changes to banlist/exceptlist/invexlist
647
 	// save changes to banlist/exceptlist/invexlist
661
 		}
669
 		}
662
 	} else {
670
 	} else {
663
 		args := append([]string{client.nick, channel.name}, channel.modeStrings(client)...)
671
 		args := append([]string{client.nick, channel.name}, channel.modeStrings(client)...)
664
-		client.Send(nil, client.nickMaskString, RPL_CHANNELMODEIS, args...)
665
-		client.Send(nil, client.nickMaskString, RPL_CHANNELCREATED, client.nick, channel.name, strconv.FormatInt(channel.createdTime.Unix(), 10))
672
+		rb.Add(nil, client.nickMaskString, RPL_CHANNELMODEIS, args...)
673
+		rb.Add(nil, client.nickMaskString, RPL_CHANNELCREATED, client.nick, channel.name, strconv.FormatInt(channel.createdTime.Unix(), 10))
666
 	}
674
 	}
667
 	return false
675
 	return false
668
 }
676
 }

読み込み中…
キャンセル
保存