ScuttleBot

add audit support for user join and part events - Add support for auditing IRC JOIN and PART events - Record user.join and user.part events in audit log - Apply audit type filtering for consistency - Improve structured logging in write()

noreply 2026-04-04 14:29 trunk
Commit a146d2cfa49504749ff8850558405d0808b83e617273717934dc57bc780581a6
--- internal/bots/auditbot/auditbot.go
+++ internal/bots/auditbot/auditbot.go
@@ -154,11 +154,50 @@
154154
Nick: nick,
155155
MessageType: env.Type,
156156
MessageID: env.ID,
157157
})
158158
})
159
+ c.Handlers.AddBg(girc.JOIN, func(_ *girc.Client, e girc.Event) {
160
+ if len(e.Params) == 0 {
161
+ return
162
+ }
163
+
164
+
165
+ if !b.shouldAudit(EventUserJoin) {
166
+ return
167
+ }
168
+
169
+ channel := e.Params[0]
170
+ nick := extractNick(e)
171
+
172
+ b.write(Entry{
173
+ Kind: KindIRC,
174
+ Channel: channel,
175
+ Nick: nick,
176
+ MessageType: EventUserJoin,
177
+ })
178
+})
179
+
180
+c.Handlers.AddBg(girc.PART, func(_ *girc.Client, e girc.Event) {
181
+ if len(e.Params) == 0 {
182
+ return
183
+ }
184
+ if !b.shouldAudit(EventUserPart) {
185
+ return
186
+ channel := e.Params[0]
187
+ nick := ""
188
+ if e.Source != nil {
189
+ nick = e.Source.Name
190
+ }
159191
192
+ b.write(Entry{
193
+ Kind: KindIRC,
194
+ Channel: channel,
195
+ Nick: nick,
196
+ MessageType: "user.part",
197
+ })
198
+})
160199
b.client = c
161200
162201
errCh := make(chan error, 1)
163202
go func() {
164203
if err := c.Connect(); err != nil && ctx.Err() == nil {
@@ -191,11 +230,17 @@
191230
}
192231
193232
func (b *Bot) write(e Entry) {
194233
e.At = time.Now()
195234
if err := b.store.Append(e); err != nil {
196
- b.log.Error("auditbot: failed to write entry", "type", e.MessageType, "err", err)
235
+ b.log.Error("failed to write audit entry",
236
+ "type", e.MessageType,
237
+ "nick", e.Nick,
238
+ "channel", e.Channel,
239
+ "kind", e.Kind,
240
+ "err", err,
241
+)
197242
}
198243
}
199244
200245
func (b *Bot) auditTypesList() []string {
201246
if len(b.auditTypes) == 0 {
202247
--- internal/bots/auditbot/auditbot.go
+++ internal/bots/auditbot/auditbot.go
@@ -154,11 +154,50 @@
154 Nick: nick,
155 MessageType: env.Type,
156 MessageID: env.ID,
157 })
158 })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
 
 
 
 
 
 
 
160 b.client = c
161
162 errCh := make(chan error, 1)
163 go func() {
164 if err := c.Connect(); err != nil && ctx.Err() == nil {
@@ -191,11 +230,17 @@
191 }
192
193 func (b *Bot) write(e Entry) {
194 e.At = time.Now()
195 if err := b.store.Append(e); err != nil {
196 b.log.Error("auditbot: failed to write entry", "type", e.MessageType, "err", err)
 
 
 
 
 
 
197 }
198 }
199
200 func (b *Bot) auditTypesList() []string {
201 if len(b.auditTypes) == 0 {
202
--- internal/bots/auditbot/auditbot.go
+++ internal/bots/auditbot/auditbot.go
@@ -154,11 +154,50 @@
154 Nick: nick,
155 MessageType: env.Type,
156 MessageID: env.ID,
157 })
158 })
159 c.Handlers.AddBg(girc.JOIN, func(_ *girc.Client, e girc.Event) {
160 if len(e.Params) == 0 {
161 return
162 }
163
164
165 if !b.shouldAudit(EventUserJoin) {
166 return
167 }
168
169 channel := e.Params[0]
170 nick := extractNick(e)
171
172 b.write(Entry{
173 Kind: KindIRC,
174 Channel: channel,
175 Nick: nick,
176 MessageType: EventUserJoin,
177 })
178 })
179
180 c.Handlers.AddBg(girc.PART, func(_ *girc.Client, e girc.Event) {
181 if len(e.Params) == 0 {
182 return
183 }
184 if !b.shouldAudit(EventUserPart) {
185 return
186 channel := e.Params[0]
187 nick := ""
188 if e.Source != nil {
189 nick = e.Source.Name
190 }
191
192 b.write(Entry{
193 Kind: KindIRC,
194 Channel: channel,
195 Nick: nick,
196 MessageType: "user.part",
197 })
198 })
199 b.client = c
200
201 errCh := make(chan error, 1)
202 go func() {
203 if err := c.Connect(); err != nil && ctx.Err() == nil {
@@ -191,11 +230,17 @@
230 }
231
232 func (b *Bot) write(e Entry) {
233 e.At = time.Now()
234 if err := b.store.Append(e); err != nil {
235 b.log.Error("failed to write audit entry",
236 "type", e.MessageType,
237 "nick", e.Nick,
238 "channel", e.Channel,
239 "kind", e.Kind,
240 "err", err,
241 )
242 }
243 }
244
245 func (b *Bot) auditTypesList() []string {
246 if len(b.auditTypes) == 0 {
247

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button