1package tui
2
3import (
4 "encoding/json"
5 "fmt"
6 "log"
7 "smoothie/git"
8 "time"
9
10 tea "github.com/charmbracelet/bubbletea"
11 "github.com/gliderlabs/ssh"
12)
13
14func SessionHandler(reposPath string, repoPoll time.Duration) func(ssh.Session) (tea.Model, []tea.ProgramOption) {
15 rs := git.NewRepoSource(reposPath)
16 err := createDefaultConfigRepo(rs)
17 if err != nil {
18 if err != nil {
19 log.Fatalf("cannot create config repo: %s", err)
20 }
21 }
22 appCfg, err := loadConfig(rs)
23 if err != nil {
24 if err != nil {
25 log.Printf("cannot load config: %s", err)
26 }
27 }
28 go func() {
29 for {
30 time.Sleep(repoPoll)
31 err := rs.LoadRepos()
32 if err != nil {
33 log.Printf("cannot load repos: %s", err)
34 continue
35 }
36 cfg, err := loadConfig(rs)
37 if err != nil {
38 if err != nil {
39 log.Printf("cannot load config: %s", err)
40 continue
41 }
42 }
43 appCfg = cfg
44 }
45 }()
46
47 return func(s ssh.Session) (tea.Model, []tea.ProgramOption) {
48 if len(s.Command()) == 0 {
49 pty, changes, active := s.Pty()
50 if !active {
51 return nil, nil
52 }
53 cfg := &SessionConfig{
54 Width: pty.Window.Width,
55 Height: pty.Window.Height,
56 WindowChanges: changes,
57 }
58 return NewBubble(appCfg, cfg), []tea.ProgramOption{tea.WithAltScreen()}
59 }
60 return nil, nil
61 }
62}
63
64func loadConfig(rs *git.RepoSource) (*Config, error) {
65 cfg := &Config{}
66 cfg.RepoSource = rs
67 cr, err := rs.GetRepo("config")
68 if err != nil {
69 return nil, fmt.Errorf("cannot load config repo: %s", err)
70 }
71 cs, err := cr.LatestFile("config.json")
72 if err != nil {
73 return nil, fmt.Errorf("cannot load config.json: %s", err)
74 }
75 err = json.Unmarshal([]byte(cs), cfg)
76 if err != nil {
77 return nil, fmt.Errorf("bad json in config.json: %s", err)
78 }
79 return cfg, nil
80}