src to pkg, impl lobby.Closed
This commit is contained in:
58
pkg/state/lobby/'
Normal file
58
pkg/state/lobby/'
Normal file
@@ -0,0 +1,58 @@
|
||||
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 })
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user