mqttim

MQTT ↔ Instant Messaging Bridge
git clone https://git.instinctive.eu/mqttim.git
Log | Files | Refs | README | LICENSE

commit f9e6b1a5f0393664125c08035da51d95a9f7fc28
parent 4fd0ec78c883ff7fcf9ad04f7ee3b3a407f80de3
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date:   Wed, 29 Jan 2025 18:36:10 +0000

IRC command infrastructure
Diffstat:
Mmain.go | 64++++++++++++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 50 insertions(+), 14 deletions(-)

diff --git a/main.go b/main.go @@ -18,6 +18,9 @@ type IrcConfig struct { Channel string Server string Nick string + CmdStart string + CmdMid string + CmdEnd string SendStart string SendMid string SendEnd string @@ -62,12 +65,19 @@ func errMsg(context string, err error) Msg { } } +type command struct { + name string + arg string +} + func readConfig(path string) Config { config := Config{ Irc: IrcConfig{ - Nick: "mqttim", - SendMid: ": ", - ShowMid: ": ", + Nick: "mqttim", + CmdStart: "!", + CmdMid: " ", + SendMid: ": ", + ShowMid: ": ", }, } @@ -96,7 +106,8 @@ func main() { var m *mqtt.Client var l *mqttLogger - ircQueue := make(chan Msg) + cmdQueue := make(chan command, 10) + ircQueue := make(chan Msg, 10) config := readConfig("mqttim.toml") @@ -132,6 +143,20 @@ func main() { i.AddCallback("366", func(e *irc.Event) {}) i.AddCallback("PRIVMSG", func(e *irc.Event) { msg := e.Message() + if strings.HasPrefix(msg, config.Irc.CmdStart) && strings.HasSuffix(msg, config.Irc.CmdEnd) { + msg = msg[len(config.Irc.CmdStart) : len(msg)-len(config.Irc.CmdEnd)] + name, arg, found := strings.Cut(msg, config.Irc.CmdMid) + if !found { + name = msg + arg = "" + } + if name == "send" { + msg = arg + } else { + cmdQueue <- command{name: name, arg: arg} + return + } + } if !strings.HasPrefix(msg, config.Irc.SendStart) || !strings.HasSuffix(msg, config.Irc.SendEnd) { return } @@ -150,7 +175,7 @@ func main() { } go subscribeAll(m, ircQueue) go mqttReader(m, l, ircQueue, &config) - go ircSender(&config.Irc, i, ircQueue) + go ircSender(&config.Irc, i, ircQueue, cmdQueue) i.Loop() } @@ -191,19 +216,30 @@ func mqttReader(m *mqtt.Client, l *mqttLogger, c chan<- Msg, config *Config) { } } -func ircSender(config *IrcConfig, i *irc.Connection, c <-chan Msg) { +func ircSender(config *IrcConfig, i *irc.Connection, cm <-chan Msg, cc <-chan command) { var buf strings.Builder f := createTopicFilter(config) for { - m := <-c - if !isFiltered(&f, m.Topic) { - str := config.ShowStart + - string(m.Topic) + - config.ShowMid + - string(m.Message) + - config.ShowEnd - ircSend(config, i, str, &buf) + select { + case m := <-cm: + if !isFiltered(&f, m.Topic) { + str := config.ShowStart + + string(m.Topic) + + config.ShowMid + + string(m.Message) + + config.ShowEnd + ircSend(config, i, str, &buf) + } + case cmd := <-cc: + switch cmd.name { + case "quit": + log.Println("Quit command", cmd.arg) + i.QuitMessage = cmd.arg + i.Quit() + default: + ircSend(config, i, "Unknown command: "+cmd.name, &buf) + } } } }