package routes
import (
"dk/internal/auth"
"dk/internal/helpers"
"dk/internal/items"
"dk/internal/middleware"
"dk/internal/router"
"dk/internal/template/components"
"dk/internal/towns"
"dk/internal/users"
)
func RegisterTownRoutes(r *router.Router) {
group := r.Group("/town")
group.Use(middleware.RequireAuth())
group.Use(middleware.RequireTown())
group.Get("/", showTown)
group.Get("/inn", showInn)
group.Get("/shop", showShop)
group.WithMiddleware(middleware.CSRF(auth.Manager)).Post("/inn", rest)
}
func showTown(ctx router.Ctx, _ []string) {
town := ctx.UserValue("town").(*towns.Town)
components.RenderPage(ctx, town.Name, "town/town.html", map[string]any{
"town": town,
"newscontent": components.GenerateTownNews(),
"whosonline": components.GenerateTownWhosOnline(),
})
}
func showInn(ctx router.Ctx, _ []string) {
var errorHTML string
if flash := auth.GetFlashMessage(ctx); flash != nil {
errorHTML = `
` + flash.Message + "
"
}
town := ctx.UserValue("town").(*towns.Town)
components.RenderPage(ctx, town.Name+" Inn", "town/inn.html", map[string]any{
"town": town,
"rested": false,
"error_message": errorHTML,
})
}
func rest(ctx router.Ctx, _ []string) {
town := ctx.UserValue("town").(*towns.Town)
user := ctx.UserValue("user").(*users.User)
if user.Gold < town.InnCost {
auth.SetFlashMessage(ctx, "error", "You can't afford to stay here tonight.")
ctx.Redirect("/town/inn", 303)
return
}
user.Set("Gold", user.Gold-town.InnCost)
user.Set("HP", user.MaxHP)
user.Set("MP", user.MaxMP)
user.Set("TP", user.MaxTP)
user.Save()
components.RenderPage(ctx, town.Name+" Inn", "town/inn.html", map[string]any{
"town": town,
"rested": true,
})
}
func showShop(ctx router.Ctx, _ []string) {
var errorHTML string
if flash := auth.GetFlashMessage(ctx); flash != nil {
errorHTML = `` + flash.Message + "
"
}
town := ctx.UserValue("town").(*towns.Town)
var itemlist []*items.Item
if town.ShopList != "" {
itemMap := helpers.NewOrderedMap[int, *items.Item]()
for _, id := range town.GetShopItems() {
if item, err := items.Find(id); err == nil {
itemMap.Set(id, item)
}
}
itemlist = itemMap.ToSlice()
}
components.RenderPage(ctx, town.Name+" Shop", "town/shop.html", map[string]any{
"town": town,
"itemlist": itemlist,
"error_message": errorHTML,
})
}