commit e6641b6

delthas  ·  2024-07-24 16:13:29 +0000 UTC
parent 36cbd41
Use labeled response when available

We do not use it inside senpai; but this enables third-party IRC
analysis tools/proxies that analyze messages flows to have this
information at hand in messages.
2 files changed,  +41, -0
+25, -0
 1@@ -4,12 +4,17 @@ import (
 2 	"bufio"
 3 	"fmt"
 4 	"net"
 5+	"strconv"
 6 	"strings"
 7 	"sync/atomic"
 8 	"time"
 9 	"unicode"
10 )
11 
12+// special internal Message commands to propagate labeled response status to the writing goroutine
13+var labelEnableCommand = ":enable_labeled_response"
14+var labelDisableCommand = ":disable_labeled_response"
15+
16 const chanCapacity = 64
17 
18 func ChanInOut(conn net.Conn) (in <-chan Message, out chan<- Message) {
19@@ -41,6 +46,8 @@ func ChanInOut(conn net.Conn) (in <-chan Message, out chan<- Message) {
20 	go func() {
21 		t := time.NewTicker(time.Second)
22 		defer t.Stop()
23+		labelOff := 1
24+		labeledResponse := false
25 	outer:
26 		for {
27 			select {
28@@ -48,6 +55,24 @@ func ChanInOut(conn net.Conn) (in <-chan Message, out chan<- Message) {
29 				if !ok {
30 					break outer
31 				}
32+				if msg.Command == labelEnableCommand {
33+					labeledResponse = true
34+					continue
35+				}
36+				if msg.Command == labelDisableCommand {
37+					labeledResponse = false
38+					continue
39+				}
40+				if labeledResponse {
41+					label := strconv.Itoa(labelOff)
42+					labelOff++
43+					if msg.Tags == nil {
44+						msg.Tags = map[string]string{"label": label}
45+					} else {
46+						msg.Tags["label"] = label
47+					}
48+				}
49+
50 				last.Store(time.Now())
51 				// TODO send messages by batches
52 				_, err := fmt.Fprintf(conn, "%s\r\n", msg.String())
+16, -0
 1@@ -57,6 +57,7 @@ var SupportedCapabilities = map[string]struct{}{
 2 	"echo-message":     {},
 3 	"extended-monitor": {},
 4 	"invite-notify":    {},
 5+	"labeled-response": {},
 6 	"message-tags":     {},
 7 	"multi-prefix":     {},
 8 	"server-time":      {},
 9@@ -837,6 +838,16 @@ func (s *Session) handleMessageRegistered(msg Message, playback bool) (Event, er
10 					for channel := range s.channels {
11 						s.out <- NewMessage("NAMES", channel)
12 					}
13+				} else if c.Name == "labeled-response" {
14+					if c.Enable {
15+						s.out <- Message{
16+							Command: labelEnableCommand,
17+						}
18+					} else {
19+						s.out <- Message{
20+							Command: labelDisableCommand,
21+						}
22+					}
23 				}
24 			}
25 		case "NAK":
26@@ -856,6 +867,11 @@ func (s *Session) handleMessageRegistered(msg Message, playback bool) (Event, er
27 			for _, c := range ParseCaps(caps) {
28 				delete(s.availableCaps, c.Name)
29 				delete(s.enabledCaps, c.Name)
30+				if c.Name == "labeled-response" {
31+					s.out <- Message{
32+						Command: labelDisableCommand,
33+					}
34+				}
35 			}
36 		}
37 	case "JOIN":