Classify recursive channel messages as public

This commit is contained in:
Brandon McGinty (chatgpt)
2026-08-10 00:00:40 -04:00
committed by Brandon McGinty
parent d7dcaa8b21
commit 874cbb7818
2 changed files with 37 additions and 8 deletions
+23 -8
View File
@@ -230,14 +230,7 @@ func (b *Barnard) Log(s string) {
} }
func (b *Barnard) OnTextMessage(e *gumble.TextMessageEvent) { func (b *Barnard) OnTextMessage(e *gumble.TextMessageEvent) {
var public = false if b.isPublicTextMessage(e) {
for _, c := range e.Channels {
if c.Name == b.Client.Self.Channel.Name {
public = true
break
}
}
if public {
sender := "Server" sender := "Server"
if e.Sender != nil { if e.Sender != nil {
sender = e.Sender.Name sender = e.Sender.Name
@@ -256,6 +249,28 @@ func (b *Barnard) OnTextMessage(e *gumble.TextMessageEvent) {
} }
} }
// isPublicTextMessage reports whether a message targets the current channel,
// either directly or through a recursive channel-tree recipient.
func (b *Barnard) isPublicTextMessage(e *gumble.TextMessageEvent) bool {
if e == nil || b.Client == nil || b.Client.Self == nil || b.Client.Self.Channel == nil {
return false
}
current := b.Client.Self.Channel
for _, channel := range e.Channels {
if sameChannel(channel, current) {
return true
}
}
for _, root := range e.Trees {
for channel := current; channel != nil; channel = channel.Parent {
if sameChannel(channel, root) {
return true
}
}
}
return false
}
func (b *Barnard) OnUserChange(e *gumble.UserChangeEvent) { func (b *Barnard) OnUserChange(e *gumble.UserChangeEvent) {
notification, hasNotification := b.userChangeNotification(e) notification, hasNotification := b.userChangeNotification(e)
if e.User != nil { if e.User != nil {
+14
View File
@@ -83,6 +83,20 @@ func TestServerAddressDefaultsPortWithoutBreakingIPv6(t *testing.T) {
} }
} }
func TestPublicTextMessageTargetsChannelIDsAndTrees(t *testing.T) {
root := &gumble.Channel{ID: 1, Name: "Root"}
current := &gumble.Channel{ID: 2, Name: "Room", Parent: root}
b := &Barnard{Client: &gumble.Client{Self: &gumble.User{Channel: current}}}
if !b.isPublicTextMessage(&gumble.TextMessageEvent{TextMessage: gumble.TextMessage{Trees: []*gumble.Channel{root}}}) {
t.Fatal("recursive message to an ancestor was not public")
}
other := &gumble.Channel{ID: 3, Name: "Room"}
if b.isPublicTextMessage(&gumble.TextMessageEvent{TextMessage: gumble.TextMessage{Channels: []*gumble.Channel{other}}}) {
t.Fatal("message to a different channel with the same name was public")
}
}
func TestPublicServerMessageDoesNotPanic(t *testing.T) { func TestPublicServerMessageDoesNotPanic(t *testing.T) {
channel := &gumble.Channel{ID: 1, Name: "Current"} channel := &gumble.Channel{ID: 1, Name: "Current"}
b := &Barnard{ b := &Barnard{