moth

Monarch Of The Hill game server
git clone https://git.woozle.org/neale/moth.git

moth / cmd / mothd
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}