init control, fix to snake case

This commit is contained in:
Sky Johnson 2025-08-22 08:19:17 -05:00
parent 75a1927d3a
commit ee19412965
5 changed files with 49 additions and 9 deletions

6
.gitignore vendored
View File

@ -1,6 +1,6 @@
# Dragon Knight test/build files # Dragon Knight test/build files
/dk /dk
_sessions.json sessions.json
users.json
/tmp /tmp
wal.log *.db-shm
*.db-wal

9
control.json Normal file
View File

@ -0,0 +1,9 @@
{
"id": 1,
"world_size": 200,
"open": 1,
"admin_email": "",
"class_1_name": "Mage",
"class_2_name": "Warrior",
"class_3_name": "Paladin"
}

View File

@ -359,14 +359,22 @@ func toSnakeCase(s string) string {
runes := []rune(s) runes := []rune(s)
for i, r := range runes { for i, r := range runes {
if i > 0 && unicode.IsUpper(r) { if i > 0 {
// Don't add underscore if previous char was also uppercase prev := runes[i-1]
// unless next char is lowercase (end of acronym)
if !unicode.IsUpper(runes[i-1]) || // Add underscore before digit if previous char was letter
if unicode.IsDigit(r) && unicode.IsLetter(prev) {
result.WriteByte('_')
}
// Add underscore before uppercase letter
if unicode.IsUpper(r) {
// Don't add if previous was also uppercase (unless end of acronym)
if !unicode.IsUpper(prev) ||
(i+1 < len(runes) && unicode.IsLower(runes[i+1])) { (i+1 < len(runes) && unicode.IsLower(runes[i+1])) {
result.WriteByte('_') result.WriteByte('_')
} }
} }
}
result.WriteRune(unicode.ToLower(r)) result.WriteRune(unicode.ToLower(r))
} }
return result.String() return result.String()

View File

@ -95,35 +95,46 @@ func showRegister(ctx sushi.Ctx) {
// processRegister handles registration form submission // processRegister handles registration form submission
func processRegister(ctx sushi.Ctx) { func processRegister(ctx sushi.Ctx) {
fmt.Println("DEBUG: Starting registration process")
username := strings.TrimSpace(ctx.Form("username").String()) username := strings.TrimSpace(ctx.Form("username").String())
email := strings.TrimSpace(ctx.Form("email").String()) email := strings.TrimSpace(ctx.Form("email").String())
userPassword := ctx.Form("password").String() userPassword := ctx.Form("password").String()
confirmPassword := ctx.Form("confirm_password").String() confirmPassword := ctx.Form("confirm_password").String()
fmt.Printf("DEBUG: Form data - username: '%s', email: '%s', password length: %d\n",
username, email, len(userPassword))
formData := map[string]string{ formData := map[string]string{
"username": username, "username": username,
"email": email, "email": email,
} }
if err := validateRegistration(username, email, userPassword, confirmPassword); err != nil { if err := validateRegistration(username, email, userPassword, confirmPassword); err != nil {
fmt.Printf("DEBUG: Validation failed: %v\n", err)
setFlashAndFormData(ctx, err.Error(), formData) setFlashAndFormData(ctx, err.Error(), formData)
ctx.Redirect("/register") ctx.Redirect("/register")
return return
} }
fmt.Println("DEBUG: Validation passed")
// Check if username already exists // Check if username already exists
if _, err := users.ByUsername(username); err == nil { if _, err := users.ByUsername(username); err == nil {
fmt.Printf("DEBUG: Username '%s' already exists\n", username)
setFlashAndFormData(ctx, "Username already exists", formData) setFlashAndFormData(ctx, "Username already exists", formData)
ctx.Redirect("/register") ctx.Redirect("/register")
return return
} }
fmt.Printf("DEBUG: Username '%s' is available\n", username)
// Check if email already exists // Check if email already exists
if _, err := users.ByEmail(email); err == nil { if _, err := users.ByEmail(email); err == nil {
fmt.Printf("DEBUG: Email '%s' already exists\n", email)
setFlashAndFormData(ctx, "Email already registered", formData) setFlashAndFormData(ctx, "Email already registered", formData)
ctx.Redirect("/register") ctx.Redirect("/register")
return return
} }
fmt.Printf("DEBUG: Email '%s' is available\n", email)
// Create new user // Create new user
user := users.New() user := users.New()
@ -133,26 +144,34 @@ func processRegister(ctx sushi.Ctx) {
user.ClassID = 1 user.ClassID = 1
user.Auth = 1 user.Auth = 1
fmt.Printf("DEBUG: Created user struct with ID: %d\n", user.ID)
// Validate before inserting // Validate before inserting
if err := user.Validate(); err != nil { if err := user.Validate(); err != nil {
fmt.Printf("DEBUG: User validation failed: %v\n", err)
setFlashAndFormData(ctx, fmt.Sprintf("Invalid user data: %s", err.Error()), formData) setFlashAndFormData(ctx, fmt.Sprintf("Invalid user data: %s", err.Error()), formData)
ctx.Redirect("/register") ctx.Redirect("/register")
return return
} }
fmt.Println("DEBUG: User validation passed")
if err := user.Insert(); err != nil { if err := user.Insert(); err != nil {
fmt.Printf("DEBUG: User insert failed: %v\n", err)
setFlashAndFormData(ctx, "Failed to create account", formData) setFlashAndFormData(ctx, "Failed to create account", formData)
ctx.Redirect("/register") ctx.Redirect("/register")
return return
} }
fmt.Printf("DEBUG: User inserted successfully with ID: %d\n", user.ID)
// Auto-login after registration // Auto-login after registration
ctx.Login(user.ID, user) ctx.Login(user.ID, user)
fmt.Printf("DEBUG: User logged in with ID: %d\n", user.ID)
// Set success message // Set success message
sess := ctx.GetCurrentSession() sess := ctx.GetCurrentSession()
sess.SetFlash("success", fmt.Sprintf("Greetings, %s!", user.Username)) sess.SetFlash("success", fmt.Sprintf("Greetings, %s!", user.Username))
fmt.Println("DEBUG: Registration completed successfully")
ctx.Redirect("/") ctx.Redirect("/")
} }

View File

@ -9,6 +9,7 @@ import (
"path/filepath" "path/filepath"
"syscall" "syscall"
"dk/internal/control"
"dk/internal/database" "dk/internal/database"
"dk/internal/models/users" "dk/internal/models/users"
"dk/internal/routes" "dk/internal/routes"
@ -62,10 +63,13 @@ func start(port string) error {
} }
defer database.DB().Close() defer database.DB().Close()
control.Init(filepath.Join(cwd, "control.json"))
defer control.Save()
template.InitializeCache(cwd) template.InitializeCache(cwd)
app := sushi.New() app := sushi.New()
sushi.InitSessions(filepath.Join(cwd, "data/_sessions.json")) sushi.InitSessions(filepath.Join(cwd, "data/sessions.json"))
app.Use(session.Middleware()) app.Use(session.Middleware())
app.Use(auth.Middleware(getUserByID)) app.Use(auth.Middleware(getUserByID))