]> Sergey Matveev's repositories - vors.git/blob - cmd/server/gui.go
Rooms support
[vors.git] / cmd / server / gui.go
1 // VoRS -- Vo(IP) Really Simple
2 // Copyright (C) 2024 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, version 3 of the License.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 package main
17
18 import (
19         "flag"
20         "os"
21         "sort"
22         "strings"
23         "time"
24
25         "github.com/jroimartin/gocui"
26 )
27
28 var (
29         NoGUI     = flag.Bool("tuiless", false, "No fancy TUI, only logs")
30         GUI       *gocui.Gui
31         GUIReady  bool
32         GUIReadyC = make(chan struct{})
33 )
34
35 func guiQuit(g *gocui.Gui, v *gocui.View) error {
36         go func() {
37                 time.Sleep(100 * time.Millisecond)
38                 os.Exit(0)
39         }()
40         return gocui.ErrQuit
41 }
42
43 func guiLayout(gui *gocui.Gui) error {
44         maxX, _ := gui.Size()
45         prevY := 0
46         v, err := gui.SetView("logs", 0, prevY, maxX-1, prevY+10+2)
47         prevY += 10 + 2
48         if err != nil {
49                 if err != gocui.ErrUnknownView {
50                         return err
51                 }
52                 v.Title = "Logs"
53                 v.Autoscroll = true
54         }
55         roomNames := make([]string, 0, len(Rooms))
56         for n := range Rooms {
57                 roomNames = append(roomNames, n)
58         }
59         sort.Strings(roomNames)
60         var now time.Time
61         for _, name := range roomNames {
62                 room := Rooms[name]
63                 lines := room.Stats(now)
64                 v, err = gui.SetView(room.name, 0, prevY, maxX-1, prevY+1+len(lines))
65                 prevY += 2 + len(lines)
66                 if err != nil {
67                         if err != gocui.ErrUnknownView {
68                                 return err
69                         }
70                         title := room.name
71                         if room.key != "" {
72                                 title += " protected"
73                         }
74                         v.Title = title
75                         v.Clear()
76                         v.Write([]byte(strings.Join(lines, "\n")))
77                 }
78         }
79         if !GUIReady {
80                 close(GUIReadyC)
81                 GUIReady = true
82         }
83         return nil
84 }