diff --git a/assets/dk.css b/assets/dk.css new file mode 100644 index 0000000..e8e842a --- /dev/null +++ b/assets/dk.css @@ -0,0 +1,108 @@ +/* + In general, we don't want to stray too far from the original appearance. + We'll optimize the layout for modern CSS and use better styles and fonts + for legibility and design, but keep the soul of the original project. +*/ + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + color: #222; + font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif; + font-size: 16px; +} + +body { + padding: 1rem; + background-image: url("/assets/images/backgrounds/snowstorm.jpg"); +} + +div#container { + width: 90vw; + display: flex; + flex-direction: column; + margin: 0px auto; +} + +header { + width: 100%; + display: flex; + justify-content: space-between; + + nav { + display: flex; + align-items: center; + justify-content: flex-end; + } +} + +section#game { + display: grid; + grid-template-columns: 180px 1fr 180px; + margin: 1rem 0; + border-top: 2px solid #000; + + & > aside#left { + grid-column: 1; + border-right: 2px solid #000; + padding: 3px; + } + + & > main { + grid-column: 2; + padding: 3px; + } + + & > aside#right { + grid-column: 3; + border-left: 2px solid #000; + padding: 3px; + } +} + +a { + color: #663300; + text-decoration: none; + font-weight: bold; + + &:hover { + color: #330000; + } +} + +.small { + font-size: 0.75rem; +} + +.highlight { + color: red; +} + +.light { + color: #999999; +} + +.title { + border: solid 1px black; + background-color: #eeeeee; + font-weight: bold; + padding: 5px; + margin: 3px; +} + +footer { + display: flex; + justify-content: center; + font-size: 0.75rem; + padding: 0.5rem 0; + + & > div { + flex: 0 0 25%; + text-align: center; + } +} + diff --git a/assets/images/backgrounds/background.gif b/assets/images/backgrounds/background.gif new file mode 100644 index 0000000..6024b97 Binary files /dev/null and b/assets/images/backgrounds/background.gif differ diff --git a/assets/images/backgrounds/classic.jpg b/assets/images/backgrounds/classic.jpg new file mode 100644 index 0000000..b4bd6cd Binary files /dev/null and b/assets/images/backgrounds/classic.jpg differ diff --git a/assets/images/backgrounds/snowstorm.jpg b/assets/images/backgrounds/snowstorm.jpg new file mode 100644 index 0000000..01e17df Binary files /dev/null and b/assets/images/backgrounds/snowstorm.jpg differ diff --git a/assets/images/bars_green.gif b/assets/images/bars_green.gif new file mode 100644 index 0000000..32349da Binary files /dev/null and b/assets/images/bars_green.gif differ diff --git a/assets/images/bars_red.gif b/assets/images/bars_red.gif new file mode 100644 index 0000000..c92630d Binary files /dev/null and b/assets/images/bars_red.gif differ diff --git a/assets/images/bars_yellow.gif b/assets/images/bars_yellow.gif new file mode 100644 index 0000000..628ecae Binary files /dev/null and b/assets/images/bars_yellow.gif differ diff --git a/assets/images/button_character.gif b/assets/images/button_character.gif new file mode 100644 index 0000000..4f2ad5d Binary files /dev/null and b/assets/images/button_character.gif differ diff --git a/assets/images/button_fastspells.gif b/assets/images/button_fastspells.gif new file mode 100644 index 0000000..6b7f276 Binary files /dev/null and b/assets/images/button_fastspells.gif differ diff --git a/assets/images/button_functions.gif b/assets/images/button_functions.gif new file mode 100644 index 0000000..fc89266 Binary files /dev/null and b/assets/images/button_functions.gif differ diff --git a/assets/images/button_help.gif b/assets/images/button_help.gif new file mode 100644 index 0000000..b108da7 Binary files /dev/null and b/assets/images/button_help.gif differ diff --git a/assets/images/button_inventory.gif b/assets/images/button_inventory.gif new file mode 100644 index 0000000..da49874 Binary files /dev/null and b/assets/images/button_inventory.gif differ diff --git a/assets/images/button_location.gif b/assets/images/button_location.gif new file mode 100644 index 0000000..0dbe494 Binary files /dev/null and b/assets/images/button_location.gif differ diff --git a/assets/images/button_login.gif b/assets/images/button_login.gif new file mode 100644 index 0000000..89c612a Binary files /dev/null and b/assets/images/button_login.gif differ diff --git a/assets/images/button_logout.gif b/assets/images/button_logout.gif new file mode 100644 index 0000000..c2343c5 Binary files /dev/null and b/assets/images/button_logout.gif differ diff --git a/assets/images/button_register.gif b/assets/images/button_register.gif new file mode 100644 index 0000000..e635590 Binary files /dev/null and b/assets/images/button_register.gif differ diff --git a/assets/images/button_shoutbox.gif b/assets/images/button_shoutbox.gif new file mode 100644 index 0000000..4180f8e Binary files /dev/null and b/assets/images/button_shoutbox.gif differ diff --git a/assets/images/button_spells.gif b/assets/images/button_spells.gif new file mode 100644 index 0000000..7946150 Binary files /dev/null and b/assets/images/button_spells.gif differ diff --git a/assets/images/button_status.gif b/assets/images/button_status.gif new file mode 100644 index 0000000..eb77375 Binary files /dev/null and b/assets/images/button_status.gif differ diff --git a/assets/images/button_towns.gif b/assets/images/button_towns.gif new file mode 100644 index 0000000..8080ee2 Binary files /dev/null and b/assets/images/button_towns.gif differ diff --git a/assets/images/compass.webp b/assets/images/compass.webp new file mode 100644 index 0000000..7a51782 Binary files /dev/null and b/assets/images/compass.webp differ diff --git a/assets/images/dkforumsbutton.gif b/assets/images/dkforumsbutton.gif new file mode 100644 index 0000000..c0afd40 Binary files /dev/null and b/assets/images/dkforumsbutton.gif differ diff --git a/assets/images/help_exploring.jpg b/assets/images/help_exploring.jpg new file mode 100644 index 0000000..c96fd72 Binary files /dev/null and b/assets/images/help_exploring.jpg differ diff --git a/assets/images/help_fighting.jpg b/assets/images/help_fighting.jpg new file mode 100644 index 0000000..829dd5c Binary files /dev/null and b/assets/images/help_fighting.jpg differ diff --git a/assets/images/icon_armor.gif b/assets/images/icon_armor.gif new file mode 100644 index 0000000..c00f854 Binary files /dev/null and b/assets/images/icon_armor.gif differ diff --git a/assets/images/icon_shield.gif b/assets/images/icon_shield.gif new file mode 100644 index 0000000..27270d1 Binary files /dev/null and b/assets/images/icon_shield.gif differ diff --git a/assets/images/icon_weapon.gif b/assets/images/icon_weapon.gif new file mode 100644 index 0000000..0e6db0b Binary files /dev/null and b/assets/images/icon_weapon.gif differ diff --git a/assets/images/logo.gif b/assets/images/logo.gif new file mode 100644 index 0000000..7468262 Binary files /dev/null and b/assets/images/logo.gif differ diff --git a/assets/images/map.gif b/assets/images/map.gif new file mode 100644 index 0000000..d89ca9d Binary files /dev/null and b/assets/images/map.gif differ diff --git a/assets/images/title_exploring.gif b/assets/images/title_exploring.gif new file mode 100644 index 0000000..362f864 Binary files /dev/null and b/assets/images/title_exploring.gif differ diff --git a/assets/images/title_fighting.gif b/assets/images/title_fighting.gif new file mode 100644 index 0000000..c0ced2c Binary files /dev/null and b/assets/images/title_fighting.gif differ diff --git a/assets/images/town_1.gif b/assets/images/town_1.gif new file mode 100644 index 0000000..8ea7af3 Binary files /dev/null and b/assets/images/town_1.gif differ diff --git a/assets/images/town_2.gif b/assets/images/town_2.gif new file mode 100644 index 0000000..46d3824 Binary files /dev/null and b/assets/images/town_2.gif differ diff --git a/assets/images/town_3.gif b/assets/images/town_3.gif new file mode 100644 index 0000000..ea68f94 Binary files /dev/null and b/assets/images/town_3.gif differ diff --git a/assets/images/town_4.gif b/assets/images/town_4.gif new file mode 100644 index 0000000..f58edb6 Binary files /dev/null and b/assets/images/town_4.gif differ diff --git a/assets/images/town_5.gif b/assets/images/town_5.gif new file mode 100644 index 0000000..623bbdc Binary files /dev/null and b/assets/images/town_5.gif differ diff --git a/assets/images/town_6.gif b/assets/images/town_6.gif new file mode 100644 index 0000000..b1118a4 Binary files /dev/null and b/assets/images/town_6.gif differ diff --git a/assets/images/town_7.gif b/assets/images/town_7.gif new file mode 100644 index 0000000..7ee30fd Binary files /dev/null and b/assets/images/town_7.gif differ diff --git a/assets/images/town_8.gif b/assets/images/town_8.gif new file mode 100644 index 0000000..f00aee9 Binary files /dev/null and b/assets/images/town_8.gif differ diff --git a/internal/middleware/doc.go b/internal/middleware/doc.go new file mode 100644 index 0000000..74047e9 --- /dev/null +++ b/internal/middleware/doc.go @@ -0,0 +1,4 @@ +// Package middleware provides reusable HTTP middleware for the Dragon Knight server. +// Middleware functions wrap request handlers to add cross-cutting functionality +// like timing, logging, authentication, and request processing. +package middleware \ No newline at end of file diff --git a/internal/middleware/timing.go b/internal/middleware/timing.go new file mode 100644 index 0000000..92ea972 --- /dev/null +++ b/internal/middleware/timing.go @@ -0,0 +1,49 @@ +package middleware + +import ( + "fmt" + "time" + + "dk/internal/router" +) + +const RequestTimerKey = "request_start_time" + +// Timing adds request timing functionality +func Timing() router.Middleware { + return func(next router.Handler) router.Handler { + return func(ctx router.Ctx, params []string) { + startTime := time.Now() + ctx.SetUserValue(RequestTimerKey, startTime) + + next(ctx, params) + } + } +} + +// GetRequestTime returns the total request processing time in seconds (formatted) +func GetRequestTime(ctx router.Ctx) string { + startTime, ok := ctx.UserValue(RequestTimerKey).(time.Time) + if !ok { + return "0" + } + + duration := time.Since(startTime) + seconds := duration.Seconds() + + if seconds < 0.001 { + return "0" + } + + return fmt.Sprintf("%.3f", seconds) +} + +// GetRequestDuration returns the raw duration +func GetRequestDuration(ctx router.Ctx) time.Duration { + startTime, ok := ctx.UserValue(RequestTimerKey).(time.Time) + if !ok { + return 0 + } + + return time.Since(startTime) +} \ No newline at end of file diff --git a/internal/server/server.go b/internal/server/server.go index 4b142a3..2f28250 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -6,6 +6,7 @@ import ( "os" "path/filepath" + "dk/internal/middleware" "dk/internal/router" "dk/internal/template" @@ -19,41 +20,48 @@ func Start(port string) error { return fmt.Errorf("failed to get current working directory: %w", err) } templateCache := template.NewCache(cwd) - + // Initialize router r := router.New() + // Add timing middleware + r.Use(middleware.Timing()) + // Hello world endpoint r.Get("/", func(ctx router.Ctx, params []string) { - tmpl, err := templateCache.Load("hello.html") + tmpl, err := templateCache.Load("layout.html") if err != nil { ctx.SetStatusCode(fasthttp.StatusInternalServerError) fmt.Fprintf(ctx, "Template error: %v", err) return } - + data := map[string]any{ - "title": "Dragon Knight", - "message": "Hello World!", + "title": "Dragon Knight", + "content": "Hello World!", + "totaltime": middleware.GetRequestTime(ctx), + "numqueries": "0", // Placeholder for now + "version": "1.0.0", + "build": "dev", } - + tmpl.WriteTo(ctx, data) }) - + // Use current working directory for static files assetsDir := filepath.Join(cwd, "assets") - + // Static file server for /assets fs := &fasthttp.FS{ Root: assetsDir, - Compress: true, + Compress: false, } assetsHandler := fs.NewRequestHandler() - + // Combined handler requestHandler := func(ctx *fasthttp.RequestCtx) { path := string(ctx.Path()) - + // Handle static assets - strip /assets prefix if len(path) >= 7 && path[:7] == "/assets" { // Strip the /assets prefix for the file system handler @@ -63,12 +71,12 @@ func Start(port string) error { ctx.Request.URI().SetPathBytes(originalPath) // Restore original path return } - + // Handle routes r.ServeHTTP(ctx) } - + addr := ":" + port log.Printf("Server starting on %s", addr) return fasthttp.ListenAndServe(addr, requestHandler) -} \ No newline at end of file +} diff --git a/templates/layout.html b/templates/layout.html new file mode 100644 index 0000000..b4d0873 --- /dev/null +++ b/templates/layout.html @@ -0,0 +1,43 @@ + + +
+ + +