From: Sergey Matveev Date: Sun, 28 Apr 2024 12:48:20 +0000 (+0300) Subject: Notification about peer mute toggling X-Git-Tag: v3.0.0~6 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=5569499c9f56574e12d28c482fc7341ab0e0c22c1862b9c99a659d92cf81ae4a;p=vors.git Notification about peer mute toggling --- diff --git a/cmd/client/gui.go b/cmd/client/gui.go index 798db14..4b06cac 100644 --- a/cmd/client/gui.go +++ b/cmd/client/gui.go @@ -35,7 +35,7 @@ func guiQuit(gui *gocui.Gui, v *gocui.View) error { } func mute(gui *gocui.Gui, v *gocui.View) error { - Muted = !Muted + muteToggle() return nil } diff --git a/cmd/client/main.go b/cmd/client/main.go index a07c75e..81db880 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -55,6 +55,7 @@ var ( Name = flag.String("name", "test", "username") Room = flag.String("room", "/", "room name") Muted bool + Ctrl = make(chan []byte) ) func incr(data []byte) { @@ -67,6 +68,20 @@ func incr(data []byte) { panic("overflow") } +func muteToggle() (muted bool) { + Muted = !Muted + if Ctrl != nil { + var cmd string + if Muted { + cmd = vors.CmdMuted + } else { + cmd = vors.CmdUnmuted + } + Ctrl <- vors.ArgsEncode([]byte(cmd)) + } + return Muted +} + func main() { srvAddr := flag.String("srv", "vors.home.arpa:"+strconv.Itoa(vors.DefaultPort), "host:TCP/UDP port to connect to") @@ -75,7 +90,8 @@ func main() { playCmd := flag.String("play", "play "+vors.SoxParams, "play command") vadRaw := flag.Uint("vad", 0, "VAD threshold") passwd := flag.String("passwd", "", "protected room's password") - muteToggle := flag.String("mute-toggle", "", "path to FIFO to toggle mute") + muteTogglePth := flag.String("mute-toggle", "", + "path to FIFO to toggle mute") prefer4 := flag.Bool("4", false, "Prefer obsolete legacy IPv4 address during name resolution") version := flag.Bool("version", false, "print version") @@ -105,17 +121,16 @@ func main() { *Name = strings.ReplaceAll(*Name, " ", "-") go func() { - if *muteToggle == "" { + if *muteTogglePth == "" { return } for { - fd, err := os.OpenFile(*muteToggle, os.O_WRONLY, os.FileMode(0666)) + fd, err := os.OpenFile(*muteTogglePth, os.O_WRONLY, os.FileMode(0666)) if err != nil { log.Fatalln(err) } - Muted = !Muted var reply string - if Muted { + if muteToggle() { reply = "muted" } else { reply = "unmuted" @@ -328,11 +343,8 @@ func main() { }() go func() { - for { - time.Sleep(vors.PingTime) - buf, err := txCS.Encrypt(nil, nil, vors.ArgsEncode( - []byte(vors.CmdPing), - )) + for buf := range Ctrl { + buf, err = txCS.Encrypt(nil, nil, buf) if err != nil { log.Fatalln("tx encrypt:", err) } @@ -342,6 +354,13 @@ func main() { } }() + go func() { + for { + time.Sleep(vors.PingTime) + Ctrl <- vors.ArgsEncode([]byte(vors.CmdPing)) + } + }() + go func(seen *time.Time) { var now time.Time for buf := range rx { @@ -502,6 +521,22 @@ func main() { delete(Streams, sid) close(s.in) close(s.stats.dead) + case vors.CmdMuted: + sid := args[1][0] + s := Streams[sid] + if s == nil { + log.Println("unknown sid:", sid) + continue + } + s.stats.muted = true + case vors.CmdUnmuted: + sid := args[1][0] + s := Streams[sid] + if s == nil { + log.Println("unknown sid:", sid) + continue + } + s.stats.muted = false default: log.Fatal("unexpected cmd:", cmd) } diff --git a/cmd/client/stats.go b/cmd/client/stats.go index 3e29d70..30a490a 100644 --- a/cmd/client/stats.go +++ b/cmd/client/stats.go @@ -36,6 +36,7 @@ type Stats struct { last time.Time vol uint64 volN uint64 + muted bool dead chan struct{} } @@ -74,6 +75,9 @@ func statsDrawer(stats *Stats, name string) { if name == *Name && Muted { s += " | " + vors.CRed + "MUTE" + vors.CReset } else { + if stats.muted { + s += " | " + vors.CRed + "MUTE" + vors.CReset + } if stats.last.Add(vors.ScreenRefresh).After(now) { s += " | " + vors.CGreen + "TALK" + vors.CReset } diff --git a/cmd/server/main.go b/cmd/server/main.go index 7208476..9ede9f6 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -306,10 +306,28 @@ func newPeer(conn *net.TCPConn) { logger.Error("empty args") break } + seen = time.Now() switch cmd := string(args[0]); cmd { case vors.CmdPing: - seen = time.Now() peer.tx <- vors.ArgsEncode([]byte(vors.CmdPong)) + case vors.CmdMuted: + peer.muted = true + s := vors.ArgsEncode([]byte(vors.CmdMuted), []byte{peer.sid}) + for _, p := range room.peers { + if p.sid == peer.sid { + continue + } + go func(tx chan []byte) { tx <- s }(p.tx) + } + case vors.CmdUnmuted: + peer.muted = false + s := vors.ArgsEncode([]byte(vors.CmdUnmuted), []byte{peer.sid}) + for _, p := range room.peers { + if p.sid == peer.sid { + continue + } + go func(tx chan []byte) { tx <- s }(p.tx) + } default: logger.Error("unknown", "cmd", cmd) } diff --git a/cmd/server/peer.go b/cmd/server/peer.go index 2250d41..c572ae6 100644 --- a/cmd/server/peer.go +++ b/cmd/server/peer.go @@ -33,6 +33,7 @@ type Peer struct { mac hash.Hash stats *Stats room *Room + muted bool logger *slog.Logger conn *vors.NSConn diff --git a/cmd/server/room.go b/cmd/server/room.go index 2e60d02..0be24b2 100644 --- a/cmd/server/room.go +++ b/cmd/server/room.go @@ -44,6 +44,9 @@ func (room *Room) Stats(now time.Time) []string { humanize.IBytes(peer.stats.bytesRx), humanize.IBytes(peer.stats.bytesTx), ) + if peer.muted { + line += " | " + vors.CRed + "MUTE" + vors.CReset + } if peer.stats.last.Add(vors.ScreenRefresh).After(now) { line += " | " + vors.CGreen + "TALK" + vors.CReset } diff --git a/doc/proto.texi b/doc/proto.texi index 97637a3..0bb1404 100644 --- a/doc/proto.texi +++ b/doc/proto.texi @@ -87,4 +87,5 @@ firewalls. Clients are notified about new peers appearance with @code{ADD} commands, telling their SIDs, usernames and keys. @code{DEL} notifies -about leaving peers. +about leaving peers. @code{MUTED}, @code{UNMUTED} notifies peer's mute +toggling. diff --git a/internal/var.go b/internal/var.go index ba13871..97f6d19 100644 --- a/internal/var.go +++ b/internal/var.go @@ -6,13 +6,15 @@ import ( ) const ( - CmdErr = "ERR" - CmdCookie = "COOKIE" - CmdSID = "SID" - CmdPing = "PING" - CmdPong = "PONG" - CmdAdd = "ADD" - CmdDel = "DEL" + CmdErr = "ERR" + CmdCookie = "COOKIE" + CmdSID = "SID" + CmdPing = "PING" + CmdPong = "PONG" + CmdAdd = "ADD" + CmdDel = "DEL" + CmdMuted = "MUTED" + CmdUnmuted = "UNMUTED" ) var (