Synchronize selected user access

This commit is contained in:
Brandon McGinty (chatgpt)
2026-08-10 00:42:09 -04:00
committed by Brandon McGinty
parent 20c6997ab0
commit 3efbd019ce
5 changed files with 49 additions and 21 deletions
+1 -1
View File
@@ -65,7 +65,7 @@ func (b *Barnard) OpenAdminMenu() {
return return
} }
b.adminReturnItem = b.UiTree.ActiveItem() b.adminReturnItem = b.UiTree.ActiveItem()
b.adminTargetUser = b.selectedUser b.adminTargetUser = b.selectedUserValue()
b.adminTargetChan = b.Client.Self.Channel b.adminTargetChan = b.Client.Self.Channel
if b.Ui.Active() == uiViewTree { if b.Ui.Active() == uiViewTree {
switch item := b.UiTree.ActiveItem().(type) { switch item := b.UiTree.ActiveItem().(type) {
+28 -15
View File
@@ -32,20 +32,21 @@ type Barnard struct {
AutoTransmit bool // auto-start transmission on connect AutoTransmit bool // auto-start transmission on connect
Connected bool Connected bool
Ui *uiterm.Ui Ui *uiterm.Ui
UiOutput uiterm.Textview UiOutput uiterm.Textview
UiInput uiterm.Textbox UiInput uiterm.Textbox
UiStatus uiterm.Label UiStatus uiterm.Label
UiTree uiterm.Tree UiTree uiterm.Tree
UiAdmin uiterm.Tree UiAdmin uiterm.Tree
UiInputStatus uiterm.Label UiInputStatus uiterm.Label
SelectedChannel *gumble.Channel SelectedChannel *gumble.Channel
selectedUser *gumble.User selectedUser *gumble.User
adminTargetUser *gumble.User selectedUserMutex sync.RWMutex
adminTargetChan *gumble.Channel adminTargetUser *gumble.User
adminReturnItem uiterm.TreeItem adminTargetChan *gumble.Channel
statusText string adminReturnItem uiterm.TreeItem
statusNotice bool statusText string
statusNotice bool
notifyChannel chan []string notifyChannel chan []string
@@ -136,6 +137,18 @@ func (b *Barnard) setChannelMuted(channelID uint32, muted bool) {
} }
} }
func (b *Barnard) selectedUserValue() *gumble.User {
b.selectedUserMutex.RLock()
defer b.selectedUserMutex.RUnlock()
return b.selectedUser
}
func (b *Barnard) setSelectedUserValue(user *gumble.User) {
b.selectedUserMutex.Lock()
b.selectedUser = user
b.selectedUserMutex.Unlock()
}
func (b *Barnard) StopTransmission() { func (b *Barnard) StopTransmission() {
if b.Tx { if b.Tx {
b.Notify("micdown", "me", "") b.Notify("micdown", "me", "")
@@ -165,7 +178,7 @@ func (b *Barnard) TreeItemKeyPress(ui *uiterm.Ui, tree *uiterm.Tree, item uiterm
b.GotoChat() b.GotoChat()
} }
if treeItem.User != nil { if treeItem.User != nil {
if b.selectedUser == treeItem.User { if b.selectedUserValue() == treeItem.User {
b.SetSelectedUser(nil) b.SetSelectedUser(nil)
b.GotoChat() b.GotoChat()
} else { } else {
+1 -1
View File
@@ -294,7 +294,7 @@ func (b *Barnard) OnUserChange(e *gumble.UserChangeEvent) {
} }
if e.Type.Has(gumble.UserChangeDisconnected) { if e.Type.Has(gumble.UserChangeDisconnected) {
if e.User == b.selectedUser { if e.User == b.selectedUserValue() {
b.SetSelectedUser(nil) b.SetSelectedUser(nil)
} }
} }
+15
View File
@@ -84,6 +84,21 @@ func TestServerAddressDefaultsPortWithoutBreakingIPv6(t *testing.T) {
} }
} }
func TestConcurrentSelectedUserAccess(t *testing.T) {
b := &Barnard{}
user := &gumble.User{Session: 1}
var wg sync.WaitGroup
for i := 0; i < 20; i++ {
wg.Add(1)
go func(user *gumble.User) {
defer wg.Done()
b.setSelectedUserValue(user)
_ = b.selectedUserValue()
}(user)
}
wg.Wait()
}
func TestConcurrentMutedChannelAccess(t *testing.T) { func TestConcurrentMutedChannelAccess(t *testing.T) {
b := &Barnard{MutedChannels: make(map[uint32]bool)} b := &Barnard{MutedChannels: make(map[uint32]bool)}
var wg sync.WaitGroup var wg sync.WaitGroup
+4 -4
View File
@@ -57,7 +57,7 @@ func (b *Barnard) Notify(event string, who string, what string) {
} }
func (b *Barnard) SetSelectedUser(user *gumble.User) { func (b *Barnard) SetSelectedUser(user *gumble.User) {
b.selectedUser = user b.setSelectedUserValue(user)
if user == nil { if user == nil {
if len(b.UiInput.Text) > 0 { if len(b.UiInput.Text) > 0 {
} }
@@ -493,9 +493,9 @@ func (b *Barnard) OnTextInput(ui *uiterm.Ui, textbox *uiterm.Textbox, text strin
// Not a command, send as chat message // Not a command, send as chat message
if b.Client != nil && b.Client.Self != nil { if b.Client != nil && b.Client.Self != nil {
if b.selectedUser != nil { if selectedUser := b.selectedUserValue(); selectedUser != nil {
b.selectedUser.Send(text) selectedUser.Send(text)
b.AddOutputPrivateMessage(b.Client.Self, b.selectedUser, text) b.AddOutputPrivateMessage(b.Client.Self, selectedUser, text)
} else { } else {
b.Client.Self.Channel.Send(text, false) b.Client.Self.Channel.Send(text, false)
b.AddOutputMessage(b.Client.Self, text) b.AddOutputMessage(b.Client.Self, text)