Neale Pickett
·
2024-04-09
main.go
1package main
2
3import (
4 "flag"
5 "fmt"
6 "log"
7 "mime"
8 "os"
9 "path/filepath"
10 "time"
11
12 "github.com/spf13/afero"
13)
14
15func main() {
16 themePath := flag.String(
17 "theme",
18 "theme",
19 "Path to theme files",
20 )
21 statePath := flag.String(
22 "state",
23 "state",
24 "Path to state files",
25 )
26 mothballPath := flag.String(
27 "mothballs",
28 "mothballs",
29 "Path to mothball files",
30 )
31 puzzlePath := flag.String(
32 "puzzles",
33 "",
34 "Path to puzzles tree (enables development mode)",
35 )
36 refreshInterval := flag.Duration(
37 "refresh",
38 2*time.Second,
39 "Duration between maintenance tasks",
40 )
41 bindStr := flag.String(
42 "bind",
43 ":8080",
44 "Bind [host]:port for HTTP service",
45 )
46 base := flag.String(
47 "base",
48 "/",
49 "Base URL of this instance",
50 )
51 seed := flag.String(
52 "seed",
53 "",
54 "Random seed to use, overrides $SEED",
55 )
56 flag.Parse()
57
58 var theme *Theme
59 osfs := afero.NewOsFs()
60 if p, err := filepath.Abs(*themePath); err != nil {
61 log.Fatal(err)
62 } else {
63 theme = NewTheme(afero.NewBasePathFs(osfs, p))
64 }
65
66 config := Configuration{}
67
68 var provider PuzzleProvider
69 if p, err := filepath.Abs(*mothballPath); err != nil {
70 log.Fatal(err)
71 } else {
72 provider = NewMothballs(afero.NewBasePathFs(osfs, p))
73 }
74 if *puzzlePath != "" {
75 if p, err := filepath.Abs(*puzzlePath); err != nil {
76 log.Fatal(err)
77 } else {
78 provider = NewTranspilerProvider(afero.NewBasePathFs(osfs, p))
79 }
80 config.Devel = true
81 log.Println("-=- You are in development mode, champ! -=-")
82 }
83
84 var state StateProvider
85 if p, err := filepath.Abs(*statePath); err != nil {
86 log.Fatal(err)
87 } else {
88 state = NewState(afero.NewBasePathFs(osfs, p))
89 }
90 if config.Devel {
91 state = NewDevelState(state)
92 }
93
94 // Set random seed
95 if *seed == "" {
96 *seed = os.Getenv("SEED")
97 }
98 if *seed == "" {
99 *seed = fmt.Sprintf("%d%d", os.Getpid(), time.Now().Unix())
100 }
101 os.Setenv("SEED", *seed)
102 log.Print("SEED=", *seed)
103
104 // Add some MIME extensions
105 // Doing this avoids decompressing a mothball entry twice per request
106 mime.AddExtensionType(".json", "application/json")
107 mime.AddExtensionType(".zip", "application/zip")
108
109 go theme.Maintain(*refreshInterval)
110 go state.Maintain(*refreshInterval)
111 go provider.Maintain(*refreshInterval)
112
113 server := NewMothServer(config, theme, state, provider)
114 httpd := NewHTTPServer(*base, server)
115
116 httpd.Run(*bindStr)
117}