]> Sergey Matveev's repositories - mmc.git/blobdiff - cmd/rd/main.go
Remember all posts
[mmc.git] / cmd / rd / main.go
index 4bb8b2439cefcdccbeafdc6c69f7d3d733fa5b5b..f6a977802be287ad27759822417037d44ae5e241 100644 (file)
@@ -23,13 +23,29 @@ import (
        "log"
        "os"
        "path"
-       "time"
+       "strings"
+       "unicode/utf8"
 
+       "github.com/fsnotify/fsnotify"
        "github.com/mattermost/mattermost-server/v6/model"
        "go.cypherpunks.ru/recfile"
        "go.stargrave.org/mmc"
 )
 
+var Threads = make(map[string]string)
+
+func rememberPost(post map[string][]string) {
+       text := strings.Split(post["Text"][0], "\n")[0]
+       i := 60
+       if len(text) > i {
+               for i > 0 && !utf8.Valid([]byte{text[i]}) {
+                       i--
+               }
+               text = text[:i] + "..."
+       }
+       Threads[post["Id"][0]] = text
+}
+
 func printPost(m map[string][]string) {
        var tag string
        if len(m["Event"]) > 0 {
@@ -40,13 +56,22 @@ func printPost(m map[string][]string) {
                        tag += "[DEL] "
                }
        }
-       fmt.Printf("\a%s <%s> %s%s\n", m["Created"][0], m["Sender"][0], tag, m["Text"][0])
+       var re string
+       if len(m["RootId"]) > 0 {
+               thread := Threads[m["RootId"][0]]
+               if thread == "" {
+                       thread = m["RootId"][0]
+               }
+               re = " [RE]: " + thread
+       }
+       fmt.Printf(
+               "\a%s <%s> %s%s%s\n",
+               m["Created"][0], m["Sender"][0],
+               tag, m["Text"][0], re,
+       )
        tag += "[FILE] "
        for i, fileId := range m["File"] {
-               fmt.Printf(
-                       "\a%s <%s> %s%s (%s)\n",
-                       m["Created"][0], m["Sender"][0], tag, fileId, m["FileName"][i],
-               )
+               fmt.Printf("\a%s%s (%s)\n", tag, fileId, m["FileName"][i])
        }
 }
 
@@ -78,22 +103,31 @@ func main() {
                ms = append(ms, m)
        }
        unlock()
+       for _, m := range ms {
+               rememberPost(m)
+       }
        if len(ms) > *lastNum {
                ms = ms[len(ms)-*lastNum:]
        }
        for _, m := range ms {
                printPost(m)
        }
-       fi, err := fd.Stat()
+
+       watcher, err := fsnotify.NewWatcher()
        if err != nil {
                log.Fatalln(err)
        }
-       size := fi.Size()
+       if err = watcher.Add(pth); err != nil {
+               log.Fatalln(err)
+       }
        for {
-               time.Sleep(mmc.SleepTime)
-               fi, err = os.Stat(pth)
-               if fi.Size() == size {
-                       continue
+               select {
+               case err = <-watcher.Errors:
+                       log.Fatalln(err)
+               case event := <-watcher.Events:
+                       if !event.Has(fsnotify.Write) {
+                               continue
+                       }
                }
                unlock, err = mmc.Lock(lockPth)
                if err != nil {
@@ -108,9 +142,9 @@ func main() {
                                }
                                log.Fatalln(err)
                        }
+                       rememberPost(m)
                        printPost(m)
                }
-               size = fi.Size()
                unlock()
        }
 }