]> Sergey Matveev's repositories - mmc.git/blob - cmd/rd/main.go
b10153eb7b07f3919ea96971678c0ef0de6ce06a
[mmc.git] / cmd / rd / main.go
1 // mmc -- Mattermost client
2 // Copyright (C) 2023 Sergey Matveev <stargrave@stargrave.org>
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU Affero General Public License as
6 // published by the Free Software Foundation, either version 3 of the
7 // License.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU Affero General Public License for more details.
13 //
14 // You should have received a copy of the GNU Affero General Public License
15 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 package main
18
19 import (
20         "flag"
21         "fmt"
22         "io"
23         "log"
24         "os"
25         "path"
26         "time"
27
28         "github.com/mattermost/mattermost-server/v6/model"
29         "go.cypherpunks.ru/recfile"
30         "go.stargrave.org/mmc"
31 )
32
33 func printPost(m map[string][]string) {
34         var tag string
35         if len(m["Event"]) > 0 {
36                 switch m["Event"][0] {
37                 case model.WebsocketEventPostEdited:
38                         tag += "[EDIT] "
39                 case model.WebsocketEventPostDeleted:
40                         tag += "[DEL] "
41                 }
42         }
43         fmt.Printf("\a%s <%s> %s%s\n", m["Created"][0], m["Sender"][0], tag, m["Text"][0])
44         tag += "[FILE] "
45         for _, fileId := range m["File"] {
46                 fmt.Printf("\a%s <%s> %s%s\n", m["Created"][0], m["Sender"][0], tag, fileId)
47         }
48 }
49
50 func main() {
51         lastNum := flag.Int("last", 10, "Only that number of messages")
52         flag.Parse()
53         where := flag.Arg(0)
54         lockPth := path.Join(where, mmc.OutRecLock)
55         unlock, err := mmc.Lock(lockPth)
56         if err != nil {
57                 log.Fatalln(err)
58         }
59         pth := path.Join(where, mmc.OutRec)
60         fd, err := os.Open(pth)
61         if err != nil {
62                 log.Fatalln(err)
63         }
64
65         r := recfile.NewReader(fd)
66         ms := make([]map[string][]string, 0)
67         for {
68                 m, err := r.NextMapWithSlice()
69                 if err != nil {
70                         if err == io.EOF {
71                                 break
72                         }
73                         log.Fatalln(err)
74                 }
75                 ms = append(ms, m)
76         }
77         unlock()
78         if len(ms) > *lastNum {
79                 ms = ms[len(ms)-*lastNum:]
80         }
81         for _, m := range ms {
82                 printPost(m)
83         }
84         fi, err := fd.Stat()
85         if err != nil {
86                 log.Fatalln(err)
87         }
88         size := fi.Size()
89         for {
90                 time.Sleep(mmc.SleepTime)
91                 fi, err = os.Stat(pth)
92                 if fi.Size() == size {
93                         continue
94                 }
95                 unlock, err = mmc.Lock(lockPth)
96                 if err != nil {
97                         log.Fatalln(err)
98                 }
99                 r = recfile.NewReader(fd)
100                 for {
101                         m, err := r.NextMapWithSlice()
102                         if err != nil {
103                                 if err == io.EOF {
104                                         break
105                                 }
106                                 log.Fatalln(err)
107                         }
108                         printPost(m)
109                 }
110                 size = fi.Size()
111                 unlock()
112         }
113 }