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}