From eef4b7941b268724124b034b50ecb16f156579f2 Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Sat, 5 Jul 2025 10:16:17 +0300 Subject: [PATCH] Enha: remove marks --- assets/words/en_nouns.txt | 1 - components/cardword.html | 6 ++---- handlers/actions.go | 15 +++++++++++++++ handlers/elements.go | 21 +++++++++++++++++---- migrations/001_initial_schema.up.sql | 1 - models/main.go | 2 -- repos/card_marks.go | 21 ++++++++++++++------- todos.md | 4 +++- 8 files changed, 51 insertions(+), 20 deletions(-) diff --git a/assets/words/en_nouns.txt b/assets/words/en_nouns.txt index 050934b..218fc1f 100644 --- a/assets/words/en_nouns.txt +++ b/assets/words/en_nouns.txt @@ -1636,7 +1636,6 @@ increase computer bobby accused -500 nonsense close finger diff --git a/components/cardword.html b/components/cardword.html index 6fd4612..74e2dff 100644 --- a/components/cardword.html +++ b/components/cardword.html @@ -28,10 +28,8 @@
- {{range .Mark}} - {{if .Active}} - X - {{end}} + {{range .Marks}} + {{.Username}} {{end}}
diff --git a/handlers/actions.go b/handlers/actions.go index e98eeaf..a396e69 100644 --- a/handlers/actions.go +++ b/handlers/actions.go @@ -75,10 +75,25 @@ func getFullInfoByCtx(ctx context.Context) (*models.FullInfo, error) { } return nil, err } + // get card_marks + if room.IsRunning && room.MimeDone { + fillCardMarks(ctx, room) + } resp.Room = room return resp, nil } +func fillCardMarks(ctx context.Context, room *models.Room) error { + for i, card := range room.Cards { + marks, err := repo.CardMarksByCardID(ctx, card.ID) + if err != nil { + return err + } + room.Cards[i].Marks = marks + } + return nil +} + func getPlayerByCtx(ctx context.Context) (*models.Player, error) { username, ok := ctx.Value(models.CtxUsernameKey).(string) if !ok { diff --git a/handlers/elements.go b/handlers/elements.go index 30b534f..f7705f6 100644 --- a/handlers/elements.go +++ b/handlers/elements.go @@ -221,17 +221,30 @@ func HandleMarkCard(w http.ResponseWriter, r *http.Request) { found := false var newMarks []models.CardMark for _, mark := range card.Marks { - if mark.Username == fi.State.Username && mark.Active { + if mark.Username == fi.State.Username { found = true } else { newMarks = append(newMarks, mark) } } if !found { - newMarks = append(newMarks, models.CardMark{ + cm := models.CardMark{ Username: fi.State.Username, - Active: true, - }) + CardID: card.ID, + } + newMarks = append(newMarks, cm) + if err := repo.CardMarksAdd(r.Context(), &cm); err != nil { + log.Error("failed to add mark", "error", err, "card", card) + abortWithError(w, "failed to add mark") + return + } + } else { + // TODO: if mark was found, it needs to be removed + if err := repo.CardMarksRemove(r.Context(), card.ID, fi.State.Username); err != nil { + log.Error("failed to remove mark", "error", err, "card", card) + abortWithError(w, "failed to remove mark") + return + } } fi.Room.Cards[i].Marks = newMarks cardword = fi.Room.Cards[i] diff --git a/migrations/001_initial_schema.up.sql b/migrations/001_initial_schema.up.sql index fc9a960..9b2aa59 100644 --- a/migrations/001_initial_schema.up.sql +++ b/migrations/001_initial_schema.up.sql @@ -40,7 +40,6 @@ CREATE TABLE word_cards ( CREATE TABLE card_marks ( card_id INTEGER NOT NULL, username TEXT NOT NULL, - active BOOLEAN NOT NULL DEFAULT TRUE, FOREIGN KEY (card_id) REFERENCES word_cards(id) ON DELETE CASCADE, FOREIGN KEY (username) REFERENCES players(username) ON DELETE CASCADE, PRIMARY KEY (card_id, username) diff --git a/models/main.go b/models/main.go index 1323f21..d745381 100644 --- a/models/main.go +++ b/models/main.go @@ -128,8 +128,6 @@ type BotPlayer struct { type CardMark struct { CardID uint32 `db:"card_id"` Username string `db:"username"` - MarkType string `db:"mark_type"` - Active bool `db:"active"` } type Room struct { diff --git a/repos/card_marks.go b/repos/card_marks.go index cdad372..2fc3608 100644 --- a/repos/card_marks.go +++ b/repos/card_marks.go @@ -8,9 +8,10 @@ import ( ) type CardMarksRepo interface { - CardMarksByCardID(ctx context.Context, cardID string) ([]models.CardMark, error) + CardMarksByCardID(ctx context.Context, cardID uint32) ([]models.CardMark, error) CardMarksAdd(ctx context.Context, cm *models.CardMark) error - CardMarksRemove(ctx context.Context, cardID, username string) error + CardMarksRemove(ctx context.Context, cardID uint32, username string) error + CardMarksByRoomID(ctx context.Context, roomID string) ([]models.CardMark, error) } type cardMarksRepo struct { @@ -21,19 +22,25 @@ func NewCardMarksRepo(db *sqlx.DB) CardMarksRepo { return &cardMarksRepo{db: db} } -func (r *cardMarksRepo) CardMarksByCardID(ctx context.Context, cardID string) ([]models.CardMark, error) { +func (r *cardMarksRepo) CardMarksByCardID(ctx context.Context, cardID uint32) ([]models.CardMark, error) { var cardMarks []models.CardMark - err := sqlx.SelectContext(ctx, getDB(ctx, r.db), &cardMarks, "SELECT * FROM card_marks WHERE card_id = ?", cardID) + err := sqlx.SelectContext(ctx, getDB(ctx, r.db), &cardMarks, "SELECT * FROM card_marks WHERE card_id = ?", cardID) return cardMarks, err } func (r *cardMarksRepo) CardMarksAdd(ctx context.Context, cm *models.CardMark) error { - _, err := getDB(ctx, r.db).ExecContext(ctx, "INSERT INTO card_marks (card_id, username, mark_type) VALUES (?, ?, ?)", cm.CardID, cm.Username, cm.MarkType) + _, err := getDB(ctx, r.db).ExecContext(ctx, "INSERT INTO card_marks (card_id, username) VALUES (?, ?)", cm.CardID, cm.Username) return err } -func (r *cardMarksRepo) CardMarksRemove(ctx context.Context, cardID, username string) error { +func (r *cardMarksRepo) CardMarksRemove(ctx context.Context, cardID uint32, username string) error { db := getDB(ctx, r.db) _, err := db.ExecContext(ctx, "DELETE FROM card_marks WHERE card_id = ? AND username = ?", cardID, username) return err -} \ No newline at end of file +} + +func (r *cardMarksRepo) CardMarksByRoomID(ctx context.Context, roomID string) ([]models.CardMark, error) { + var cardMarks []models.CardMark + err := sqlx.SelectContext(ctx, getDB(ctx, r.db), &cardMarks, "SELECT * FROM card_marks WHERE card_id IN (select id from word_cards where room_id = ?)", roomID) + return cardMarks, err +} diff --git a/todos.md b/todos.md index 3c8132f..dfa3b06 100644 --- a/todos.md +++ b/todos.md @@ -68,4 +68,6 @@ - bot ends a turn after guessing one word only; - sync writing to json cache; what happens now: timer (or other side routine) overwrites old room, while mime making clue; ----------------- -- card marks; +- card marks; + +- on server recover relaunch guess timer if needed; +- start new game: clear last clue; mimedone to false; unload old cards;