commit 1866cb9607a9f84c9d90b2b6c72942490c9c8487
parent f9e6b1a5f0393664125c08035da51d95a9f7fc28
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date: Thu, 30 Jan 2025 18:54:58 +0000
Filter-updating IRC commands
Diffstat:
M | main.go | | | 65 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 65 insertions(+), 0 deletions(-)
diff --git a/main.go b/main.go
@@ -3,6 +3,7 @@ package main
import (
"database/sql"
"errors"
+ "fmt"
"log"
"os"
"strings"
@@ -233,10 +234,20 @@ func ircSender(config *IrcConfig, i *irc.Connection, cm <-chan Msg, cc <-chan co
}
case cmd := <-cc:
switch cmd.name {
+ case "filters":
+ ircSendFilters(config, i, &f, &buf)
+ case "ignore":
+ filterAddIgnored(&f, cmd.arg)
+ case "important":
+ filterAddImportant(&f, cmd.arg)
case "quit":
log.Println("Quit command", cmd.arg)
i.QuitMessage = cmd.arg
i.Quit()
+ case "unignore":
+ filterDelIgnored(&f, cmd.arg)
+ case "unimportant":
+ filterDelImportant(&f, cmd.arg)
default:
ircSend(config, i, "Unknown command: "+cmd.name, &buf)
}
@@ -269,6 +280,28 @@ func ircSend(config *IrcConfig, i *irc.Connection, s string, buf *strings.Builde
}
}
+func ircSendTopicList(config *IrcConfig, i *irc.Connection, name string, topics [][]string, buf *strings.Builder) {
+ if len(topics) >= 2 {
+ ircSend(config, i, name+" = [", buf)
+ for index, topic := range topics {
+ suffix := ","
+ if index == len(topics)-1 {
+ suffix = " ]"
+ }
+ ircSend(config, i, fmt.Sprintf(" %q%s", strings.Join(topic, "/"), suffix), buf)
+ }
+ } else if len(topics) == 1 {
+ ircSend(config, i, fmt.Sprintf("%s = [%q]", name, strings.Join(topics[0], "/")), buf)
+ } else {
+ ircSend(config, i, name+" = []", buf)
+ }
+}
+
+func ircSendFilters(config *IrcConfig, i *irc.Connection, f *mqttTopicFilter, buf *strings.Builder) {
+ ircSendTopicList(config, i, "important", f.important, buf)
+ ircSendTopicList(config, i, "ignored", f.ignored, buf)
+}
+
func subscribeAll(m *mqtt.Client, ircQueue chan<- Msg) {
for {
err := m.Subscribe(nil, "#")
@@ -432,6 +465,22 @@ type mqttTopicFilter struct {
important [][]string
}
+func addPattern(topics [][]string, newPattern string) [][]string {
+ return append(topics, strings.Split(newPattern, "/"))
+}
+
+func delPattern(topics [][]string, toRemove string) [][]string {
+ var result [][]string
+
+ for _, pat := range topics {
+ if strings.Join(pat, "/") != toRemove {
+ result = append(result, pat)
+ }
+ }
+
+ return result
+}
+
func createTopicFilter(config *IrcConfig) mqttTopicFilter {
result := mqttTopicFilter{
ignored: make([][]string, len(config.Ignored)),
@@ -449,6 +498,22 @@ func createTopicFilter(config *IrcConfig) mqttTopicFilter {
return result
}
+func filterAddIgnored(filter *mqttTopicFilter, pattern string) {
+ filter.ignored = addPattern(filter.ignored, pattern)
+}
+
+func filterAddImportant(filter *mqttTopicFilter, pattern string) {
+ filter.important = addPattern(filter.important, pattern)
+}
+
+func filterDelIgnored(filter *mqttTopicFilter, pattern string) {
+ filter.ignored = delPattern(filter.ignored, pattern)
+}
+
+func filterDelImportant(filter *mqttTopicFilter, pattern string) {
+ filter.important = delPattern(filter.important, pattern)
+}
+
func isFiltered(filter *mqttTopicFilter, topic []byte) bool {
t := strings.Split(string(topic), "/")