moth

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

moth / cmd / mothd
Neale Pickett  ·  2023-04-11

transpiler.go

 1package main
 2
 3import (
 4	"bytes"
 5	"encoding/json"
 6	"io"
 7	"log"
 8	"time"
 9
10	"github.com/dirtbags/moth/v4/pkg/transpile"
11	"github.com/spf13/afero"
12)
13
14// NewTranspilerProvider returns a new TranspilerProvider.
15func NewTranspilerProvider(fs afero.Fs) TranspilerProvider {
16	return TranspilerProvider{fs}
17}
18
19// TranspilerProvider provides puzzles generated from source files on disk
20type TranspilerProvider struct {
21	fs afero.Fs
22}
23
24// Inventory returns a Category list for this provider.
25func (p TranspilerProvider) Inventory() []Category {
26	ret := make([]Category, 0)
27	inv, err := transpile.FsInventory(p.fs)
28	if err != nil {
29		log.Print(err)
30		return ret
31	}
32	for name, points := range inv {
33		ret = append(ret, Category{name, points})
34	}
35	return ret
36}
37
38type nopCloser struct {
39	io.ReadSeeker
40}
41
42func (c nopCloser) Close() error {
43	return nil
44}
45
46// Open returns a file associated with the given category and point value.
47func (p TranspilerProvider) Open(cat string, points int, filename string) (ReadSeekCloser, time.Time, error) {
48	c := transpile.NewFsCategory(p.fs, cat)
49	switch filename {
50	case "", "puzzle.json":
51		p, err := c.Puzzle(points)
52		if err != nil {
53			return nopCloser{new(bytes.Reader)}, time.Time{}, err
54		}
55		jp, err := json.Marshal(p)
56		if err != nil {
57			return nopCloser{new(bytes.Reader)}, time.Time{}, err
58		}
59		return nopCloser{bytes.NewReader(jp)}, time.Now(), nil
60	default:
61		r, err := c.Open(points, filename)
62		return r, time.Now(), err
63	}
64}
65
66// CheckAnswer checks whether an answer si correct.
67func (p TranspilerProvider) CheckAnswer(cat string, points int, answer string) (bool, error) {
68	c := transpile.NewFsCategory(p.fs, cat)
69	return c.Answer(points, answer), nil
70}
71
72// Mothball packages up a category into a mothball.
73func (p TranspilerProvider) Mothball(cat string, w io.Writer) error {
74	c := transpile.NewFsCategory(p.fs, cat)
75	return transpile.Mothball(c, w)
76}
77
78// Maintain performs housekeeping.
79func (p TranspilerProvider) Maintain(updateInterval time.Duration) {
80	// Nothing to do here.
81}
82
83func (p TranspilerProvider) refresh() {
84	// Nothing to do for a theme
85}