cmd/client/gui.go | 21 +++++++++------------ cmd/client/main.go | 30 ++++++++++++++++++++++-------- cmd/client/stats.go | 7 +++++-- doc/features.texi | 2 ++ internal/colours.go | 8 +++++--- diff --git a/cmd/client/gui.go b/cmd/client/gui.go index 4f4051cc5076f99e79b2ef4735148b898fe3e4cf53d572e6a303c3d6a4382b6e..34f1370688108dbb38d677cfda96a3f7e9383bde7ba5be472656d4e02989dd74 100644 --- a/cmd/client/gui.go +++ b/cmd/client/gui.go @@ -32,16 +32,6 @@ GUIMaxY int CurrentView = 0 ) -func guiQuit(gui *gocui.Gui, v *gocui.View) error { - Finish <- struct{}{} - return gocui.ErrQuit -} - -func mute(gui *gocui.Gui, v *gocui.View) error { - muteToggle() - return nil -} - func tabHandle(gui *gocui.Gui, v *gocui.View) error { sids := make([]int, 0, len(Streams)+1) sids = append(sids, -1) @@ -106,9 +96,8 @@ for sid := range Streams { sids = append(sids, int(sid)) } sort.Ints(sids) - var stream *Stream for _, sid := range sids { - stream = Streams[byte(sid)] + stream := Streams[byte(sid)] v, err = gui.SetView(stream.name, 0, prevY, maxX/2-1, prevY+2) if err != nil { if err != gocui.ErrUnknownView { @@ -118,6 +107,14 @@ if stream.name == *Name { v.Title = ">" + stream.name + "<" } else { v.Title = stream.name + if err := GUI.SetKeybinding( + stream.name, gocui.KeyEnter, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + stream.silenced = !stream.silenced + return nil + }, + ); err != nil { + return err + } } } _, err = gui.SetView(stream.name+"-vol", maxX/2, prevY, maxX-1, prevY+2) diff --git a/cmd/client/main.go b/cmd/client/main.go index 620dee6289b3cde532a8ab2c3533e93e1c3cb8662cb5238dd61c62c01374e92b..f485d513ffa4fa32d2a2bec43be19b9e8d779982e3da482a72dc56459931315d 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -42,12 +42,13 @@ "golang.org/x/crypto/chacha20" ) type Stream struct { - name string - ctr uint32 - actr uint32 - muted bool - in chan []byte - stats *Stats + name string + ctr uint32 + actr uint32 + muted bool + silenced bool + in chan []byte + stats *Stats } var ( @@ -315,10 +316,20 @@ GUI.SetManagerFunc(guiLayout) if err := GUI.SetKeybinding("", gocui.KeyTab, gocui.ModNone, tabHandle); err != nil { log.Fatal(err) } - if err := GUI.SetKeybinding("", gocui.KeyF1, gocui.ModNone, mute); err != nil { + if err := GUI.SetKeybinding("", gocui.KeyF1, gocui.ModNone, + func(gui *gocui.Gui, v *gocui.View) error { + muteToggle() + return nil + }, + ); err != nil { log.Fatal(err) } - if err := GUI.SetKeybinding("", gocui.KeyF10, gocui.ModNone, guiQuit); err != nil { + if err := GUI.SetKeybinding("", gocui.KeyF10, gocui.ModNone, + func(gui *gocui.Gui, v *gocui.View) error { + Finish <- struct{}{} + return gocui.ErrQuit + }, + ); err != nil { log.Fatal(err) } @@ -424,6 +435,9 @@ } pcmbuf, ok = <-playerTx if !ok { break + } + if stream.silenced { + continue } if _, err = io.Copy(player, bytes.NewReader(pcmbuf)); err != nil { diff --git a/cmd/client/stats.go b/cmd/client/stats.go index d157f44d265e4ad444a56bcaf491f95038661eec6e71dc65405ee186fbc574a5..985c3aef491dd0ef4ad5189bb0b58f3fce3c08c7539dcf23de1b52023504142b 100644 --- a/cmd/client/stats.go +++ b/cmd/client/stats.go @@ -75,11 +75,14 @@ ) if s.name == *Name && Muted { l += " | " + vors.CRed + "MUTE" + vors.CReset } else { - if s.muted { - l += " | " + vors.CRed + "MUTE" + vors.CReset + if s.silenced { + l += " | " + vors.CMagenta + "SILENT" + vors.CReset } if s.stats.last.Add(vors.ScreenRefresh).After(now) { l += " | " + vors.CGreen + "TALK" + vors.CReset + } + if s.muted { + l += " | " + vors.CRed + "MUTE" + vors.CReset } } v, err = GUI.View(s.name) diff --git a/doc/features.texi b/doc/features.texi index 279c12122a65e8e9d38df340871e5cffea605ec4406938a572f11f141fb263cd..8608dc6d8eef9454f02486527a2928b6a8c4b688237686562268d7266188b5b1 100644 --- a/doc/features.texi +++ b/doc/features.texi @@ -21,6 +21,8 @@ @item Rooms, optionally password protected. Peers are able to broadcast text message to everyone in the room. +@item Ability to silence specified peer in the room. + @item Fancy TUI client with mute-toggle ability by external utilities. @end itemize diff --git a/internal/colours.go b/internal/colours.go index 707ce8152bd6bd7bcff1cf3113f58931572a5137d0fca1a85fd9e8530596e450..b5153af9019e8fe5eb74247a7dfb264f310df3718908f25ca803059ebe5fb354 100644 --- a/internal/colours.go +++ b/internal/colours.go @@ -7,9 +7,10 @@ "golang.org/x/term" ) var ( - CGreen string - CRed string - CReset string + CGreen string + CRed string + CMagenta string + CReset string ) func init() { @@ -17,5 +18,6 @@ var b bytes.Buffer t := term.NewTerminal(&b, "") CGreen = string(t.Escape.Green) CRed = string(t.Escape.Red) + CMagenta = string(t.Escape.Magenta) CReset = string(t.Escape.Reset) }