Browse Source

(hopefully) fix labeled-response behaviour

tags/v0.11.0-beta
Daniel Oaks 6 years ago
parent
commit
a70cc6713c
4 changed files with 43 additions and 33 deletions
  1. 3
    0
      irc/caps/constants.go
  2. 34
    15
      irc/channel.go
  3. 3
    15
      irc/handlers.go
  4. 3
    3
      irc/responsebuffer.go

+ 3
- 0
irc/caps/constants.go View File

@@ -7,6 +7,9 @@ package caps
7 7
 type Capability string
8 8
 
9 9
 const (
10
+	// LabelTagName is the tag name used for the labeled-response spec.
11
+	LabelTagName = "draft/label"
12
+
10 13
 	// AccountNotify is this IRCv3 capability: http://ircv3.net/specs/extensions/account-notify-3.1.html
11 14
 	AccountNotify Capability = "account-notify"
12 15
 	// AccountTag is this IRCv3 capability: http://ircv3.net/specs/extensions/account-tag-3.2.html

+ 34
- 15
irc/channel.go View File

@@ -549,12 +549,26 @@ func (channel *Channel) sendMessage(msgid, cmd string, requiredCaps []caps.Capab
549 549
 	if minPrefix != nil {
550 550
 		minPrefixMode = *minPrefix
551 551
 	}
552
+	// send echo-message
553
+	if client.capabilities.Has(caps.EchoMessage) {
554
+		var messageTagsToUse *map[string]ircmsg.TagValue
555
+		if client.capabilities.Has(caps.MessageTags) {
556
+			messageTagsToUse = clientOnlyTags
557
+		}
558
+
559
+		if message == nil {
560
+			rb.AddFromClient(msgid, client, messageTagsToUse, cmd, channel.name)
561
+		} else {
562
+			rb.AddFromClient(msgid, client, messageTagsToUse, cmd, channel.name, *message)
563
+		}
564
+	}
552 565
 	for _, member := range channel.Members() {
553 566
 		if minPrefix != nil && !channel.ClientIsAtLeast(member, minPrefixMode) {
554 567
 			// STATUSMSG
555 568
 			continue
556 569
 		}
557
-		if member == client && !client.capabilities.Has(caps.EchoMessage) {
570
+		// echo-message is handled above, so skip sending the msg to the user themselves as well
571
+		if member == client {
558 572
 			continue
559 573
 		}
560 574
 
@@ -574,9 +588,9 @@ func (channel *Channel) sendMessage(msgid, cmd string, requiredCaps []caps.Capab
574 588
 		}
575 589
 
576 590
 		if message == nil {
577
-			rb.AddFromClient(msgid, client, messageTagsToUse, cmd, channel.name)
591
+			member.SendFromClient(msgid, client, messageTagsToUse, cmd, channel.name)
578 592
 		} else {
579
-			rb.AddFromClient(msgid, client, messageTagsToUse, cmd, channel.name, *message)
593
+			member.SendFromClient(msgid, client, messageTagsToUse, cmd, channel.name, *message)
580 594
 		}
581 595
 	}
582 596
 }
@@ -602,12 +616,25 @@ func (channel *Channel) sendSplitMessage(msgid, cmd string, minPrefix *modes.Mod
602 616
 	if minPrefix != nil {
603 617
 		minPrefixMode = *minPrefix
604 618
 	}
619
+	// send echo-message
620
+	if client.capabilities.Has(caps.EchoMessage) {
621
+		var tagsToUse *map[string]ircmsg.TagValue
622
+		if client.capabilities.Has(caps.MessageTags) {
623
+			tagsToUse = clientOnlyTags
624
+		}
625
+		if message == nil {
626
+			rb.AddFromClient(msgid, client, tagsToUse, cmd, channel.name)
627
+		} else {
628
+			rb.AddSplitMessageFromClient(msgid, client, tagsToUse, cmd, channel.name, *message)
629
+		}
630
+	}
605 631
 	for _, member := range channel.Members() {
606 632
 		if minPrefix != nil && !channel.ClientIsAtLeast(member, minPrefixMode) {
607 633
 			// STATUSMSG
608 634
 			continue
609 635
 		}
610
-		if member == client && !client.capabilities.Has(caps.EchoMessage) {
636
+		// echo-message is handled above, so skip sending the msg to the user themselves as well
637
+		if member == client {
611 638
 			continue
612 639
 		}
613 640
 		var tagsToUse *map[string]ircmsg.TagValue
@@ -615,18 +642,10 @@ func (channel *Channel) sendSplitMessage(msgid, cmd string, minPrefix *modes.Mod
615 642
 			tagsToUse = clientOnlyTags
616 643
 		}
617 644
 
618
-		if member == client {
619
-			if message == nil {
620
-				rb.AddFromClient(msgid, client, tagsToUse, cmd, channel.name)
621
-			} else {
622
-				rb.AddSplitMessageFromClient(msgid, client, tagsToUse, cmd, channel.name, *message)
623
-			}
645
+		if message == nil {
646
+			member.SendFromClient(msgid, client, tagsToUse, cmd, channel.name)
624 647
 		} else {
625
-			if message == nil {
626
-				member.SendFromClient(msgid, client, tagsToUse, cmd, channel.name)
627
-			} else {
628
-				member.SendSplitMsgFromClient(msgid, client, tagsToUse, cmd, channel.name, *message)
629
-			}
648
+			member.SendSplitMsgFromClient(msgid, client, tagsToUse, cmd, channel.name, *message)
630 649
 		}
631 650
 	}
632 651
 }

+ 3
- 15
irc/handlers.go View File

@@ -1770,11 +1770,7 @@ func noticeHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re
1770 1770
 			// restrict messages appropriately when +R is set
1771 1771
 			// intentionally make the sending user think the message went through fine
1772 1772
 			if !user.flags[modes.RegisteredOnly] || client.registered {
1773
-				if user == client {
1774
-					rb.AddSplitMessageFromClient(msgid, client, clientOnlyTags, "NOTICE", user.nick, splitMsg)
1775
-				} else {
1776
-					user.SendSplitMsgFromClient(msgid, client, clientOnlyTags, "NOTICE", user.nick, splitMsg)
1777
-				}
1773
+				user.SendSplitMsgFromClient(msgid, client, clientOnlyTags, "NOTICE", user.nick, splitMsg)
1778 1774
 			}
1779 1775
 			if client.capabilities.Has(caps.EchoMessage) {
1780 1776
 				rb.AddSplitMessageFromClient(msgid, client, clientOnlyTags, "NOTICE", user.nick, splitMsg)
@@ -2002,11 +1998,7 @@ func privmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *R
2002 1998
 			// restrict messages appropriately when +R is set
2003 1999
 			// intentionally make the sending user think the message went through fine
2004 2000
 			if !user.flags[modes.RegisteredOnly] || client.registered {
2005
-				if user == client {
2006
-					rb.AddSplitMessageFromClient(msgid, client, clientOnlyTags, "PRIVMSG", user.nick, splitMsg)
2007
-				} else {
2008
-					user.SendSplitMsgFromClient(msgid, client, clientOnlyTags, "PRIVMSG", user.nick, splitMsg)
2009
-				}
2001
+				user.SendSplitMsgFromClient(msgid, client, clientOnlyTags, "PRIVMSG", user.nick, splitMsg)
2010 2002
 			}
2011 2003
 			if client.capabilities.Has(caps.EchoMessage) {
2012 2004
 				rb.AddSplitMessageFromClient(msgid, client, clientOnlyTags, "PRIVMSG", user.nick, splitMsg)
@@ -2258,11 +2250,7 @@ func tagmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re
2258 2250
 			if !user.capabilities.Has(caps.MessageTags) {
2259 2251
 				continue
2260 2252
 			}
2261
-			if user == client {
2262
-				rb.AddFromClient(msgid, client, clientOnlyTags, "TAGMSG", user.nick)
2263
-			} else {
2264
-				user.SendFromClient(msgid, client, clientOnlyTags, "TAGMSG", user.nick)
2265
-			}
2253
+			user.SendFromClient(msgid, client, clientOnlyTags, "TAGMSG", user.nick)
2266 2254
 			if client.capabilities.Has(caps.EchoMessage) {
2267 2255
 				rb.AddFromClient(msgid, client, clientOnlyTags, "TAGMSG", user.nick)
2268 2256
 			}

+ 3
- 3
irc/responsebuffer.go View File

@@ -23,7 +23,7 @@ type ResponseBuffer struct {
23 23
 
24 24
 // GetLabel returns the label from the given message.
25 25
 func GetLabel(msg ircmsg.IrcMessage) string {
26
-	return msg.Tags["label"].Value
26
+	return msg.Tags[caps.LabelTagName].Value
27 27
 }
28 28
 
29 29
 // NewResponseBuffer returns a new ResponseBuffer.
@@ -90,13 +90,13 @@ func (rb *ResponseBuffer) Send() error {
90 90
 	// if label but no batch, add label to first message
91 91
 	if useLabel && batch == nil {
92 92
 		message := rb.messages[0]
93
-		message.Tags["label"] = ircmsg.MakeTagValue(rb.Label)
93
+		message.Tags[caps.LabelTagName] = ircmsg.MakeTagValue(rb.Label)
94 94
 		rb.messages[0] = message
95 95
 	}
96 96
 
97 97
 	// start batch if required
98 98
 	if batch != nil {
99
-		batch.Start(rb.target, ircmsg.MakeTags("label", rb.Label))
99
+		batch.Start(rb.target, ircmsg.MakeTags(caps.LabelTagName, rb.Label))
100 100
 	}
101 101
 
102 102
 	// send each message out

Loading…
Cancel
Save