Browse Source

Add labeled-responses for MODE

tags/v0.11.0-beta
Daniel Oaks 6 years ago
parent
commit
16a55cbba8
1 changed files with 23 additions and 15 deletions
  1. 23
    15
      irc/modes.go

+ 23
- 15
irc/modes.go View File

@@ -326,11 +326,15 @@ func (client *Client) applyUserModeChanges(force bool, changes ModeChanges) Mode
326 326
 
327 327
 // MODE <target> [<modestring> [<mode arguments>...]]
328 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 333
 	nickname, err := CasefoldName(msg.Params[0])
330 334
 	target := server.clients.Get(nickname)
331 335
 	if err != nil || target == nil {
332 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 339
 		return false
336 340
 	}
@@ -340,9 +344,9 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
340 344
 
341 345
 	if !hasPrivs {
342 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 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 351
 		return false
348 352
 	}
@@ -357,7 +361,7 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
357 361
 
358 362
 		// alert for unknown mode changes
359 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 366
 		if len(unknown) == 1 && len(changes) == 0 {
363 367
 			return false
@@ -368,13 +372,13 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
368 372
 	}
369 373
 
370 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 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 378
 		if client.flags[LocalOperator] || client.flags[Operator] {
375 379
 			masks := server.snomasks.String(client)
376 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,7 +480,7 @@ func ParseChannelModeChanges(params ...string) (ModeChanges, map[rune]bool) {
476 480
 }
477 481
 
478 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 484
 	// so we only output one warning for each list type when full
481 485
 	listFullWarned := make(map[Mode]bool)
482 486
 
@@ -521,7 +525,7 @@ func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, c
521 525
 		if !hasPrivs(change) {
522 526
 			if !alreadySentPrivError {
523 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 530
 			continue
527 531
 		}
@@ -543,7 +547,7 @@ func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, c
543 547
 			case Add:
544 548
 				if channel.lists[change.mode].Length() >= client.server.Limits().ChanListModes {
545 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 551
 						listFullWarned[change.mode] = true
548 552
 					}
549 553
 					continue
@@ -608,11 +612,15 @@ func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, c
608 612
 
609 613
 // MODE <target> [<modestring> [<mode arguments>...]]
610 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 619
 	channelName, err := CasefoldChannel(msg.Params[0])
612 620
 	channel := server.channels.Get(channelName)
613 621
 
614 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 624
 		return false
617 625
 	}
618 626
 
@@ -626,14 +634,14 @@ func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
626 634
 
627 635
 		// alert for unknown mode changes
628 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 639
 		if len(unknown) == 1 && len(changes) == 0 {
632 640
 			return false
633 641
 		}
634 642
 
635 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 647
 	// save changes to banlist/exceptlist/invexlist
@@ -661,8 +669,8 @@ func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
661 669
 		}
662 670
 	} else {
663 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 675
 	return false
668 676
 }

Loading…
Cancel
Save