From e35ddef4b77fde7bff55c1bfd2ba14d0dde00748 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Wed, 12 Feb 2025 16:48:58 -0700 Subject: [PATCH] src to pkg, impl lobby.Closed --- .gitignore | 1 + src/lib/db/db.go => pkg/lib/db/ctx.go | 0 .../db/db_test.go => pkg/lib/db/ctx_test.go | 2 +- pkg/lib/db/new.go | 21 +++++++ {src => pkg}/lib/event/serialize.go | 0 {src => pkg}/lib/test.go | 5 +- {src => pkg}/lib/test_test.go | 4 +- {src => pkg}/state/generate.go | 0 .../lobby/events.go => pkg/state/lobby/' | 8 ++- pkg/state/lobby/events.go | 60 +++++++++++++++++++ {src => pkg}/state/lobby/internal/event.go | 6 +- .../state/lobby/internal/event_test.go | 2 +- {src => pkg}/state/lobby/lobby_test.go | 10 +++- {src => pkg}/state/lobby/open.go | 5 +- {src => pkg}/state/priceiswrong/events.go | 4 +- .../state/priceiswrong/internal/event.go | 2 +- {src => pkg}/state/priceiswrong/open.go | 4 +- .../state/priceiswrong/priceiswrong_test.go | 4 +- 18 files changed, 117 insertions(+), 21 deletions(-) rename src/lib/db/db.go => pkg/lib/db/ctx.go (100%) rename src/lib/db/db_test.go => pkg/lib/db/ctx_test.go (91%) create mode 100644 pkg/lib/db/new.go rename {src => pkg}/lib/event/serialize.go (100%) rename {src => pkg}/lib/test.go (78%) rename {src => pkg}/lib/test_test.go (86%) rename {src => pkg}/state/generate.go (100%) rename src/state/lobby/events.go => pkg/state/lobby/' (85%) create mode 100644 pkg/state/lobby/events.go rename {src => pkg}/state/lobby/internal/event.go (83%) rename {src => pkg}/state/lobby/internal/event_test.go (92%) rename {src => pkg}/state/lobby/lobby_test.go (86%) rename {src => pkg}/state/lobby/open.go (96%) rename {src => pkg}/state/priceiswrong/events.go (96%) rename {src => pkg}/state/priceiswrong/internal/event.go (95%) rename {src => pkg}/state/priceiswrong/open.go (96%) rename {src => pkg}/state/priceiswrong/priceiswrong_test.go (95%) diff --git a/.gitignore b/.gitignore index 3758ebf..e64c058 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ **/*.sw* /src/state/fsm/template +/pkg/state/fsm/template diff --git a/src/lib/db/db.go b/pkg/lib/db/ctx.go similarity index 100% rename from src/lib/db/db.go rename to pkg/lib/db/ctx.go diff --git a/src/lib/db/db_test.go b/pkg/lib/db/ctx_test.go similarity index 91% rename from src/lib/db/db_test.go rename to pkg/lib/db/ctx_test.go index 8309420..a378ccb 100644 --- a/src/lib/db/db_test.go +++ b/pkg/lib/db/ctx_test.go @@ -3,7 +3,7 @@ package db_test import ( "context" "database/sql" - "gitea/price-is-wrong/src/lib/db" + "gitea/price-is-wrong/pkg/lib/db" "testing" ) diff --git a/pkg/lib/db/new.go b/pkg/lib/db/new.go new file mode 100644 index 0000000..ac1fa41 --- /dev/null +++ b/pkg/lib/db/new.go @@ -0,0 +1,21 @@ +package db + +import ( + "context" + "database/sql" + + _ "github.com/glebarez/sqlite" +) + +func New(ctx context.Context, driver, conn string) (*sql.DB, error) { + db, err := sql.Open(driver, conn) + if err != nil { + return nil, err + } + + if err := db.PingContext(ctx); err != nil { + return nil, err + } + + return db, nil +} diff --git a/src/lib/event/serialize.go b/pkg/lib/event/serialize.go similarity index 100% rename from src/lib/event/serialize.go rename to pkg/lib/event/serialize.go diff --git a/src/lib/test.go b/pkg/lib/test.go similarity index 78% rename from src/lib/test.go rename to pkg/lib/test.go index 6683eeb..36a3461 100644 --- a/src/lib/test.go +++ b/pkg/lib/test.go @@ -2,11 +2,10 @@ package lib import ( "context" - "database/sql" "path" "testing" - "gitea/price-is-wrong/src/lib/db" + "gitea/price-is-wrong/pkg/lib/db" _ "github.com/glebarez/sqlite" ) @@ -15,7 +14,7 @@ func NewTestCtx(t *testing.T) context.Context { d := t.TempDir() p := path.Join(d, "db.db") t.Logf("test db at %s", p) - b, err := sql.Open("sqlite", p) + b, err := db.New(context.Background(), "sqlite", p) if err != nil { t.Fatal(err) } diff --git a/src/lib/test_test.go b/pkg/lib/test_test.go similarity index 86% rename from src/lib/test_test.go rename to pkg/lib/test_test.go index af5ff40..1b7073d 100644 --- a/src/lib/test_test.go +++ b/pkg/lib/test_test.go @@ -2,8 +2,8 @@ package lib_test import ( "context" - "gitea/price-is-wrong/src/lib" - "gitea/price-is-wrong/src/lib/db" + "gitea/price-is-wrong/pkg/lib" + "gitea/price-is-wrong/pkg/lib/db" "sync" "testing" ) diff --git a/src/state/generate.go b/pkg/state/generate.go similarity index 100% rename from src/state/generate.go rename to pkg/state/generate.go diff --git a/src/state/lobby/events.go b/pkg/state/lobby/' similarity index 85% rename from src/state/lobby/events.go rename to pkg/state/lobby/' index 745786f..5292ccb 100644 --- a/src/state/lobby/events.go +++ b/pkg/state/lobby/' @@ -2,8 +2,8 @@ package lobby import ( "context" - "gitea/price-is-wrong/src/lib/db" - lobby "gitea/price-is-wrong/src/state/lobby/internal" + "gitea/price-is-wrong/pkg/lib/db" + lobby "gitea/price-is-wrong/pkg/state/lobby/internal" "slices" ) @@ -15,6 +15,10 @@ func (l *Lobby) Leave(ctx context.Context, id int) error { return l.upsertEvent(ctx, &lobby.PlayerLeave{ID: id}) } +func (l *Lobby) Close(ctx context.Context) error { + return l.upsertEvent(ctx, &lobby.Close{}) +} + func (l *Lobby) upsertEvent(ctx context.Context, e lobby.Event) error { if err := upsertEvent(ctx, l.id, e); err != nil { return err diff --git a/pkg/state/lobby/events.go b/pkg/state/lobby/events.go new file mode 100644 index 0000000..3b988c3 --- /dev/null +++ b/pkg/state/lobby/events.go @@ -0,0 +1,60 @@ +package lobby + +import ( + "context" + "gitea/price-is-wrong/pkg/lib/db" + lobby "gitea/price-is-wrong/pkg/state/lobby/internal" + "slices" +) + +func (l *Lobby) Join(ctx context.Context, id int) error { + return l.upsertEvent(ctx, &lobby.PlayerJoin{ID: id}) +} + +func (l *Lobby) Leave(ctx context.Context, id int) error { + return l.upsertEvent(ctx, &lobby.PlayerLeave{ID: id}) +} + +func (l *Lobby) Close(ctx context.Context) error { + return l.upsertEvent(ctx, &lobby.Close{}) +} + +func (l *Lobby) upsertEvent(ctx context.Context, e lobby.Event) error { + if err := upsertEvent(ctx, l.id, e); err != nil { + return err + } + + l2, err := openID(ctx, l.id) + if err != nil { + return err + } + + *l = *l2 + return nil +} + +func upsertEvent(ctx context.Context, lobbyID int, e lobby.Event) error { + b, err := lobby.MarshalEvent(e) + if err != nil { + return err + } + + _, err = db.From(ctx).ExecContext(ctx, ` + INSERT INTO lobby_events (lobby_id, payload) VALUES (?, ?) + `, lobbyID, b) + return err +} + +func (l *Lobby) apply(e lobby.Event) error { + switch e := e.(type) { + case *lobby.PlayerJoin: + if !slices.Contains(l.Players, e.ID) { + l.Players = append(l.Players, e.ID) + } + case *lobby.PlayerLeave: + l.Players = slices.DeleteFunc(l.Players, func(id int) bool { return id == e.ID }) + case *lobby.Close: + l.Closed = true + } + return nil +} diff --git a/src/state/lobby/internal/event.go b/pkg/state/lobby/internal/event.go similarity index 83% rename from src/state/lobby/internal/event.go rename to pkg/state/lobby/internal/event.go index d9494d9..f39bdaf 100644 --- a/src/state/lobby/internal/event.go +++ b/pkg/state/lobby/internal/event.go @@ -2,7 +2,7 @@ package lobby import ( "fmt" - "gitea/price-is-wrong/src/lib/event" + "gitea/price-is-wrong/pkg/lib/event" ) type Event interface{} @@ -15,10 +15,14 @@ type PlayerLeave struct { ID int } +type Close struct { +} + func ParseEvent(b []byte) (Event, error) { typesToPointers := map[string]any{ "*lobby.PlayerJoin": &PlayerJoin{}, "*lobby.PlayerLeave": &PlayerLeave{}, + "*lobby.Close": &Close{}, } t, err := event.Parse(b, typesToPointers) return typesToPointers[t], err diff --git a/src/state/lobby/internal/event_test.go b/pkg/state/lobby/internal/event_test.go similarity index 92% rename from src/state/lobby/internal/event_test.go rename to pkg/state/lobby/internal/event_test.go index 23ae2d8..bca1272 100644 --- a/src/state/lobby/internal/event_test.go +++ b/pkg/state/lobby/internal/event_test.go @@ -2,7 +2,7 @@ package lobby_test import ( "fmt" - lobby "gitea/price-is-wrong/src/state/lobby/internal" + lobby "gitea/price-is-wrong/pkg/state/lobby/internal" "testing" ) diff --git a/src/state/lobby/lobby_test.go b/pkg/state/lobby/lobby_test.go similarity index 86% rename from src/state/lobby/lobby_test.go rename to pkg/state/lobby/lobby_test.go index e7667c6..f95dc89 100644 --- a/src/state/lobby/lobby_test.go +++ b/pkg/state/lobby/lobby_test.go @@ -1,8 +1,8 @@ package lobby_test import ( - "gitea/price-is-wrong/src/lib" - "gitea/price-is-wrong/src/state/lobby" + "gitea/price-is-wrong/pkg/lib" + "gitea/price-is-wrong/pkg/state/lobby" "testing" ) @@ -44,4 +44,10 @@ func TestOpen(t *testing.T) { } else if len(l.Players) != 2 { t.Errorf("second join yielded wrong players: %+v", l.Players) } + + if err := l.Close(ctx); err != nil { + t.Fatal(err) + } else if !l.Closed { + t.Error(l.Closed) + } } diff --git a/src/state/lobby/open.go b/pkg/state/lobby/open.go similarity index 96% rename from src/state/lobby/open.go rename to pkg/state/lobby/open.go index e5fe1a3..e5e8a01 100644 --- a/src/state/lobby/open.go +++ b/pkg/state/lobby/open.go @@ -4,13 +4,14 @@ import ( "context" "database/sql" "fmt" - "gitea/price-is-wrong/src/lib/db" - lobby "gitea/price-is-wrong/src/state/lobby/internal" + "gitea/price-is-wrong/pkg/lib/db" + lobby "gitea/price-is-wrong/pkg/state/lobby/internal" ) type Lobby struct { id int Players []int + Closed bool } func Open(ctx context.Context, name string) (*Lobby, error) { diff --git a/src/state/priceiswrong/events.go b/pkg/state/priceiswrong/events.go similarity index 96% rename from src/state/priceiswrong/events.go rename to pkg/state/priceiswrong/events.go index a547265..021012a 100644 --- a/src/state/priceiswrong/events.go +++ b/pkg/state/priceiswrong/events.go @@ -2,8 +2,8 @@ package priceiswrong import ( "context" - "gitea/price-is-wrong/src/lib/db" - priceiswrong "gitea/price-is-wrong/src/state/priceiswrong/internal" + "gitea/price-is-wrong/pkg/lib/db" + priceiswrong "gitea/price-is-wrong/pkg/state/priceiswrong/internal" "html" "math/rand" ) diff --git a/src/state/priceiswrong/internal/event.go b/pkg/state/priceiswrong/internal/event.go similarity index 95% rename from src/state/priceiswrong/internal/event.go rename to pkg/state/priceiswrong/internal/event.go index c132a22..3432ae4 100644 --- a/src/state/priceiswrong/internal/event.go +++ b/pkg/state/priceiswrong/internal/event.go @@ -2,7 +2,7 @@ package priceiswrong import ( "fmt" - "gitea/price-is-wrong/src/lib/event" + "gitea/price-is-wrong/pkg/lib/event" ) type Event interface{} diff --git a/src/state/priceiswrong/open.go b/pkg/state/priceiswrong/open.go similarity index 96% rename from src/state/priceiswrong/open.go rename to pkg/state/priceiswrong/open.go index 6be1517..0c9534d 100644 --- a/src/state/priceiswrong/open.go +++ b/pkg/state/priceiswrong/open.go @@ -4,8 +4,8 @@ import ( "context" "database/sql" "fmt" - "gitea/price-is-wrong/src/lib/db" - priceiswrong "gitea/price-is-wrong/src/state/priceiswrong/internal" + "gitea/price-is-wrong/pkg/lib/db" + priceiswrong "gitea/price-is-wrong/pkg/state/priceiswrong/internal" ) type PriceIsWrong struct { diff --git a/src/state/priceiswrong/priceiswrong_test.go b/pkg/state/priceiswrong/priceiswrong_test.go similarity index 95% rename from src/state/priceiswrong/priceiswrong_test.go rename to pkg/state/priceiswrong/priceiswrong_test.go index 12643bf..f838c73 100644 --- a/src/state/priceiswrong/priceiswrong_test.go +++ b/pkg/state/priceiswrong/priceiswrong_test.go @@ -1,8 +1,8 @@ package priceiswrong_test import ( - "gitea/price-is-wrong/src/lib" - "gitea/price-is-wrong/src/state/priceiswrong" + "gitea/price-is-wrong/pkg/lib" + "gitea/price-is-wrong/pkg/state/priceiswrong" "testing" )