"os/exec"
"os/signal"
"path"
+ "sort"
"strings"
"syscall"
"time"
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
)
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)
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(
}(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, "")
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: