From 01c1a4554a1ebf04ca326f814a6d0eec343780c2 Mon Sep 17 00:00:00 2001 From: emilis Date: Thu, 2 Oct 2025 17:52:12 +0100 Subject: [PATCH] target merge into identity, self updates, etc --- Cargo.lock | 766 ++++++++---------- werewolves-proto/Cargo.toml | 1 - werewolves-proto/src/error.rs | 6 +- werewolves-proto/src/game/mod.rs | 11 +- werewolves-proto/src/game/night.rs | 4 +- werewolves-proto/src/game/village.rs | 38 +- werewolves-proto/src/game_test/mod.rs | 2 +- werewolves-proto/src/game_test/night_order.rs | 10 +- werewolves-proto/src/lib.rs | 16 - werewolves-proto/src/message.rs | 16 - werewolves-proto/src/message/host.rs | 10 +- werewolves-proto/src/message/ident.rs | 69 +- werewolves-proto/src/message/night.rs | 32 +- werewolves-proto/src/player.rs | 104 +-- werewolves-proto/src/role.rs | 6 +- werewolves-server/Cargo.toml | 2 +- werewolves-server/src/client.rs | 8 +- werewolves-server/src/communication/player.rs | 26 +- werewolves-server/src/connection.rs | 14 +- werewolves-server/src/game.rs | 8 +- werewolves-server/src/lobby.rs | 30 +- werewolves-server/src/main.rs | 6 +- werewolves/Cargo.toml | 7 +- werewolves/index.html | 4 +- werewolves/index.scss | 271 ++++--- werewolves/src/clients/client/client.rs | 163 ++-- werewolves/src/clients/host/host.rs | 41 +- werewolves/src/clients/mod.rs | 6 +- werewolves/src/components/action/prompt.rs | 37 +- werewolves/src/components/action/target.rs | 25 +- werewolves/src/components/action/wolves.rs | 9 +- werewolves/src/components/button.rs | 2 - werewolves/src/components/client/nav.rs | 207 +++++ werewolves/src/components/client/signin.rs | 82 ++ werewolves/src/components/field.rs | 89 ++ .../components/host/{mod.rs => daytime.rs} | 17 +- werewolves/src/components/identity.rs | 21 +- werewolves/src/components/input.rs | 29 + werewolves/src/components/input_name.rs | 73 -- werewolves/src/components/lobby.rs | 11 +- werewolves/src/components/lobby_player.rs | 62 +- werewolves/src/components/reveal.rs | 24 +- werewolves/src/components/settings.rs | 52 +- werewolves/src/main.rs | 64 +- werewolves/src/storage.rs | 52 +- 45 files changed, 1480 insertions(+), 1053 deletions(-) create mode 100644 werewolves/src/components/client/nav.rs create mode 100644 werewolves/src/components/client/signin.rs create mode 100644 werewolves/src/components/field.rs rename werewolves/src/components/host/{mod.rs => daytime.rs} (86%) create mode 100644 werewolves/src/components/input.rs delete mode 100644 werewolves/src/components/input_name.rs diff --git a/Cargo.lock b/Cargo.lock index f219eb8..b8367a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" @@ -26,12 +26,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -43,9 +37,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "anymap2" @@ -67,19 +61,25 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.4.0" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" +checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" dependencies = [ "axum-core", - "base64 0.22.1", + "base64", "bytes", "form_urlencoded", "futures-util", @@ -94,8 +94,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "serde_json", "serde_path_to_error", "serde_urlencoded", @@ -111,9 +110,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" dependencies = [ "bytes", "futures-core", @@ -122,7 +121,6 @@ dependencies = [ "http-body-util", "mime", "pin-project-lite", - "rustversion", "sync_wrapper", "tower-layer", "tower-service", @@ -131,9 +129,9 @@ dependencies = [ [[package]] name = "axum-extra" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bf463831f5131b7d3c756525b305d40f1185b688565648a92e1392ca35713d" +checksum = "9963ff19f40c6102c76756ef0a46004c0d58957d87259fc9208ff8441c12ab96" dependencies = [ "axum", "axum-core", @@ -146,17 +144,17 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "serde", - "tower", + "serde_core", "tower-layer", "tower-service", + "tracing", ] [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -164,15 +162,9 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -190,9 +182,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "block-buffer" @@ -211,9 +203,9 @@ checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytes" @@ -223,31 +215,31 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.17" +version = "1.2.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" dependencies = [ + "find-msvc-tools", "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-link 0.1.1", + "windows-link", ] [[package]] @@ -283,7 +275,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -357,7 +349,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -368,14 +360,14 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] name = "data-encoding" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "derive_builder" @@ -395,7 +387,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -405,7 +397,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -441,7 +433,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -472,6 +464,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + [[package]] name = "fnv" version = "1.0.7" @@ -480,9 +478,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -543,7 +541,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -588,36 +586,36 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "gloo" @@ -789,7 +787,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "903f432be5ba34427eac5e16048ef65604a82061fe93789f2212afc73d8617d6" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "gloo-events 0.2.0", "gloo-utils 0.2.0", "serde", @@ -1025,7 +1023,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -1040,17 +1038,17 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "headers" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "headers-core", "http 1.3.1", @@ -1068,12 +1066,6 @@ dependencies = [ "http 1.3.1", ] -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hermit-abi" version = "0.5.2" @@ -1145,31 +1137,33 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "http 1.3.1", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", ] [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "bytes", - "futures-util", + "futures-core", "http 1.3.1", "http-body", "hyper", @@ -1180,9 +1174,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1204,21 +1198,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -1227,31 +1222,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -1259,67 +1234,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -1328,9 +1290,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1339,9 +1301,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1364,14 +1326,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "699c1b6d335e63d0ba5c1e1c7f647371ce989c3bcbe1f7ed2b85fa56e3bd1a21" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] name = "indexmap" -version = "2.8.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", "hashbrown", @@ -1389,15 +1351,26 @@ dependencies = [ "web-sys", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + [[package]] name = "is-terminal" version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.5.2", + "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1418,21 +1391,21 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -1440,9 +1413,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "matchit" @@ -1452,9 +1425,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" @@ -1474,22 +1447,22 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff70ce3e48ae43fa075863cef62e8b43b71a4f2382229920e0df362592919430" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -1509,19 +1482,19 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -1534,9 +1507,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -1544,22 +1517,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" @@ -1578,7 +1551,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -1604,6 +1577,15 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -1635,12 +1617,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.31" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -1679,9 +1661,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -1705,9 +1687,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.37.4" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ce8c88de324ff838700f36fb6ab86c96df0e3c4ab6ef3a9b2044465cce1369" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "encoding_rs", "memchr", @@ -1715,28 +1697,27 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", "rand_core", - "zerocopy", ] [[package]] @@ -1755,23 +1736,23 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -1781,9 +1762,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -1792,9 +1773,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "route-recognizer" @@ -1804,15 +1785,15 @@ checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -1828,10 +1809,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -1858,36 +1840,47 @@ dependencies = [ ] [[package]] -name = "serde_derive" -version = "1.0.219" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -1921,36 +1914,33 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.9" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1977,9 +1967,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -1994,13 +1984,13 @@ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -2023,11 +2013,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -2038,25 +2028,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -2064,20 +2054,22 @@ dependencies = [ [[package]] name = "tokio" -version = "1.44.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2088,7 +2080,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -2104,9 +2096,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.26.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", @@ -2116,9 +2108,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" [[package]] name = "toml_edit" @@ -2173,29 +2165,29 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] [[package]] name = "tungstenite" -version = "0.26.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ "bytes", "data-encoding", @@ -2204,21 +2196,21 @@ dependencies = [ "log", "rand", "sha1", - "thiserror 2.0.12", + "thiserror 2.0.17", "utf-8", ] [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-segmentation" @@ -2228,13 +2220,14 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -2249,12 +2242,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2263,11 +2250,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "js-sys", "serde", "wasm-bindgen", @@ -2281,17 +2268,26 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ - "wit-bindgen-rt", + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", ] [[package]] @@ -2316,7 +2312,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", "wasm-bindgen-shared", ] @@ -2351,7 +2347,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2394,7 +2390,7 @@ dependencies = [ "ciborium", "convert_case", "futures", - "getrandom 0.3.2", + "getrandom 0.3.3", "gloo 0.11.0", "instant", "log", @@ -2402,8 +2398,9 @@ dependencies = [ "rand", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "uuid", + "wasm-bindgen", "wasm-bindgen-futures", "wasm-logger", "web-sys", @@ -2420,7 +2417,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -2434,7 +2431,7 @@ dependencies = [ "rand", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "uuid", "werewolves-macros", ] @@ -2457,7 +2454,7 @@ dependencies = [ "rand", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "werewolves-macros", "werewolves-proto", @@ -2469,50 +2466,44 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.1", ] [[package]] name = "windows-core" -version = "0.61.0" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.1.1", + "windows-link", "windows-result", "windows-strings", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - [[package]] name = "windows-link" version = "0.2.0" @@ -2521,38 +2512,38 @@ checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" [[package]] name = "windows-result" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" dependencies = [ - "windows-link 0.1.1", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" dependencies = [ - "windows-link 0.1.1", + "windows-link", ] [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] name = "windows-sys" -version = "0.60.2" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" dependencies = [ - "windows-targets 0.53.4", + "windows-link", ] [[package]] @@ -2561,31 +2552,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" -dependencies = [ - "windows-link 0.2.0", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -2594,96 +2568,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" version = "0.5.40" @@ -2694,25 +2620,16 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "yansi" @@ -2757,7 +2674,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -2787,14 +2704,14 @@ checksum = "42bfd190a07ca8cfde7cd4c52b3ac463803dc07323db8c34daa697e86365978c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -2804,34 +2721,34 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] [[package]] @@ -2851,15 +2768,26 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", "synstructure", ] [[package]] -name = "zerovec" -version = "0.10.4" +name = "zerotrie" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -2868,11 +2796,11 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.106", ] diff --git a/werewolves-proto/Cargo.toml b/werewolves-proto/Cargo.toml index b339c11..7984809 100644 --- a/werewolves-proto/Cargo.toml +++ b/werewolves-proto/Cargo.toml @@ -12,7 +12,6 @@ uuid = { version = "1.17", features = ["v4", "serde"] } rand = { version = "0.9" } werewolves-macros = { path = "../werewolves-macros" } - [dev-dependencies] pretty_assertions = { version = "1" } pretty_env_logger = { version = "0.5" } diff --git a/werewolves-proto/src/error.rs b/werewolves-proto/src/error.rs index 813bb25..4e51fa1 100644 --- a/werewolves-proto/src/error.rs +++ b/werewolves-proto/src/error.rs @@ -13,8 +13,6 @@ pub enum GameError { InvalidMessageForGameState, #[error("no executions during night time")] NoExecutionsAtNight, - #[error("no-trial not allowed")] - NoTrialNotAllowed, #[error("chracter is already dead")] CharacterAlreadyDead, #[error("no matching character found")] @@ -47,8 +45,6 @@ pub enum GameError { CantAddVillagerToSettings, #[error("no mentor for an apprentice to be an apprentice to :(")] NoApprenticeMentor, - #[error("BUG: cannot find character in village, but they should be there")] - CannotFindTargetButShouldBeThere, #[error("inactive game object")] InactiveGameObject, #[error("socket error: {0}")] @@ -73,4 +69,6 @@ pub enum GameError { NoPreviousState, #[error("invalid original kill for guardian guard")] GuardianInvalidOriginalKill, + #[error("player not assigned number: {0}")] + PlayerNotAssignedNumber(String), } diff --git a/werewolves-proto/src/game/mod.rs b/werewolves-proto/src/game/mod.rs index dba5239..60fd4b2 100644 --- a/werewolves-proto/src/game/mod.rs +++ b/werewolves-proto/src/game/mod.rs @@ -94,8 +94,7 @@ impl Game { .into_iter() .map(|c| CharacterState { player_id: c.player_id().clone(), - character_id: c.character_id().clone(), - public_identity: c.public_identity().clone(), + identity: c.identity(), role: c.role().title(), died_to: c.died_to().cloned(), }) @@ -109,9 +108,7 @@ impl Game { (GameState::Night { night }, HostGameMessage::GetState) => { if let Some(res) = night.current_result() { return Ok(ServerToHostMessage::ActionResult( - night - .current_character() - .map(|c| c.public_identity().clone()), + night.current_character().map(|c| c.identity()), res.clone(), )); } @@ -138,9 +135,7 @@ impl Game { HostGameMessage::Night(HostNightMessage::ActionResponse(resp)), ) => match night.received_response(resp.clone()) { Ok(res) => Ok(ServerToHostMessage::ActionResult( - night - .current_character() - .map(|c| c.public_identity().clone()), + night.current_character().map(|c| c.identity()), res, )), Err(GameError::NightNeedsNext) => match night.next() { diff --git a/werewolves-proto/src/game/night.rs b/werewolves-proto/src/game/night.rs index c2d8582..064ef1c 100644 --- a/werewolves-proto/src/game/night.rs +++ b/werewolves-proto/src/game/night.rs @@ -111,7 +111,7 @@ impl Night { wolves: village .living_wolf_pack_players() .into_iter() - .map(|w| (w.target(), w.role().title())) + .map(|w| (w.identity(), w.role().title())) .collect(), }); } @@ -324,7 +324,7 @@ impl Night { .village .character_by_id(&kill_target) .ok_or(GameError::NoMatchingCharacterFound)? - .character_identity(), + .identity(), }); } // Remove any further shapeshift prompts from the queue diff --git a/werewolves-proto/src/game/village.rs b/werewolves-proto/src/game/village.rs index b8f410f..0c0f748 100644 --- a/werewolves-proto/src/game/village.rs +++ b/werewolves-proto/src/game/village.rs @@ -7,14 +7,14 @@ use super::Result; use crate::{ error::GameError, game::{DateTime, GameOver, GameSettings}, - message::{Identification, Target}, + message::{CharacterIdentity, Identification}, player::{Character, CharacterId, PlayerId}, role::{Role, RoleTitle}, }; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Village { - characters: Vec, + characters: Box<[Character]>, date_time: DateTime, } @@ -58,8 +58,12 @@ impl Village { .iter() .cloned() .zip(roles) - .map(|(player, role)| Character::new(player, role)) - .collect(), + .map(|(player, role)| { + let player_str = player.public.to_string(); + Character::new(player, role) + .ok_or_else(|| GameError::PlayerNotAssignedNumber(player_str)) + }) + .collect::>>()?, date_time: DateTime::Night { number: 0 }, }) } @@ -118,17 +122,11 @@ impl Village { DateTime::Night { number: _ } => return Err(GameError::NoExecutionsAtNight), }; - if characters.is_empty() { - return Err(GameError::NoTrialNotAllowed); - } let targets = self .characters .iter_mut() .filter(|c| characters.contains(c.character_id())) .collect::>(); - if targets.len() != characters.len() { - return Err(GameError::CannotFindTargetButShouldBeThere); - } for t in targets { t.execute(day)?; } @@ -166,39 +164,39 @@ impl Village { } } - pub fn living_players(&self) -> Box<[Target]> { + pub fn living_players(&self) -> Box<[CharacterIdentity]> { self.characters .iter() .filter(|c| c.alive()) - .map(Character::target) + .map(Character::identity) .collect() } - pub fn target_by_id(&self, character_id: &CharacterId) -> Option { - self.character_by_id(character_id).map(Character::target) + pub fn target_by_id(&self, character_id: &CharacterId) -> Option { + self.character_by_id(character_id).map(Character::identity) } - pub fn living_villagers(&self) -> Box<[Target]> { + pub fn living_villagers(&self) -> Box<[CharacterIdentity]> { self.characters .iter() .filter(|c| c.alive() && c.is_village()) - .map(Character::target) + .map(Character::identity) .collect() } - pub fn living_players_excluding(&self, exclude: &CharacterId) -> Box<[Target]> { + pub fn living_players_excluding(&self, exclude: &CharacterId) -> Box<[CharacterIdentity]> { self.characters .iter() .filter(|c| c.alive() && c.character_id() != exclude) - .map(Character::target) + .map(Character::identity) .collect() } - pub fn dead_targets(&self) -> Box<[Target]> { + pub fn dead_targets(&self) -> Box<[CharacterIdentity]> { self.characters .iter() .filter(|c| !c.alive()) - .map(Character::target) + .map(Character::identity) .collect() } diff --git a/werewolves-proto/src/game_test/mod.rs b/werewolves-proto/src/game_test/mod.rs index 5c4f444..66d2d18 100644 --- a/werewolves-proto/src/game_test/mod.rs +++ b/werewolves-proto/src/game_test/mod.rs @@ -156,7 +156,7 @@ fn gen_players(range: Range) -> Box<[Identification]> { public: PublicIdentity { name: format!("player {num}"), pronouns: None, - number: NonZeroU8::new(num).unwrap(), + number: NonZeroU8::new(num), }, }) .collect() diff --git a/werewolves-proto/src/game_test/night_order.rs b/werewolves-proto/src/game_test/night_order.rs index 12bb058..ed7888f 100644 --- a/werewolves-proto/src/game_test/night_order.rs +++ b/werewolves-proto/src/game_test/night_order.rs @@ -4,7 +4,7 @@ use pretty_assertions::{assert_eq, assert_ne, assert_str_eq}; use crate::{ message::{ - CharacterIdentity, PublicIdentity, + CharacterIdentity, night::{ActionPrompt, ActionPromptTitle}, }, player::CharacterId, @@ -13,11 +13,9 @@ use crate::{ fn character_identity() -> CharacterIdentity { CharacterIdentity { character_id: CharacterId::new(), - public: PublicIdentity { - name: String::new(), - pronouns: None, - number: NonZeroU8::new(1).unwrap(), - }, + name: Default::default(), + pronouns: Default::default(), + number: NonZeroU8::new(1).unwrap(), } } diff --git a/werewolves-proto/src/lib.rs b/werewolves-proto/src/lib.rs index 3c5fd7f..3309e21 100644 --- a/werewolves-proto/src/lib.rs +++ b/werewolves-proto/src/lib.rs @@ -14,19 +14,3 @@ pub mod modifier; pub mod nonzero; pub mod player; pub mod role; - -#[derive(Debug, Error, Clone, Serialize, Deserialize)] -pub enum MessageError { - #[error("{0}")] - GameError(#[from] GameError), -} - -pub(crate) trait MustBeInVillage { - fn must_be_in_village(self) -> Result; -} - -impl MustBeInVillage for Option { - fn must_be_in_village(self) -> Result { - self.ok_or(GameError::CannotFindTargetButShouldBeThere) - } -} diff --git a/werewolves-proto/src/message.rs b/werewolves-proto/src/message.rs index 557c057..9e42bda 100644 --- a/werewolves-proto/src/message.rs +++ b/werewolves-proto/src/message.rs @@ -38,22 +38,6 @@ pub struct DayCharacter { pub alive: bool, } -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -pub struct Target { - pub character_id: CharacterId, - pub public: PublicIdentity, -} - -impl Display for Target { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let Target { - character_id, - public, - } = self; - write!(f, "{public} [(c){character_id}]") - } -} - #[derive(Debug, Clone, Serialize, Deserialize)] pub enum ServerMessage { Disconnect, diff --git a/werewolves-proto/src/message/host.rs b/werewolves-proto/src/message/host.rs index 0c00be8..a78cbd5 100644 --- a/werewolves-proto/src/message/host.rs +++ b/werewolves-proto/src/message/host.rs @@ -1,13 +1,12 @@ use core::num::NonZeroU8; use serde::{Deserialize, Serialize}; -use werewolves_macros::Extract; use crate::{ error::GameError, game::{GameOver, GameSettings}, message::{ - PublicIdentity, Target, + CharacterIdentity, PublicIdentity, night::{ActionPrompt, ActionResponse, ActionResult}, }, player::{CharacterId, PlayerId}, @@ -55,6 +54,7 @@ impl From for HostGameMessage { pub enum HostLobbyMessage { GetState, Kick(PlayerId), + SetPlayerNumber(PlayerId, NonZeroU8), GetGameSettings, SetGameSettings(GameSettings), Start, @@ -69,13 +69,13 @@ pub enum ServerToHostMessage { day: NonZeroU8, }, ActionPrompt(ActionPrompt), - ActionResult(Option, ActionResult), + ActionResult(Option, ActionResult), Lobby(Box<[PlayerState]>), GameSettings(GameSettings), Error(GameError), GameOver(GameOver), WaitingForRoleRevealAcks { - ackd: Box<[Target]>, - waiting: Box<[Target]>, + ackd: Box<[CharacterIdentity]>, + waiting: Box<[CharacterIdentity]>, }, } diff --git a/werewolves-proto/src/message/ident.rs b/werewolves-proto/src/message/ident.rs index 6a4d5c5..7a49c23 100644 --- a/werewolves-proto/src/message/ident.rs +++ b/werewolves-proto/src/message/ident.rs @@ -14,34 +14,70 @@ pub struct Identification { pub public: PublicIdentity, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] pub struct PublicIdentity { pub name: String, pub pronouns: Option, - pub number: NonZeroU8, + pub number: Option, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct CharacterIdentity { pub character_id: CharacterId, - pub public: PublicIdentity, + pub name: String, + pub pronouns: Option, + pub number: NonZeroU8, } -impl CharacterIdentity { - pub const fn new(character_id: CharacterId, public: PublicIdentity) -> Self { +impl From for PublicIdentity { + fn from(c: CharacterIdentity) -> Self { Self { - character_id, - public, + name: c.name, + pronouns: c.pronouns, + number: Some(c.number), } } } -impl Default for PublicIdentity { - fn default() -> Self { +impl From<&CharacterIdentity> for PublicIdentity { + fn from(c: &CharacterIdentity) -> Self { Self { - name: Default::default(), - pronouns: Default::default(), - number: NonZeroU8::new(1).unwrap(), + name: c.name.clone(), + pronouns: c.pronouns.clone(), + number: Some(c.number), + } + } +} + +impl Display for CharacterIdentity { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let CharacterIdentity { + character_id, + name, + pronouns, + number, + } = self; + let pronouns = pronouns + .as_ref() + .map(|p| format!(" ({p})")) + .unwrap_or_default(); + + write!(f, "[{number}] {name}{pronouns} <<{character_id}>>") + } +} + +impl CharacterIdentity { + pub const fn new( + character_id: CharacterId, + name: String, + pronouns: Option, + number: NonZeroU8, + ) -> Self { + Self { + name, + number, + pronouns, + character_id, } } } @@ -57,7 +93,11 @@ impl Display for PublicIdentity { .as_ref() .map(|p| format!(" ({p})")) .unwrap_or_default(); - write!(f, "[{number}] {name}{pronouns}") + let number = number + .as_ref() + .map(|n| format!("[{n}] ")) + .unwrap_or_default(); + write!(f, "{number}{name}{pronouns}") } } @@ -83,8 +123,7 @@ pub struct PlayerState { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct CharacterState { pub player_id: PlayerId, - pub character_id: CharacterId, - pub public_identity: PublicIdentity, + pub identity: CharacterIdentity, pub role: RoleTitle, pub died_to: Option, } diff --git a/werewolves-proto/src/message/night.rs b/werewolves-proto/src/message/night.rs index 866a8bb..28a208f 100644 --- a/werewolves-proto/src/message/night.rs +++ b/werewolves-proto/src/message/night.rs @@ -7,8 +7,6 @@ use crate::{ role::{Alignment, PreviousGuardianAction, RoleTitle}, }; -use super::Target; - #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd)] pub enum ActionType { Cover, @@ -40,7 +38,9 @@ pub enum ActionPrompt { CoverOfDarkness, #[checks(ActionType::WolfPackKill)] #[checks] - WolvesIntro { wolves: Box<[(Target, RoleTitle)]> }, + WolvesIntro { + wolves: Box<[(CharacterIdentity, RoleTitle)]>, + }, #[checks(ActionType::RoleChange)] RoleChange { character_id: CharacterIdentity, @@ -49,59 +49,61 @@ pub enum ActionPrompt { #[checks(ActionType::Other)] Seer { character_id: CharacterIdentity, - living_players: Box<[Target]>, + living_players: Box<[CharacterIdentity]>, }, #[checks(ActionType::Protect)] Protector { character_id: CharacterIdentity, - targets: Box<[Target]>, + targets: Box<[CharacterIdentity]>, }, #[checks(ActionType::Other)] Arcanist { character_id: CharacterIdentity, - living_players: Box<[Target]>, + living_players: Box<[CharacterIdentity]>, }, #[checks(ActionType::Other)] Gravedigger { character_id: CharacterIdentity, - dead_players: Box<[Target]>, + dead_players: Box<[CharacterIdentity]>, }, #[checks(ActionType::Other)] Hunter { character_id: CharacterIdentity, - current_target: Option, - living_players: Box<[Target]>, + current_target: Option, + living_players: Box<[CharacterIdentity]>, }, #[checks(ActionType::Other)] Militia { character_id: CharacterIdentity, - living_players: Box<[Target]>, + living_players: Box<[CharacterIdentity]>, }, #[checks(ActionType::Other)] MapleWolf { character_id: CharacterIdentity, kill_or_die: bool, - living_players: Box<[Target]>, + living_players: Box<[CharacterIdentity]>, }, #[checks(ActionType::Protect)] Guardian { character_id: CharacterIdentity, previous: Option, - living_players: Box<[Target]>, + living_players: Box<[CharacterIdentity]>, }, #[checks(ActionType::WolfPackKill)] - WolfPackKill { living_villagers: Box<[Target]> }, + WolfPackKill { + living_villagers: Box<[CharacterIdentity]>, + }, #[checks(ActionType::OtherWolf)] Shapeshifter { character_id: CharacterIdentity }, #[checks(ActionType::OtherWolf)] AlphaWolf { character_id: CharacterIdentity, - living_villagers: Box<[Target]>, + living_villagers: Box<[CharacterIdentity]>, }, #[checks(ActionType::Direwolf)] DireWolf { character_id: CharacterIdentity, - living_players: Box<[Target]>, + living_players: Box<[CharacterIdentity]>, }, } diff --git a/werewolves-proto/src/player.rs b/werewolves-proto/src/player.rs index 436f8e8..d74a1c8 100644 --- a/werewolves-proto/src/player.rs +++ b/werewolves-proto/src/player.rs @@ -6,7 +6,7 @@ use crate::{ diedto::DiedTo, error::GameError, game::{DateTime, Village}, - message::{CharacterIdentity, Identification, PublicIdentity, Target, night::ActionPrompt}, + message::{CharacterIdentity, Identification, PublicIdentity, night::ActionPrompt}, modifier::Modifier, role::{MAPLE_WOLF_ABSTAIN_LIMIT, PreviousGuardianAction, Role, RoleTitle}, }; @@ -77,8 +77,7 @@ pub enum KillOutcome { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Character { player_id: PlayerId, - character_id: CharacterId, - public: PublicIdentity, + identity: CharacterIdentity, role: Role, modifier: Option, died_to: Option, @@ -93,46 +92,47 @@ pub struct RoleChange { } impl Character { - pub fn new(Identification { player_id, public }: Identification, role: Role) -> Self { - Self { - role, - public, + pub fn new( + Identification { + player_id, + public: + PublicIdentity { + name, + pronouns, + number, + }, + }: Identification, + role: Role, + ) -> Option { + Some(Self { + role, + identity: CharacterIdentity { + character_id: CharacterId::new(), + name, + pronouns, + number: number?, + }, player_id, - character_id: CharacterId::new(), modifier: None, died_to: None, role_changes: Vec::new(), - } + }) } - pub fn target(&self) -> Target { - Target { - character_id: self.character_id.clone(), - public: self.public.clone(), - } - } - - pub const fn public_identity(&self) -> &PublicIdentity { - &self.public - } - - pub fn character_identity(&self) -> CharacterIdentity { - CharacterIdentity { - character_id: self.character_id.clone(), - public: self.public.clone(), - } + pub fn identity(&self) -> CharacterIdentity { + self.identity.clone() } pub fn name(&self) -> &str { - &self.public.name + self.identity.name.as_str() } pub const fn number(&self) -> NonZeroU8 { - self.public.number + self.identity.number } pub const fn pronouns(&self) -> Option<&str> { - match self.public.pronouns.as_ref() { + match self.identity.pronouns.as_ref() { Some(p) => Some(p.as_str()), None => None, } @@ -162,7 +162,7 @@ impl Character { } pub const fn character_id(&self) -> &CharacterId { - &self.character_id + &self.identity.character_id } pub const fn player_id(&self) -> &PlayerId { @@ -220,24 +220,24 @@ impl Character { | Role::Scapegoat | Role::Villager => return Ok(None), Role::Seer => ActionPrompt::Seer { - character_id: self.character_identity(), - living_players: village.living_players_excluding(&self.character_id), + character_id: self.identity(), + living_players: village.living_players_excluding(self.character_id()), }, Role::Arcanist => ActionPrompt::Arcanist { - character_id: self.character_identity(), - living_players: village.living_players_excluding(&self.character_id), + character_id: self.identity(), + living_players: village.living_players_excluding(self.character_id()), }, Role::Protector { last_protected: Some(last_protected), } => ActionPrompt::Protector { - character_id: self.character_identity(), + character_id: self.identity(), targets: village.living_players_excluding(last_protected), }, Role::Protector { last_protected: None, } => ActionPrompt::Protector { - character_id: self.character_identity(), - targets: village.living_players_excluding(&self.character_id), + character_id: self.identity(), + targets: village.living_players_excluding(self.character_id()), }, Role::Apprentice(role) => { let current_night = match village.date_time() { @@ -254,7 +254,7 @@ impl Character { DateTime::Night { number } => number + 1 >= current_night, }) .then(|| ActionPrompt::RoleChange { - character_id: self.character_identity(), + character_id: self.identity(), new_role: role.title(), })); } @@ -265,61 +265,61 @@ impl Character { }; return Ok((current_night == knows_on_night.get()).then_some({ ActionPrompt::RoleChange { - character_id: self.character_identity(), + character_id: self.identity(), new_role: RoleTitle::Elder, } })); } Role::Militia { targeted: None } => ActionPrompt::Militia { - character_id: self.character_identity(), - living_players: village.living_players_excluding(&self.character_id), + character_id: self.identity(), + living_players: village.living_players_excluding(self.character_id()), }, Role::Werewolf => ActionPrompt::WolfPackKill { living_villagers: village.living_players(), }, Role::AlphaWolf { killed: None } => ActionPrompt::AlphaWolf { - character_id: self.character_identity(), - living_villagers: village.living_players_excluding(&self.character_id), + character_id: self.identity(), + living_villagers: village.living_players_excluding(self.character_id()), }, Role::DireWolf => ActionPrompt::DireWolf { - character_id: self.character_identity(), + character_id: self.identity(), living_players: village.living_players(), }, Role::Shapeshifter { shifted_into: None } => ActionPrompt::Shapeshifter { - character_id: self.character_identity(), + character_id: self.identity(), }, Role::Gravedigger => ActionPrompt::Gravedigger { - character_id: self.character_identity(), + character_id: self.identity(), dead_players: village.dead_targets(), }, Role::Hunter { target } => ActionPrompt::Hunter { - character_id: self.character_identity(), + character_id: self.identity(), current_target: target.as_ref().and_then(|t| village.target_by_id(t)), - living_players: village.living_players_excluding(&self.character_id), + living_players: village.living_players_excluding(self.character_id()), }, Role::MapleWolf { last_kill_on_night } => ActionPrompt::MapleWolf { - character_id: self.character_identity(), + character_id: self.identity(), kill_or_die: last_kill_on_night + MAPLE_WOLF_ABSTAIN_LIMIT.get() == night, - living_players: village.living_players_excluding(&self.character_id), + living_players: village.living_players_excluding(self.character_id()), }, Role::Guardian { last_protected: Some(PreviousGuardianAction::Guard(prev_target)), } => ActionPrompt::Guardian { - character_id: self.character_identity(), + character_id: self.identity(), previous: Some(PreviousGuardianAction::Guard(prev_target.clone())), living_players: village.living_players_excluding(&prev_target.character_id), }, Role::Guardian { last_protected: Some(PreviousGuardianAction::Protect(prev_target)), } => ActionPrompt::Guardian { - character_id: self.character_identity(), + character_id: self.identity(), previous: Some(PreviousGuardianAction::Protect(prev_target.clone())), living_players: village.living_players(), }, Role::Guardian { last_protected: None, } => ActionPrompt::Guardian { - character_id: self.character_identity(), + character_id: self.identity(), previous: None, living_players: village.living_players(), }, diff --git a/werewolves-proto/src/role.rs b/werewolves-proto/src/role.rs index cc2aa1a..cb59a84 100644 --- a/werewolves-proto/src/role.rs +++ b/werewolves-proto/src/role.rs @@ -5,7 +5,7 @@ use werewolves_macros::{ChecksAs, Titles}; use crate::{ game::{DateTime, Village}, - message::Target, + message::CharacterIdentity, player::CharacterId, }; @@ -178,6 +178,6 @@ pub enum RoleBlock { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub enum PreviousGuardianAction { - Protect(Target), - Guard(Target), + Protect(CharacterIdentity), + Guard(CharacterIdentity), } diff --git a/werewolves-server/Cargo.toml b/werewolves-server/Cargo.toml index f635740..f4fe802 100644 --- a/werewolves-server/Cargo.toml +++ b/werewolves-server/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" [dependencies] axum = { version = "0.8", features = ["ws"] } -tokio = { version = "1.44", features = ["full"] } +tokio = { version = "1.47", features = ["full"] } log = { version = "0.4" } pretty_env_logger = { version = "0.5" } # env_logger = { version = "0.11" } diff --git a/werewolves-server/src/client.rs b/werewolves-server/src/client.rs index 77965e3..5647ced 100644 --- a/werewolves-server/src/client.rs +++ b/werewolves-server/src/client.rs @@ -121,7 +121,7 @@ struct Client { who: String, sender: Sender, receiver: Receiver, - message_history: Vec, + // message_history: Vec, } impl Client { @@ -140,7 +140,7 @@ impl Client { who, sender, receiver, - message_history: Vec::new(), + // message_history: Vec::new(), } } #[cfg(feature = "cbor")] @@ -193,7 +193,7 @@ impl Client { if let ClientMessage::UpdateSelf(update) = &message { match update { UpdateSelf::Name(name) => self.ident.public.name = name.clone(), - UpdateSelf::Number(num) => self.ident.public.number = *num, + UpdateSelf::Number(num) => self.ident.public.number = Some(*num), UpdateSelf::Pronouns(pronouns) => self.ident.public.pronouns = pronouns.clone(), } } @@ -221,7 +221,7 @@ impl Client { }) }) .await?; - self.message_history.push(message); + // self.message_history.push(message); Ok(()) } diff --git a/werewolves-server/src/communication/player.rs b/werewolves-server/src/communication/player.rs index 32fce4d..8b7da99 100644 --- a/werewolves-server/src/communication/player.rs +++ b/werewolves-server/src/communication/player.rs @@ -1,35 +1,25 @@ -use core::time::Duration; -use std::collections::HashMap; - use colored::Colorize; -use tokio::{ - sync::broadcast::{Receiver, Sender}, - time::Instant, -}; -use werewolves_proto::{ - error::GameError, - message::{ClientMessage, ServerMessage, Target, night::ActionResponse}, - player::{Character, CharacterId, PlayerId}, -}; +use tokio::sync::broadcast::Receiver; +use werewolves_proto::{error::GameError, player::PlayerId}; use crate::{connection::JoinedPlayers, runner::IdentifiedClientMessage}; pub struct PlayerIdComms { - joined_players: JoinedPlayers, + // joined_players: JoinedPlayers, message_recv: Receiver, - connect_recv: tokio::sync::broadcast::Receiver<(PlayerId, bool)>, + // connect_recv: tokio::sync::broadcast::Receiver<(PlayerId, bool)>, } impl PlayerIdComms { pub fn new( - joined_players: JoinedPlayers, + // joined_players: JoinedPlayers, message_recv: Receiver, - connect_recv: tokio::sync::broadcast::Receiver<(PlayerId, bool)>, + // connect_recv: tokio::sync::broadcast::Receiver<(PlayerId, bool)>, ) -> Self { Self { - joined_players, + // joined_players, message_recv, - connect_recv, + // connect_recv, } } diff --git a/werewolves-server/src/connection.rs b/werewolves-server/src/connection.rs index ad88000..02b9a97 100644 --- a/werewolves-server/src/connection.rs +++ b/werewolves-server/src/connection.rs @@ -36,7 +36,7 @@ pub struct JoinedPlayer { active_connection: ConnectionId, in_game: bool, pub name: String, - pub number: NonZeroU8, + pub number: Option, pub pronouns: Option, } @@ -46,7 +46,7 @@ impl JoinedPlayer { receiver: Receiver, active_connection: ConnectionId, name: String, - number: NonZeroU8, + number: Option, pronouns: Option, ) -> Self { Self { @@ -111,6 +111,16 @@ impl JoinedPlayers { } } + pub async fn get_player_identity(&self, player_id: &PlayerId) -> Option { + self.players.lock().await.iter().find_map(|(id, p)| { + (id == player_id).then(|| PublicIdentity { + name: p.name.clone(), + pronouns: p.pronouns.clone(), + number: p.number, + }) + }) + } + /// Disconnect the player /// /// Will not disconnect if the player is currently in a game, allowing them to reconnect diff --git a/werewolves-server/src/game.rs b/werewolves-server/src/game.rs index 7bafd24..e7a1028 100644 --- a/werewolves-server/src/game.rs +++ b/werewolves-server/src/game.rs @@ -3,7 +3,7 @@ use core::ops::Not; use crate::{ LogError, communication::{Comms, lobby::LobbyComms}, - connection::{InGameToken, JoinedPlayers}, + connection::JoinedPlayers, lobby::{Lobby, LobbyPlayers}, runner::{IdentifiedClientMessage, Message}, }; @@ -13,7 +13,7 @@ use werewolves_proto::{ game::{Game, GameOver, Village}, message::{ ClientMessage, Identification, ServerMessage, - host::{HostGameMessage, HostMessage, HostNightMessage, ServerToHostMessage}, + host::{HostGameMessage, HostMessage, ServerToHostMessage}, }, player::{Character, PlayerId}, }; @@ -94,11 +94,11 @@ impl GameRunner { .send(ServerToHostMessage::WaitingForRoleRevealAcks { ackd: acks .iter() - .filter_map(|(a, ackd)| ackd.then_some(a.target())) + .filter_map(|(a, ackd)| ackd.then_some(a.identity())) .collect(), waiting: acks .iter() - .filter_map(|(a, ackd)| ackd.not().then_some(a.target())) + .filter_map(|(a, ackd)| ackd.not().then_some(a.identity())) .collect(), }) .log_err(); diff --git a/werewolves-server/src/lobby.rs b/werewolves-server/src/lobby.rs index 97ae968..15d69ad 100644 --- a/werewolves-server/src/lobby.rs +++ b/werewolves-server/src/lobby.rs @@ -3,7 +3,7 @@ use core::{ ops::{Deref, DerefMut}, time::Duration, }; -use std::collections::HashMap; +use std::{collections::HashMap, os::unix::raw::pid_t}; use serde::{Deserialize, Serialize}; use tokio::sync::broadcast::Sender; @@ -178,6 +178,21 @@ impl Lobby { settings.check()?; self.settings = settings; } + Message::Host(HostMessage::Lobby(HostLobbyMessage::SetPlayerNumber(pid, num))) => { + self.joined_players + .update(&pid, |p| p.number = Some(num)) + .await; + if let Some(p) = self + .players_in_lobby + .iter_mut() + .find_map(|(c, _)| (c.player_id == pid).then_some(c)) + && let Some(joined_id) = self.joined_players.get_player_identity(&pid).await + { + p.public = joined_id; + } + self.send_lobby_info_to_clients().await; + self.send_lobby_info_to_host().await.log_debug(); + } Message::Host(HostMessage::Lobby(HostLobbyMessage::Start)) => { if self.players_in_lobby.len() < self.settings.min_players_needed() { return Err(GameError::TooFewPlayers { @@ -275,12 +290,19 @@ impl Lobby { message: ClientMessage::UpdateSelf(_), }) => { self.joined_players - .update(&player_id, move |p| { - p.name = public.name; + .update(&player_id, |p| { + p.name = public.name.clone(); p.number = public.number; - p.pronouns = public.pronouns; + p.pronouns = public.pronouns.clone(); }) .await; + if let Some(p) = self + .players_in_lobby + .iter_mut() + .find_map(|(c, _)| (c.player_id == player_id).then_some(c)) + { + p.public = public; + } self.send_lobby_info_to_clients().await; self.send_lobby_info_to_host().await.log_debug(); } diff --git a/werewolves-server/src/main.rs b/werewolves-server/src/main.rs index 3f3d439..a9b9c69 100644 --- a/werewolves-server/src/main.rs +++ b/werewolves-server/src/main.rs @@ -101,7 +101,11 @@ async fn main() { let lobby_comms = LobbyComms::new( Comms::new( HostComms::new(server_send, server_recv), - PlayerIdComms::new(joined_players.clone(), recv, connect_recv.resubscribe()), + PlayerIdComms::new( + //joined_players.clone(), + recv, + // connect_recv.resubscribe() + ), ), connect_recv, ); diff --git a/werewolves/Cargo.toml b/werewolves/Cargo.toml index a0bff82..1219dda 100644 --- a/werewolves/Cargo.toml +++ b/werewolves/Cargo.toml @@ -14,12 +14,13 @@ web-sys = { version = "0.3", features = [ "HtmlDivElement", "HtmlSelectElement", ] } +wasm-bindgen = { version = "=0.2.100" } log = "0.4" rand = { version = "0.9", features = ["small_rng"] } getrandom = { version = "0.3", features = ["wasm_js"] } uuid = { version = "*", features = ["js"] } yew = { version = "0.21", features = ["csr"] } -yew-router = "0.18.0" +yew-router = "0.18" serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0", optional = true } gloo = "0.11" @@ -29,8 +30,8 @@ once_cell = "1" chrono = { version = "0.4" } werewolves-macros = { path = "../werewolves-macros" } werewolves-proto = { path = "../werewolves-proto" } -futures = "0.3.31" -wasm-bindgen-futures = "0.4.50" +futures = "0.3" +wasm-bindgen-futures = "0.4" thiserror = { version = "2" } convert_case = { version = "0.8" } ciborium = { version = "0.2", optional = true } diff --git a/werewolves/index.html b/werewolves/index.html index 59c75ac..c87d84d 100644 --- a/werewolves/index.html +++ b/werewolves/index.html @@ -14,12 +14,12 @@ - + diff --git a/werewolves/index.scss b/werewolves/index.scss index f5e3b63..cfedac1 100644 --- a/werewolves/index.scss +++ b/werewolves/index.scss @@ -54,43 +54,86 @@ nav.debug-nav { } -.button-container { - button { - font-size: 1.3rem; - border: 1px solid rgba(255, 255, 255, 1); - padding: 5px; - background-color: rgba(0, 0, 0, 0.3); - color: #cccccc; - cursor: pointer; +.default-button { + font-size: 1.3rem; + border: 1px solid rgba(255, 255, 255, 1); + padding: 5px; + background-color: black; + color: #cccccc; + cursor: pointer; + + &:hover { + background-color: white; + color: invert(#cccccc); } - - button:hover { - filter: $link_select_filter; - } - - // button { - // color: #fff; - // background: transparent; - // background-repeat: no-repeat; - // cursor: pointer; - // overflow: hidden; - // outline: none; - // padding: 0px; - - // &:hover { - // background-color: rgba(0, 0, 0, 0.5); - // } - // } } -.player .number { - padding-top: 3px; +.player { margin: 0px; + // padding-left: 5px; + // padding-right: 5px; + // padding-bottom: 5px; + min-width: 10rem; + max-width: 10vw; + max-height: 4rem; + text-align: center; + + justify-content: center; + font-family: 'Cute Font'; + + &.marked { + // background-color: brighten($village_color, 100%); + filter: hue-rotate(90deg); + } + + &.connected {} + + &.disconnected { + // background-color: $disconnected_color; + // border: 3px solid darken($disconnected_color, 20%); + } + + &.dead { + filter: grayscale(100%); + } + + .number { + padding-top: 3px; + margin: 0px; + + &.not-set { + border: 2px solid rgba(255, 0, 0, 0.3); + background-color: rgba(255, 0, 0, 0.7); + } + } } -.player:hover { - filter: brightness(120%); +.submenu { + background-color: black; + border: 1px solid rgba(255, 255, 255, 0.7); + padding: 10px; + // position: absolute; + position: relative; + + // top: 1px; + align-self: stretch; + z-index: 5; + + & button { + width: 100%; + } +} + +.click-backdrop { + z-index: 4; + background-color: rgba(0, 0, 0, 0.7); + position: fixed; + top: 0; + left: 0; + height: 200vh; + width: 100vw; + background-size: cover; } .player-container { @@ -137,41 +180,37 @@ button { border: none; - width: fit-content; - height: fit-content; outline: inherit; padding-left: 5px; padding-right: 5px; + background-color: #000; + + &:disabled { + filter: grayscale(80%); + } + + &:disabled:hover { + filter: sepia(100%); + } + + &:disabled:hover::after { + content: attr(reason); + position: absolute; + margin-top: 10px; + top: 90%; + font: 'Cute Font'; + // color: #000; + // background-color: #fff; + color: rgba(255, 0, 0, 1); + background-color: rgba(255, 0, 0, 0.3); + border: 1px solid rgba(255, 0, 0, 0.3); + min-width: 50vw; + width: fit-content; + padding: 3px; + z-index: 4; + } } -button:disabled { - filter: grayscale(80%); -} - -button:hover { - filter: brightness(80%); -} - -button:disabled:hover { - filter: sepia(100%); -} - -button:disabled:hover::after { - content: attr(reason); - position: absolute; - margin-top: 10px; - top: 90%; - font: 'Cute Font'; - // color: #000; - // background-color: #fff; - color: rgba(255, 0, 0, 1); - background-color: rgba(255, 0, 0, 0.3); - border: 1px solid rgba(255, 0, 0, 0.3); - min-width: 50vw; - width: fit-content; - padding: 3px; - z-index: 3; -} .settings { list-style: none; @@ -396,7 +435,6 @@ client { font-family: 'Cute Font'; // font-size: 0.7rem; - background-color: hsl(280, 55%, 61%); display: flex; // flex-wrap: wrap; flex-direction: column; @@ -405,7 +443,6 @@ client { padding: 30px; gap: 30px; - filter: $client_filter; border: 2px solid black; } @@ -414,17 +451,10 @@ clients { font-family: 'Cute Font'; // font-size: 0.7rem; - background-color: white; display: flex; flex-wrap: wrap; flex-direction: row; font-size: 2rem; - margin-left: 20px; - margin-right: 20px; - - gap: 10px; - border: solid 3px; - border-color: #432054; } .role-reveal-cards { @@ -550,6 +580,19 @@ clients { font-size: 1.2rem; } +.client-nav { + // position: absolute; + // left: 0; + // top: 0; + width: 100%; + padding: 10px; + // background-color: rgba(255, 107, 255, 0.2); + display: flex; + flex-direction: row; + justify-content: baseline; + gap: 10px; +} + .ident { gap: 0px; margin: 0px; @@ -558,10 +601,11 @@ clients { .submenu { margin-top: 10px; margin-bottom: 10px; - display: flex; + // display: flex; justify-content: center; // visibility: collapse; display: none; + z-index: 5; .button-container { display: flex; @@ -571,6 +615,9 @@ clients { &.shown { // visibility: visible; display: flex; + flex-direction: row; + align-items: baseline; + // position: absolute; } button { @@ -617,40 +664,14 @@ error { } } - - - -.player { - - margin: 0px; - padding-left: 5px; - padding-right: 5px; - text-align: center; - - justify-content: center; - font-family: 'Cute Font'; - - background-color: $village_color; - border: 3px solid darken($village_color, 20%); - - &.marked { - // background-color: brighten($village_color, 100%); - filter: hue-rotate(90deg); - } - - &.connected { - background-color: $connected_color; - border: 3px solid darken($connected_color, 20%); - } - - &.disconnected { - background-color: $disconnected_color; - border: 3px solid darken($disconnected_color, 20%); - } - - &.dead { - filter: grayscale(100%); - } +.player-list { + padding-bottom: 80px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 10px; + // align-items: center; + justify-content: space-evenly; } .binary { @@ -674,3 +695,45 @@ error { } } } + +input { + background-color: rgba(255, 255, 255, 0.1); + color: white; + border: 2px solid rgba(255, 255, 255, 0.2); + margin: 10px; +} + +.signin { + @extend .row-list; + justify-content: center; + text-align: center; + + & label { + font-size: 1.5rem; + } + + & input { + height: 2rem; + text-align: center; + + &#number { + font-size: 2rem; + } + } +} + +.info-update { + font-size: 2rem; + align-content: stretch; + margin: 0; + + & * { + margin: 0; + width: 100%; + text-align: center; + } +} + +.zoom { + zoom: 200%; +} diff --git a/werewolves/src/clients/client/client.rs b/werewolves/src/clients/client/client.rs index 7095742..32244c6 100644 --- a/werewolves/src/clients/client/client.rs +++ b/werewolves/src/clients/client/client.rs @@ -1,4 +1,4 @@ -use core::{sync::atomic::AtomicBool, time::Duration}; +use core::{num::NonZeroU8, sync::atomic::AtomicBool, time::Duration}; use std::collections::VecDeque; use futures::{ @@ -16,7 +16,6 @@ use werewolves_proto::{ game::GameOver, message::{ ClientMessage, DayCharacter, Identification, PlayerUpdate, PublicIdentity, ServerMessage, - Target, night::{ActionPrompt, ActionResponse, ActionResult}, }, player::PlayerId, @@ -25,7 +24,10 @@ use werewolves_proto::{ use yew::{html::Scope, prelude::*}; use crate::{ - components::{InputName, Notification}, + components::{ + Button, Identity, Notification, + client::{ClientNav, InputName}, + }, storage::StorageKey, }; @@ -50,8 +52,8 @@ fn url() -> String { format!( "{}client", option_env!("LOCAL") - .map(|_| super::DEBUG_URL) - .unwrap_or(super::LIVE_URL) + .map(|_| crate::clients::DEBUG_URL) + .unwrap_or(crate::clients::LIVE_URL) ) } @@ -185,7 +187,6 @@ impl Connection { #[derive(PartialEq)] pub enum ClientEvent { Disconnected, - Notification(String), Waiting, ShowRole(RoleTitle), NotInLobby(Box<[PublicIdentity]>), @@ -201,13 +202,17 @@ impl TryFrom for ClientEvent { Ok(match msg { ServerMessage::Disconnect => Self::Disconnected, ServerMessage::LobbyInfo { - joined: false, - players, - } => Self::NotInLobby(players), - ServerMessage::LobbyInfo { - joined: true, - players, - } => Self::InLobby(players), + joined, + mut players, + } => { + const LAST: NonZeroU8 = NonZeroU8::new(0xFF).unwrap(); + players.sort_by(|l, r| l.number.unwrap_or(LAST).cmp(&r.number.unwrap_or(LAST))); + let players = players.into_iter().collect(); + match joined { + true => Self::InLobby(players), + false => Self::NotInLobby(players), + } + } ServerMessage::GameInProgress => Self::GameInProgress, _ => return Err(msg), }) @@ -251,10 +256,9 @@ impl Component for Client { fn create(ctx: &Context) -> Self { gloo::utils::document().set_title("Werewolves Player"); - let player = StorageKey::PlayerId - .get() + let player = PlayerId::load_from_storage() .ok() - .and_then(|p| StorageKey::PublicIdentity.get().ok().map(|n| (p, n))) + .and_then(|p| PublicIdentity::load_from_storage().ok().map(|n| (p, n))) .map(|(player_id, public)| Identification { player_id, public }); let (send, recv) = futures::channel::mpsc::channel::(100); @@ -337,11 +341,11 @@ impl Component for Client { ); html! {
+

{format!("Players in lobby: {}", players.len())}

    {players.iter().map(|p| html!{

    {p.to_string()}

    }).collect::()}
-
} } @@ -355,11 +359,11 @@ impl Component for Client { ); html! {
+

{format!("Players in lobby: {}", players.len())}

    {players.iter().map(|p| html!{

    {p.to_string()}

    }).collect::()}
-
} } @@ -378,43 +382,42 @@ impl Component for Client { }}

}, - ClientEvent::Notification(notification) => { - let scope = ctx.link().clone(); - let next_event = - // Callback::from(move |_| scope.clone().send_message(Message::)); - Callback::from(move |_| log::info!("nothing")); - html! { - - } - } }; let player = self .player .as_ref() .map(|player| { - let pronouns = if let Some(pronouns) = player.public.pronouns.as_ref() { - html! { -

{"("}{pronouns.as_str()}{")"}

- } - } else { - html!() - }; html! { - -

{player.public.number.get()}

- {player.public.name.clone()} - {pronouns} -
+ + } }) .unwrap_or(html!()); + let send = self.send.clone(); + let client_nav_msg_cb = move |msg| { + let mut send = send.clone(); + yew::platform::spawn_local(async move { + if let Err(err) = send.send(msg).await { + log::error!("sending nav message: {err}"); + } + }); + }; + let nav = self.player.as_ref().map(|_| { + html! { + + } + }); + html! { - - {player} - {content} - + <> + {nav} + + {player} + {content} + + } } @@ -431,34 +434,45 @@ impl Component for Client { } Message::SetPublicIdentity(public) => { match self.player.as_mut() { - Some(p) => p.public = public, + Some(p) => { + if let Err(err) = public.save_to_storage() { + self.error(err.into()); + return false; + } + p.public = public; + } None => { - let res = - StorageKey::PlayerId - .get_or_set(PlayerId::new) - .and_then(|player_id| { - StorageKey::PublicIdentity - .set(public.clone()) - .map(|_| Identification { player_id, public }) - }); - match res { - Ok(ident) => { - self.player = Some(ident.clone()); - if let Some(recv) = self.recv.take() { - yew::platform::spawn_local( - Connection { - scope: ctx.link().clone(), - ident, - recv, - } - .run(), - ); + let player_id = match PlayerId::load_from_storage() { + Ok(pid) => pid, + Err(StorageError::KeyNotFound(_)) => { + let pid = PlayerId::new(); + if let Err(err) = pid.save_to_storage() { + self.error(err.into()); + return false; } + pid } Err(err) => { self.error(err.into()); return false; } + }; + if let Err(err) = public.save_to_storage() { + self.error(err.into()); + return false; + } + let ident = Identification { player_id, public }; + self.player = Some(ident.clone()); + + if let Some(recv) = self.recv.take() { + yew::platform::spawn_local( + Connection { + recv, + ident, + scope: ctx.link().clone(), + } + .run(), + ); } } } @@ -469,17 +483,16 @@ impl Component for Client { joined: false, players: _, } = &msg + && self.auto_join { - if self.auto_join { - let mut send = self.send.clone(); - yew::platform::spawn_local(async move { - if let Err(err) = send.send(ClientMessage::Hello).await { - log::error!("send: {err}"); - } - }); - self.auto_join = false; - return false; - } + let mut send = self.send.clone(); + yew::platform::spawn_local(async move { + if let Err(err) = send.send(ClientMessage::Hello).await { + log::error!("send: {err}"); + } + }); + self.auto_join = false; + return false; } let msg = match msg.try_into() { Ok(event) => { @@ -519,7 +532,7 @@ impl Component for Client { ServerMessage::Sleep => self.current_event = Some(ClientEvent::Waiting), ServerMessage::Update(update) => match (update, self.player.as_mut()) { (PlayerUpdate::Number(num), Some(player)) => { - player.public.number = num; + player.public.number = Some(num); return true; } (_, None) => return false, diff --git a/werewolves/src/clients/host/host.rs b/werewolves/src/clients/host/host.rs index 62a15e4..12821f4 100644 --- a/werewolves/src/clients/host/host.rs +++ b/werewolves/src/clients/host/host.rs @@ -1,4 +1,5 @@ use core::{num::NonZeroU8, ops::Not, time::Duration}; +use std::{rc::Rc, sync::Arc}; use futures::{ SinkExt, StreamExt, @@ -11,7 +12,7 @@ use werewolves_proto::{ error::GameError, game::{GameOver, GameSettings}, message::{ - CharacterState, PlayerState, PublicIdentity, Target, + CharacterIdentity, CharacterState, PlayerState, PublicIdentity, host::{ HostDayMessage, HostGameMessage, HostLobbyMessage, HostMessage, HostNightMessage, ServerToHostMessage, @@ -37,8 +38,8 @@ fn url() -> String { format!( "{}host", option_env!("LOCAL") - .map(|_| super::DEBUG_URL) - .unwrap_or(super::LIVE_URL) + .map(|_| crate::clients::DEBUG_URL) + .unwrap_or(crate::clients::LIVE_URL) ) } @@ -184,7 +185,7 @@ pub enum HostEvent { pub enum HostState { Disconnected, Lobby { - players: Box<[PlayerState]>, + players: Rc<[PlayerState]>, settings: GameSettings, }, Day { @@ -196,11 +197,11 @@ pub enum HostState { result: GameOver, }, RoleReveal { - ackd: Box<[Target]>, - waiting: Box<[Target]>, + ackd: Box<[CharacterIdentity]>, + waiting: Box<[CharacterIdentity]>, }, Prompt(ActionPrompt), - Result(Option, ActionResult), + Result(Option, ActionResult), } impl From for HostEvent { @@ -340,7 +341,7 @@ impl Component for Host { settings={settings} on_start={on_start} on_update={on_changed} - players_in_lobby={players.len()} + players_in_lobby={players.clone()} /> } }); @@ -352,6 +353,9 @@ impl Component for Host { LobbyPlayerAction::Kick => { HostMessage::Lobby(HostLobbyMessage::Kick(player_id)) } + LobbyPlayerAction::SetNumber(num) => HostMessage::Lobby( + HostLobbyMessage::SetPlayerNumber(player_id, num), + ), }; let mut send = send.clone(); let on_error = on_error.clone(); @@ -404,7 +408,7 @@ impl Component for Host { HostState::RoleReveal { ackd, waiting } => { let send = self.send.clone(); let on_force_ready = self.big_screen.not().then(|| { - Callback::from(move |target: Target| { + Callback::from(move |target: CharacterIdentity| { let send = send.clone(); yew::platform::spawn_local(async move { if let Err(err) = send @@ -456,7 +460,7 @@ impl Component for Host { result={result} big_screen={self.big_screen} on_complete={on_complete} - ident={ident} + ident={ident.map(|i| i.into())} /> } } @@ -471,7 +475,7 @@ impl Component for Host { self.send.clone(), ); html! { -