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;