Classify recursive channel messages as public
This commit is contained in:
committed by
Brandon McGinty
parent
d7dcaa8b21
commit
874cbb7818
@@ -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 {
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
Reference in New Issue
Block a user