Synchronize selected user access
This commit is contained in:
committed by
Brandon McGinty
parent
20c6997ab0
commit
3efbd019ce
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user