]> Sergey Matveev's repositories - mmc.git/commitdiff
User statuses
authorSergey Matveev <stargrave@stargrave.org>
Sun, 12 Mar 2023 14:42:35 +0000 (17:42 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 12 Mar 2023 14:42:35 +0000 (17:42 +0300)
cmd/mmc/main.go
cmd/start
doc/arch.texi
doc/usage.texi

index b288a8d5d11532bf0597fb926fb4a4e2ec94abe4..12eb7df3bdcc4166d357dfe803bfac874da43ec4 100644 (file)
@@ -30,6 +30,7 @@ import (
        "os/exec"
        "os/signal"
        "path"
+       "sort"
        "strings"
        "syscall"
        "time"
@@ -43,7 +44,7 @@ const CmdFile = "/FILE "
 
 var (
        Newwin    = flag.String("newwin", "cmd/newwin", "Path to newwin command")
-       DebugFifo = flag.String("debug", "debug", "Path to debug FIFO to be created")
+       DebugFifo = flag.String("debug", "", "Path to debug FIFO to be created")
        DebugFd   *os.File
        UmaskCur  int
 )
@@ -61,6 +62,7 @@ func main() {
        entrypoint := flag.String("entrypoint", mmc.GetEntrypoint(), "Entrypoint")
        notifyCmd := flag.String("notify", "cmd/notify", "Path to notification handler")
        heartbeatCh := flag.String("heartbeat-ch", "town-square", "Channel for heartbeating")
+       userStatusFifo := flag.String("user-status", "", "Path to FIFO for user statuses")
        flag.Parse()
        log.SetFlags(log.Lshortfile)
        log.SetOutput(os.Stdout)
@@ -116,8 +118,11 @@ func main() {
        if err != nil {
                log.Fatalln(err)
        }
+
        UsersDC := make(map[string]*model.Channel, len(Users))
+       userIds := make([]string, 0, len(Users))
        for _, u := range Users {
+               userIds = append(userIds, u.Id)
                pth := path.Join("users", strings.ReplaceAll(u.Username, ".", "_"))
                os.MkdirAll(pth, 0777)
                rewriteIfChanged(
@@ -224,6 +229,52 @@ func main() {
                }(u)
        }
 
+       UserStatus := make(map[string]string)
+       if *userStatusFifo != "" {
+               statuses, resp, err := c.GetUsersStatusesByIds(userIds)
+               if err != nil {
+                       if DebugFd != nil {
+                               spew.Fdump(DebugFd, resp)
+                       }
+                       log.Fatalln(err)
+               }
+               if DebugFd != nil {
+                       spew.Fdump(DebugFd, teams)
+               }
+               userIds = nil
+               for _, s := range statuses {
+                       UserStatus[Users[s.UserId].Username] = s.Status
+               }
+               statuses = nil
+               go func() {
+                       for {
+                               time.Sleep(mmc.SleepTime)
+                               fd, err := os.OpenFile(
+                                       *userStatusFifo, os.O_WRONLY|os.O_APPEND, os.FileMode(0666),
+                               )
+                               if err != nil {
+                                       log.Println("OpenFile:", *userStatusFifo, err)
+                                       continue
+                               }
+                               var onlines []string
+                               var aways []string
+                               for name, status := range UserStatus {
+                                       switch status {
+                                       case "online":
+                                               onlines = append(onlines, name)
+                                       case "away":
+                                               aways = append(aways, name)
+                                       }
+                               }
+                               sort.Strings(onlines)
+                               sort.Strings(aways)
+                               fmt.Fprintln(fd, "O:", strings.Join(onlines, " "))
+                               fmt.Fprintln(fd, "A:", strings.Join(aways, " "))
+                               fd.Close()
+                       }
+               }()
+       }
+
        Chans := make(map[string]*model.Channel)
        time.Sleep(mmc.SleepTime)
        page, resp, err := c.GetChannelsForTeamForUser(Team.Id, me.Id, false, "")
@@ -501,11 +552,18 @@ func main() {
                                                log.Fatalln(err)
                                        }
                                case model.WebsocketEventStatusChange:
-                                       log.Println("status change:", user.Username, "->", data["status"].(string))
+                                       status := data["status"].(string)
+                                       switch status {
+                                       case "online":
+                                       case "offline":
+                                       case "away":
+                                       default:
+                                               log.Println(user.Username, "unknown status:", status)
+                                       }
+                                       UserStatus[user.Username] = status
                                        if *notifyCmd != "" {
                                                exec.Command(*notifyCmd, fmt.Sprintf(
-                                                       "status: %s -> %s",
-                                                       user.Username, data["status"].(string),
+                                                       "status: %s -> %s", user.Username, status,
                                                )).Run()
                                        }
                                case model.WebsocketEventHello:
index ade0962c693ce522ce8cfa460e157e67d54b0329..173aef1298602f6290054fe5fbf8b9fddc5052be 100755 (executable)
--- a/cmd/start
+++ b/cmd/start
@@ -1,12 +1,14 @@
-#!/bin/sh
+#!/bin/sh -x
 
 cmd="$(dirname "$(realpath -- "$0")")"
 unset TMUX
 TMUX="tmux -S tmux.sock"
 $TMUX has-session -t mmc 2>/dev/null && exit
-rm -f debug
-mkfifo debug
+mkdir -p users
+rm -f debug users/status
+mkfifo debug users/status
 [ -s tmux.conf ] || sed "s#NEWWIN#$cmd/newwin#" < "$cmd"/tmux.conf > tmux.conf
 $TMUX -f tmux.conf new-session -d -n ROOT -s mmc "cat debug | tai64n | tai64nlocal"
-$TMUX split-window -h "$cmd/mmc/mmc -newwin $cmd/newwin -notify $cmd/notify | tai64n | tai64nlocal"
+$TMUX split-window -h 'while : ; do cat users/status | spc -e grn,"^O:.*" -e cya,"^A:.*" ; sleep 5 ; clear ; done'
+$TMUX split-window -v "$cmd/mmc/mmc -debug debug -user-status users/status -newwin $cmd/newwin -notify $cmd/notify | tai64n | tai64nlocal"
 $TMUX attach-session
index ba2fe4f291d060ff9b13117c72ce0ddd614eeeca..6ae56be5103abb67e4357d5b289ae83747649556 100644 (file)
@@ -10,8 +10,10 @@ cmd/start
   F tmux.conf
   R tmux -f tmux.conf
     R tail -f debug | tai64n
+    R for { cat users/status ; sleep 5 }
     R fzf **(/) | cmd/newwin
     R cmd/mmc | tai64n
+     F users/status
      F users/.../{id,email,name,|in,out.rec,|status,last}
      F chans/.../{id,info,out.rec,|users,last}
      F file/{|get,|out}
index b0f4a8005ef316bd8eedf9d39914986cd0307d02..db261d64e7ce858c25bf1436a14d0521fa63d49a 100644 (file)
@@ -21,7 +21,7 @@ default). For example
 @item Set @env{$MMC_ENTRYPOINT} environment variable to your entrypoint.
 
 @item Run @command{cmd/start} and you should see started @command{tmux}
-with split window and running @command{cmd/mmc}.
+with split window, running @command{cmd/mmc} and list of user statuses.
 
 @item By pressing @code{Prefix+c}, list of available users/channels is
 shown inside @command{fzf}. Choose the desired one.