]> Sergey Matveev's repositories - vors.git/commitdiff
Notification about peer mute toggling
authorSergey Matveev <stargrave@stargrave.org>
Sun, 28 Apr 2024 12:48:20 +0000 (15:48 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 29 Apr 2024 11:28:12 +0000 (14:28 +0300)
cmd/client/gui.go
cmd/client/main.go
cmd/client/stats.go
cmd/server/main.go
cmd/server/peer.go
cmd/server/room.go
doc/proto.texi
internal/var.go

index 798db149a7d378c9d6c6ee5f5068030e7f522e4599998e58828b0120a5a0301e..4b06cacd58e6d44afd319636c5bcc54f8d3bc14cb63ac22b39938d08518cb9e2 100644 (file)
@@ -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
 }
 
index a07c75e6c5064a78a14c28c42a9b6385d888d4b999b857e0aac9285beebb4f01..81db880b3b2842e51d74fe60344f32898d6f73b4000eece8188f3e127a8ad566 100644 (file)
@@ -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)
                        }
index 3e29d701469d9047b130ee6caa3f6c5475214d67237a998b6bb315d58bcae065..30a490a74c405902ef4bb144f578c20d27c9daa2253ebb8c33c5d0afd1021a78 100644 (file)
@@ -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
                                }
index 7208476080569cd7e2c13dcd153b020a427f635fb681dd2e21f38c91218613d8..9ede9f61c29b3f27937506d7154b31c8315d267d9a4b8f97f575bf85fa70fbd4 100644 (file)
@@ -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)
                }
index 2250d4142c6ffc109af4f9f1f8218aea152152a541233f28071ca3892bcaa976..c572ae6424dc35e6504c0c699e61c0249caf6005547a2627eac7ff786ce7e225 100644 (file)
@@ -33,6 +33,7 @@ type Peer struct {
        mac   hash.Hash
        stats *Stats
        room  *Room
+       muted bool
 
        logger     *slog.Logger
        conn       *vors.NSConn
index 2e60d02c978a13b9641794b5029f25cbe27448f42f9c73b3ca06315ff98f7ca5..0be24b25d24697e39460d00b3b604f4b11820a72f13202bf289f7552704d8024 100644 (file)
@@ -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
                }
index 97637a38a777cd9db40b5bdbea163d3ae5bda0aac26bcf47b7bc13cd165f8238..0bb140474af3cc9371e9576f3ad03dcbe9f22253744eb7ac8d8b6919e539042f 100644 (file)
@@ -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.
index ba138710ddba9bdc1418897fb20f938d421a409e208b84adcbfb1336451cf9a8..97f6d19e7963811e734035f3cef751c96c7843ebeddaeb6ec33de37ce3e71a87 100644 (file)
@@ -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 (