|
@@ -2658,31 +2658,54 @@ func relaymsgHandler(server *Server, client *Client, msg ircmsg.Message, rb *Res
|
2658
|
2658
|
return false
|
2659
|
2659
|
}
|
2660
|
2660
|
|
|
2661
|
+ // #1647: we need to publish a full NUH. send ~u (or the configured alternative)
|
|
2662
|
+ // as the user/ident, and send the relayer's hostname as the hostname:
|
|
2663
|
+ ident := config.Server.CoerceIdent
|
|
2664
|
+ if ident == "" {
|
|
2665
|
+ ident = "~u"
|
|
2666
|
+ }
|
|
2667
|
+ hostname := client.Hostname()
|
|
2668
|
+ nuh := fmt.Sprintf("%s!%s@%s", nick, ident, hostname)
|
|
2669
|
+
|
2661
|
2670
|
channel.AddHistoryItem(history.Item{
|
2662
|
2671
|
Type: history.Privmsg,
|
2663
|
2672
|
Message: message,
|
2664
|
|
- Nick: nick,
|
|
2673
|
+ Nick: nuh,
|
2665
|
2674
|
}, "")
|
2666
|
2675
|
|
2667
|
|
- // send msg
|
2668
|
|
- channelName := channel.Name()
|
2669
|
|
- relayTags := map[string]string{
|
2670
|
|
- caps.RelaymsgTagName: client.Nick(),
|
|
2676
|
+ // 3 possibilities for tags:
|
|
2677
|
+ // no tags, the relaymsg tag only, or the relaymsg tag together with all client-only tags
|
|
2678
|
+ cnick := client.Nick()
|
|
2679
|
+ relayTag := map[string]string{
|
|
2680
|
+ caps.RelaymsgTagName: cnick,
|
2671
|
2681
|
}
|
2672
|
|
- for t, v := range msg.ClientOnlyTags() {
|
2673
|
|
- relayTags[t] = v
|
|
2682
|
+ clientOnlyTags := msg.ClientOnlyTags()
|
|
2683
|
+ var fullTags map[string]string
|
|
2684
|
+ if len(clientOnlyTags) == 0 {
|
|
2685
|
+ fullTags = relayTag
|
|
2686
|
+ } else {
|
|
2687
|
+ fullTags = make(map[string]string, 1+len(clientOnlyTags))
|
|
2688
|
+ fullTags[caps.RelaymsgTagName] = cnick
|
|
2689
|
+ for t, v := range clientOnlyTags {
|
|
2690
|
+ fullTags[t] = v
|
|
2691
|
+ }
|
2674
|
2692
|
}
|
|
2693
|
+
|
|
2694
|
+ // actually send the message
|
|
2695
|
+ channelName := channel.Name()
|
2675
|
2696
|
for _, member := range channel.Members() {
|
2676
|
2697
|
for _, session := range member.Sessions() {
|
2677
|
2698
|
var tagsToUse map[string]string
|
2678
|
|
- if session.capabilities.Has(caps.Relaymsg) {
|
2679
|
|
- tagsToUse = relayTags
|
|
2699
|
+ if session.capabilities.Has(caps.MessageTags) {
|
|
2700
|
+ tagsToUse = fullTags
|
|
2701
|
+ } else if session.capabilities.Has(caps.Relaymsg) {
|
|
2702
|
+ tagsToUse = relayTag
|
2680
|
2703
|
}
|
2681
|
2704
|
|
2682
|
2705
|
if session == rb.session {
|
2683
|
|
- rb.AddSplitMessageFromClient(nick, "*", false, tagsToUse, "PRIVMSG", channelName, message)
|
|
2706
|
+ rb.AddSplitMessageFromClient(nuh, "*", false, tagsToUse, "PRIVMSG", channelName, message)
|
2684
|
2707
|
} else {
|
2685
|
|
- session.sendSplitMsgFromClientInternal(false, nick, "*", false, tagsToUse, "PRIVMSG", channelName, message)
|
|
2708
|
+ session.sendSplitMsgFromClientInternal(false, nuh, "*", false, tagsToUse, "PRIVMSG", channelName, message)
|
2686
|
2709
|
}
|
2687
|
2710
|
}
|
2688
|
2711
|
}
|