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
|
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
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user