diff --git a/.helix/ignore b/.helix/ignore index 25da40d..10f3355 100644 --- a/.helix/ignore +++ b/.helix/ignore @@ -1 +1,2 @@ jong-db +bevy_spacetimedb diff --git a/Cargo.lock b/Cargo.lock index 87787c4..f3d8fff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -500,7 +500,7 @@ dependencies = [ "derive_more 2.1.1", "downcast-rs 2.0.2", "either", - "petgraph", + "petgraph 0.8.3", "ron", "serde", "smallvec", @@ -1303,7 +1303,7 @@ dependencies = [ "glam", "indexmap 2.13.0", "inventory", - "petgraph", + "petgraph 0.8.3", "serde", "smallvec", "smol_str", @@ -2153,6 +2153,18 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "windows-sys 0.59.0", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -2733,6 +2745,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +[[package]] +name = "ecow" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78e4f79b296fbaab6ce2e22d52cb4c7f010fe0ebe7a32e34fa25885fd797bd02" + [[package]] name = "either" version = "1.15.0" @@ -2770,6 +2788,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "enum-as-inner" version = "0.6.1" @@ -2782,6 +2806,26 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "env_filter" version = "0.1.4" @@ -3751,6 +3795,22 @@ dependencies = [ "libc", ] +[[package]] +name = "insta" +version = "1.46.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e82db8c87c7f1ccecb34ce0c24399b8a73081427f3c7c50a5d597925356115e4" +dependencies = [ + "console", + "once_cell", + "regex", + "serde", + "similar", + "tempfile", + "toml_edit", + "toml_writer", +] + [[package]] name = "instability" version = "0.3.11" @@ -4819,15 +4879,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-float" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2c1f9f56e534ac6a9b8a4600bdf0f530fb393b5f393e7b4d03489c3cf0c3f01" -dependencies = [ - "num-traits", -] - [[package]] name = "owned_ttf_parser" version = "0.25.1" @@ -4927,6 +4978,16 @@ dependencies = [ "sha2", ] +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap 2.13.0", +] + [[package]] name = "petgraph" version = "0.8.3" @@ -5772,6 +5833,15 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_with" version = "3.16.1" @@ -5887,6 +5957,12 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + [[package]] name = "siphasher" version = "1.0.2" @@ -5980,9 +6056,9 @@ dependencies = [ [[package]] name = "spacetimedb" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83af98280374b59796296f512f7855fd19e19240a358bb7706a54f1c4e4e7dff" +checksum = "503ac8c991a76998d4ba699ef9b7f0085d3d7c363d1fcce4219314f909746bca" dependencies = [ "anyhow", "bytemuck", @@ -5998,13 +6074,14 @@ dependencies = [ "spacetimedb-bindings-sys", "spacetimedb-lib", "spacetimedb-primitives", + "spacetimedb-query-builder", ] [[package]] name = "spacetimedb-bindings-macro" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d8dbedaa26e2e59d886a19bd2b784356d8d008274046f735c9185f9943bd912" +checksum = "1214628a7c29ee58255d511b7c4dbaaa463bc5022dba9401f264c1c85b5a891c" dependencies = [ "heck 0.4.1", "humantime", @@ -6016,18 +6093,18 @@ dependencies = [ [[package]] name = "spacetimedb-bindings-sys" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0d30e1655731b1564b7094a6213ef6c354ea920e3c04424e55ad377a1bc3e2" +checksum = "d4777d90692bade6601887a21a074b71c157b34a92a5cfc8d5ecb46a0c571094" dependencies = [ "spacetimedb-primitives", ] [[package]] name = "spacetimedb-client-api-messages" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93dac13fc3dbd43698823c287c3839a3c13391dd9b33414a724c85335d1aa966" +checksum = "745d7ab0f81e3f6333d3ee353ce314b73841fbfe06adad69ab43efa791301da3" dependencies = [ "bytes", "bytestring", @@ -6047,12 +6124,13 @@ dependencies = [ [[package]] name = "spacetimedb-data-structures" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5d42998701abb5fd4878e0ceac31bf208caccc453491620f0ff59e2e75de9" +checksum = "b5d85162537b1eeb6eac39383e34ca27aafcbf26987753172ca3de1de1e3a838" dependencies = [ "ahash", "crossbeam-queue", + "either", "hashbrown 0.16.1", "nohash-hasher", "smallvec", @@ -6061,9 +6139,9 @@ dependencies = [ [[package]] name = "spacetimedb-lib" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f7284d48bcfddc7c091756c6d5d3cc9a847b95778c636fdd03b9538d74a57c7" +checksum = "6c5e91c66b10dc38cce01928d3f77313276e34c635504e54afdec6f186a2fc9c" dependencies = [ "anyhow", "bitflags 2.11.0", @@ -6071,6 +6149,7 @@ dependencies = [ "chrono", "derive_more 0.99.20", "enum-as-inner", + "enum-map", "hex", "itertools 0.12.1", "log", @@ -6083,10 +6162,20 @@ dependencies = [ ] [[package]] -name = "spacetimedb-metrics" -version = "1.11.3" +name = "spacetimedb-memory-usage" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a759e05414bd0f41a1bd498173c3cc2aa94d83b37e564dd0f597aa5c026f3ad" +checksum = "eb9c081d3ffafa9c2fa11194b4ea3329773d979e342944b0128282bcbf5d3343" +dependencies = [ + "decorum", + "ethnum", +] + +[[package]] +name = "spacetimedb-metrics" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985858969f693529c8624ce195cb747a34f7c84f3097418f595f795c0559fbd1" dependencies = [ "arrayvec", "itertools 0.12.1", @@ -6096,22 +6185,32 @@ dependencies = [ [[package]] name = "spacetimedb-primitives" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2dc124963dd166ecde2b4d8f0e5ed4cfd27a20d7f6bb9e84d7eff46cc520b5" +checksum = "8f0321a161fa39f0937aceb436b47115cd811212799ddaf7996a8ecac3476d8d" dependencies = [ "bitflags 2.11.0", "either", "enum-as-inner", "itertools 0.12.1", "nohash-hasher", + "spacetimedb-memory-usage", +] + +[[package]] +name = "spacetimedb-query-builder" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df8137b6dc2739d4efbc6218c5fb106f1e105a1345819a74053b677bd38c429" +dependencies = [ + "spacetimedb-lib", ] [[package]] name = "spacetimedb-sats" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df06586ffc862efd795425854cc2469c561aca5b95f5df2212aa29ef14a56f8a" +checksum = "f4e07b1bc933156b0cbe6b6c759e57381ce95df52c4522d9c3d71df59c01cf20" dependencies = [ "anyhow", "arrayvec", @@ -6132,6 +6231,7 @@ dependencies = [ "sha3", "smallvec", "spacetimedb-bindings-macro", + "spacetimedb-memory-usage", "spacetimedb-metrics", "spacetimedb-primitives", "thiserror 1.0.69", @@ -6139,10 +6239,40 @@ dependencies = [ ] [[package]] -name = "spacetimedb-sdk" -version = "1.11.3" +name = "spacetimedb-schema" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b12876a6ebba7685ad52bcd1b540cd4d220bd4cf37746b3a776cb140ebc52483" +checksum = "c2763b4769028f111032f00b35635f6cbb0562f54a59d05775f5ea66d7b8f8d2" +dependencies = [ + "anyhow", + "derive_more 0.99.20", + "ecow", + "enum-as-inner", + "enum-map", + "indexmap 2.13.0", + "insta", + "itertools 0.12.1", + "lazy_static", + "petgraph 0.6.5", + "serde_json", + "smallvec", + "spacetimedb-data-structures", + "spacetimedb-lib", + "spacetimedb-memory-usage", + "spacetimedb-primitives", + "spacetimedb-sats", + "spacetimedb-sql-parser", + "termcolor", + "thiserror 1.0.69", + "unicode-ident", + "unicode-normalization", +] + +[[package]] +name = "spacetimedb-sdk" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243f7b433aa0ba1d665aeb9db397b9bd40698d80817840d8fa8d8bfe74e99f00" dependencies = [ "anymap", "base64 0.21.7", @@ -6161,12 +6291,26 @@ dependencies = [ "spacetimedb-data-structures", "spacetimedb-lib", "spacetimedb-metrics", + "spacetimedb-query-builder", "spacetimedb-sats", + "spacetimedb-schema", "thiserror 1.0.69", "tokio", "tokio-tungstenite", ] +[[package]] +name = "spacetimedb-sql-parser" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cd63f69d4d6b074771830d8f8d12ce52c253179940c1bd02a50adeba7a9485" +dependencies = [ + "derive_more 0.99.20", + "spacetimedb-lib", + "sqlparser", + "thiserror 1.0.69", +] + [[package]] name = "spin" version = "0.10.0" @@ -6185,6 +6329,15 @@ dependencies = [ "bitflags 2.11.0", ] +[[package]] +name = "sqlparser" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0272b7bb0a225320170c99901b4b5fb3a4384e255a7f2cc228f61e2ba3893e75" +dependencies = [ + "log", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -6410,7 +6563,7 @@ dependencies = [ "nix 0.29.0", "num-derive", "num-traits", - "ordered-float 4.6.0", + "ordered-float", "pest", "pest_derive", "phf", @@ -6631,8 +6784,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ "indexmap 2.13.0", + "serde_core", + "serde_spanned", "toml_datetime", "toml_parser", + "toml_writer", "winnow", ] @@ -6645,6 +6801,12 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + [[package]] name = "tracing" version = "0.1.44" @@ -6832,6 +6994,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-script" version = "0.5.8" @@ -7251,7 +7422,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" dependencies = [ "log", - "ordered-float 4.6.0", + "ordered-float", "strsim", "thiserror 1.0.69", "wezterm-dynamic-derive", @@ -7399,7 +7570,7 @@ dependencies = [ "ndk-sys 0.6.0+11769913", "objc", "once_cell", - "ordered-float 5.0.0", + "ordered-float", "parking_lot", "portable-atomic", "portable-atomic-util", @@ -8317,7 +8488,3 @@ name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[patch.unused]] -name = "bevy_ratatui" -version = "0.10.0" diff --git a/Cargo.toml b/Cargo.toml index cecf3ee..1c9bb29 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,10 +12,10 @@ bevy.default-features = false bevy_ratatui = "0.11.1" bevy_spacetimedb = "0.7" -spacetimedb.version = "1.11.*" +spacetimedb.version = "1.12.*" spacetimedb.features = ["unstable"] -spacetimedb-sdk = "1.11.*" +spacetimedb-sdk = "1.12.*" strum.version = "0.27.2" strum.features = ["derive"] diff --git a/devenv.lock b/devenv.lock index 3dda13a..08cedca 100644 --- a/devenv.lock +++ b/devenv.lock @@ -125,10 +125,10 @@ ] }, "locked": { - "lastModified": 1771642886, + "lastModified": 1771729765, "owner": "oxalica", "repo": "rust-overlay", - "rev": "85078369717bdbe1f266c9eaad5e66956fb6feea", + "rev": "be926cb1a76e8450ab2b92121b2e88d09fa4d41c", "type": "github" }, "original": { diff --git a/devenv.nix b/devenv.nix index 925cfa6..9899754 100644 --- a/devenv.nix +++ b/devenv.nix @@ -24,7 +24,7 @@ # spacetimedb openssl binaryen - spacetimedb + # spacetimedb # bevy Linux # Audio (Linux only) diff --git a/jong-db/src/db/bot_table.rs b/jong-db/src/db/bot_table.rs index e9379ed..d062239 100644 --- a/jong-db/src/db/bot_table.rs +++ b/jong-db/src/db/bot_table.rs @@ -142,3 +142,19 @@ impl<'ctx> BotIdUnique<'ctx> { self.imp.find(col_val) } } + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `Bot`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait botQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `Bot`. + fn bot(&self) -> __sdk::__query_builder::Table; +} + +impl botQueryTableAccess for __sdk::QueryTableAccessor { + fn bot(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("bot") + } +} diff --git a/jong-db/src/db/bot_type.rs b/jong-db/src/db/bot_type.rs index dcad657..58acb75 100644 --- a/jong-db/src/db/bot_type.rs +++ b/jong-db/src/db/bot_type.rs @@ -21,3 +21,47 @@ pub struct Bot { impl __sdk::InModule for Bot { type Module = super::RemoteModule; } + +/// Column accessor struct for the table `Bot`. +/// +/// Provides typed access to columns for query building. +pub struct BotCols { + pub id: __sdk::__query_builder::Col, + pub lobby_id: __sdk::__query_builder::Col, + pub turn_state: __sdk::__query_builder::Col, + pub hand: __sdk::__query_builder::Col>, + pub pond: __sdk::__query_builder::Col>, + pub working_tile: __sdk::__query_builder::Col>, +} + +impl __sdk::__query_builder::HasCols for Bot { + type Cols = BotCols; + fn cols(table_name: &'static str) -> Self::Cols { + BotCols { + id: __sdk::__query_builder::Col::new(table_name, "id"), + lobby_id: __sdk::__query_builder::Col::new(table_name, "lobby_id"), + turn_state: __sdk::__query_builder::Col::new(table_name, "turn_state"), + hand: __sdk::__query_builder::Col::new(table_name, "hand"), + pond: __sdk::__query_builder::Col::new(table_name, "pond"), + working_tile: __sdk::__query_builder::Col::new(table_name, "working_tile"), + } + } +} + +/// Indexed column accessor struct for the table `Bot`. +/// +/// Provides typed access to indexed columns for query building. +pub struct BotIxCols { + pub id: __sdk::__query_builder::IxCol, + pub lobby_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for Bot { + type IxCols = BotIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + BotIxCols { + id: __sdk::__query_builder::IxCol::new(table_name, "id"), + lobby_id: __sdk::__query_builder::IxCol::new(table_name, "lobby_id"), + } + } +} diff --git a/jong-db/src/db/db_tile_type.rs b/jong-db/src/db/db_tile_type.rs index cf5c736..9bd4f8e 100644 --- a/jong-db/src/db/db_tile_type.rs +++ b/jong-db/src/db/db_tile_type.rs @@ -16,3 +16,37 @@ pub struct DbTile { impl __sdk::InModule for DbTile { type Module = super::RemoteModule; } + +/// Column accessor struct for the table `DbTile`. +/// +/// Provides typed access to columns for query building. +pub struct DbTileCols { + pub id: __sdk::__query_builder::Col, + pub tile: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for DbTile { + type Cols = DbTileCols; + fn cols(table_name: &'static str) -> Self::Cols { + DbTileCols { + id: __sdk::__query_builder::Col::new(table_name, "id"), + tile: __sdk::__query_builder::Col::new(table_name, "tile"), + } + } +} + +/// Indexed column accessor struct for the table `DbTile`. +/// +/// Provides typed access to indexed columns for query building. +pub struct DbTileIxCols { + pub id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for DbTile { + type IxCols = DbTileIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + DbTileIxCols { + id: __sdk::__query_builder::IxCol::new(table_name, "id"), + } + } +} diff --git a/jong-db/src/db/db_wall_type.rs b/jong-db/src/db/db_wall_type.rs index 20688c7..47ec2cc 100644 --- a/jong-db/src/db/db_wall_type.rs +++ b/jong-db/src/db/db_wall_type.rs @@ -16,3 +16,37 @@ pub struct DbWall { impl __sdk::InModule for DbWall { type Module = super::RemoteModule; } + +/// Column accessor struct for the table `DbWall`. +/// +/// Provides typed access to columns for query building. +pub struct DbWallCols { + pub lobby_id: __sdk::__query_builder::Col, + pub tiles: __sdk::__query_builder::Col>, +} + +impl __sdk::__query_builder::HasCols for DbWall { + type Cols = DbWallCols; + fn cols(table_name: &'static str) -> Self::Cols { + DbWallCols { + lobby_id: __sdk::__query_builder::Col::new(table_name, "lobby_id"), + tiles: __sdk::__query_builder::Col::new(table_name, "tiles"), + } + } +} + +/// Indexed column accessor struct for the table `DbWall`. +/// +/// Provides typed access to indexed columns for query building. +pub struct DbWallIxCols { + pub lobby_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for DbWall { + type IxCols = DbWallIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + DbWallIxCols { + lobby_id: __sdk::__query_builder::IxCol::new(table_name, "lobby_id"), + } + } +} diff --git a/jong-db/src/db/game_timer_table.rs b/jong-db/src/db/game_timer_table.rs index 58bdfe0..9d29ade 100644 --- a/jong-db/src/db/game_timer_table.rs +++ b/jong-db/src/db/game_timer_table.rs @@ -171,3 +171,19 @@ impl<'ctx> GameTimerLobbyIdUnique<'ctx> { self.imp.find(col_val) } } + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `GameTimer`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait game_timerQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `GameTimer`. + fn game_timer(&self) -> __sdk::__query_builder::Table; +} + +impl game_timerQueryTableAccess for __sdk::QueryTableAccessor { + fn game_timer(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("game_timer") + } +} diff --git a/jong-db/src/db/game_timer_type.rs b/jong-db/src/db/game_timer_type.rs index cefd735..80b8a73 100644 --- a/jong-db/src/db/game_timer_type.rs +++ b/jong-db/src/db/game_timer_type.rs @@ -15,3 +15,41 @@ pub struct GameTimer { impl __sdk::InModule for GameTimer { type Module = super::RemoteModule; } + +/// Column accessor struct for the table `GameTimer`. +/// +/// Provides typed access to columns for query building. +pub struct GameTimerCols { + pub id: __sdk::__query_builder::Col, + pub lobby_id: __sdk::__query_builder::Col, + pub scheduled_at: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for GameTimer { + type Cols = GameTimerCols; + fn cols(table_name: &'static str) -> Self::Cols { + GameTimerCols { + id: __sdk::__query_builder::Col::new(table_name, "id"), + lobby_id: __sdk::__query_builder::Col::new(table_name, "lobby_id"), + scheduled_at: __sdk::__query_builder::Col::new(table_name, "scheduled_at"), + } + } +} + +/// Indexed column accessor struct for the table `GameTimer`. +/// +/// Provides typed access to indexed columns for query building. +pub struct GameTimerIxCols { + pub id: __sdk::__query_builder::IxCol, + pub lobby_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for GameTimer { + type IxCols = GameTimerIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + GameTimerIxCols { + id: __sdk::__query_builder::IxCol::new(table_name, "id"), + lobby_id: __sdk::__query_builder::IxCol::new(table_name, "lobby_id"), + } + } +} diff --git a/jong-db/src/db/lobby_table.rs b/jong-db/src/db/lobby_table.rs index 962b676..8d7f499 100644 --- a/jong-db/src/db/lobby_table.rs +++ b/jong-db/src/db/lobby_table.rs @@ -142,3 +142,19 @@ impl<'ctx> LobbyIdUnique<'ctx> { self.imp.find(col_val) } } + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `Lobby`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait lobbyQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `Lobby`. + fn lobby(&self) -> __sdk::__query_builder::Table; +} + +impl lobbyQueryTableAccess for __sdk::QueryTableAccessor { + fn lobby(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("lobby") + } +} diff --git a/jong-db/src/db/lobby_type.rs b/jong-db/src/db/lobby_type.rs index 6fca7de..af8dda7 100644 --- a/jong-db/src/db/lobby_type.rs +++ b/jong-db/src/db/lobby_type.rs @@ -20,3 +20,43 @@ pub struct Lobby { impl __sdk::InModule for Lobby { type Module = super::RemoteModule; } + +/// Column accessor struct for the table `Lobby`. +/// +/// Provides typed access to columns for query building. +pub struct LobbyCols { + pub id: __sdk::__query_builder::Col, + pub players: __sdk::__query_builder::Col>, + pub dealer_idx: __sdk::__query_builder::Col, + pub current_idx: __sdk::__query_builder::Col, + pub game_state: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for Lobby { + type Cols = LobbyCols; + fn cols(table_name: &'static str) -> Self::Cols { + LobbyCols { + id: __sdk::__query_builder::Col::new(table_name, "id"), + players: __sdk::__query_builder::Col::new(table_name, "players"), + dealer_idx: __sdk::__query_builder::Col::new(table_name, "dealer_idx"), + current_idx: __sdk::__query_builder::Col::new(table_name, "current_idx"), + game_state: __sdk::__query_builder::Col::new(table_name, "game_state"), + } + } +} + +/// Indexed column accessor struct for the table `Lobby`. +/// +/// Provides typed access to indexed columns for query building. +pub struct LobbyIxCols { + pub id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for Lobby { + type IxCols = LobbyIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + LobbyIxCols { + id: __sdk::__query_builder::IxCol::new(table_name, "id"), + } + } +} diff --git a/jong-db/src/db/logged_out_player_table.rs b/jong-db/src/db/logged_out_player_table.rs index aeaa8a2..1de7240 100644 --- a/jong-db/src/db/logged_out_player_table.rs +++ b/jong-db/src/db/logged_out_player_table.rs @@ -173,3 +173,19 @@ impl<'ctx> LoggedOutPlayerIdentityUnique<'ctx> { self.imp.find(col_val) } } + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `Player`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait logged_out_playerQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `Player`. + fn logged_out_player(&self) -> __sdk::__query_builder::Table; +} + +impl logged_out_playerQueryTableAccess for __sdk::QueryTableAccessor { + fn logged_out_player(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("logged_out_player") + } +} diff --git a/jong-db/src/db/mod.rs b/jong-db/src/db/mod.rs index de00af9..b1eefc3 100644 --- a/jong-db/src/db/mod.rs +++ b/jong-db/src/db/mod.rs @@ -1,7 +1,7 @@ // THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE // WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. -// This was generated using spacetimedb cli version 1.11.3 (commit 02449737ca3b29e7e39679fccbef541a50f32094). +// This was generated using spacetimedb cli version 1.12.0 (commit 4fdb8d923f39ed592931ad4c7e6391ed99b9fe3a). #![allow(unused, clippy::all)] use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; @@ -37,6 +37,7 @@ pub mod suit_type; pub mod tile_table; pub mod tile_type; pub mod turn_state_type; +pub mod view_hand_table; pub mod wall_table; pub mod wind_type; @@ -73,6 +74,7 @@ pub use suit_type::Suit; pub use tile_table::*; pub use tile_type::Tile; pub use turn_state_type::TurnState; +pub use view_hand_table::*; pub use wall_table::*; pub use wind_type::Wind; @@ -188,6 +190,7 @@ pub struct DbUpdate { player_clock: __sdk::TableUpdate, player_hand: __sdk::TableUpdate, tile: __sdk::TableUpdate, + view_hand: __sdk::TableUpdate, wall: __sdk::TableUpdate, } @@ -221,6 +224,9 @@ impl TryFrom<__ws::DatabaseUpdate<__ws::BsatnFormat>> for DbUpdate { "tile" => db_update .tile .append(tile_table::parse_table_update(table_update)?), + "view_hand" => db_update + .view_hand + .append(view_hand_table::parse_table_update(table_update)?), "wall" => db_update .wall .append(wall_table::parse_table_update(table_update)?), @@ -277,6 +283,7 @@ impl __sdk::DbUpdate for DbUpdate { diff.wall = cache .apply_diff_to_table::("wall", &self.wall) .with_updates_by_pk(|row| &row.lobby_id); + diff.view_hand = cache.apply_diff_to_table::("view_hand", &self.view_hand); diff } @@ -294,6 +301,7 @@ pub struct AppliedDiff<'r> { player_clock: __sdk::TableAppliedDiff<'r, PlayerClock>, player_hand: __sdk::TableAppliedDiff<'r, PlayerHand>, tile: __sdk::TableAppliedDiff<'r, DbTile>, + view_hand: __sdk::TableAppliedDiff<'r, PlayerHand>, wall: __sdk::TableAppliedDiff<'r, DbWall>, __unused: std::marker::PhantomData<&'r ()>, } @@ -324,6 +332,7 @@ impl<'r> __sdk::AppliedDiff<'r> for AppliedDiff<'r> { ); callbacks.invoke_table_row_callbacks::("player_hand", &self.player_hand, event); callbacks.invoke_table_row_callbacks::("tile", &self.tile, event); + callbacks.invoke_table_row_callbacks::("view_hand", &self.view_hand, event); callbacks.invoke_table_row_callbacks::("wall", &self.wall, event); } } @@ -1042,6 +1051,7 @@ impl __sdk::SpacetimeModule for RemoteModule { type DbUpdate = DbUpdate; type AppliedDiff<'r> = AppliedDiff<'r>; type SubscriptionHandle = SubscriptionHandle; + type QueryBuilder = __sdk::QueryBuilder; fn register_tables(client_cache: &mut __sdk::ClientCache) { bot_table::register_table(client_cache); @@ -1052,6 +1062,7 @@ impl __sdk::SpacetimeModule for RemoteModule { player_clock_table::register_table(client_cache); player_hand_table::register_table(client_cache); tile_table::register_table(client_cache); + view_hand_table::register_table(client_cache); wall_table::register_table(client_cache); } } diff --git a/jong-db/src/db/player_clock_table.rs b/jong-db/src/db/player_clock_table.rs index 551f521..79a0eb0 100644 --- a/jong-db/src/db/player_clock_table.rs +++ b/jong-db/src/db/player_clock_table.rs @@ -171,3 +171,19 @@ impl<'ctx> PlayerClockPlayerIdUnique<'ctx> { self.imp.find(col_val) } } + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `PlayerClock`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait player_clockQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `PlayerClock`. + fn player_clock(&self) -> __sdk::__query_builder::Table; +} + +impl player_clockQueryTableAccess for __sdk::QueryTableAccessor { + fn player_clock(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("player_clock") + } +} diff --git a/jong-db/src/db/player_clock_type.rs b/jong-db/src/db/player_clock_type.rs index e8c0407..6ae3212 100644 --- a/jong-db/src/db/player_clock_type.rs +++ b/jong-db/src/db/player_clock_type.rs @@ -16,3 +16,43 @@ pub struct PlayerClock { impl __sdk::InModule for PlayerClock { type Module = super::RemoteModule; } + +/// Column accessor struct for the table `PlayerClock`. +/// +/// Provides typed access to columns for query building. +pub struct PlayerClockCols { + pub id: __sdk::__query_builder::Col, + pub player_id: __sdk::__query_builder::Col, + pub renewable: __sdk::__query_builder::Col, + pub total: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for PlayerClock { + type Cols = PlayerClockCols; + fn cols(table_name: &'static str) -> Self::Cols { + PlayerClockCols { + id: __sdk::__query_builder::Col::new(table_name, "id"), + player_id: __sdk::__query_builder::Col::new(table_name, "player_id"), + renewable: __sdk::__query_builder::Col::new(table_name, "renewable"), + total: __sdk::__query_builder::Col::new(table_name, "total"), + } + } +} + +/// Indexed column accessor struct for the table `PlayerClock`. +/// +/// Provides typed access to indexed columns for query building. +pub struct PlayerClockIxCols { + pub id: __sdk::__query_builder::IxCol, + pub player_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for PlayerClock { + type IxCols = PlayerClockIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + PlayerClockIxCols { + id: __sdk::__query_builder::IxCol::new(table_name, "id"), + player_id: __sdk::__query_builder::IxCol::new(table_name, "player_id"), + } + } +} diff --git a/jong-db/src/db/player_hand_table.rs b/jong-db/src/db/player_hand_table.rs index a61a5db..4b1af06 100644 --- a/jong-db/src/db/player_hand_table.rs +++ b/jong-db/src/db/player_hand_table.rs @@ -173,3 +173,19 @@ impl<'ctx> PlayerHandPlayerIdUnique<'ctx> { self.imp.find(col_val) } } + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `PlayerHand`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait player_handQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `PlayerHand`. + fn player_hand(&self) -> __sdk::__query_builder::Table; +} + +impl player_handQueryTableAccess for __sdk::QueryTableAccessor { + fn player_hand(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("player_hand") + } +} diff --git a/jong-db/src/db/player_hand_type.rs b/jong-db/src/db/player_hand_type.rs index b8255d7..dfa7dbf 100644 --- a/jong-db/src/db/player_hand_type.rs +++ b/jong-db/src/db/player_hand_type.rs @@ -21,3 +21,47 @@ pub struct PlayerHand { impl __sdk::InModule for PlayerHand { type Module = super::RemoteModule; } + +/// Column accessor struct for the table `PlayerHand`. +/// +/// Provides typed access to columns for query building. +pub struct PlayerHandCols { + pub id: __sdk::__query_builder::Col, + pub player_id: __sdk::__query_builder::Col, + pub turn_state: __sdk::__query_builder::Col, + pub pond: __sdk::__query_builder::Col>, + pub hand: __sdk::__query_builder::Col>, + pub working_tile: __sdk::__query_builder::Col>, +} + +impl __sdk::__query_builder::HasCols for PlayerHand { + type Cols = PlayerHandCols; + fn cols(table_name: &'static str) -> Self::Cols { + PlayerHandCols { + id: __sdk::__query_builder::Col::new(table_name, "id"), + player_id: __sdk::__query_builder::Col::new(table_name, "player_id"), + turn_state: __sdk::__query_builder::Col::new(table_name, "turn_state"), + pond: __sdk::__query_builder::Col::new(table_name, "pond"), + hand: __sdk::__query_builder::Col::new(table_name, "hand"), + working_tile: __sdk::__query_builder::Col::new(table_name, "working_tile"), + } + } +} + +/// Indexed column accessor struct for the table `PlayerHand`. +/// +/// Provides typed access to indexed columns for query building. +pub struct PlayerHandIxCols { + pub id: __sdk::__query_builder::IxCol, + pub player_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for PlayerHand { + type IxCols = PlayerHandIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + PlayerHandIxCols { + id: __sdk::__query_builder::IxCol::new(table_name, "id"), + player_id: __sdk::__query_builder::IxCol::new(table_name, "player_id"), + } + } +} diff --git a/jong-db/src/db/player_table.rs b/jong-db/src/db/player_table.rs index b83dd9b..78db0f7 100644 --- a/jong-db/src/db/player_table.rs +++ b/jong-db/src/db/player_table.rs @@ -173,3 +173,19 @@ impl<'ctx> PlayerIdentityUnique<'ctx> { self.imp.find(col_val) } } + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `Player`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait playerQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `Player`. + fn player(&self) -> __sdk::__query_builder::Table; +} + +impl playerQueryTableAccess for __sdk::QueryTableAccessor { + fn player(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("player") + } +} diff --git a/jong-db/src/db/player_type.rs b/jong-db/src/db/player_type.rs index 318aa2a..be770b6 100644 --- a/jong-db/src/db/player_type.rs +++ b/jong-db/src/db/player_type.rs @@ -18,3 +18,49 @@ pub struct Player { impl __sdk::InModule for Player { type Module = super::RemoteModule; } + +/// Column accessor struct for the table `Player`. +/// +/// Provides typed access to columns for query building. +pub struct PlayerCols { + pub id: __sdk::__query_builder::Col, + pub identity: __sdk::__query_builder::Col, + pub name: __sdk::__query_builder::Col>, + pub lobby_id: __sdk::__query_builder::Col, + pub ready: __sdk::__query_builder::Col, + pub sort: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for Player { + type Cols = PlayerCols; + fn cols(table_name: &'static str) -> Self::Cols { + PlayerCols { + id: __sdk::__query_builder::Col::new(table_name, "id"), + identity: __sdk::__query_builder::Col::new(table_name, "identity"), + name: __sdk::__query_builder::Col::new(table_name, "name"), + lobby_id: __sdk::__query_builder::Col::new(table_name, "lobby_id"), + ready: __sdk::__query_builder::Col::new(table_name, "ready"), + sort: __sdk::__query_builder::Col::new(table_name, "sort"), + } + } +} + +/// Indexed column accessor struct for the table `Player`. +/// +/// Provides typed access to indexed columns for query building. +pub struct PlayerIxCols { + pub id: __sdk::__query_builder::IxCol, + pub identity: __sdk::__query_builder::IxCol, + pub lobby_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for Player { + type IxCols = PlayerIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + PlayerIxCols { + id: __sdk::__query_builder::IxCol::new(table_name, "id"), + identity: __sdk::__query_builder::IxCol::new(table_name, "identity"), + lobby_id: __sdk::__query_builder::IxCol::new(table_name, "lobby_id"), + } + } +} diff --git a/jong-db/src/db/tile_table.rs b/jong-db/src/db/tile_table.rs index 8d188eb..e23f10e 100644 --- a/jong-db/src/db/tile_table.rs +++ b/jong-db/src/db/tile_table.rs @@ -141,3 +141,19 @@ impl<'ctx> TileIdUnique<'ctx> { self.imp.find(col_val) } } + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `DbTile`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait tileQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `DbTile`. + fn tile(&self) -> __sdk::__query_builder::Table; +} + +impl tileQueryTableAccess for __sdk::QueryTableAccessor { + fn tile(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("tile") + } +} diff --git a/jong-db/src/db/view_hand_table.rs b/jong-db/src/db/view_hand_table.rs new file mode 100644 index 0000000..1a9adbf --- /dev/null +++ b/jong-db/src/db/view_hand_table.rs @@ -0,0 +1,113 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use super::db_tile_type::DbTile; +use super::player_hand_type::PlayerHand; +use super::turn_state_type::TurnState; +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +/// Table handle for the table `view_hand`. +/// +/// Obtain a handle from the [`ViewHandTableAccess::view_hand`] method on [`super::RemoteTables`], +/// like `ctx.db.view_hand()`. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.view_hand().on_insert(...)`. +pub struct ViewHandTableHandle<'ctx> { + imp: __sdk::TableHandle, + ctx: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the table `view_hand`. +/// +/// Implemented for [`super::RemoteTables`]. +pub trait ViewHandTableAccess { + #[allow(non_snake_case)] + /// Obtain a [`ViewHandTableHandle`], which mediates access to the table `view_hand`. + fn view_hand(&self) -> ViewHandTableHandle<'_>; +} + +impl ViewHandTableAccess for super::RemoteTables { + fn view_hand(&self) -> ViewHandTableHandle<'_> { + ViewHandTableHandle { + imp: self.imp.get_table::("view_hand"), + ctx: std::marker::PhantomData, + } + } +} + +pub struct ViewHandInsertCallbackId(__sdk::CallbackId); +pub struct ViewHandDeleteCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::Table for ViewHandTableHandle<'ctx> { + type Row = PlayerHand; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } + + type InsertCallbackId = ViewHandInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> ViewHandInsertCallbackId { + ViewHandInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: ViewHandInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } + + type DeleteCallbackId = ViewHandDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> ViewHandDeleteCallbackId { + ViewHandDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: ViewHandDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +#[doc(hidden)] +pub(super) fn register_table(client_cache: &mut __sdk::ClientCache) { + let _table = client_cache.get_or_make_table::("view_hand"); +} + +#[doc(hidden)] +pub(super) fn parse_table_update( + raw_updates: __ws::TableUpdate<__ws::BsatnFormat>, +) -> __sdk::Result<__sdk::TableUpdate> { + __sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| { + __sdk::InternalError::failed_parse("TableUpdate", "TableUpdate") + .with_cause(e) + .into() + }) +} + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `PlayerHand`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait view_handQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `PlayerHand`. + fn view_hand(&self) -> __sdk::__query_builder::Table; +} + +impl view_handQueryTableAccess for __sdk::QueryTableAccessor { + fn view_hand(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("view_hand") + } +} diff --git a/jong-db/src/db/wall_table.rs b/jong-db/src/db/wall_table.rs index 1f920d6..70c4010 100644 --- a/jong-db/src/db/wall_table.rs +++ b/jong-db/src/db/wall_table.rs @@ -141,3 +141,19 @@ impl<'ctx> WallLobbyIdUnique<'ctx> { self.imp.find(col_val) } } + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `DbWall`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait wallQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `DbWall`. + fn wall(&self) -> __sdk::__query_builder::Table; +} + +impl wallQueryTableAccess for __sdk::QueryTableAccessor { + fn wall(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("wall") + } +} diff --git a/jong-db/src/lib.rs b/jong-db/src/lib.rs index 0d2a8d5..0d3befb 100644 --- a/jong-db/src/lib.rs +++ b/jong-db/src/lib.rs @@ -1,4 +1,6 @@ pub mod db; + +pub use conversions::*; pub use db::*; mod conversions { diff --git a/jong-line/src/lib.rs b/jong-line/src/lib.rs index adcca63..438880d 100644 --- a/jong-line/src/lib.rs +++ b/jong-line/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(if_let_guard)] + use log::debug; use spacetimedb::{ReducerContext, Table, reducer}; diff --git a/jong-line/src/reducers.rs b/jong-line/src/reducers.rs index a9ce012..54f1233 100644 --- a/jong-line/src/reducers.rs +++ b/jong-line/src/reducers.rs @@ -1,14 +1,16 @@ use std::time::Duration; -use spacetimedb::{ReducerContext, ScheduleAt::Interval, reducer}; +use spacetimedb::{ + ReducerContext, ScheduleAt::Interval, Table as _, rand::seq::SliceRandom, reducer, +}; use jong_types::{GameState, TurnState}; use crate::{ - reducers::deal::shuffle_deal, + reducers::deal::{deal_hands, new_shuffled_wall, shuffle_deal}, tables::{ - GameTimer, PlayerClock, PlayerOrBot, bot, game_timer, lobby as _, player_clock, - player_hand, wall, + DbTile, DbWall, GameTimer, PlayerClock, PlayerHand, PlayerOrBot, bot, game_timer, + lobby as _, player, player_clock, player_hand, tile as _, wall, }, }; @@ -20,6 +22,7 @@ mod lobby; pub fn advance_game(ctx: &ReducerContext, mut game_timer: GameTimer) -> Result<(), String> { // checks every second (or more? when users make moves) on whether to advance the game's various states // TODO this, or allow player/debug to call this? + if !ctx.sender_auth().is_internal() { return Err("This reducer can only be called by the scheduler".to_string()); } @@ -29,11 +32,51 @@ pub fn advance_game(ctx: &ReducerContext, mut game_timer: GameTimer) -> Result<( GameState::Setup => { // TODO reduce interval beforehand so we don't wait a second? // TODO keep a count to clear stale lobbies + let tiles = { + let mut rng = ctx.rng(); + let mut wall: Vec<_> = jong_types::tiles::tiles() + .into_iter() + .map(|tile| ctx.db.tile().insert(DbTile { id: 0, tile })) + .collect(); + wall.shuffle(&mut rng); + wall + }; + ctx.db.wall().insert(DbWall { + // id: 0, + lobby_id: lobby.id, + tiles, + }); lobby.game_state = GameState::Deal; } GameState::Deal => { // TODO reduce interval beforehand so this can animate? - shuffle_deal(ctx, lobby.id); + // TODO change loop to be per interval somehow? + let mut wall = ctx.db.wall().lobby_id().find(lobby.id).unwrap(); + for pob in &lobby.players { + let mut tiles = wall.tiles.split_off(wall.tiles.len() - 13); + wall = ctx.db.wall().lobby_id().update(wall); + tiles.sort_by_key(|t| t.tile); + match pob { + PlayerOrBot::Player { id } + if let Some(p) = ctx.db.player().id().find(id) => + { + ctx.db.player_hand().insert(PlayerHand { + id: 0, + player_id: p.id, + turn_state: jong_types::TurnState::None, + pond: vec![], + hand: tiles, + working_tile: None, + }); + } + PlayerOrBot::Bot { id } if let Some(mut b) = ctx.db.bot().id().find(id) => { + b.hand = tiles; + ctx.db.bot().id().update(b); + } + _ => Err("couldn't find player or bot".to_string())?, + } + } + lobby.game_state = jong_types::states::GameState::Play; } GameState::Play => { let curr_player = lobby.players.get(lobby.current_idx as usize).unwrap(); @@ -87,7 +130,8 @@ pub fn advance_game(ctx: &ReducerContext, mut game_timer: GameTimer) -> Result<( _ => Err(format!("lobby {} in impossible state", lobby.id))?, } - ctx.db.game_timer().id().update(game_timer); + // ctx.db.game_timer().id().update(game_timer); + ctx.db.lobby().id().update(lobby); } else { ctx.db.game_timer().id().delete(game_timer.id); Err(format!( diff --git a/jong-line/src/reducers/deal.rs b/jong-line/src/reducers/deal.rs index a82e78a..8c54edc 100644 --- a/jong-line/src/reducers/deal.rs +++ b/jong-line/src/reducers/deal.rs @@ -9,15 +9,12 @@ pub fn shuffle_deal(ctx: &ReducerContext, lobby_id: u32) { if lobby.game_state == jong_types::states::GameState::Deal { let tiles = new_shuffled_wall(ctx); - ctx.db.wall().insert(DbWall { // id: 0, lobby_id, tiles, }); - deal_hands(ctx, lobby_id); - lobby.game_state = jong_types::states::GameState::Play; ctx.db.lobby().id().update(lobby); } diff --git a/jong-line/src/reducers/lobby.rs b/jong-line/src/reducers/lobby.rs index b51aeac..ebe69c9 100644 --- a/jong-line/src/reducers/lobby.rs +++ b/jong-line/src/reducers/lobby.rs @@ -15,6 +15,8 @@ pub fn join_or_create_lobby(ctx: &ReducerContext, mut lobby_id: u32) -> Result<( .ok_or(format!("cannot find player {}", ctx.sender))?; if lobby_id == 0 { + // TODO check first if player is already in a lobby + let lobby = ctx.db.lobby().insert(Lobby { id: 0, players: vec![PlayerOrBot::Player { id: player.id }], diff --git a/jong-line/src/tables.rs b/jong-line/src/tables.rs index a8ef7d5..4dfc472 100644 --- a/jong-line/src/tables.rs +++ b/jong-line/src/tables.rs @@ -1,6 +1,4 @@ -use std::time::Instant; - -use spacetimedb::{SpacetimeType, table}; +use spacetimedb::{SpacetimeType, ViewContext, table, view}; use jong_types::{ states::{GameState, TurnState}, @@ -47,7 +45,6 @@ pub enum PlayerOrBot { Bot { id: u32 }, } -// FIXME this shant be public, use views #[table(name = player, public)] #[table(name = logged_out_player)] #[derive(Debug)] @@ -98,7 +95,7 @@ pub struct PlayerHand { pub working_tile: Option, } -#[table(name = bot)] +#[table(name = bot, public)] pub struct Bot { #[primary_key] #[auto_inc] @@ -126,3 +123,12 @@ pub struct GameTimer { pub scheduled_at: spacetimedb::ScheduleAt, } + +#[view(name = view_hand, public)] +fn view_hand(ctx: &ViewContext) -> Option { + ctx.db + .player() + .identity() + .find(ctx.sender) + .and_then(|p| ctx.db.player_hand().player_id().find(p.id)) +} diff --git a/jong/src/riichi.rs b/jong/src/riichi.rs index c8aa7d7..73134f5 100644 --- a/jong/src/riichi.rs +++ b/jong/src/riichi.rs @@ -3,7 +3,10 @@ use bevy_spacetimedb::{ ReadInsertUpdateMessage, ReadStdbConnectedMessage, ReadStdbDisconnectedMessage, StdbPlugin, }; -use jong_db::{self, DbConnection, LobbyTableAccess, PlayerTableAccess, RemoteTables}; +use jong_db::{ + self, DbConnection, LobbyTableAccess, PlayerHand, PlayerTableAccess, RemoteTables, + ViewHandTableAccess as _, +}; use jong_db::{add_bot, set_ready}; use jong_types::*; @@ -19,11 +22,10 @@ impl Plugin for Riichi { .with_uri("http://localhost:3000") .with_module_name("jong-line") .with_run_fn(DbConnection::run_threaded) - // TODO why don't I need to call add_reducer? - - // TODO do these need to be subscription & vice-versa? .add_table(RemoteTables::player) .add_table(RemoteTables::lobby) + // TODO check bevy_spacetimedb PR status + .add_view_with_pk(RemoteTables::view_hand, |p| p.id) // semicolon stopper ; @@ -87,104 +89,70 @@ fn subscriptions(stdb: SpacetimeDB) { .on_applied(|_| trace!("made all subs!")) .on_error(|_, err| error!("sub failed: {err}")) .subscribe([ - // TODO until views work + // TODO change these to sub/unsub based on being in lobby and some such format!( "SELECT * FROM player p WHERE p.identity = '{}'", stdb.identity() ), - "SELECT l.* FROM lobby l JOIN player p ON l.host_player_id = p.id".to_string(), + "SELECT l.* FROM lobby l JOIN player p ON l.id = p.lobby_id".to_string(), + "SELECT c.* FROM player_clock c JOIN player p ON c.player_id = p.id".to_string(), + "SELECT * FROM view_hand".to_string(), + "SELECT b.* FROM bot b JOIN lobby l ON l.id = b.lobby_id".to_string(), ]); // .subscribe_to_all_tables(); } -fn on_player_insert_update( - mut messages: ReadInsertUpdateMessage, +fn on_view_hand_insert_update( + stdb: SpacetimeDB, + mut messages: ReadInsertUpdateMessage, + mut commands: Commands, - - pond: Option>>, - hand: Option>>, - tiles: Query<(Entity, &TileId)>, + mut hand: Option>>, + tiles: Query<&Tile>, + mut next_turnstate: ResMut>, ) { - let hand = if hand.is_none() { - let hand = commands.spawn(Hand).id(); - commands.spawn(Pond); - hand - } else { - *hand.unwrap() - }; - let pond = if pond.is_none() { - let pond = commands.spawn(Pond).id(); - commands.spawn(Pond); - pond - } else { - *pond.unwrap() - }; - for msg in messages.read() { - /* match msg.new.turn_state { - jong_db::TurnState::None => {} - jong_db::TurnState::Tsumo => { - stdb.reducers().draw_tile().unwrap(); - } - jong_db::TurnState::Menzen => todo!(), - jong_db::TurnState::RiichiKan => todo!(), - jong_db::TurnState::RonChiiPonKan => { - stdb.reducers().skip_call().unwrap(); - } - jong_db::TurnState::End => todo!(), + if hand.is_none() { + let hand_tiles: Vec<_> = msg + .new + .hand + .iter() + .map(|dbt| commands.spawn((Tile::from(&dbt.tile), TileId(dbt.id))).id()) + .collect(); + commands.spawn(Hand).add_children(&hand_tiles); } - let hand_tiles: Vec<_> = msg - .new - .hand - .iter() - .map(|dbt| { - tiles - .iter() - .find_map(|(e, t)| if *t == TileId(dbt.id) { Some(e) } else { None }) - .or_else(|| Some(commands.spawn((Tile::from(&dbt.tile), TileId(dbt.id))).id())) - .unwrap() - }) - .collect(); - let pond_tiles: Vec<_> = msg - .new - .pond - .iter() - .map(|dbt| { - tiles - .iter() - .find_map(|(e, t)| if *t == TileId(dbt.id) { Some(e) } else { None }) - .expect(&format!( - "dealt tiles should still be around, couldn't find {:?}. Tiles: {:?}", - dbt, - tiles.iter().map(|(_, t)| t).collect::>() - )) - }) - .collect(); + // match msg.new.turn_state { + // jong_db::TurnState::None => todo!(), + // jong_db::TurnState::Tsumo => todo!(), + // jong_db::TurnState::Menzen => todo!(), + // jong_db::TurnState::RiichiKan => todo!(), + // jong_db::TurnState::RonChiiPonKan => todo!(), + // jong_db::TurnState::End => todo!(), + // } - debug!("hand_tiles: {hand_tiles:?}"); - - commands.entity(hand).replace_children(&hand_tiles); - commands.entity(pond).replace_children(&pond_tiles); - - // drawn tile is always a new tile to us until wall isn't fake - if let Some(dbt) = &msg.new.drawn_tile { - debug!("drew tile with id: {}", dbt.id); - commands.spawn((Tile::from(&dbt.tile), TileId(dbt.id), Drawn)); - } */ + next_turnstate.set(msg.new.turn_state.into()); } } +fn on_player_insert_update( + stdb: SpacetimeDB, + mut messages: ReadInsertUpdateMessage, + + mut commands: Commands, +) { + for msg in messages.read() {} +} + fn on_lobby_insert_update( stdb: SpacetimeDB, mut messages: ReadInsertUpdateMessage, commands: Commands, mut next_gamestate: ResMut>, - mut next_turnstate: ResMut>, ) { for msg in messages.read() { - // trace!("on_lobby_insert_update msg:\n{:#?}", msg.new); + trace!("on_lobby_insert_update msg:\n{:#?}", msg.new); let player = stdb .db() @@ -205,12 +173,10 @@ fn on_lobby_insert_update( stdb.reducers().add_bot(player.lobby_id).unwrap(); } stdb.reducers().set_ready(true).unwrap(); - // stdb.reducers().start_game().unwrap(); } } jong_db::GameState::Setup => { trace!("game entered setup"); - // stdb.reducers().shuffle_deal(player.lobby_id).unwrap(); } jong_db::GameState::Deal => { trace!("game entered deal"); diff --git a/jong/src/tui.rs b/jong/src/tui.rs index 9198051..4a82498 100644 --- a/jong/src/tui.rs +++ b/jong/src/tui.rs @@ -97,9 +97,8 @@ impl Plugin for TuiPlugin { fn discard_tile( stdb: SpacetimeDB, - mut selected: MessageReader, - mut commands: Commands, + mut selected: MessageReader, drawn: Single<(Entity, &TileId), With>, tiles: Query<&TileId>, ) { diff --git a/justfile b/justfile index 8f51801..4541442 100644 --- a/justfile +++ b/justfile @@ -8,8 +8,6 @@ default: just --list run-tui: - just spacetime_restart_dev - sleep 3sec cargo run -- run-tui update: @@ -27,3 +25,8 @@ spacetime_generate-bindings: spacetime_restart_dev: mprocs -s localhost:4050 --ctl $"({c: restart-proc, name: spacetimedb_dev} | to yaml)" + +rrt: + just spacetime_restart_dev + sleep 3sec + just run-tui