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
}
b.adminReturnItem = b.UiTree.ActiveItem()
b.adminTargetUser = b.selectedUser
b.adminTargetUser = b.selectedUserValue()
b.adminTargetChan = b.Client.Self.Channel
if b.Ui.Active() == uiViewTree {
switch item := b.UiTree.ActiveItem().(type) {
+14 -1
View File
@@ -41,6 +41,7 @@ type Barnard struct {
UiInputStatus uiterm.Label
SelectedChannel *gumble.Channel
selectedUser *gumble.User
selectedUserMutex sync.RWMutex
adminTargetUser *gumble.User
adminTargetChan *gumble.Channel
adminReturnItem uiterm.TreeItem
@@ -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() {
if b.Tx {
b.Notify("micdown", "me", "")
@@ -165,7 +178,7 @@ func (b *Barnard) TreeItemKeyPress(ui *uiterm.Ui, tree *uiterm.Tree, item uiterm
b.GotoChat()
}
if treeItem.User != nil {
if b.selectedUser == treeItem.User {
if b.selectedUserValue() == treeItem.User {
b.SetSelectedUser(nil)
b.GotoChat()
} else {
+1 -1
View File
@@ -294,7 +294,7 @@ func (b *Barnard) OnUserChange(e *gumble.UserChangeEvent) {
}
if e.Type.Has(gumble.UserChangeDisconnected) {
if e.User == b.selectedUser {
if e.User == b.selectedUserValue() {
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) {
b := &Barnard{MutedChannels: make(map[uint32]bool)}
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) {
b.selectedUser = user
b.setSelectedUserValue(user)
if user == nil {
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
if b.Client != nil && b.Client.Self != nil {
if b.selectedUser != nil {
b.selectedUser.Send(text)
b.AddOutputPrivateMessage(b.Client.Self, b.selectedUser, text)
if selectedUser := b.selectedUserValue(); selectedUser != nil {
selectedUser.Send(text)
b.AddOutputPrivateMessage(b.Client.Self, selectedUser, text)
} else {
b.Client.Self.Channel.Send(text, false)
b.AddOutputMessage(b.Client.Self, text)