package web import ( "fmt" "gemif/pkg/gamemanager" "io/ioutil" "net/url" "path" "path/filepath" "github.com/markbates/pkger" "github.com/pitr/gig" ) func handleStatic(c gig.Context) error { p, err := url.PathUnescape(c.Param("*")) if err != nil { return fmt.Errorf("unable to parse url: %w", err) } if p == "/" { p = "/index.gmi" } name := filepath.Join("/static/docs", path.Clean("/"+p)) // "/"+ for security f, fileErr := pkger.Open(name) if fileErr != nil { return fmt.Errorf("couldn't open file: %w", fileErr) } sl, readErr := ioutil.ReadAll(f) if readErr != nil { return fmt.Errorf("couldn't read file: %w", readErr) } return c.Gemini(string(sl)) } func handleHome(gm *gamemanager.GameManager) func(gig.Context) error { return func(c gig.Context) error { stories := gm.GetStories() startStates, startErr := gm.ConstructStartingState(stories) if startErr != nil { return fmt.Errorf("couldn't load game: %w", startErr) } return c.Render("gemif:/static/templates/index.gmi.tmpl", map[string]interface{}{ "Stories": startStates, "Banner": getRandomBanner(), }) } } func handleGame(gm *gamemanager.GameManager) func(gig.Context) error { return func(c gig.Context) error { gameState, gameErr := gm.DeserializeState(c.Param("statetoken")) if gameErr != nil { return fmt.Errorf("could not deserialized game state: %w", gameErr) } currentRoom, roomErr := gm.GetRoomByID(gameState.StoryID, gameState.CurrentRoom) if roomErr != nil { return fmt.Errorf("could not find room: %w", roomErr) } speculativeStates, speculationErr := gm.ConstructSpeculativeStates(gameState, currentRoom) if speculationErr != nil { return fmt.Errorf("unable to render exits: %w", speculationErr) } return c.Render("gemif:/static/templates/room.gmi.tmpl", map[string]interface{}{ "RoomName": currentRoom.Name, "Description": currentRoom.Description, "Actions": speculativeStates, }) } }