natsim

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

commit c9b7474ca3e1a3f75a54f32cf32dc33b40819081
parent a94d0254c402a06a4c61d60e8daf04adbe8d9a9b
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date:   Wed, 16 Jul 2025 19:07:13 +0000

Nick filtering
Diffstat:
Mmain.go | 48+++++++++++++++++++++++++++++++++++++-----------
1 file changed, 37 insertions(+), 11 deletions(-)

diff --git a/main.go b/main.go @@ -83,6 +83,10 @@ type IrcConfig struct { AntiFlood antiflood Filter []FilterElement AutoClear bool + AllowCmd []string + AllowSend []string + BlockCmd []string + BlockSend []string } type LogConfig struct { @@ -579,17 +583,21 @@ func (natsim *NatsIM) ircJoined(e *irc.Event) { func (natsim *NatsIM) ircReceive(e *irc.Event) { msg := e.Message() if name, arg, found := unpackMark(natsim.Irc.Cmd, msg, true); found { - natsim.cmdQueue <- command{name: name, arg: arg} - } else if subject, data, found := unpackMark(natsim.Irc.Send, msg, false); found { - natsim.curMsg.Subject = subject - natsim.curMsg.Data = []byte(data) - if err := natsim.nc.PublishMsg(&natsim.curMsg); err != nil { - natsim.ircSendError("Publish", err) - } else { - natsim.logSent(&natsim.curMsg) + if nickAllowed(e.Nick, natsim.Irc.AllowSend, natsim.Irc.BlockSend) { + natsim.cmdQueue <- command{name: name, arg: arg} } - if natsim.Irc.AutoClear { - natsim.curMsg = nats.Msg{} + } else if subject, data, found := unpackMark(natsim.Irc.Send, msg, false); found { + if nickAllowed(e.Nick, natsim.Irc.AllowCmd, natsim.Irc.BlockCmd) { + natsim.curMsg.Subject = subject + natsim.curMsg.Data = []byte(data) + if err := natsim.nc.PublishMsg(&natsim.curMsg); err != nil { + natsim.ircSendError("Publish", err) + } else { + natsim.logSent(&natsim.curMsg) + } + if natsim.Irc.AutoClear { + natsim.curMsg = nats.Msg{} + } } } } @@ -880,7 +888,7 @@ func (natsim *NatsIM) logSent(msg *nats.Msg) { natsim.logMsg(msg, natsim.insertSent, natsim.insertSHeader) } -/**************** Filters ****************/ +/**************** Message Filters ****************/ type FilterElement struct { Result bool @@ -975,6 +983,24 @@ func IsKept(subject string, data []byte, elements []FilterElement, base bool) bo return base } +/**************** Nick Filters ****************/ + +func nickAllowed(nick string, allowedList, blockedList []string) bool { + for _, blocked := range blockedList { + if nick == blocked { + return false + } + } + + for _, allowed := range allowedList { + if nick == allowed { + return true + } + } + + return len(allowedList) == 0 +} + /**************** Tools ****************/ type antiflood struct {