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":