diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4f9c9a50..8bfd7fc4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -39,7 +39,7 @@ jobs: sudo apt-get update sudo apt-get install build-essential librust-atk-sys-dev libgtk-3-dev \ gcc-multilib libpq-dev libxcb-shape0-dev libxcb-xfixes0-dev \ - libasound2-dev portaudio19-dev libpulse-dev libdbus-1-dev libudev-dev + libasound2-dev portaudio19-dev libpulse-dev libdbus-1-dev libudev-dev protobuf-compiler - uses: Swatinem/rust-cache@v2 - uses: actions-rs/cargo@v1 with: @@ -105,3 +105,23 @@ jobs: asset_path: ./target/release/gccl.exe asset_name: gccl-${{ matrix.release_suffix }}.exe asset_content_type: application/zip # required by GitHub API + + - name: Publish App for Mac & Linux + if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' + uses: WebFreak001/deploy-nightly@v1.1.0 + with: + upload_url: https://uploads.github.com/repos/gamercade-io/gamercade_console/releases/73475292/assets{?name,label} # find out this value by opening https://api.github.com/repos///releases in your browser and copy the full "upload_url" value including the {?name,label} part + release_id: 73475292 # same as above (id can just be taken out the upload_url, it's used to find old releases) + asset_path: ./target/release/app + asset_name: gamercade_app-${{ matrix.release_suffix }} + asset_content_type: application/zip # required by GitHub API + + - name: Publish App for Windows + if: matrix.os == 'windows-latest' + uses: WebFreak001/deploy-nightly@v1.1.0 + with: + upload_url: https://uploads.github.com/repos/gamercade-io/gamercade_console/releases/73475292/assets{?name,label} # find out this value by opening https://api.github.com/repos///releases in your browser and copy the full "upload_url" value including the {?name,label} part + release_id: 73475292 # same as above (id can just be taken out the upload_url, it's used to find old releases) + asset_path: ./target/release/app.exe + asset_name: gamercade_app-${{ matrix.release_suffix }}.exe + asset_content_type: application/zip # required by GitHub API \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 50a09315..565cdc84 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,7 +50,7 @@ jobs: sudo apt-get update sudo apt-get install build-essential librust-atk-sys-dev libgtk-3-dev \ gcc-multilib libpq-dev libxcb-shape0-dev libxcb-xfixes0-dev \ - libasound2-dev portaudio19-dev libpulse-dev libdbus-1-dev libudev-dev + libasound2-dev portaudio19-dev libpulse-dev libdbus-1-dev libudev-dev protobuf-compiler - uses: Swatinem/rust-cache@v2 - uses: actions-rs/cargo@v1 with: @@ -75,7 +75,7 @@ jobs: sudo apt-get update sudo apt-get install build-essential librust-atk-sys-dev libgtk-3-dev \ gcc-multilib libpq-dev libxcb-shape0-dev libxcb-xfixes0-dev \ - libasound2-dev portaudio19-dev libpulse-dev libdbus-1-dev libudev-dev + libasound2-dev portaudio19-dev libpulse-dev libdbus-1-dev libudev-dev protobuf-compiler - uses: Swatinem/rust-cache@v2 - name: Install nextest uses: taiki-e/install-action@nextest @@ -100,7 +100,7 @@ jobs: sudo apt-get update sudo apt-get install build-essential librust-atk-sys-dev libgtk-3-dev \ gcc-multilib libpq-dev libxcb-shape0-dev libxcb-xfixes0-dev \ - libasound2-dev portaudio19-dev libpulse-dev libdbus-1-dev libudev-dev + libasound2-dev portaudio19-dev libpulse-dev libdbus-1-dev libudev-dev protobuf-compiler - uses: Swatinem/rust-cache@v2 - uses: actions-rs/cargo@v1 with: diff --git a/.gitignore b/.gitignore index 46424056..5e022c7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ /target -/keyboardInput.json \ No newline at end of file +/keyboardInput.json +*.db +/roms diff --git a/Cargo.lock b/Cargo.lock index a367fd76..75da5da6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,76 +20,146 @@ checksum = "330223a1aecc308757b9926e9391c9b47f8ef2dbd8aea9df88312aea18c5e8d6" [[package]] name = "accesskit" -version = "0.9.0" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c98a5d094590335462354da402d754fe2cb78f0e6ce5024611c28ed539c1de" + +[[package]] +name = "accesskit" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4803cf8c252f374ae6bfbb341e49e5a37f7601f2ce74a105927a663eba952c67" +checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b" +dependencies = [ + "enumn", + "serde", +] [[package]] name = "accesskit_consumer" -version = "0.13.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee8cf1202a4f94d31837f1902ab0a75c77b65bf59719e093703abe83efd74ec" +checksum = "ca541e0fdb600916d196a940228df99b86d804fd2e6ef13894d7814f2799db43" dependencies = [ - "accesskit", - "parking_lot 0.12.1", + "accesskit 0.11.0", +] + +[[package]] +name = "accesskit_consumer" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c17cca53c09fbd7288667b22a201274b9becaa27f0b91bf52a526db95de45e6" +dependencies = [ + "accesskit 0.12.3", ] [[package]] name = "accesskit_macos" -version = "0.5.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10be25f2b27bc33aa1647072e86b948b41596f1af1ae43a2b4b9be5d2011cbda" +checksum = "4baea9413f0daf1cd4aab199bc09f8139cd726ce7673d523c27d186b8b878325" dependencies = [ - "accesskit", - "accesskit_consumer", - "objc2", + "accesskit 0.11.0", + "accesskit_consumer 0.15.0", + "objc2 0.3.0-beta.3", + "once_cell", +] + +[[package]] +name = "accesskit_macos" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3b6ae1eabbfbced10e840fd3fce8a93ae84f174b3e4ba892ab7bcb42e477a7" +dependencies = [ + "accesskit 0.12.3", + "accesskit_consumer 0.16.1", + "objc2 0.3.0-beta.3", "once_cell", - "parking_lot 0.12.1", ] [[package]] name = "accesskit_unix" -version = "0.2.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630e7ee8f93c6246478bf0df6760db899b28d9ad54353a5f2d3157138ba817fc" +checksum = "b4d1517421278cc8e67422d0786a18cf4291093ebe49eadf1cf989ff80e57f90" dependencies = [ - "accesskit", - "accesskit_consumer", - "async-channel", - "atspi", + "accesskit 0.11.0", + "accesskit_consumer 0.15.0", + "async-channel 1.8.0", + "atspi 0.10.1", "futures-lite", - "parking_lot 0.12.1", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_unix" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f46c18d99ba61ad7123dd13eeb0c104436ab6af1df6a1cd8c11054ed394a08" +dependencies = [ + "accesskit 0.12.3", + "accesskit_consumer 0.16.1", + "async-channel 2.2.1", + "async-once-cell", + "atspi 0.19.0", + "futures-lite", + "once_cell", "serde", "zbus", ] [[package]] name = "accesskit_windows" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13c462fabdd950ef14308a9390b07fa2e2e3aabccba1f3ea36ea2231bb942ab" +checksum = "e11c7f177739f23bd19bb856e4a64fdd96eb8638ec0a6a6dde9a7019a9e91c53" dependencies = [ - "accesskit", - "accesskit_consumer", + "accesskit 0.11.0", + "accesskit_consumer 0.15.0", "arrayvec", "once_cell", - "parking_lot 0.12.1", "paste", - "windows 0.42.0", + "windows 0.44.0", +] + +[[package]] +name = "accesskit_windows" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afcae27ec0974fc7c3b0b318783be89fd1b2e66dd702179fe600166a38ff4a0b" +dependencies = [ + "accesskit 0.12.3", + "accesskit_consumer 0.16.1", + "once_cell", + "paste", + "static_assertions", + "windows 0.48.0", ] [[package]] name = "accesskit_winit" -version = "0.10.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17727888757ec027ec221db33070e226ee07df44425b583bc67684204d35eff9" +checksum = "14f1bd64cd0b480cafb7bdd91eb489a1ff50f0f5702437b9efa32a25b8bb82a1" dependencies = [ - "accesskit", - "accesskit_macos", - "accesskit_unix", - "accesskit_windows", - "parking_lot 0.12.1", - "winit", + "accesskit 0.11.0", + "accesskit_macos 0.7.1", + "accesskit_unix 0.5.0", + "accesskit_windows 0.14.0", + "winit 0.28.6", +] + +[[package]] +name = "accesskit_winit" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5284218aca17d9e150164428a0ebc7b955f70e3a9a78b4c20894513aabf98a67" +dependencies = [ + "accesskit 0.12.3", + "accesskit_macos 0.10.1", + "accesskit_unix 0.6.2", + "accesskit_windows 0.15.1", + "winit 0.29.15", ] [[package]] @@ -103,11 +173,11 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.19.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.27.2", + "gimli 0.28.1", ] [[package]] @@ -129,34 +199,42 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", + "getrandom", "once_cell", + "serde", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "0.7.19" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "alsa" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8512c9117059663fb5606788fbca3619e2a91dac0e3fe516242eab1fa6be5e44" +checksum = "37fe60779335388a88c01ac6c3be40304d1e349de3ada3b15f7808bb90fa9dce" dependencies = [ "alsa-sys", - "bitflags", + "bitflags 2.4.2", "libc", - "nix 0.24.2", ] [[package]] @@ -176,15 +254,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c77a0045eda8b888c76ea473c2b0515ba6f471d318f8927c5c72240937035a6" dependencies = [ "android-properties", - "bitflags", + "bitflags 1.3.2", "cc", "jni-sys", "libc", "log", - "ndk", + "ndk 0.7.0", "ndk-context", - "ndk-sys", - "num_enum", + "ndk-sys 0.4.0", + "num_enum 0.5.7", +] + +[[package]] +name = "android-activity" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" +dependencies = [ + "android-properties", + "bitflags 2.4.2", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk 0.8.0", + "ndk-context", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum 0.7.2", + "thiserror", ] [[package]] @@ -204,16 +303,15 @@ dependencies = [ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] @@ -243,12 +341,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -257,21 +355,25 @@ version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602" +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + [[package]] name = "arboard" -version = "3.2.0" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6041616acea41d67c4a984709ddab1587fd0b10efe5cc563fee954d2f011854" +checksum = "a2041f1943049c7978768d84e6d0fd95de98b76d6c4727b09e78ec253d29fa58" dependencies = [ "clipboard-win", "log", "objc", "objc-foundation", "objc_id", - "once_cell", "parking_lot 0.12.1", "thiserror", - "winapi", "x11rb", ] @@ -283,20 +385,26 @@ checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" dependencies = [ "serde", ] +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + [[package]] name = "ash" -version = "0.37.2+1.3.238" +version = "0.37.3+1.3.251" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bf19c1f0a470be5fbf7522a308a05df06610252c5bcf5143e1b23f629a9a03" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" dependencies = [ - "libloading", + "libloading 0.7.3", ] [[package]] @@ -305,7 +413,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" dependencies = [ - "event-listener", + "event-listener 2.5.3", "futures-core", ] @@ -316,8 +424,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +dependencies = [ + "concurrent-queue", + "event-listener 5.3.0", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] @@ -329,7 +450,7 @@ dependencies = [ "async-lock", "async-task", "concurrent-queue", - "fastrand", + "fastrand 1.9.0", "futures-lite", "slab", ] @@ -359,10 +480,10 @@ dependencies = [ "futures-lite", "log", "parking", - "polling", + "polling 2.8.0", "rustix 0.37.3", "slab", - "socket2", + "socket2 0.4.9", "waker-fn", ] @@ -372,9 +493,15 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" dependencies = [ - "event-listener", + "event-listener 2.5.3", ] +[[package]] +name = "async-once-cell" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9338790e78aa95a416786ec8389546c4b6a1dfc3dc36071ed9518a9413a542eb" + [[package]] name = "async-process" version = "1.7.0" @@ -386,7 +513,7 @@ dependencies = [ "autocfg", "blocking", "cfg-if", - "event-listener", + "event-listener 2.5.3", "futures-lite", "rustix 0.37.3", "signal-hook", @@ -401,7 +528,29 @@ checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.48", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", ] [[package]] @@ -412,13 +561,13 @@ checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.48", ] [[package]] @@ -447,9 +596,9 @@ checksum = "73b5e5f48b927f04e952dedc932f31995a65a0bf65ec971c74436e51bf6e970d" [[package]] name = "atspi" -version = "0.8.7" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab84c09a770065868da0d713f1f4b35af85d96530a868f1c1a6c249178379187" +checksum = "674e7a3376837b2e7d12d34d58ac47073c491dc3bf6f71a7adaf687d4d817faa" dependencies = [ "async-recursion", "async-trait", @@ -463,29 +612,61 @@ dependencies = [ ] [[package]] -name = "atspi-macros" -version = "0.1.4" +name = "atspi" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3ebc5a6f61f6996eca56a4cece7b3fe7da3b86f0473c7b71ab44e229f3acce4" +checksum = "6059f350ab6f593ea00727b334265c4dfc7fd442ee32d264794bd9bdc68e87ca" dependencies = [ - "proc-macro2", - "quote", + "atspi-common", + "atspi-connection", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92af95f966d2431f962bc632c2e68eda7777330158bf640c4af4249349b2cdf5" +dependencies = [ + "enumflags2", "serde", - "syn 1.0.109", + "static_assertions", "zbus", "zbus_names", "zvariant", ] [[package]] -name = "atty" -version = "0.2.14" +name = "atspi-connection" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "a0c65e7d70f86d4c0e3b2d585d9bf3f979f0b19d635a336725a88d279f76b939" dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "atspi-common", + "atspi-proxies", + "futures-lite", + "zbus", +] + +[[package]] +name = "atspi-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb4870a32c0eaa17e35bca0e6b16020635157121fb7d45593d242c295bc768" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "atspi-proxies" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6495661273703e7a229356dcbe8c8f38223d697aacfaf0e13590a9ac9977bb52" +dependencies = [ + "atspi-common", + "serde", + "zbus", ] [[package]] @@ -494,6 +675,51 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.28", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.66" @@ -515,6 +741,12 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "bincode" version = "1.3.3" @@ -530,7 +762,7 @@ version = "0.59.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cexpr", "clang-sys", "lazy_static", @@ -580,6 +812,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + [[package]] name = "block" version = "0.1.6" @@ -601,7 +839,16 @@ version = "0.1.0-beta.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" dependencies = [ - "objc-sys", + "objc-sys 0.2.0-beta.2", +] + +[[package]] +name = "block-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" +dependencies = [ + "objc-sys 0.3.3", ] [[package]] @@ -610,8 +857,18 @@ version = "0.2.0-alpha.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" dependencies = [ - "block-sys", - "objc2-encode", + "block-sys 0.1.0-beta.1", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "block2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" +dependencies = [ + "block-sys 0.2.1", + "objc2 0.4.1", ] [[package]] @@ -620,26 +877,26 @@ version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" dependencies = [ - "async-channel", + "async-channel 1.8.0", "async-lock", "async-task", "atomic-waker", - "fastrand", + "fastrand 1.9.0", "futures-lite", "log", ] [[package]] name = "bumpalo" -version = "3.11.0" +version = "3.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" +checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" dependencies = [ "bytemuck_derive", ] @@ -652,7 +909,7 @@ checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.48", ] [[package]] @@ -667,12 +924,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" -[[package]] -name = "cache-padded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" - [[package]] name = "cairo-sys-rs" version = "0.16.3" @@ -696,6 +947,32 @@ dependencies = [ "vec_map", ] +[[package]] +name = "calloop" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" +dependencies = [ + "bitflags 2.4.2", + "log", + "polling 3.6.0", + "rustix 0.38.31", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +dependencies = [ + "calloop 0.12.4", + "rustix 0.38.31", + "wayland-backend", + "wayland-client 0.31.2", +] + [[package]] name = "cc" version = "1.0.73" @@ -758,65 +1035,108 @@ checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.7.3", ] [[package]] name = "clap" -version = "4.2.7" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.2.7" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", - "bitflags", "clap_lex", "strsim", ] [[package]] name = "clap_derive" -version = "4.2.0" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.48", ] [[package]] name = "clap_lex" -version = "0.4.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "clipboard-win" -version = "4.4.2" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" +checksum = "79f4473f5144e20d9aceaf2972478f06ddf687831eafeeb434fbaf0acc4144ad" dependencies = [ "error-code", - "str-buf", - "winapi", ] [[package]] -name = "codespan-reporting" -version = "0.11.1" +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics 0.22.3", + "foreign-types 0.3.2", + "libc", + "objc", +] + +[[package]] +name = "cocoa" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics 0.23.1", + "foreign-types 0.5.0", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", + "objc", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ @@ -836,12 +1156,43 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "com" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" +dependencies = [ + "com_macros", +] + [[package]] name = "com-rs" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" +[[package]] +name = "com_macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" +dependencies = [ + "com_macros_support", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "com_macros_support" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "combine" version = "4.6.6" @@ -854,9 +1205,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ "crossbeam-utils", ] @@ -889,10 +1240,23 @@ version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" dependencies = [ - "bitflags", + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" +dependencies = [ + "bitflags 1.3.2", "core-foundation", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -902,9 +1266,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", - "foreign-types", + "foreign-types 0.3.2", "libc", ] @@ -914,7 +1278,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb17e2d1795b1996419648915df94bc7103c28f7b48062d7acf4652fc371b2ff" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation-sys 0.6.2", "coreaudio-sys", ] @@ -930,34 +1294,32 @@ dependencies = [ [[package]] name = "cpal" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" dependencies = [ "alsa", "core-foundation-sys 0.8.3", "coreaudio-rs", "dasp_sample", - "jni 0.19.0", + "jni", "js-sys", "libc", "mach2", - "ndk", + "ndk 0.8.0", "ndk-context", "oboe", - "once_cell", - "parking_lot 0.12.1", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows 0.46.0", + "windows 0.54.0", ] [[package]] name = "cpp_demangle" -version = "0.3.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" dependencies = [ "cfg-if", ] @@ -973,27 +1335,28 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.95.1" +version = "0.106.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1277fbfa94bc82c8ec4af2ded3e639d49ca5f7f3c7eeab2c66accd135ece4e70" +checksum = "5b3775cc6cc00c90d29eebea55feedb2b0168e23f5415bab7859c4004d7323d1" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.95.1" +version = "0.106.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e8c31ad3b2270e9aeec38723888fe1b0ace3bea2b06b3f749ccf46661d3220" +checksum = "637f3184ba5bfa48d425bad1d2e4faf5fcf619f5e0ca107edc6dc02f589d4d74" dependencies = [ "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-control", "cranelift-entity", "cranelift-isle", - "gimli 0.27.2", - "hashbrown 0.13.2", + "gimli 0.28.1", + "hashbrown 0.14.3", "log", "regalloc2", "smallvec", @@ -1002,33 +1365,43 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.95.1" +version = "0.106.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ac5ac30d62b2d66f12651f6b606dbdfd9c2cfd0908de6b387560a277c5c9da" +checksum = "e4b35b8240462341d94d31aab807cad704683988708261aecae3d57db48b7212" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.95.1" +version = "0.106.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3cd1555aa9df1d6d8375732de41b4cb0d787006948d55b6d004d521e9efeb0" + +[[package]] +name = "cranelift-control" +version = "0.106.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd82b8b376247834b59ed9bdc0ddeb50f517452827d4a11bccf5937b213748b8" +checksum = "14b31a562a10e98ab148fa146801e20665c5f9eda4fce9b2c5a3836575887d74" +dependencies = [ + "arbitrary", +] [[package]] name = "cranelift-entity" -version = "0.95.1" +version = "0.106.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" +checksum = "af1e0467700a3f4fccf5feddbaebdf8b0eb82535b06a9600c4bc5df40872e75d" dependencies = [ "serde", + "serde_derive", ] [[package]] name = "cranelift-frontend" -version = "0.95.1" +version = "0.106.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a25d9d0a0ae3079c463c34115ec59507b4707175454f0eee0891e83e30e82d" +checksum = "6cb918ee2c23939262efd1b99d76a21212ac7bd35129582133e21a22a6ff0467" dependencies = [ "cranelift-codegen", "log", @@ -1038,15 +1411,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.95.1" +version = "0.106.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80de6a7d0486e4acbd5f9f87ec49912bf4c8fb6aea00087b989685460d4469ba" +checksum = "966e4cfb23cf6d7f1d285d53a912baaffc5f06bcd9c9b0a2d8c66a184fae534b" [[package]] name = "cranelift-native" -version = "0.95.1" +version = "0.106.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6b03e0e03801c4b3fd8ce0758a94750c07a44e7944cc0ffbf0d3f2e7c79b00" +checksum = "bea803aadfc4aabdfae7c3870f1b1f6dd4332f4091859e9758ef5fca6bf8cc87" dependencies = [ "cranelift-codegen", "libc", @@ -1055,9 +1428,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.95.1" +version = "0.106.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff3220489a3d928ad91e59dd7aeaa8b3de18afb554a6211213673a71c90737ac" +checksum = "11d18a3572cd897555bba3621e568029417d8f5cc26aeede2d7cb0bad6afd916" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1069,6 +1442,21 @@ dependencies = [ "wasmtime-types", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.3.2" @@ -1134,10 +1522,10 @@ dependencies = [ ] [[package]] -name = "cty" -version = "0.2.2" +name = "cursor-icon" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] name = "d3d12" @@ -1145,8 +1533,8 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da" dependencies = [ - "bitflags", - "libloading", + "bitflags 1.3.2", + "libloading 0.7.3", "winapi", ] @@ -1156,6 +1544,21 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" +[[package]] +name = "data-url" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" + +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + [[package]] name = "derivative" version = "2.2.0" @@ -1237,11 +1640,20 @@ dependencies = [ [[package]] name = "dlib" -version = "0.5.0" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.3", +] + +[[package]] +name = "document-features" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95" dependencies = [ - "libloading", + "litrs", ] [[package]] @@ -1259,28 +1671,85 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "ecolor" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e479a7fa3f23d4e794f8b2f8b3568dd4e47886ad1b12c9c095e141cb591eb63" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ecolor" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20930a432bbd57a6d55e07976089708d4893f3d556cf42a0d79e9e321fa73b10" +dependencies = [ + "bytemuck", + "serde", +] + [[package]] name = "eframe" -version = "0.21.3" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df3ce60931e5f2d83bab4484d1a283908534d5308cc6b0c5c22c59cd15ee7cc" +checksum = "bf4596583a2c680c55b6feaa748f74890c4f9cb9c7cb69d6117110444cb65b2f" dependencies = [ "bytemuck", - "egui", - "egui-winit", - "egui_glow", - "glow", - "glutin", - "glutin-winit", + "cocoa 0.24.1", + "egui 0.22.0", + "egui-winit 0.22.0", + "egui_glow 0.22.0", + "glow 0.12.1", + "glutin 0.30.8", + "glutin-winit 0.3.0", + "image", "js-sys", + "log", + "objc", "percent-encoding", - "raw-window-handle", + "raw-window-handle 0.5.2", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winapi", + "winit 0.28.6", +] + +[[package]] +name = "eframe" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020e2ccef6bbcec71dbc542f7eed64a5846fc3076727f5746da8fd307c91bab2" +dependencies = [ + "bytemuck", + "cocoa 0.25.0", + "document-features", + "egui 0.27.2", + "egui-wgpu 0.27.2", + "egui-winit 0.27.2", + "egui_glow 0.27.2", + "glow 0.13.1", + "glutin 0.31.3", + "glutin-winit 0.4.2", + "image", + "js-sys", + "log", + "objc", + "parking_lot 0.12.1", + "percent-encoding", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", + "static_assertions", "thiserror", - "tracing", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winit", + "web-time", + "winapi", + "winit 0.29.15", ] [[package]] @@ -1289,13 +1758,39 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6412a21e0bde7c0918f7fb44bbbb86b5e1f88e63c026a4e747cc7af02f76dfbe" dependencies = [ - "accesskit", - "ahash 0.8.3", - "epaint", + "ahash 0.8.7", + "epaint 0.21.0", "nohash-hasher", "tracing", ] +[[package]] +name = "egui" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3aef8ec3ae1b772f340170c65bf27d5b8c28f543a0116c844d2ac08d01123e7" +dependencies = [ + "accesskit 0.11.0", + "ahash 0.8.7", + "epaint 0.22.0", + "log", + "nohash-hasher", +] + +[[package]] +name = "egui" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "584c5d1bf9a67b25778a3323af222dbe1a1feb532190e103901187f92c7fe29a" +dependencies = [ + "accesskit 0.12.3", + "ahash 0.8.7", + "epaint 0.27.2", + "log", + "nohash-hasher", + "serde", +] + [[package]] name = "egui-wgpu" version = "0.21.0" @@ -1303,10 +1798,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1678d8f30181193e78c15dddae16e6027c6058fdda9631950ade511b8a4b26f5" dependencies = [ "bytemuck", - "epaint", + "epaint 0.21.0", "tracing", "type-map", - "wgpu", + "wgpu 0.15.1", +] + +[[package]] +name = "egui-wgpu" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469ff65843f88a702b731a1532b7d03b0e8e96d283e70f3a22b0e06c46cb9b37" +dependencies = [ + "bytemuck", + "document-features", + "egui 0.27.2", + "epaint 0.27.2", + "log", + "thiserror", + "type-map", + "web-time", + "wgpu 0.19.4", + "winit 0.29.15", ] [[package]] @@ -1315,32 +1828,109 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab43597ba41f0ce39a364ad83185594578bfd8b3409b99dbcbb01df23afc3dbb" dependencies = [ - "accesskit_winit", - "android-activity", - "arboard", - "egui", + "android-activity 0.4.1", + "egui 0.21.0", "instant", - "smithay-clipboard", "tracing", "webbrowser", - "winit", + "winit 0.28.6", +] + +[[package]] +name = "egui-winit" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a49155fd4a0a4fb21224407a91de0030847972ef90fc64edb63621caea61cb2" +dependencies = [ + "accesskit_winit 0.14.1", + "arboard", + "egui 0.22.0", + "instant", + "log", + "raw-window-handle 0.5.2", + "smithay-clipboard 0.6.6", + "webbrowser", + "winit 0.28.6", +] + +[[package]] +name = "egui-winit" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e3da0cbe020f341450c599b35b92de4af7b00abde85624fd16f09c885573609" +dependencies = [ + "accesskit_winit 0.16.1", + "arboard", + "egui 0.27.2", + "log", + "raw-window-handle 0.6.0", + "smithay-clipboard 0.7.1", + "web-time", + "webbrowser", + "winit 0.29.15", +] + +[[package]] +name = "egui_extras" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b78779f35ded1a853786c9ce0b43fe1053e10a21ea3b23ebea411805ce41593" +dependencies = [ + "egui 0.27.2", + "ehttp", + "enum-map", + "image", + "log", + "mime_guess2", + "resvg", + "serde", ] [[package]] name = "egui_glow" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8257332fb168a965b3dca81d6a344e053153773c889cabdba0b3b76f1629ae81" +checksum = "1f8c2752cdf1b0ef5fcda59a898cacabad974d4f5880e92a420b2c917022da64" dependencies = [ "bytemuck", - "egui", - "glow", + "egui 0.22.0", + "glow 0.12.1", + "log", "memoffset 0.6.5", - "tracing", "wasm-bindgen", "web-sys", ] +[[package]] +name = "egui_glow" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0e5d975f3c86edc3d35b1db88bb27c15dde7c55d3b5af164968ab5ede3f44ca" +dependencies = [ + "bytemuck", + "egui 0.27.2", + "glow 0.13.1", + "log", + "memoffset 0.9.0", + "wasm-bindgen", + "web-sys", + "winit 0.29.15", +] + +[[package]] +name = "ehttp" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a81c221a1e4dad06cb9c9deb19aea1193a5eea084e8cd42d869068132bf876" +dependencies = [ + "document-features", + "js-sys", + "ureq", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "either" version = "1.8.0" @@ -1357,37 +1947,84 @@ dependencies = [ ] [[package]] -name = "enumflags2" -version = "0.7.7" +name = "emath" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" +checksum = "3857d743a6e0741cdd60b622a74c7a36ea75f5f8f11b793b41d905d2c9721a4b" dependencies = [ - "enumflags2_derive", - "serde", + "bytemuck", ] [[package]] -name = "enumflags2_derive" -version = "0.7.7" +name = "emath" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" +checksum = "e4c3a552cfca14630702449d35f41c84a0d15963273771c6059175a803620f3f" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.16", + "bytemuck", + "serde", ] [[package]] -name = "env_logger" -version = "0.9.1" +name = "encoding_rs" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c90bf5f19754d10198ccb95b70664fc925bd1fc090a0fd9a6ebc54acc8cd6272" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", + "cfg-if", +] + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "enumflags2" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "enumn" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", ] [[package]] @@ -1397,52 +2034,98 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12e78b5c58a1f7f621f9d546add2adce20636422c9b251e29f749e8a2f713c95" dependencies = [ "ab_glyph", - "ahash 0.8.3", + "ahash 0.8.7", "atomic_refcell", "bytemuck", - "ecolor", - "emath", + "ecolor 0.21.0", + "emath 0.21.0", "nohash-hasher", "parking_lot 0.12.1", ] [[package]] -name = "errno" -version = "0.3.1" +name = "epaint" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "09333964d4d57f40a85338ba3ca5ed4716070ab184dcfed966b35491c5c64f3b" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", + "ab_glyph", + "ahash 0.8.7", + "atomic_refcell", + "bytemuck", + "ecolor 0.22.0", + "emath 0.22.0", + "log", + "nohash-hasher", + "parking_lot 0.12.1", ] [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "epaint" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "b381f8b149657a4acf837095351839f32cd5c4aec1817fc4df84e18d76334176" dependencies = [ - "cc", - "libc", + "ab_glyph", + "ahash 0.8.7", + "bytemuck", + "ecolor 0.27.2", + "emath 0.27.2", + "log", + "nohash-hasher", + "parking_lot 0.12.1", + "serde", ] [[package]] -name = "error-code" -version = "2.3.1" +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "str-buf", + "windows-sys 0.52.0", ] +[[package]] +name = "error-code" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" + [[package]] name = "event-listener" version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +dependencies = [ + "event-listener 5.3.0", + "pin-project-lite", +] + [[package]] name = "exr" version = "1.5.1" @@ -1482,9 +2165,15 @@ dependencies = [ [[package]] name = "fallible-iterator" -version = "0.2.0" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" @@ -1496,27 +2185,29 @@ dependencies = [ ] [[package]] -name = "file-per-thread-logger" -version = "0.1.5" +name = "fastrand" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e16290574b39ee41c71aeb90ae960c504ebaf1e2a1c87bd52aa56ed6e1a02f" -dependencies = [ - "env_logger", - "log", -] +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "filetime" -version = "0.2.17" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", - "windows-sys 0.36.1", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.0.24" @@ -1527,6 +2218,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + [[package]] name = "flume" version = "0.10.14" @@ -1537,7 +2234,7 @@ dependencies = [ "futures-sink", "nanorand", "pin-project", - "spin", + "spin 0.9.4", ] [[package]] @@ -1552,7 +2249,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", ] [[package]] @@ -1561,6 +2279,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.1.0" @@ -1579,6 +2303,15 @@ dependencies = [ "libc", ] +[[package]] +name = "futures-channel" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" +dependencies = [ + "futures-core", +] + [[package]] name = "futures-core" version = "0.3.28" @@ -1597,7 +2330,7 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "fastrand", + "fastrand 1.9.0", "futures-core", "futures-io", "memchr", @@ -1643,13 +2376,46 @@ dependencies = [ "byteorder", ] +[[package]] +name = "fxprof-processed-profile" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" +dependencies = [ + "bitflags 2.4.2", + "debugid", + "fxhash", + "serde", + "serde_json", +] + +[[package]] +name = "gamercade_app" +version = "0.1.0" +dependencies = [ + "bytemuck", + "eframe 0.27.2", + "egui_extras", + "gamercade_interface", + "hashbrown 0.14.3", + "nohash-hasher", + "radix_fmt", + "reqwest", + "rfd", + "rusqlite", + "tokio", + "tokio-stream", + "tonic", +] + [[package]] name = "gamercade_audio" version = "0.1.0" dependencies = [ "arrayvec", - "base64", - "fastrand", + "base64 0.22.0", + "bytemuck", + "fastrand 2.0.2", "rtrb", "serde", "strum", @@ -1663,17 +2429,18 @@ dependencies = [ "bytemuck", "clap", "cpal", - "egui", - "egui-wgpu", - "egui-winit", - "fastrand", + "egui 0.21.0", + "egui-wgpu 0.21.0", + "egui-winit 0.21.1", + "fastrand 1.9.0", "gamercade_audio", "gamercade_core", "gamercade_fs", + "gamercade_interface", "gamercade_sound_engine", "ggrs", "gilrs", - "hashbrown 0.13.2", + "hashbrown 0.14.3", "parking_lot 0.12.1", "paste", "pixels", @@ -1681,7 +2448,7 @@ dependencies = [ "serde", "serde_json", "wasmtime", - "winit", + "winit 0.28.6", "winit_input_helper", ] @@ -1689,7 +2456,7 @@ dependencies = [ name = "gamercade_core" version = "0.1.0" dependencies = [ - "base64", + "base64 0.21.0", "bytemuck", "serde", "serde-big-array", @@ -1700,12 +2467,12 @@ dependencies = [ name = "gamercade_editor" version = "0.1.0" dependencies = [ - "eframe", + "eframe 0.22.0", "gamercade_audio", "gamercade_core", "gamercade_fs", "gamercade_sound_engine", - "hashbrown 0.13.2", + "hashbrown 0.14.3", "hound", "image", "rfd", @@ -1718,7 +2485,9 @@ dependencies = [ name = "gamercade_fs" version = "0.1.1" dependencies = [ + "base64 0.22.0", "bincode", + "bytemuck", "gamercade_audio", "gamercade_core", "gamercade_sound_engine", @@ -1727,6 +2496,17 @@ dependencies = [ "zstd 0.12.3+zstd.1.5.2", ] +[[package]] +name = "gamercade_interface" +version = "0.1.0" +dependencies = [ + "crc", + "prost", + "serde", + "tonic", + "tonic-build", +] + [[package]] name = "gamercade_rs" version = "0.1.2" @@ -1804,12 +2584,12 @@ dependencies = [ [[package]] name = "gethostname" -version = "0.2.3" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" dependencies = [ "libc", - "winapi", + "windows-targets 0.48.0", ] [[package]] @@ -1827,9 +2607,9 @@ dependencies = [ [[package]] name = "ggrs" -version = "0.9.4" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1419c3c38e579884b075b99a8ade2ca507e87a2bde81940c6fe4aea895696831" +checksum = "a5eea709a0f7d1e6a54acf0c9d5c3e28272d90370c459b4fd05b9f17a283cbe5" dependencies = [ "bincode", "bitfield-rle", @@ -1881,7 +2661,7 @@ dependencies = [ "vec_map", "wasm-bindgen", "web-sys", - "windows 0.46.0", + "windows 0.48.0", ] [[package]] @@ -1892,12 +2672,12 @@ checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" [[package]] name = "gimli" -version = "0.27.2" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" dependencies = [ "fallible-iterator", - "indexmap", + "indexmap 2.2.1", "stable_deref_trait", ] @@ -1953,29 +2733,65 @@ dependencies = [ "web-sys", ] +[[package]] +name = "glow" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "glutin" version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62f9b771a65f0a1e3ddb6aa16f867d87dc73c922411c255e6c4ab7f6d45c7327" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg_aliases", "cgl", "core-foundation", "dispatch", - "glutin_egl_sys", - "glutin_glx_sys", - "glutin_wgl_sys", - "libloading", - "objc2", + "glutin_egl_sys 0.5.0", + "glutin_glx_sys 0.4.0", + "glutin_wgl_sys 0.4.0", + "libloading 0.7.3", + "objc2 0.3.0-beta.3", "once_cell", - "raw-window-handle", + "raw-window-handle 0.5.2", "wayland-sys 0.30.1", "windows-sys 0.45.0", "x11-dl", ] +[[package]] +name = "glutin" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fcd4ae4e86d991ad1300b8f57166e5be0c95ef1f63f3f5b827f8a164548746" +dependencies = [ + "bitflags 2.4.2", + "cfg_aliases", + "cgl", + "core-foundation", + "dispatch", + "glutin_egl_sys 0.6.0", + "glutin_glx_sys 0.5.0", + "glutin_wgl_sys 0.5.0", + "icrate", + "libloading 0.8.3", + "objc2 0.4.1", + "once_cell", + "raw-window-handle 0.5.2", + "wayland-sys 0.31.1", + "windows-sys 0.48.0", + "x11-dl", +] + [[package]] name = "glutin-winit" version = "0.3.0" @@ -1983,9 +2799,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "629a873fc04062830bfe8f97c03773bcd7b371e23bcc465d0a61448cd1588fa4" dependencies = [ "cfg_aliases", - "glutin", - "raw-window-handle", - "winit", + "glutin 0.30.8", + "raw-window-handle 0.5.2", + "winit 0.28.6", +] + +[[package]] +name = "glutin-winit" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebcdfba24f73b8412c5181e56f092b5eff16671c514ce896b258a0a64bd7735" +dependencies = [ + "cfg_aliases", + "glutin 0.31.3", + "raw-window-handle 0.5.2", + "winit 0.29.15", ] [[package]] @@ -1998,6 +2826,16 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "glutin_egl_sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77cc5623f5309ef433c3dd4ca1223195347fe62c413da8e2fdd0eb76db2d9bcd" +dependencies = [ + "gl_generator", + "windows-sys 0.48.0", +] + [[package]] name = "glutin_glx_sys" version = "0.4.0" @@ -2008,6 +2846,16 @@ dependencies = [ "x11-dl", ] +[[package]] +name = "glutin_glx_sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a165fd686c10dcc2d45380b35796e577eacfd43d4660ee741ec8ebe2201b3b4f" +dependencies = [ + "gl_generator", + "x11-dl", +] + [[package]] name = "glutin_wgl_sys" version = "0.4.0" @@ -2017,6 +2865,15 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "glutin_wgl_sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +dependencies = [ + "gl_generator", +] + [[package]] name = "gobject-sys" version = "0.16.3" @@ -2034,8 +2891,18 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d" dependencies = [ - "bitflags", - "gpu-alloc-types", + "bitflags 1.3.2", + "gpu-alloc-types 0.2.0", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.4.2", + "gpu-alloc-types 0.3.0", ] [[package]] @@ -2044,7 +2911,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.4.2", ] [[package]] @@ -2060,13 +2936,26 @@ dependencies = [ "windows 0.44.0", ] +[[package]] +name = "gpu-allocator" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" +dependencies = [ + "log", + "presser", + "thiserror", + "winapi", + "windows 0.52.0", +] + [[package]] name = "gpu-descriptor" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a" dependencies = [ - "bitflags", + "bitflags 1.3.2", "gpu-descriptor-types", "hashbrown 0.12.3", ] @@ -2077,7 +2966,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -2099,11 +2988,49 @@ dependencies = [ ] [[package]] -name = "half" -version = "1.8.2" +name = "h2" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.9", + "indexmap 2.2.1", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.1.0", + "indexmap 2.2.1", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + [[package]] name = "hashbrown" version = "0.12.3" @@ -2119,22 +3046,56 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash 0.8.7", + "allocator-api2", "serde", ] +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.3", +] + [[package]] name = "hassle-rs" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90601c6189668c7345fc53842cb3f3a3d872203d523be1b3cb44a36a3e62fb85" dependencies = [ - "bitflags", + "bitflags 1.3.2", "com-rs", "libc", - "libloading", + "libloading 0.7.3", + "thiserror", + "widestring 0.5.1", + "winapi", +] + +[[package]] +name = "hassle-rs" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" +dependencies = [ + "bitflags 2.4.2", + "com", + "libc", + "libloading 0.8.3", "thiserror", - "widestring", + "widestring 1.1.0", "winapi", ] @@ -2144,6 +3105,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -2155,9 +3122,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.1" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -2178,10 +3145,175 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1" [[package]] -name = "humantime" -version = "2.1.0" +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http 0.2.9", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.24", + "http 0.2.9", + "http-body 0.4.5", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.6", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.4", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper 0.14.28", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.3.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.3.1", + "pin-project-lite", + "socket2 0.5.6", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "icrate" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" +dependencies = [ + "block2 0.3.0", + "dispatch", + "objc2 0.4.1", +] [[package]] name = "id-arena" @@ -2218,6 +3350,12 @@ dependencies = [ "tiff", ] +[[package]] +name = "imagesize" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" + [[package]] name = "indexmap" version = "1.9.3" @@ -2226,6 +3364,16 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "433de089bd45971eecf4668ee0ee8f4cec17db4f8bd8f7bc3197a6ce37aa7d9b" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", "serde", ] @@ -2235,7 +3383,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" dependencies = [ - "bitflags", + "bitflags 1.3.2", "inotify-sys", "libc", ] @@ -2277,43 +3425,37 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.9", "libc", "windows-sys 0.48.0", ] [[package]] -name = "is-terminal" -version = "0.4.7" +name = "ipnet" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" -dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", - "rustix 0.37.3", - "windows-sys 0.48.0", -] +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itertools" -version = "0.10.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8bf247779e67a9082a4790b45e71ac7cfd1321331a5c856a74a9faebdab78d0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.3" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "ittapi" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e648c437172ce7d3ac35ca11a068755072054826fa455a916b43524fa4a62a7" +checksum = "6b996fe614c41395cdaedf3cf408a9534851090959d90d54a535f675550b64b1" dependencies = [ "anyhow", "ittapi-sys", @@ -2322,41 +3464,13 @@ dependencies = [ [[package]] name = "ittapi-sys" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b32a4d23f72548178dde54f3c12c6b6a08598e25575c0d0fa5bd861e0dc1a5" +checksum = "52f5385394064fa2c886205dba02598013ce83d3e92d33dbdc0c52fe0e7bf4fc" dependencies = [ "cc", ] -[[package]] -name = "jni" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", -] - -[[package]] -name = "jni" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", -] - [[package]] name = "jni" version = "0.21.1" @@ -2399,9 +3513,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2413,7 +3527,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" dependencies = [ "libc", - "libloading", + "libloading 0.7.3", + "pkg-config", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading 0.8.3", "pkg-config", ] @@ -2439,10 +3564,19 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587" dependencies = [ - "bitflags", + "bitflags 1.3.2", "libc", ] +[[package]] +name = "kurbo" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b" +dependencies = [ + "arrayvec", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -2469,9 +3603,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.144" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" @@ -2483,6 +3617,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.52.3", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "libudev-sys" version = "0.1.4" @@ -2495,15 +3650,21 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.1.4" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" [[package]] name = "linux-raw-sys" -version = "0.3.7" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" [[package]] name = "lock_api" @@ -2551,6 +3712,12 @@ dependencies = [ "libc", ] +[[package]] +name = "matchit" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" + [[package]] name = "memchr" version = "2.5.0" @@ -2575,6 +3742,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.5" @@ -2595,9 +3771,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -2608,14 +3784,45 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060" dependencies = [ - "bitflags", + "bitflags 1.3.2", "block", "core-graphics-types", - "foreign-types", + "foreign-types 0.3.2", "log", "objc", ] +[[package]] +name = "metal" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" +dependencies = [ + "bitflags 2.4.2", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mime_guess2" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a3333bb1609500601edc766a39b4c1772874a4ce26022f4d866854dc020c41" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2643,6 +3850,12 @@ dependencies = [ "windows-sys 0.36.1", ] +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + [[package]] name = "naga" version = "0.11.0" @@ -2650,14 +3863,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eafe22a23b797c9bc227c6c896419b26b5bb88fa903417a3adaed08778850d5" dependencies = [ "bit-set", - "bitflags", + "bitflags 1.3.2", "codespan-reporting", "hexf-parse", - "indexmap", + "indexmap 1.9.3", "log", "num-traits", "rustc-hash", - "spirv", + "spirv 0.2.0+1.5.4", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "naga" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" +dependencies = [ + "bit-set", + "bitflags 2.4.2", + "codespan-reporting", + "hexf-parse", + "indexmap 2.2.1", + "log", + "num-traits", + "rustc-hash", + "spirv 0.3.0+sdk-1.3.268.0", "termcolor", "thiserror", "unicode-xid", @@ -2672,17 +3905,51 @@ dependencies = [ "getrandom", ] +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndk" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" dependencies = [ - "bitflags", + "bitflags 1.3.2", "jni-sys", - "ndk-sys", - "num_enum", - "raw-window-handle", + "ndk-sys 0.4.0", + "num_enum 0.5.7", + "raw-window-handle 0.5.2", + "thiserror", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.4.2", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum 0.7.2", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "thiserror", ] @@ -2701,13 +3968,22 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "nix" version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.6.5", @@ -2719,7 +3995,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.7.1", @@ -2744,31 +4020,32 @@ dependencies = [ [[package]] name = "notify" -version = "5.1.0" +version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ea850aa68a06e48fdb069c0ec44d0d64c8dbffa49bf3b6f7f0a901fdea1ba9" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags", + "bitflags 2.4.2", "crossbeam-channel", "filetime", "fsevent-sys", "inotify", "kqueue", "libc", + "log", "mio", "walkdir", - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] name = "num-derive" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -2817,7 +4094,16 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.5.7", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive 0.7.2", ] [[package]] @@ -2832,6 +4118,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "objc" version = "0.2.7" @@ -2859,15 +4157,31 @@ version = "0.2.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" +[[package]] +name = "objc-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da284c198fb9b7b0603f8635185e85fbd5b64ee154b1ed406d489077de2d6d60" + [[package]] name = "objc2" version = "0.3.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe31e5425d3d0b89a15982c024392815da40689aceb34bad364d58732bcfd649" dependencies = [ - "block2", - "objc-sys", - "objc2-encode", + "block2 0.2.0-alpha.6", + "objc-sys 0.2.0-beta.2", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "objc2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" +dependencies = [ + "objc-sys 0.3.3", + "objc2-encode 3.0.0", ] [[package]] @@ -2876,9 +4190,15 @@ version = "2.0.0-pre.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" dependencies = [ - "objc-sys", + "objc-sys 0.2.0-beta.2", ] +[[package]] +name = "objc2-encode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" + [[package]] name = "objc_exception" version = "0.1.2" @@ -2908,24 +4228,24 @@ dependencies = [ [[package]] name = "object" -version = "0.30.3" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "crc32fast", - "hashbrown 0.13.2", - "indexmap", + "hashbrown 0.14.3", + "indexmap 2.2.1", "memchr", ] [[package]] name = "oboe" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" dependencies = [ - "jni 0.20.0", - "ndk", + "jni", + "ndk 0.8.0", "ndk-context", "num-derive", "num-traits", @@ -2934,18 +4254,62 @@ dependencies = [ [[package]] name = "oboe-sys" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" dependencies = [ "cc", ] [[package]] name = "once_cell" -version = "1.14.0" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.4.2", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] [[package]] name = "orbclient" @@ -3043,9 +4407,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "peeking_take_while" @@ -3059,6 +4423,22 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap 1.9.3", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "pin-project" version = "1.0.12" @@ -3081,9 +4461,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -3099,10 +4479,10 @@ checksum = "a8a87d67cc8f4592a5313b37ce395e8965dd8284492a85f19478af941a4df257" dependencies = [ "bytemuck", "pollster", - "raw-window-handle", + "raw-window-handle 0.5.2", "thiserror", "ultraviolet", - "wgpu", + "wgpu 0.15.1", ] [[package]] @@ -3117,7 +4497,7 @@ version = "0.17.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f0e7f4c94ec26ff209cee506314212639d6c91b80afb82984819fafce9df01c" dependencies = [ - "bitflags", + "bitflags 1.3.2", "crc32fast", "flate2", "miniz_oxide", @@ -3130,7 +4510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ "autocfg", - "bitflags", + "bitflags 1.3.2", "cfg-if", "concurrent-queue", "libc", @@ -3139,6 +4519,21 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "polling" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.3.9", + "pin-project-lite", + "rustix 0.38.31", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "pollster" version = "0.2.5" @@ -3151,6 +4546,22 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "prettyplease" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9825a04601d60621feed79c4e6b56d65db77cdca55cef43b46b0de1096d1c282" +dependencies = [ + "proc-macro2", + "syn 2.0.48", +] + [[package]] name = "proc-macro-crate" version = "1.2.1" @@ -3159,14 +4570,14 @@ checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" dependencies = [ "once_cell", "thiserror", - "toml", + "toml 0.5.9", ] [[package]] name = "proc-macro2" -version = "1.0.57" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ec6d5fe0b140acb27c9a0444118cf55bfbb4e0b259739429abb4521dd67c16" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -3178,23 +4589,65 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d" [[package]] -name = "psm" -version = "0.1.20" +name = "prost" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f446d0a6efba22928558c4fb4ce0b3fd6c89b0061343e390bf01a703742b8125" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" dependencies = [ - "cc", + "bytes", + "prost-derive", ] [[package]] -name = "pulldown-cmark" -version = "0.8.0" +name = "prost-build" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffade02495f22453cd593159ea2f59827aae7f53fa8323f756799b670881dcf8" +checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" dependencies = [ - "bitflags", - "memchr", - "unicase", + "bytes", + "heck 0.5.0", + "itertools", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.48", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "prost-types" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" +dependencies = [ + "prost", +] + +[[package]] +name = "psm" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f446d0a6efba22928558c4fb4ce0b3fd6c89b0061343e390bf01a703742b8125" +dependencies = [ + "cc", ] [[package]] @@ -3206,15 +4659,30 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + [[package]] name = "quote" -version = "1.0.27" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] +[[package]] +name = "radix_fmt" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce082a9940a7ace2ad4a8b7d0b1eac6aa378895f18be598230c5f2284ac05426" + [[package]] name = "rand" version = "0.8.5" @@ -3253,12 +4721,15 @@ checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6" [[package]] name = "raw-window-handle" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" -dependencies = [ - "cty", -] +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "raw-window-handle" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" [[package]] name = "rayon" @@ -3284,13 +4755,19 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "rctree" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f" + [[package]] name = "redox_syscall" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -3299,7 +4776,16 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", ] [[package]] @@ -3315,21 +4801,34 @@ dependencies = [ [[package]] name = "regalloc2" -version = "0.6.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80535183cae11b149d618fbd3c37e38d7cda589d82d7769e196ca9a9042d7621" +checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" dependencies = [ - "fxhash", + "hashbrown 0.13.2", "log", + "rustc-hash", "slice-group-by", "smallvec", ] [[package]] name = "regex" -version = "1.6.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" dependencies = [ "aho-corasick", "memchr", @@ -3338,9 +4837,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.27" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "renderdoc-sys" @@ -3348,6 +4847,68 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "reqwest" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19" +dependencies = [ + "base64 0.22.0", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.4", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "resvg" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadccb3d99a9efb8e5e00c16fbb732cbe400db2ec7fc004697ee7d97d86cf1f4" +dependencies = [ + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia 0.11.4", + "usvg", +] + [[package]] name = "rfd" version = "0.11.3" @@ -3366,20 +4927,64 @@ dependencies = [ "objc", "objc-foundation", "objc_id", - "raw-window-handle", + "raw-window-handle 0.5.2", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "windows 0.44.0", ] +[[package]] +name = "rgb" +version = "0.8.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "roxmltree" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f" + [[package]] name = "rtrb" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e704dd104faf2326a320140f70f0b736d607c1caa1b1748a6c568a79819109" +checksum = "636b228b5adb32add7f0e41e5084d38aa66fb0f942e8a91751c1e90023288fbe" dependencies = [ - "cache-padded", + "crossbeam-utils", +] + +[[package]] +name = "rusqlite" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" +dependencies = [ + "bitflags 2.4.2", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", ] [[package]] @@ -3396,30 +5001,67 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.36.13" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a38f9520be93aba504e8ca974197f46158de5dcaa9fa04b57c57cd6a679d658" +checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" dependencies = [ - "bitflags", + "bitflags 1.3.2", "errno", "io-lifetimes", "libc", - "linux-raw-sys 0.1.4", + "linux-raw-sys 0.3.7", "windows-sys 0.45.0", ] [[package]] name = "rustix" -version = "0.37.3" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags", + "bitflags 2.4.2", "errno", - "io-lifetimes", "libc", - "linux-raw-sys 0.3.7", - "windows-sys 0.45.0", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.0", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" + +[[package]] +name = "rustls-webpki" +version = "0.101.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +dependencies = [ + "ring", + "untrusted", ] [[package]] @@ -3452,6 +5094,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "scoped-tls" version = "1.0.0" @@ -3464,6 +5115,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "sctk-adwaita" version = "0.5.4" @@ -3472,57 +5133,87 @@ checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" dependencies = [ "ab_glyph", "log", - "memmap2", - "smithay-client-toolkit", - "tiny-skia", + "memmap2 0.5.10", + "smithay-client-toolkit 0.16.0", + "tiny-skia 0.8.4", ] [[package]] -name = "serde" -version = "1.0.163" +name = "sctk-adwaita" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "82b2eaf3a5b264a521b988b2e73042e742df700c4f962cde845d1541adb46550" dependencies = [ - "serde_derive", + "ab_glyph", + "log", + "memmap2 0.9.4", + "smithay-client-toolkit 0.18.1", + "tiny-skia 0.11.4", ] [[package]] -name = "serde-big-array" -version = "0.5.1" +name = "security-framework" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ - "serde", + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys 0.8.3", + "libc", + "security-framework-sys", ] [[package]] -name = "serde-xml-rs" -version = "0.4.1" +name = "security-framework-sys" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0bf1ba0696ccf0872866277143ff1fd14d22eec235d2b23702f95e6660f7dfa" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +dependencies = [ + "core-foundation-sys 0.8.3", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" dependencies = [ - "log", "serde", - "thiserror", - "xml-rs", ] [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -3535,9 +5226,30 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.16", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", ] [[package]] @@ -3587,6 +5299,21 @@ dependencies = [ "libc", ] +[[package]] +name = "simplecss" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "slab" version = "0.4.8" @@ -3613,9 +5340,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.9.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smithay-client-toolkit" @@ -3623,17 +5350,42 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" dependencies = [ - "bitflags", - "calloop", + "bitflags 1.3.2", + "calloop 0.10.1", "dlib", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "nix 0.24.2", "pkg-config", - "wayland-client", - "wayland-cursor", - "wayland-protocols", + "wayland-client 0.29.5", + "wayland-cursor 0.29.5", + "wayland-protocols 0.29.5", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" +dependencies = [ + "bitflags 2.4.2", + "calloop 0.12.4", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2 0.9.4", + "rustix 0.38.31", + "thiserror", + "wayland-backend", + "wayland-client 0.31.2", + "wayland-csd-frame", + "wayland-cursor 0.31.1", + "wayland-protocols 0.31.2", + "wayland-protocols-wlr", + "wayland-scanner 0.31.1", + "xkeysym", ] [[package]] @@ -3642,8 +5394,28 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" dependencies = [ - "smithay-client-toolkit", - "wayland-client", + "smithay-client-toolkit 0.16.0", + "wayland-client 0.29.5", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c091e7354ea8059d6ad99eace06dd13ddeedbb0ac72d40a9a6e7ff790525882d" +dependencies = [ + "libc", + "smithay-client-toolkit 0.18.1", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49" +dependencies = [ + "serde", ] [[package]] @@ -3656,6 +5428,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "spin" version = "0.9.4" @@ -3671,10 +5459,25 @@ version = "0.2.0+1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" dependencies = [ - "bitflags", + "bitflags 1.3.2", "num-traits", ] +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.4.2", +] + +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3687,23 +5490,20 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "str-buf" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" - [[package]] name = "strict-num" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df65f20698aeed245efdde3628a6b559ea1239bbb871af1b6e3b58c413b2bd1" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" @@ -3720,13 +5520,23 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck", + "heck 0.4.0", "proc-macro2", "quote", "rustversion", "syn 1.0.109", ] +[[package]] +name = "svgtypes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e44e288cd960318917cbd540340968b90becc8bc81f171345d706e7a89d9d70" +dependencies = [ + "kurbo", + "siphasher", +] + [[package]] name = "syn" version = "1.0.109" @@ -3740,15 +5550,21 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.16" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" @@ -3761,6 +5577,27 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys 0.8.3", + "libc", +] + [[package]] name = "system-deps" version = "6.0.2" @@ -3768,17 +5605,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" dependencies = [ "cfg-expr", - "heck", + "heck 0.4.0", "pkg-config", - "toml", + "toml 0.5.9", "version-compare", ] [[package]] name = "target-lexicon" -version = "0.12.4" +version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tempfile" @@ -3787,7 +5624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" dependencies = [ "cfg-if", - "fastrand", + "fastrand 1.9.0", "redox_syscall 0.3.5", "rustix 0.37.3", "windows-sys 0.45.0", @@ -3795,31 +5632,31 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.3" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.48", ] [[package]] @@ -3853,7 +5690,22 @@ dependencies = [ "bytemuck", "cfg-if", "png", - "tiny-skia-path", + "tiny-skia-path 0.8.4", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png", + "tiny-skia-path 0.11.4", ] [[package]] @@ -3867,11 +5719,22 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + [[package]] name = "tinystr" -version = "0.7.1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ac3f5b6856e931e15e07b478e98c8045239829a65f9156d4fa7e7788197a5ef" +checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece" dependencies = [ "displaydoc", ] @@ -3891,6 +5754,81 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +[[package]] +name = "tokio" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" +dependencies = [ + "autocfg", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot 0.12.1", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.4.9", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e267c18a719545b481171952a79f8c25c80361463ba44bc7fa9eba7c742ef4f" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + [[package]] name = "toml" version = "0.5.9" @@ -3900,6 +5838,112 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +dependencies = [ + "indexmap 2.2.1", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.0", + "bytes", + "h2 0.3.24", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.28", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d021fc044c18582b9a2408cd0dd05b1596e3ecdb5c4df822bb0183545683889" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + [[package]] name = "tracing" version = "0.1.37" @@ -3907,6 +5951,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3920,7 +5965,7 @@ checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.48", ] [[package]] @@ -3932,6 +5977,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + [[package]] name = "ttf-parser" version = "0.15.2" @@ -3974,9 +6025,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] @@ -4002,6 +6053,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + [[package]] name = "unicode-width" version = "0.1.10" @@ -4009,10 +6066,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] -name = "unicode-xid" -version = "0.2.4" +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "ureq" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" +dependencies = [ + "base64 0.21.0", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-webpki", + "url", + "webpki-roots", +] [[package]] name = "url" @@ -4025,6 +6104,50 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "usvg" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b0a51b72ab80ca511d126b77feeeb4fb1e972764653e61feac30adc161a756" +dependencies = [ + "base64 0.21.0", + "log", + "pico-args", + "usvg-parser", + "usvg-tree", + "xmlwriter", +] + +[[package]] +name = "usvg-parser" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd4e3c291f45d152929a31f0f6c819245e2921bfd01e7bd91201a9af39a2bdc" +dependencies = [ + "data-url", + "flate2", + "imagesize", + "kurbo", + "log", + "roxmltree", + "simplecss", + "siphasher", + "svgtypes", + "usvg-tree", +] + +[[package]] +name = "usvg-tree" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee3d202ebdb97a6215604b8f5b4d6ef9024efd623cf2e373a6416ba976ec7d3" +dependencies = [ + "rctree", + "strict-num", + "svgtypes", + "tiny-skia-path 0.11.4", +] + [[package]] name = "utf8parse" version = "0.2.1" @@ -4043,6 +6166,12 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ea29db9f94ff08bb619656b8120878f280526f71dc88b5262c958a510181812" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vec_map" version = "0.8.2" @@ -4078,6 +6207,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4086,9 +6225,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4096,24 +6235,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -4123,9 +6262,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4133,113 +6272,147 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasm-encoder" -version = "0.27.0" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c7d2731df60006819b013f64ccc2019691deccf6e11a1804bc850cd6748f1a" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-encoder" +version = "0.202.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77053dc709db790691d3732cfc458adc5acc881dec524965c608effdcd9c581" +checksum = "bfd106365a7f5f7aa3c1916a98cbb3ad477f5ff96ddb130285a91c6e7429e67a" dependencies = [ "leb128", ] [[package]] name = "wasmparser" -version = "0.102.0" +version = "0.201.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" +checksum = "84e5df6dba6c0d7fafc63a450f1738451ed7a0b52295d83e868218fa286bf708" dependencies = [ - "indexmap", - "url", + "bitflags 2.4.2", + "indexmap 2.2.1", + "semver", +] + +[[package]] +name = "wasmprinter" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a67e66da702706ba08729a78e3c0079085f6bfcb1a62e4799e97bbf728c2c265" +dependencies = [ + "anyhow", + "wasmparser", ] [[package]] name = "wasmtime" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" +checksum = "516be5b58a8f75d39b01378516dcb0ff7b9bc39c7f1f10eec5b338d4916cf988" dependencies = [ + "addr2line 0.21.0", "anyhow", "async-trait", "bincode", + "bumpalo", "cfg-if", - "indexmap", + "encoding_rs", + "fxprof-processed-profile", + "gimli 0.28.1", + "indexmap 2.2.1", + "ittapi", "libc", "log", - "object 0.30.3", + "object 0.32.2", "once_cell", "paste", - "psm", "rayon", + "rustix 0.38.31", + "semver", "serde", + "serde_derive", + "serde_json", "target-lexicon", + "wasm-encoder 0.201.0", "wasmparser", "wasmtime-cache", "wasmtime-component-macro", + "wasmtime-component-util", "wasmtime-cranelift", "wasmtime-environ", "wasmtime-fiber", - "wasmtime-jit", + "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", "wasmtime-runtime", + "wasmtime-slab", + "wasmtime-winch", "wat", - "windows-sys 0.45.0", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-asm-macros" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" +checksum = "e8d22d88a92d69385f18143c946884bf6aaa9ec206ce54c85a2d320c1362b009" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86437fa68626fe896e5afc69234bb2b5894949083586535f200385adfd71213" +checksum = "068728a840223b56c964507550da671372e7e5c2f3a7856012b57482e3e979a7" dependencies = [ "anyhow", - "base64", + "base64 0.21.0", "bincode", "directories-next", - "file-per-thread-logger", "log", - "rustix 0.36.13", + "rustix 0.38.31", "serde", + "serde_derive", "sha2", - "toml", - "windows-sys 0.45.0", - "zstd 0.11.2+zstd.1.5.2", + "toml 0.8.12", + "windows-sys 0.52.0", + "zstd 0.13.1", ] [[package]] name = "wasmtime-component-macro" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267096ed7cc93b4ab15d3daa4f195e04dbb7e71c7e5c6457ae7d52e9dd9c3607" +checksum = "631244bac89c57ebe7283209d86fe175ad5929328e75f61bf9141895cafbf52d" dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", "wasmtime-component-util", "wasmtime-wit-bindgen", "wit-parser", @@ -4247,211 +6420,274 @@ dependencies = [ [[package]] name = "wasmtime-component-util" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74e02ca7a4a3c69d72b88f26f0192e333958df6892415ac9ab84dcc42c9000c2" +checksum = "82ad496ba0558f7602da5e9d4c201f35f7aefcca70f973ec916f3f0d0787ef74" [[package]] name = "wasmtime-cranelift" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cefde0cce8cb700b1b21b6298a3837dba46521affd7b8c38a9ee2c869eee04" +checksum = "961ab5ee4b17e627001b18069ee89ef906edbbd3f84955515f6aad5ab6d82299" dependencies = [ "anyhow", + "cfg-if", "cranelift-codegen", + "cranelift-control", "cranelift-entity", "cranelift-frontend", "cranelift-native", "cranelift-wasm", - "gimli 0.27.2", + "gimli 0.28.1", "log", - "object 0.30.3", + "object 0.32.2", "target-lexicon", "thiserror", "wasmparser", "wasmtime-cranelift-shared", "wasmtime-environ", + "wasmtime-versioned-export-macros", ] [[package]] name = "wasmtime-cranelift-shared" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd041e382ef5aea1b9fc78442394f1a4f6d676ce457e7076ca4cb3f397882f8b" +checksum = "bc4db94596be14cd1f85844ce85470bf68acf235143098b9d9bf72b49e47b917" dependencies = [ "anyhow", "cranelift-codegen", + "cranelift-control", "cranelift-native", - "gimli 0.27.2", - "object 0.30.3", + "gimli 0.28.1", + "object 0.32.2", "target-lexicon", "wasmtime-environ", ] [[package]] name = "wasmtime-environ" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" +checksum = "420b13858ef27dfd116f1fdb0513e9593a307a632ade2ea58334b639a3d8d24e" dependencies = [ "anyhow", + "bincode", + "cpp_demangle", "cranelift-entity", - "gimli 0.27.2", - "indexmap", + "gimli 0.28.1", + "indexmap 2.2.1", "log", - "object 0.30.3", + "object 0.32.2", + "rustc-demangle", "serde", + "serde_derive", "target-lexicon", "thiserror", + "wasm-encoder 0.201.0", "wasmparser", + "wasmprinter", + "wasmtime-component-util", "wasmtime-types", ] [[package]] name = "wasmtime-fiber" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab182d5ab6273a133ab88db94d8ca86dc3e57e43d70baaa4d98f94ddbd7d10a" +checksum = "5d37ff0e11a023019e34fe839c74a1c00880b989f4446176b6cc6da3b58e3ef2" dependencies = [ + "anyhow", "cc", "cfg-if", - "rustix 0.36.13", + "rustix 0.38.31", "wasmtime-asm-macros", - "windows-sys 0.45.0", -] - -[[package]] -name = "wasmtime-jit" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" -dependencies = [ - "addr2line 0.19.0", - "anyhow", - "bincode", - "cfg-if", - "cpp_demangle", - "gimli 0.27.2", - "ittapi", - "log", - "object 0.30.3", - "rustc-demangle", - "serde", - "target-lexicon", - "wasmtime-environ", - "wasmtime-jit-debug", - "wasmtime-jit-icache-coherence", - "wasmtime-runtime", - "windows-sys 0.45.0", + "wasmtime-versioned-export-macros", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-jit-debug" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" +checksum = "7b849f19ad1d4a8133ff05b82c438144f17fb49b08e5f7995f8c1e25cf35f390" dependencies = [ - "object 0.30.3", + "object 0.32.2", "once_cell", - "rustix 0.36.13", + "rustix 0.38.31", + "wasmtime-versioned-export-macros", ] [[package]] name = "wasmtime-jit-icache-coherence" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" +checksum = "59c48eb4223d6556ffbf3decb146d0da124f1fd043f41c98b705252cb6a5c186" dependencies = [ "cfg-if", "libc", - "windows-sys 0.45.0", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-runtime" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" +checksum = "7fefac2cb5f5a6f365234a3584bf40bd2e45e7f6cd90a689d9b2afbb9881978f" dependencies = [ "anyhow", "cc", "cfg-if", - "indexmap", + "encoding_rs", + "indexmap 2.2.1", "libc", "log", "mach", "memfd", - "memoffset 0.8.0", + "memoffset 0.9.0", "paste", - "rand", - "rustix 0.36.13", + "psm", + "rustix 0.38.31", + "sptr", + "wasm-encoder 0.201.0", "wasmtime-asm-macros", "wasmtime-environ", "wasmtime-fiber", "wasmtime-jit-debug", - "windows-sys 0.45.0", + "wasmtime-versioned-export-macros", + "wasmtime-wmemcheck", + "windows-sys 0.52.0", ] +[[package]] +name = "wasmtime-slab" +version = "19.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d7b97b92df126fdbe994a53d2215828ec5ed5087535e6d4703b1fbd299f0e3" + [[package]] name = "wasmtime-types" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" +checksum = "509c88abb830819b259c49e2d4e4f22b555db066ba08ded0b76b071a2aa53ddf" dependencies = [ "cranelift-entity", "serde", + "serde_derive", "thiserror", "wasmparser", ] +[[package]] +name = "wasmtime-versioned-export-macros" +version = "19.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1d81c092a61ca1667013e2eb08fed7c6c53e496dbbaa32d5685dc5152b0a772" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "wasmtime-winch" +version = "19.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0958907880e37a2d3974f5b3574c23bf70aaf1fc6c1f716625bb50dac776f1a" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli 0.28.1", + "object 0.32.2", + "target-lexicon", + "wasmparser", + "wasmtime-cranelift-shared", + "wasmtime-environ", + "winch-codegen", +] + [[package]] name = "wasmtime-wit-bindgen" -version = "8.0.1" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "983db9cc294d1adaa892a53ff6a0dc6605fc0ab1a4da5d8a2d2d4bde871ff7dd" +checksum = "a593ddefd2f80617df6bea084b2e422d8969e924bc209642a794d57518f59587" dependencies = [ "anyhow", - "heck", + "heck 0.4.0", + "indexmap 2.2.1", "wit-parser", ] +[[package]] +name = "wasmtime-wmemcheck" +version = "19.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77212b6874bbc86d220bb1d28632d0c11c6afe996c3e1ddcf746b1a6b4919b9" + [[package]] name = "wast" -version = "58.0.0" +version = "202.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372eecae2d10a5091c2005b32377d7ecd6feecdf2c05838056d02d8b4f07c429" +checksum = "1fbcb11204515c953c9b42ede0a46a1c5e17f82af05c4fae201a8efff1b0f4fe" dependencies = [ + "bumpalo", "leb128", "memchr", "unicode-width", - "wasm-encoder", + "wasm-encoder 0.202.0", ] [[package]] name = "wat" -version = "1.0.64" +version = "1.202.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d47446190e112ab1579ab40b3ad7e319d859d74e5134683f04e9f0747bf4173" +checksum = "4de4b15a47135c56a3573406e9977b9518787a6154459b4842a9b9d3d1684848" dependencies = [ "wast", ] +[[package]] +name = "wayland-backend" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" +dependencies = [ + "cc", + "downcast-rs", + "rustix 0.38.31", + "scoped-tls", + "smallvec", + "wayland-sys 0.31.1", +] + [[package]] name = "wayland-client" version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" dependencies = [ - "bitflags", + "bitflags 1.3.2", "downcast-rs", "libc", "nix 0.24.2", "scoped-tls", "wayland-commons", - "wayland-scanner", + "wayland-scanner 0.29.5", "wayland-sys 0.29.5", ] +[[package]] +name = "wayland-client" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" +dependencies = [ + "bitflags 2.4.2", + "rustix 0.38.31", + "wayland-backend", + "wayland-scanner 0.31.1", +] + [[package]] name = "wayland-commons" version = "0.29.5" @@ -4464,6 +6700,17 @@ dependencies = [ "wayland-sys 0.29.5", ] +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.4.2", + "cursor-icon", + "wayland-backend", +] + [[package]] name = "wayland-cursor" version = "0.29.5" @@ -4471,7 +6718,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" dependencies = [ "nix 0.24.2", - "wayland-client", + "wayland-client 0.29.5", + "xcursor", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71ce5fa868dd13d11a0d04c5e2e65726d0897be8de247c0c5a65886e283231ba" +dependencies = [ + "rustix 0.38.31", + "wayland-client 0.31.2", "xcursor", ] @@ -4481,10 +6739,48 @@ version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" dependencies = [ - "bitflags", - "wayland-client", + "bitflags 1.3.2", + "wayland-client 0.29.5", "wayland-commons", - "wayland-scanner", + "wayland-scanner 0.29.5", +] + +[[package]] +name = "wayland-protocols" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +dependencies = [ + "bitflags 2.4.2", + "wayland-backend", + "wayland-client 0.31.2", + "wayland-scanner 0.31.1", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +dependencies = [ + "bitflags 2.4.2", + "wayland-backend", + "wayland-client 0.31.2", + "wayland-protocols 0.31.2", + "wayland-scanner 0.31.1", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +dependencies = [ + "bitflags 2.4.2", + "wayland-backend", + "wayland-client 0.31.2", + "wayland-protocols 0.31.2", + "wayland-scanner 0.31.1", ] [[package]] @@ -4498,6 +6794,17 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "wayland-scanner" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + [[package]] name = "wayland-sys" version = "0.29.5" @@ -4521,11 +6828,33 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "wayland-sys" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" dependencies = [ "js-sys", "wasm-bindgen", @@ -4539,15 +6868,21 @@ checksum = "b692165700260bbd40fbc5ff23766c03e339fbaca907aeea5cb77bf0a553ca83" dependencies = [ "core-foundation", "dirs", - "jni 0.21.1", + "jni", "log", "ndk-context", "objc", - "raw-window-handle", + "raw-window-handle 0.5.2", "url", "web-sys", ] +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + [[package]] name = "weezl" version = "0.1.7" @@ -4564,18 +6899,42 @@ dependencies = [ "cfg-if", "js-sys", "log", - "naga", + "naga 0.11.0", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle 0.5.2", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core 0.15.1", + "wgpu-hal 0.15.4", + "wgpu-types 0.15.2", +] + +[[package]] +name = "wgpu" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" +dependencies = [ + "arrayvec", + "cfg-if", + "cfg_aliases", + "js-sys", + "log", "parking_lot 0.12.1", "profiling", - "raw-window-handle", + "raw-window-handle 0.6.0", "smallvec", "static_assertions", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", + "wgpu-core 0.19.4", + "wgpu-hal 0.19.4", + "wgpu-types 0.19.2", ] [[package]] @@ -4586,60 +6945,127 @@ checksum = "7131408d940e335792645a98f03639573b0480e9e2e7cddbbab74f7c6d9f3fff" dependencies = [ "arrayvec", "bit-vec", - "bitflags", + "bitflags 1.3.2", + "codespan-reporting", + "fxhash", + "log", + "naga 0.11.0", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle 0.5.2", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal 0.15.4", + "wgpu-types 0.15.2", +] + +[[package]] +name = "wgpu-core" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.4.2", + "cfg_aliases", "codespan-reporting", + "indexmap 2.2.1", + "log", + "naga 0.19.2", + "once_cell", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle 0.6.0", + "rustc-hash", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal 0.19.4", + "wgpu-types 0.19.2", +] + +[[package]] +name = "wgpu-hal" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdcf61a283adc744bb5453dd88ea91f3f86d5ca6b027661c6c73c7734ae0288b" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 1.3.2", + "block", + "core-graphics-types", + "d3d12", + "foreign-types 0.3.2", "fxhash", + "glow 0.12.1", + "gpu-alloc 0.5.3", + "gpu-allocator 0.22.0", + "gpu-descriptor", + "hassle-rs 0.9.0", + "js-sys", + "khronos-egl 4.1.0", + "libc", + "libloading 0.7.3", "log", - "naga", + "metal 0.24.0", + "naga 0.11.0", + "objc", "parking_lot 0.12.1", "profiling", - "raw-window-handle", + "range-alloc", + "raw-window-handle 0.5.2", + "renderdoc-sys 0.7.1", "smallvec", "thiserror", + "wasm-bindgen", "web-sys", - "wgpu-hal", - "wgpu-types", + "wgpu-types 0.15.2", + "winapi", ] [[package]] name = "wgpu-hal" -version = "0.15.4" +version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdcf61a283adc744bb5453dd88ea91f3f86d5ca6b027661c6c73c7734ae0288b" +checksum = "fc1a4924366df7ab41a5d8546d6534f1f33231aa5b3f72b9930e300f254e39c3" dependencies = [ "android_system_properties", "arrayvec", "ash", - "bit-set", - "bitflags", - "block", + "bitflags 2.4.2", + "cfg_aliases", "core-graphics-types", - "d3d12", - "foreign-types", - "fxhash", - "glow", - "gpu-alloc", - "gpu-allocator", + "glow 0.13.1", + "glutin_wgl_sys 0.5.0", + "gpu-alloc 0.6.0", + "gpu-allocator 0.25.0", "gpu-descriptor", - "hassle-rs", + "hassle-rs 0.11.0", "js-sys", - "khronos-egl", + "khronos-egl 6.0.0", "libc", - "libloading", + "libloading 0.8.3", "log", - "metal", - "naga", + "metal 0.27.0", + "naga 0.19.2", + "ndk-sys 0.5.0+25.2.9519653", "objc", + "once_cell", "parking_lot 0.12.1", "profiling", - "range-alloc", - "raw-window-handle", - "renderdoc-sys", + "raw-window-handle 0.6.0", + "renderdoc-sys 1.1.0", + "rustc-hash", "smallvec", "thiserror", "wasm-bindgen", "web-sys", - "wgpu-types", + "wgpu-types 0.19.2", "winapi", ] @@ -4649,7 +7075,18 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32444e121b0bd00cb02c0de32fde457a9491bd44e03e7a5db6df9b1da2f6f110" dependencies = [ - "bitflags", + "bitflags 1.3.2", + "js-sys", + "web-sys", +] + +[[package]] +name = "wgpu-types" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" +dependencies = [ + "bitflags 2.4.2", "js-sys", "web-sys", ] @@ -4670,6 +7107,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + [[package]] name = "winapi" version = "0.3.9" @@ -4695,15 +7138,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "winapi-wsapoll" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -4711,19 +7145,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.42.0" +name = "winch-codegen" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0286ba339aa753e70765d521bb0242cc48e1194562bfa2a2ad7ac8a6de28f5d5" +checksum = "e72a6a7034793b874b85e428fd6d7b3ccccb98c326e33af3aa40cdf50d0c33da" dependencies = [ - "windows-implement", - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "anyhow", + "cranelift-codegen", + "gimli 0.28.1", + "regalloc2", + "smallvec", + "target-lexicon", + "wasmparser", + "wasmtime-environ", ] [[package]] @@ -4732,29 +7166,114 @@ version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" dependencies = [ + "windows-implement 0.44.0", + "windows-interface 0.44.0", "windows-targets 0.42.2", ] [[package]] name = "windows" -version = "0.46.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.42.2", + "windows-implement 0.48.0", + "windows-interface 0.48.0", + "windows-targets 0.48.0", +] + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.3", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.3", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.3", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.3", +] + +[[package]] +name = "windows-implement" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce87ca8e3417b02dc2a8a22769306658670ec92d78f1bd420d6310a67c245c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "windows-implement" -version = "0.42.0" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-interface" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "853f69a591ecd4f810d29f17e902d40e349fb05b0b11fff63b08b826bfe39c7f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-interface" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9539b6bd3eadbd9de66c9666b22d802b833da7e996bc06896142e09854a61767" +checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] +[[package]] +name = "windows-result" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd19df78e5168dfb0aedc343d1d1b8d422ab2db6756d2dc3fef75035402a3f64" +dependencies = [ + "windows-targets 0.52.3", +] + [[package]] name = "windows-sys" version = "0.36.1" @@ -4768,21 +7287,6 @@ dependencies = [ "windows_x86_64_msvc 0.36.1", ] -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -4801,6 +7305,15 @@ dependencies = [ "windows-targets 0.48.0", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.3", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -4831,6 +7344,21 @@ dependencies = [ "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows-targets" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +dependencies = [ + "windows_aarch64_gnullvm 0.52.3", + "windows_aarch64_msvc 0.52.3", + "windows_i686_gnu 0.52.3", + "windows_i686_msvc 0.52.3", + "windows_x86_64_gnu 0.52.3", + "windows_x86_64_gnullvm 0.52.3", + "windows_x86_64_msvc 0.52.3", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -4843,6 +7371,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" + [[package]] name = "windows_aarch64_msvc" version = "0.36.1" @@ -4861,6 +7395,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" + [[package]] name = "windows_i686_gnu" version = "0.36.1" @@ -4879,6 +7419,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" + [[package]] name = "windows_i686_msvc" version = "0.36.1" @@ -4897,6 +7443,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_i686_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" + [[package]] name = "windows_x86_64_gnu" version = "0.36.1" @@ -4915,6 +7467,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -4927,6 +7485,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" + [[package]] name = "windows_x86_64_msvc" version = "0.36.1" @@ -4945,73 +7509,141 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" + [[package]] name = "winit" version = "0.28.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "866db3f712fffba75d31bf0cdecf357c8aeafd158c5b7ab51dba2a2b2d47f196" dependencies = [ - "android-activity", - "bitflags", + "android-activity 0.4.1", + "bitflags 1.3.2", "cfg_aliases", "core-foundation", - "core-graphics", + "core-graphics 0.22.3", "dispatch", "instant", "libc", "log", "mio", - "ndk", - "objc2", + "ndk 0.7.0", + "objc2 0.3.0-beta.3", "once_cell", "orbclient", "percent-encoding", - "raw-window-handle", + "raw-window-handle 0.5.2", "redox_syscall 0.3.5", - "sctk-adwaita", + "sctk-adwaita 0.5.4", "serde", - "smithay-client-toolkit", + "smithay-client-toolkit 0.16.0", "wasm-bindgen", - "wayland-client", + "wayland-client 0.29.5", "wayland-commons", - "wayland-protocols", - "wayland-scanner", + "wayland-protocols 0.29.5", + "wayland-scanner 0.29.5", "web-sys", "windows-sys 0.45.0", "x11-dl", ] +[[package]] +name = "winit" +version = "0.29.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" +dependencies = [ + "ahash 0.8.7", + "android-activity 0.5.2", + "atomic-waker", + "bitflags 2.4.2", + "bytemuck", + "calloop 0.12.4", + "cfg_aliases", + "core-foundation", + "core-graphics 0.23.1", + "cursor-icon", + "icrate", + "js-sys", + "libc", + "log", + "memmap2 0.9.4", + "ndk 0.8.0", + "ndk-sys 0.5.0+25.2.9519653", + "objc2 0.4.1", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", + "redox_syscall 0.3.5", + "rustix 0.38.31", + "sctk-adwaita 0.8.1", + "smithay-client-toolkit 0.18.1", + "smol_str", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client 0.31.2", + "wayland-protocols 0.31.2", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.48.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + [[package]] name = "winit_input_helper" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5de0485e86aa2ee87d2d4c373a908c9548357bc65c5bce19fd884c8ea9eac4d7" dependencies = [ - "winit", + "winit 0.28.6", ] [[package]] name = "winnow" -version = "0.4.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wit-parser" -version = "0.6.4" +version = "0.201.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f887c3da527a51b321076ebe6a7513026a4757b6d4d144259946552d6fc728b3" +checksum = "196d3ecfc4b759a8573bf86a9b3f8996b304b3732e4c7de81655f875f6efdca6" dependencies = [ "anyhow", "id-arena", - "indexmap", + "indexmap 2.2.1", "log", - "pulldown-cmark", + "semver", + "serde", + "serde_derive", + "serde_json", "unicode-xid", - "url", + "wasmparser", ] [[package]] @@ -5027,25 +7659,24 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.10.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" dependencies = [ + "as-raw-xcb-connection", "gethostname", - "nix 0.24.2", - "winapi", - "winapi-wsapoll", + "libc", + "libloading 0.8.3", + "once_cell", + "rustix 0.38.31", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.10.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" -dependencies = [ - "nix 0.24.2", -] +checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" [[package]] name = "xcursor" @@ -5066,17 +7697,42 @@ dependencies = [ "winapi", ] +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.4.2", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621" + [[package]] name = "xml-rs" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + [[package]] name = "zbus" -version = "3.13.1" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c3d77c9966c28321f1907f0b6c5a5561189d1f7311eea6d94180c6be9daab29" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" dependencies = [ "async-broadcast", "async-executor", @@ -5087,10 +7743,11 @@ dependencies = [ "async-recursion", "async-task", "async-trait", + "blocking", "byteorder", "derivative", "enumflags2", - "event-listener", + "event-listener 2.5.3", "futures-core", "futures-sink", "futures-util", @@ -5100,7 +7757,6 @@ dependencies = [ "ordered-stream", "rand", "serde", - "serde-xml-rs", "serde_repr", "sha1", "static_assertions", @@ -5115,24 +7771,23 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.13.1" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e341d12edaff644e539ccbbf7f161601294c9a84ed3d7e015da33155b435af" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "regex", "syn 1.0.109", - "winnow", "zvariant_utils", ] [[package]] name = "zbus_names" -version = "2.5.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82441e6033be0a741157a72951a3e4957d519698f3a824439cc131c5ba77ac2a" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" dependencies = [ "serde", "static_assertions", @@ -5140,12 +7795,23 @@ dependencies = [ ] [[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", + "proc-macro2", + "quote", + "syn 2.0.48", ] [[package]] @@ -5158,13 +7824,12 @@ dependencies = [ ] [[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" +name = "zstd" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" dependencies = [ - "libc", - "zstd-sys", + "zstd-safe 7.1.0", ] [[package]] @@ -5177,22 +7842,30 @@ dependencies = [ "zstd-sys", ] +[[package]] +name = "zstd-safe" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +dependencies = [ + "zstd-sys", +] + [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.10+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" dependencies = [ "cc", - "libc", "pkg-config", ] [[package]] name = "zvariant" -version = "3.14.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622cc473f10cef1b0d73b7b34a266be30ebdcfaea40ec297dd8cbda088f9f93c" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" dependencies = [ "byteorder", "enumflags2", @@ -5204,9 +7877,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.14.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d9c1b57352c25b778257c661f3c4744b7cefb7fc09dd46909a153cce7773da2" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 6675078c..6e793c06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,13 +2,23 @@ resolver = "2" members = [ + "gamercade_app", "gamercade_audio", "gamercade_cli", "gamercade_console", "gamercade_core", "gamercade_editor", "gamercade_fs", + "gamercade_interface", "gamercade_rs", "gamercade_sound_engine", "gamercade_tools", ] + +[profile.release] +opt-level = 3 +lto = true + +[profile.perf] +inherits = "release" +debug = true \ No newline at end of file diff --git a/README.md b/README.md index 9b7cfecb..e7331198 100644 --- a/README.md +++ b/README.md @@ -92,12 +92,14 @@ If you are not using any custom assets, or are okay with the default color palet This is the main workspace crate. Consider viewing the inner crates for more information about the project. Each of them has their own README. +- `gamercade_app` - For the user-facing platform app. - `gamercade_audio` - For all gamercade audio related things. - `gamercade_cli` - The `gccl` tools for development. - `gamercade_console` - The console used to run & play games. - `gamercade_core` - Core shared types and functionality. - `gamercade_editor` - The editor used to bundle WASM code with assets. - `gamercade_fs` - File System management, loading, saving etc. +- `gamercade_interface` - Interface definitions between app and platform. - `gamercade_rs` - A safe wrapper around the raw Api. - `gamercade_sound_engine` - Closely related to gamercade_audio, responsible for actual sound output. - `gamercade_tools` - Useful assorted tools. @@ -106,6 +108,10 @@ This is the main workspace crate. Consider viewing the inner crates for more inf Gamercade runs on **Stable Rust 1.66 or later**. +## Requirements + +- When building from source, you may need to install `protoc` https://protobuf.dev/ + ## License Licensed under either of diff --git a/gamercade_app/Cargo.toml b/gamercade_app/Cargo.toml new file mode 100644 index 00000000..0e08456a --- /dev/null +++ b/gamercade_app/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "gamercade_app" +version = "0.1.0" +edition = "2021" +license = "MIT OR Apache-2.0" +description = "Main gamercade application" +homepage = "https://gamercade.io" +repository = "https://github.com/gamercade-io/gamercade_app" + +[[bin]] +name = "app" +path = "src/main.rs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +gamercade_interface = { path = "../gamercade_interface" } + +rfd = "0.11.3" +radix_fmt = "1.0.0" +bytemuck = "1.15.0" + +tokio = { version = "1.28.1", features = ["full"] } +tokio-stream = "0.1.14" +tonic = "0.10.2" +reqwest = "0.12.3" + +eframe = "0.27.2" +egui_extras = {version = "0.27.2", features = ["all_loaders"] } +rusqlite = { version = "0.30.0", features = ["bundled"] } +hashbrown = "0.14.3" +nohash-hasher = "0.2.0" \ No newline at end of file diff --git a/gamercade_app/README.md b/gamercade_app/README.md new file mode 100644 index 00000000..40c2f3d2 --- /dev/null +++ b/gamercade_app/README.md @@ -0,0 +1,18 @@ +# Gamercade App + +Primary client application for interacting with the Gamercade Platform. + +## License + +Licensed under either of + + * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +#### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in the work by you, as defined in the Apache-2.0 license, shall be +dual licensed as above, without any additional terms or conditions. diff --git a/gamercade_app/default-logo.png b/gamercade_app/default-logo.png new file mode 100644 index 00000000..9cd8566c Binary files /dev/null and b/gamercade_app/default-logo.png differ diff --git a/gamercade_app/src/app.rs b/gamercade_app/src/app.rs new file mode 100644 index 00000000..edb4ff2d --- /dev/null +++ b/gamercade_app/src/app.rs @@ -0,0 +1,207 @@ +use eframe::egui::{self, Ui}; +use gamercade_interface::{platform::FrontPageRequest, CRC}; + +use crate::{ + local_directory::LocalDirectory, + modes::{AppMode, ArcadeModeView, LibraryModeView, SettingsModeView}, + task_manager::{ + AuthState, GameResponse, HttpResponse, PlatformRequest, PlatformResponse, SuperTaskManager, + TaskNotification, + }, +}; + +#[derive(Default)] +pub struct App { + directory: LocalDirectory, + + tasks: SuperTaskManager, + auth_state: AuthState, + + active_mode: AppMode, + modes: Modes, +} + +#[derive(Default)] +pub struct Modes { + pub arcade: ArcadeModeView, + pub library: LibraryModeView, + pub settings: SettingsModeView, +} + +pub struct AppDrawContext<'a> { + pub ui: &'a mut Ui, + pub task_manager: &'a mut SuperTaskManager, + pub directory: &'a mut LocalDirectory, + pub auth_state: &'a AuthState, +} + +impl eframe::App for App { + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + self.handle_notifications(); + + self.directory.sync_games_cache(); + + egui::CentralPanel::default().show(ctx, |ui| { + ui.horizontal(|ui| { + ui.selectable_value(&mut self.active_mode, AppMode::Arcade, "Arcade"); + ui.selectable_value(&mut self.active_mode, AppMode::Library, "Library"); + ui.selectable_value(&mut self.active_mode, AppMode::Settings, "Settings"); + }); + + ui.separator(); + + let context = &mut AppDrawContext { + ui, + task_manager: &mut self.tasks, + directory: &mut self.directory, + auth_state: &self.auth_state, + }; + + match self.active_mode { + AppMode::Arcade => self.modes.arcade.draw(context), + AppMode::Library => self.modes.library.draw(context), + AppMode::Settings => self.modes.settings.draw(context), + } + }); + } +} + +impl App { + fn handle_notifications(&mut self) { + while let Ok(notification) = self.tasks.events.try_recv() { + match notification { + TaskNotification::GlobalTags(tags) => { + self.directory.upsert_tags(&tags, true); + } + TaskNotification::GlobalPermissionLevels(permissions) => { + self.directory.upsert_permission_levesl(&permissions, true); + } + TaskNotification::AuthStateChanged(new_state) => { + self.auth_state = new_state; + + self.modes.arcade.login.waiting = false; + + match &self.auth_state { + AuthState::Unauthorized => self.modes.arcade.logged_out(), + AuthState::SessionHeld(session) => { + self.modes.arcade.logged_in(); + self.tasks + .platform + .send(PlatformRequest::FrontPage(FrontPageRequest {})); + self.tasks + .platform + .send(PlatformRequest::VotedGames(session.clone())); + self.tasks + .platform + .send(PlatformRequest::EditableGames(session.clone())); + } + } + } + TaskNotification::LoginFailed => { + self.modes.arcade.login.waiting = false; + self.modes.arcade.logged_out(); + } + TaskNotification::PlatformResponse(response) => { + self.handle_platform_response(response) + } + TaskNotification::GameResponse(response) => self.handle_game_response(response), + TaskNotification::HttpResponse(response) => self.handle_http_response(response), + } + } + } + + fn handle_game_response(&mut self, response: GameResponse) { + let mut update = None; + match response { + GameResponse::CreateGame(result) => { + self.modes + .arcade + .online + .dashboard + .new_game_view + .awaiting_game = false; + + self.modes.arcade.online.dashboard.main_view(); + + match result { + Ok(game_info) => update = Some(game_info), + Err(e) => println!("Create Game Error: {e}"), + } + } + GameResponse::UpdateGame(result) => { + self.modes + .arcade + .online + .dashboard + .new_game_view + .awaiting_game = false; + + self.modes.arcade.online.dashboard.main_view(); + + match result { + Ok(game_info) => update = Some(game_info), + Err(e) => println!("Update Game Error: {e}"), + } + } + } + + if let Some(game_info) = update { + self.directory.update_game(game_info); + self.tasks.platform.send(PlatformRequest::EditableGames( + self.auth_state.get_session().unwrap(), + )) + } + } + + fn handle_platform_response(&mut self, response: PlatformResponse) { + match response { + PlatformResponse::FrontPage(mut front_page_response) => { + self.modes.arcade.online.arcade.front_page = Some(front_page_response.clone()); + front_page_response + .games + .drain(..) + .for_each(|game| self.directory.update_game(game)) + } + + PlatformResponse::EditableGames(editable_games_response) => self + .directory + .handle_editable_games_response(editable_games_response), + + PlatformResponse::VotedGames(voted_games_response) => self + .directory + .handle_voted_games_response(voted_games_response), + + PlatformResponse::Search(mut search_response) => search_response + .games_info + .drain(..) + .for_each(|game| self.directory.update_game(game)), + } + } + + fn handle_http_response(&mut self, response: HttpResponse) { + match response { + HttpResponse::DownloadComplete(complete) => { + let checksum = CRC.checksum(&complete.data); + let len = complete.data.len(); + self.directory + .update_game_rom(complete.game_id, checksum as i64, len as i32); + } + HttpResponse::Upload(result) => { + self.modes + .arcade + .online + .dashboard + .manage_game_view + .awaiting_request = false; + + self.modes.arcade.online.dashboard.main_view(); + + // TODO: Could add the game to the local directory + + if let Err(e) = result { + println!("Upload error {e}") + } + } + } + } +} diff --git a/gamercade_app/src/chat/chat_client.rs b/gamercade_app/src/chat/chat_client.rs new file mode 100644 index 00000000..77a3e237 --- /dev/null +++ b/gamercade_app/src/chat/chat_client.rs @@ -0,0 +1,66 @@ +use gamercade_interface::chat::{ChatChannel, ClientChatMessage}; + +use super::{ + chat_thread::{self, ChatThreadChannels}, + ChatRequestError, ReceivedChatMessage, +}; + +pub struct ChatClient { + channels: ChatThreadChannels, +} + +impl ChatClient { + /// Initializes a chat client with only the + /// global chat subscription + pub fn new() -> Self { + Self { + channels: chat_thread::spawn(), + } + } + + pub fn send_chat_message( + &self, + chat_channel: ChatChannel, + message: &str, + ) -> Result<(), ChatRequestError> { + self.channels + .outbox + .try_send(ClientChatMessage { + channel: Some(chat_channel), + message_text: message.into(), + }) + .map_err(|e| match e { + tokio::sync::mpsc::error::TrySendError::Full(_) => { + ChatRequestError::TooManyRequests + } + tokio::sync::mpsc::error::TrySendError::Closed(_) => { + ChatRequestError::ChannelClosed + } + }) + } + + pub fn subscribe_chat_channel( + &self, + chat_channel: ChatChannel, + ) -> Result<(), ChatRequestError> { + self.channels + .pending_subscriptions + .try_send(chat_channel) + .map_err(|e| match e { + tokio::sync::mpsc::error::TrySendError::Full(_) => { + ChatRequestError::TooManyRequests + } + tokio::sync::mpsc::error::TrySendError::Closed(_) => { + ChatRequestError::ChannelClosed + } + }) + } + + pub fn get_new_messages(&mut self) -> Vec { + let mut out = Vec::new(); + while let Ok(msg) = self.channels.incoming_messages_receiver.try_recv() { + out.push(msg) + } + out + } +} diff --git a/gamercade_app/src/chat/chat_thread.rs b/gamercade_app/src/chat/chat_thread.rs new file mode 100644 index 00000000..b637b159 --- /dev/null +++ b/gamercade_app/src/chat/chat_thread.rs @@ -0,0 +1,78 @@ +use tokio::{select, sync::mpsc}; + +use gamercade_interface::chat::{ + chat_channel::Channel, chat_service_client::ChatServiceClient, ChatChannel, ClientChatMessage, +}; +use gamercade_interface::common::Empty; +use tokio_stream::StreamExt; + +use crate::{chat::ReceivedChatMessage, ips::CHAT_IP}; + +pub struct ChatThreadChannels { + pub outbox: mpsc::Sender, + pub pending_subscriptions: mpsc::Sender, + pub incoming_messages_receiver: mpsc::UnboundedReceiver, +} + +pub fn spawn() -> ChatThreadChannels { + let (outbox, mut outbox_receiver) = mpsc::channel(super::MAX_CONCURRENT_MESSAGES); + let (pending_subscriptions, mut pending_subscriptions_receiver) = + mpsc::channel(super::MAX_CONCURRENT_MESSAGES); + let (incoming_messages, incoming_messages_receiver) = mpsc::unbounded_channel(); + + // Subscribe to global chat + pending_subscriptions + .try_send(ChatChannel { + channel: Some(Channel::Global(Empty {})), + }) + .unwrap(); + + tokio::spawn(async move { + // Initialize the chat client + let Ok(mut client) = ChatServiceClient::connect(CHAT_IP).await else { + //TODO: Add retry mechanism or atomic bool for connection status? + println!("Failed to connect to chat service!"); + return; + }; + + loop { + select! { + + out = outbox_receiver.recv() => { + if let Some(out) = out { + if let Err(e) = client.send_chat_message(out).await { + println!("{}", e) + } + } + }, + + sub = pending_subscriptions_receiver.recv() => { + if let Some(sub) = sub { + let channel_name = sub.clone(); + match client.subscribe_chat_channel(sub).await { + Ok(new_channel) => { + let mut new_channel = new_channel.into_inner(); + let sender = incoming_messages.clone(); + tokio::spawn(async move { + while let Some(Ok(message)) = new_channel.next().await { + let channel_name = channel_name.clone(); + let _ = sender.send(ReceivedChatMessage { message, channel: channel_name }); + } + }); + }, + Err(e) => { + println!("{}", e); + } + } + } + } + } + } + }); + + ChatThreadChannels { + outbox, + pending_subscriptions, + incoming_messages_receiver, + } +} diff --git a/gamercade_app/src/chat/mod.rs b/gamercade_app/src/chat/mod.rs new file mode 100644 index 00000000..cad8c031 --- /dev/null +++ b/gamercade_app/src/chat/mod.rs @@ -0,0 +1,18 @@ +mod chat_client; +mod chat_thread; + +pub use chat_client::ChatClient; +use gamercade_interface::chat::{ChatChannel, ServerChatMessage}; + +pub const MAX_CONCURRENT_MESSAGES: usize = 8; + +pub struct ReceivedChatMessage { + pub message: ServerChatMessage, + pub channel: ChatChannel, +} + +#[derive(Debug)] +pub enum ChatRequestError { + TooManyRequests, + ChannelClosed, +} diff --git a/gamercade_app/src/local_directory/game.rs b/gamercade_app/src/local_directory/game.rs new file mode 100644 index 00000000..ab2ac160 --- /dev/null +++ b/gamercade_app/src/local_directory/game.rs @@ -0,0 +1,135 @@ +use gamercade_interface::game::GameInfoBasic; +use nohash_hasher::IsEnabled; +use rusqlite::{types::FromSql, Connection}; + +use super::LocalDirectory; + +#[derive(Eq, PartialEq, Debug, Default)] +pub struct GameId(pub i64); + +impl std::hash::Hash for GameId { + fn hash(&self, hasher: &mut H) { + hasher.write_i64(self.0) + } +} + +impl IsEnabled for GameId {} + +impl FromSql for GameId { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + value.as_i64().map(Self) + } +} + +pub struct Game { + pub id: i64, + pub title: String, + pub short_description: String, + pub long_description: Option, + pub tags: Vec, + pub rating: f32, + pub file_checksum: Option, + pub rom_size: Option, +} + +const UPSERT_GAMES_QUERIES: &str = " +CREATE TABLE IF NOT EXISTS games ( + id INTEGER PRIMARY KEY, + title TEXT NOT NULL, + short_description TEXT NOT NULL, + long_description TEXT, + tags BLOB, + rating REAL, + file_checksum INTEGER, + rom_size INTEGER, + UNIQUE(title) +) STRICT; +"; + +pub(super) fn upsert_games_table(db: &Connection) { + db.execute_batch(UPSERT_GAMES_QUERIES).unwrap(); +} + +impl LocalDirectory { + pub fn update_game(&mut self, game: GameInfoBasic) { + let tag_bytes = game + .tags + .into_iter() + .map(|tag| u8::try_from(tag).unwrap()) + .collect::>(); + + self.db.execute("INSERT OR REPLACE INTO games (id, title, short_description, file_checksum, rom_size, rating, tags) + VALUES (?, ?, ?, ?, ?, ?, ?);", + (game.game_id, game.title, game.short_description, game.checksum, game.rom_size, game.average_rating, tag_bytes)).unwrap(); + + self.cache_dirty = true; + } + + pub fn update_game_rom(&mut self, game_id: i64, checksum: i64, rom_size: i32) { + self.db + .execute( + "UPDATE games SET file_checksum = ?, rom_size = ? WHERE id = ?;", + (checksum, rom_size, game_id), + ) + .unwrap(); + + self.cache_dirty = true; + } + + pub fn iter_games(&self) -> GameIter<'_> { + GameIter::new(&self.cached_games) + } + + pub fn sync_games_cache(&mut self) { + if !self.cache_dirty { + return; + } + + let mut query = self.db.prepare("SELECT * FROM games;").unwrap(); + + self.cached_games = query + .query_map((), |row| { + let tag_bytes: Vec = row.get(4)?; + let tags = tag_bytes + .chunks_exact(4) + .map(|num| *bytemuck::from_bytes(num)) + .collect::>(); + Ok(Game { + id: row.get(0)?, + title: row.get(1)?, + short_description: row.get(2)?, + long_description: row.get(3)?, + tags, + rating: row.get(5)?, + file_checksum: row.get(6)?, + rom_size: row.get(7)?, + }) + }) + .unwrap() + .flatten() + .collect(); + + self.cache_dirty = false; + } +} + +pub struct GameIter<'a> { + vec: &'a Vec, + index: usize, +} + +impl<'a> Iterator for GameIter<'a> { + type Item = &'a Game; + + fn next(&mut self) -> Option { + let out = self.vec.get(self.index); + self.index += 1; + out + } +} + +impl<'a> GameIter<'a> { + fn new(vec: &'a Vec) -> Self { + Self { vec, index: 0 } + } +} diff --git a/gamercade_app/src/local_directory/game_footprint.rs b/gamercade_app/src/local_directory/game_footprint.rs new file mode 100644 index 00000000..6894430c --- /dev/null +++ b/gamercade_app/src/local_directory/game_footprint.rs @@ -0,0 +1,96 @@ +use gamercade_interface::platform::{EditableGamesResponse, VotedGamesResponse}; +use rusqlite::types::FromSql; + +use super::{game::GameId, Dictionary, DictionaryTrait, LocalDirectory}; + +#[derive(Default, Debug)] +pub struct GameFootprint { + pub permission_level: Option, + pub vote: Option, +} + +#[derive(Debug)] +pub enum Vote { + Up, + Down, +} + +impl FromSql for Vote { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + value.as_i64().map(|num| match num { + 0 => Vote::Down, + 1 => Vote::Up, + _ => unreachable!(), + }) + } +} + +impl From<&rusqlite::Row<'_>> for GameFootprint { + fn from(value: &rusqlite::Row<'_>) -> Self { + let permission_level = value.get(1).unwrap(); + let vote: Option = value.get(2).unwrap(); + + Self { + permission_level, + vote, + } + } +} + +impl DictionaryTrait for Dictionary { + fn fetch_all_query() -> &'static str { + "SELECT * FROM game_footprint" + } + + fn upsert_table_query() -> &'static str { + "CREATE TABLE IF NOT EXISTS game_footprint(game_id INTEGER PRIMARY KEY, permission_level INTEGER, vote INTEGER) STRICT;" + } + + fn drop_table_query() -> &'static str { + "DROP TABLE IF EXISTS game_footprint" + } + + fn insert_query() -> &'static str { + "INSERT INTO game_footprint(game_id, permission_level, vote) VALUES (?, ?, ?)" + } + + fn insert_statement( + statement: &mut rusqlite::Statement, + (key, value): &(GameId, GameFootprint), + ) { + let vote = value.vote.as_ref().map(|vote| match vote { + Vote::Up => 1, + Vote::Down => 0, + }); + statement + .execute((key.0 as i32, value.permission_level, vote)) + .unwrap(); + } +} + +impl LocalDirectory { + pub fn handle_voted_games_response(&mut self, response: VotedGamesResponse) { + let query = "INSERT OR REPLACE INTO game_footprint(game_id, vote) VALUES (?, ?);"; + + for game in response.voted_games { + self.db + .execute(query, (game.game_id, game.vote_value as i32)) + .unwrap(); + } + + self.game_footprint.sync(&self.db); + } + + pub fn handle_editable_games_response(&mut self, response: EditableGamesResponse) { + let query = + "INSERT OR REPLACE INTO game_footprint(game_id, permission_level) VALUES (?, ?)"; + + for game in response.editable_games { + self.db + .execute(query, (game.game_id, game.permission_level)) + .unwrap(); + } + + self.game_footprint.sync(&self.db); + } +} diff --git a/gamercade_app/src/local_directory/mod.rs b/gamercade_app/src/local_directory/mod.rs new file mode 100644 index 00000000..53bcdb1c --- /dev/null +++ b/gamercade_app/src/local_directory/mod.rs @@ -0,0 +1,178 @@ +use std::hash::{BuildHasher, BuildHasherDefault, Hash}; + +use nohash_hasher::{IntMap, NoHashHasher}; +use rusqlite::{types::FromSql, Connection, Row, Statement}; + +mod game; +mod game_footprint; +mod permission_level; +mod tag; +mod user; + +pub use game::{Game, GameId}; +pub use permission_level::{PermissionLevel, PermissionLevelId}; +pub use tag::{Tag, TagId}; +pub use user::{User, UserId}; + +use self::{game::upsert_games_table, game_footprint::GameFootprint}; + +const LOCAL_DB_PATH: &str = "./local.db"; + +type TagDictionary = Dictionary; +type UserDictionary = Dictionary; +type PermissionLevelDictionary = Dictionary; +type GameFootprintDictionary = Dictionary; + +pub struct LocalDirectory { + db: Connection, + pub cached_games: Vec, + cache_dirty: bool, + pub tags: TagDictionary, + pub users: UserDictionary, + pub permission_levels: PermissionLevelDictionary, + // TODO: Add Images + pub game_footprint: GameFootprintDictionary, +} + +#[derive(Default)] +pub struct Dictionary { + map: IntMap, +} + +impl LocalDirectory { + pub fn upsert_tags(&mut self, tags: &[(TagId, Tag)], clear_db: bool) { + if clear_db { + self.db + .execute(TagDictionary::drop_table_query(), ()) + .unwrap(); + self.db + .execute(TagDictionary::upsert_table_query(), ()) + .unwrap(); + } + self.tags.bulk_insert(&mut self.db, tags); + self.tags.sync(&self.db); + } + + pub fn upsert_permission_levesl( + &mut self, + permission_levels: &[(PermissionLevelId, PermissionLevel)], + clear_db: bool, + ) { + if clear_db { + self.db + .execute(PermissionLevelDictionary::drop_table_query(), ()) + .unwrap(); + self.db + .execute(PermissionLevelDictionary::upsert_table_query(), ()) + .unwrap(); + } + self.permission_levels + .bulk_insert(&mut self.db, permission_levels); + self.permission_levels.sync(&self.db); + } + + pub fn upsert_users(&mut self, users: &[(UserId, User)], clear_db: bool) { + if clear_db { + self.db + .execute(UserDictionary::drop_table_query(), ()) + .unwrap(); + self.db + .execute(UserDictionary::upsert_table_query(), ()) + .unwrap(); + } + + self.users.bulk_insert(&mut self.db, users); + self.users.sync(&self.db); + } +} + +trait DictionaryTrait { + fn new(db: &Connection) -> Self + where + Self: Sized + Default + IsDictionary, + K: Hash + Eq + FromSql, + V: for<'a> From<&'a Row<'a>>, + BuildHasherDefault>: BuildHasher, + { + let mut output = Self::default(); + + output.sync(db); + + output + } + + fn sync(&mut self, db: &Connection) + where + Self: IsDictionary, + K: Hash + Eq + FromSql, + V: for<'a> From<&'a Row<'a>>, + BuildHasherDefault>: BuildHasher, + { + self.get_map_mut().clear(); + + db.execute(Self::upsert_table_query(), ()).unwrap(); + + let mut query = db.prepare(Self::fetch_all_query()).unwrap(); + let mut results = query.query([]).unwrap(); + + while let Ok(Some(row)) = results.next() { + let key = row.get(0).unwrap(); + let value = V::from(row); + self.get_map_mut().insert(key, value); + } + } + + fn bulk_insert(&self, db: &mut rusqlite::Connection, values: &[(K, V)]) { + let mut tx = db.transaction().unwrap(); + tx.set_drop_behavior(rusqlite::DropBehavior::Commit); + + let mut statement = tx.prepare(Self::insert_query()).unwrap(); + + for kv in values.iter() { + Self::insert_statement(&mut statement, kv); + } + } + + fn fetch_all_query() -> &'static str; + fn upsert_table_query() -> &'static str; + fn drop_table_query() -> &'static str; + fn insert_query() -> &'static str; + fn insert_statement(statement: &mut Statement, kv: &(K, V)); +} + +pub trait IsDictionary { + fn get_map(&self) -> &IntMap; + fn get_map_mut(&mut self) -> &mut IntMap; +} + +impl IsDictionary for Dictionary { + fn get_map_mut(&mut self) -> &mut IntMap { + &mut self.map + } + + fn get_map(&self) -> &IntMap { + &self.map + } +} + +impl Default for LocalDirectory { + fn default() -> Self { + let db = Connection::open(LOCAL_DB_PATH).unwrap(); + + let mut output = Self { + tags: TagDictionary::new(&db), + users: UserDictionary::new(&db), + permission_levels: PermissionLevelDictionary::new(&db), + game_footprint: GameFootprintDictionary::new(&db), + db, + cached_games: Vec::new(), + cache_dirty: true, + }; + + upsert_games_table(&output.db); + + output.sync_games_cache(); + + output + } +} diff --git a/gamercade_app/src/local_directory/permission_level.rs b/gamercade_app/src/local_directory/permission_level.rs new file mode 100644 index 00000000..7a626c0c --- /dev/null +++ b/gamercade_app/src/local_directory/permission_level.rs @@ -0,0 +1,61 @@ +use nohash_hasher::IsEnabled; +use rusqlite::types::FromSql; + +use super::{Dictionary, DictionaryTrait}; + +#[derive(Eq, PartialEq, Debug, Default)] +pub struct PermissionLevelId(pub i32); + +impl std::hash::Hash for PermissionLevelId { + fn hash(&self, hasher: &mut H) { + hasher.write_i32(self.0) + } +} + +impl IsEnabled for PermissionLevelId {} + +#[derive(Default, Debug)] +pub struct PermissionLevel { + pub name: String, +} + +impl From<&rusqlite::Row<'_>> for PermissionLevel { + fn from(value: &rusqlite::Row<'_>) -> Self { + Self { + name: value.get_unwrap(1), + } + } +} + +impl FromSql for PermissionLevelId { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + value.as_i64().map(|num| Self(num as i32)) + } +} + +impl DictionaryTrait + for Dictionary +{ + fn fetch_all_query() -> &'static str { + "SELECT * FROM permission_levels;" + } + + fn upsert_table_query() -> &'static str { + "CREATE TABLE IF NOT EXISTS permission_levels(id INTEGER PRIMARY KEY, level_name TEXT NOT NULL) STRICT;" + } + + fn drop_table_query() -> &'static str { + "DROP TABLE IF EXISTS permission_levels;" + } + + fn insert_query() -> &'static str { + "INSERT INTO permission_levels(id, level_name) VALUES (?, ?)" + } + + fn insert_statement( + statement: &mut rusqlite::Statement, + (key, value): &(PermissionLevelId, PermissionLevel), + ) { + statement.execute((key.0, value.name.clone())).unwrap(); + } +} diff --git a/gamercade_app/src/local_directory/tag.rs b/gamercade_app/src/local_directory/tag.rs new file mode 100644 index 00000000..bbf37c04 --- /dev/null +++ b/gamercade_app/src/local_directory/tag.rs @@ -0,0 +1,52 @@ +use nohash_hasher::IsEnabled; +use rusqlite::types::FromSql; + +use super::{Dictionary, DictionaryTrait}; + +#[derive(Eq, PartialEq, Debug, Default)] +pub struct TagId(pub i32); + +#[derive(Default, Debug)] +pub struct Tag(pub String); + +impl IsEnabled for TagId {} + +impl std::hash::Hash for TagId { + fn hash(&self, hasher: &mut H) { + hasher.write_i32(self.0) + } +} + +impl From<&rusqlite::Row<'_>> for Tag { + fn from(value: &rusqlite::Row<'_>) -> Self { + Self(value.get_unwrap(1)) + } +} + +impl FromSql for TagId { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + value.as_i64().map(|num| Self(num as i32)) + } +} + +impl DictionaryTrait for Dictionary { + fn fetch_all_query() -> &'static str { + "SELECT * FROM tags" + } + + fn upsert_table_query() -> &'static str { + "CREATE TABLE IF NOT EXISTS tags(id INTEGER PRIMARY KEY, tag_name TEXT NOT NULL) STRICT;" + } + + fn drop_table_query() -> &'static str { + "DROP TABLE IF EXISTS tags" + } + + fn insert_query() -> &'static str { + "INSERT INTO tags(id, tag_name) VALUES (?, ?)" + } + + fn insert_statement(statement: &mut rusqlite::Statement, (key, value): &(TagId, Tag)) { + statement.execute((key.0, value.0.clone())).unwrap(); + } +} diff --git a/gamercade_app/src/local_directory/user.rs b/gamercade_app/src/local_directory/user.rs new file mode 100644 index 00000000..4bf118c8 --- /dev/null +++ b/gamercade_app/src/local_directory/user.rs @@ -0,0 +1,72 @@ +use nohash_hasher::IsEnabled; +use rusqlite::{types::FromSql, ToSql}; + +use super::{Dictionary, DictionaryTrait}; + +#[derive(Eq, PartialEq, Debug, Default)] +pub struct UserId(pub i64); + +impl std::hash::Hash for UserId { + fn hash(&self, hasher: &mut H) { + hasher.write_i64(self.0) + } +} + +impl IsEnabled for UserId {} + +#[derive(Default, Debug)] +pub struct User { + pub id: u64, + pub username: String, + pub avatar_last_updated: Option, +} + +impl From<&rusqlite::Row<'_>> for User { + fn from(value: &rusqlite::Row<'_>) -> Self { + Self { + id: value.get::(0).unwrap() as u64, + username: value.get(1).unwrap(), + avatar_last_updated: value.get(2).unwrap(), + } + } +} + +impl FromSql for UserId { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + value.as_i64().map(Self) + } +} + +impl ToSql for User { + fn to_sql(&self) -> rusqlite::Result> { + todo!() + } +} + +impl DictionaryTrait for Dictionary { + fn fetch_all_query() -> &'static str { + "SELECT * FROM users" + } + + fn upsert_table_query() -> &'static str { + "CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, username TEXT NOT NULL, avatar_last_updated INTEGER) STRICT;" + } + + fn drop_table_query() -> &'static str { + "DROP TABLE IF EXISTS users" + } + + fn insert_query() -> &'static str { + "INSERT INTO permission_levels(id, username, avarar_last_updated) VALUES (?, ?)" + } + + fn insert_statement(statement: &mut rusqlite::Statement, (key, user): &(UserId, User)) { + statement + .execute(( + key.0 as i32, + user.username.clone(), + user.avatar_last_updated, + )) + .unwrap(); + } +} diff --git a/gamercade_app/src/main.rs b/gamercade_app/src/main.rs new file mode 100644 index 00000000..c7994c36 --- /dev/null +++ b/gamercade_app/src/main.rs @@ -0,0 +1,37 @@ +use eframe::egui::{self, ViewportBuilder}; + +mod app; +mod local_directory; +mod modes; +mod task_manager; +mod urls; + +pub const GAME_DIR: &str = "./roms"; +pub const IMAGE_DIR: &str = "./images"; + +pub fn game_rom_path(game_id: i64) -> String { + format!("{GAME_DIR}/{game_id:x}.gcrom") +} + +pub fn game_image_path(game_id: i64) -> String { + format!("{GAME_DIR}/{game_id:x}.png") +} + +#[tokio::main] +async fn main() -> Result<(), eframe::Error> { + let viewport = ViewportBuilder::default().with_inner_size(egui::vec2(1280.0, 720.0)); + + let options = eframe::NativeOptions { + viewport, + ..Default::default() + }; + + eframe::run_native( + "Gamercade Platform", + options, + Box::new(|cc| { + egui_extras::install_image_loaders(&cc.egui_ctx); + Box::::default() + }), + ) +} diff --git a/gamercade_app/src/modes/arcade_mode/creator_dashboard.rs b/gamercade_app/src/modes/arcade_mode/creator_dashboard.rs new file mode 100644 index 00000000..9308aacd --- /dev/null +++ b/gamercade_app/src/modes/arcade_mode/creator_dashboard.rs @@ -0,0 +1,121 @@ +use eframe::egui; +use gamercade_interface::PERMISSION_LEVEL_EDITOR; + +use crate::{ + app::AppDrawContext, + local_directory::{GameId, IsDictionary}, +}; + +use super::{manage_game::ManageGameView, new_game::NewGameView}; + +#[derive(Default)] +pub struct CreatorDashboardView { + view: DashboardView, + pub new_game_view: NewGameView, + pub manage_game_view: ManageGameView, +} + +#[derive(Default)] +enum DashboardView { + #[default] + Main, + NewGameView, + ManageGameView, +} + +impl CreatorDashboardView { + pub fn main_view(&mut self) { + self.view = DashboardView::Main + } + + pub fn draw(&mut self, context: &mut AppDrawContext) { + let enabled = context.auth_state.get_session().is_some(); + + context.ui.set_enabled(enabled); + + context.ui.label("Creator Dashboard"); + + match self.view { + DashboardView::Main => { + self.draw_main_view(context); + } + DashboardView::NewGameView => { + if self.new_game_view.draw(context) { + self.view = DashboardView::Main + } + } + DashboardView::ManageGameView => { + if self.manage_game_view.draw(context) { + self.view = DashboardView::Main + } + } + } + } + + fn draw_main_view(&mut self, context: &mut AppDrawContext) { + let ui = &mut context.ui; + + // TODO: Add Images + // TODO: Add Tags + egui::Grid::new("editable_grid") + .num_columns(5) + .spacing([40.0, 4.0]) + .striped(true) + .show(ui, |ui| { + ui.label("Editable Games:"); + ui.end_row(); + + ui.label("Title"); + ui.label("Rom Details"); + ui.label("Short Description"); + ui.label("Long Description"); + ui.label("Manage"); + ui.end_row(); + + // Only iterate games which we are able to edit + for game in context.directory.iter_games().filter(|game| { + context + .directory + .game_footprint + .get_map() + .get(&GameId(game.id)) + .map(|game| { + if let Some(level) = game.permission_level { + level <= PERMISSION_LEVEL_EDITOR + } else { + false + } + }) + .unwrap_or_default() + }) { + ui.label(&game.title); + + let rom_exists = + if let (Some(_), Some(size)) = (game.file_checksum, game.rom_size) { + let size = size as f32 / (1024.0 * 1024.0); + format!("{size}mb") + } else { + "N/A".to_string() + }; + ui.label(rom_exists); + + ui.label(&game.short_description); + + ui.label(game.long_description.as_ref().unwrap_or(&String::default())); + + if ui.button("Manage Game").clicked() { + self.manage_game_view = ManageGameView::new(game); + self.view = DashboardView::ManageGameView; + } + + ui.end_row(); + } + }); + + ui.separator(); + if ui.button("Create New Game").clicked() { + self.view = DashboardView::NewGameView; + self.new_game_view.reset(); + } + } +} diff --git a/gamercade_app/src/modes/arcade_mode/login.rs b/gamercade_app/src/modes/arcade_mode/login.rs new file mode 100644 index 00000000..c76e43ac --- /dev/null +++ b/gamercade_app/src/modes/arcade_mode/login.rs @@ -0,0 +1,71 @@ +use eframe::egui::TextEdit; + +use crate::app::AppDrawContext; + +use super::ArcadeActiveView; + +#[derive(Default)] +pub struct LoginView { + provider: String, + provider_kind: Provider, + password: String, + pub waiting: bool, +} + +#[derive(Default, PartialEq, Eq)] +enum Provider { + #[default] + Username, + Email, +} + +impl LoginView { + pub fn draw(&mut self, context: &mut AppDrawContext) -> Option { + let AppDrawContext { + ui, task_manager, .. + } = context; + + ui.set_enabled(!self.waiting); + + ui.horizontal(|ui| { + ui.selectable_value(&mut self.provider_kind, Provider::Username, "Username"); + ui.separator(); + ui.selectable_value(&mut self.provider_kind, Provider::Email, "Email"); + }); + + ui.horizontal(|ui| { + let text = match self.provider_kind { + Provider::Username => "Username: ", + Provider::Email => "Email: ", + }; + ui.label(text); + ui.text_edit_singleline(&mut self.provider); + }); + + ui.horizontal(|ui| { + ui.label("Password: "); + let pw_entry = TextEdit::singleline(&mut self.password).password(true); + ui.add(pw_entry); + }); + + if ui.button("Login").clicked() { + // TODO: Support email login too + task_manager.auth.try_login(&self.provider, &self.password); + self.waiting = true; + } + + ui.separator(); + + if ui.button("Sign Up").clicked() { + return Some(ArcadeActiveView::sign_up()); + } + + if self.waiting { + ui.spinner(); + } + + ui.set_enabled(true); + + None + } +} diff --git a/gamercade_app/src/modes/arcade_mode/manage_game.rs b/gamercade_app/src/modes/arcade_mode/manage_game.rs new file mode 100644 index 00000000..0b75cd6e --- /dev/null +++ b/gamercade_app/src/modes/arcade_mode/manage_game.rs @@ -0,0 +1,106 @@ +use gamercade_interface::game::UpdateGameRequest; +use rfd::FileDialog; + +use crate::{ + app::AppDrawContext, + local_directory::Game, + task_manager::{GameRequest, UploadRom}, + urls::WithSession, +}; + +#[derive(Default)] +pub struct ManageGameView { + pub awaiting_request: bool, + game_id: i64, + title: String, + short_description: String, + long_description: String, + tags: Vec, +} + +impl ManageGameView { + pub fn new(game: &Game) -> Self { + Self { + awaiting_request: false, + game_id: game.id, + title: game.title.clone(), + short_description: game.short_description.clone(), + long_description: game.long_description.as_ref().cloned().unwrap_or_default(), + tags: game.tags.clone(), + } + } + + pub fn draw(&mut self, context: &mut AppDrawContext) -> bool { + let mut done = false; + let ui = &mut context.ui; + + ui.set_enabled(!self.awaiting_request); + + ui.label("Manage Game View:"); + ui.separator(); + + ui.label("Game Title: "); + ui.text_edit_singleline(&mut self.title); + ui.separator(); + + ui.label("Short Description: "); + ui.text_edit_singleline(&mut self.short_description); + + ui.label("Long Description: "); + ui.text_edit_singleline(&mut self.long_description); + ui.separator(); + + ui.horizontal(|ui| { + if ui.button("Upload ROM").clicked() { + if let Some(file) = FileDialog::new() + .add_filter("gcrom (.gcrom)", &["gcrom"]) + .pick_file() + { + let bytes = std::fs::read(file).unwrap(); + + context.task_manager.http.try_upload_rom( + UploadRom { + game_id: self.game_id, + bytes, + }, + &context.auth_state.get_session().unwrap(), + ); + + self.awaiting_request = true; + } + } + + if ui.button("Update Game").clicked() { + context + .task_manager + .game + .send(GameRequest::UpdateGame(WithSession::new( + &context.auth_state.get_session().unwrap(), + UpdateGameRequest { + game_id: Some(self.game_id), + title: Some(self.title.clone()), + short_description: Some(self.short_description.clone()), + long_description: Some(self.long_description.clone()), + }, + ))); + + self.awaiting_request = true; + } + }); + + ui.separator(); + + // TODO: Add delete game (via a "are you sure?" confirmation box) + ui.set_enabled(true); + + if ui.button("Go Back").clicked() { + done = true; + } + + if self.awaiting_request { + ui.spinner(); + } + + done + } +} diff --git a/gamercade_app/src/modes/arcade_mode/mod.rs b/gamercade_app/src/modes/arcade_mode/mod.rs new file mode 100644 index 00000000..8e9d66df --- /dev/null +++ b/gamercade_app/src/modes/arcade_mode/mod.rs @@ -0,0 +1,70 @@ +use crate::app::AppDrawContext; + +mod creator_dashboard; +mod login; +mod manage_game; +mod new_game; +mod online; +mod sign_up; + +use creator_dashboard::*; +use login::*; +use online::*; +use sign_up::*; + +#[derive(Default)] +pub struct ArcadeModeView { + pub active_view: ArcadeActiveView, + + pub login: LoginView, + pub sign_up: SignUpView, + pub online: OnlineView, +} + +impl ArcadeModeView { + pub fn draw(&mut self, context: &mut AppDrawContext) { + context.ui.label("Arcade Mode View"); + + if let Some(next) = match self.active_view { + ArcadeActiveView::Login => self.login.draw(context), + ArcadeActiveView::SignUp => self.sign_up.draw(context), + ArcadeActiveView::Online => self.online.draw(context), + } { + self.active_view = next; + } + } + + pub fn logged_in(&mut self) { + self.active_view = ArcadeActiveView::online_browsing() + } + + pub fn logged_out(&mut self) { + self.active_view = ArcadeActiveView::login() + } +} + +pub enum ArcadeActiveView { + Login, + SignUp, + Online, +} + +impl Default for ArcadeActiveView { + fn default() -> Self { + Self::login() + } +} + +impl ArcadeActiveView { + fn login() -> Self { + Self::Login + } + + fn sign_up() -> Self { + Self::SignUp + } + + fn online_browsing() -> Self { + Self::Online + } +} diff --git a/gamercade_app/src/modes/arcade_mode/new_game.rs b/gamercade_app/src/modes/arcade_mode/new_game.rs new file mode 100644 index 00000000..49888a9d --- /dev/null +++ b/gamercade_app/src/modes/arcade_mode/new_game.rs @@ -0,0 +1,68 @@ +use gamercade_interface::game::UpdateGameRequest; + +use crate::{app::AppDrawContext, task_manager::GameRequest, urls::WithSession}; + +#[derive(Default, Debug)] +pub struct NewGameView { + pub awaiting_game: bool, + title: String, + short_description: String, + long_description: String, +} + +impl NewGameView { + pub fn reset(&mut self) { + *self = Self::default() + } + + pub fn draw(&mut self, context: &mut AppDrawContext) -> bool { + let mut done = false; + let ui = &mut context.ui; + + ui.set_enabled(!self.awaiting_game); + + ui.label("New Game View"); + ui.separator(); + + ui.label("Game Title: "); + ui.text_edit_singleline(&mut self.title); + ui.separator(); + + ui.label("Short Description: "); + ui.text_edit_singleline(&mut self.short_description); + + ui.label("Long Description: "); + ui.text_edit_singleline(&mut self.long_description); + + ui.separator(); + ui.horizontal(|ui| { + if ui.button("Create Game").clicked() { + self.awaiting_game = true; + context + .task_manager + .game + .send(GameRequest::CreateGame(WithSession { + session: context.auth_state.get_session().unwrap(), + data: UpdateGameRequest { + game_id: None, + title: Some(self.title.clone()), + short_description: Some(self.short_description.clone()), + long_description: Some(self.long_description.clone()), + }, + })); + } + + ui.set_enabled(true); + + if ui.button("Go Back").clicked() { + done = true + } + }); + + if self.awaiting_game { + ui.spinner(); + } + + done + } +} diff --git a/gamercade_app/src/modes/arcade_mode/online.rs b/gamercade_app/src/modes/arcade_mode/online.rs new file mode 100644 index 00000000..cce45b3d --- /dev/null +++ b/gamercade_app/src/modes/arcade_mode/online.rs @@ -0,0 +1,125 @@ +use eframe::egui; +use gamercade_interface::platform::FrontPageResponse; + +use crate::app::AppDrawContext; + +use super::{ArcadeActiveView, CreatorDashboardView}; + +#[derive(Default)] +pub struct OnlineView { + active_mode: OnlineViewMode, + + pub arcade: ArcadeView, + pub dashboard: CreatorDashboardView, +} + +#[derive(Default)] +pub struct ArcadeView { + pub front_page: Option, + tab: ArcadeTab, +} + +#[derive(Default, PartialEq)] +enum ArcadeTab { + #[default] + Popular, + TopRated, + New, +} + +impl ArcadeView { + fn draw(&mut self, context: &mut AppDrawContext) { + let ui = &mut context.ui; + if let Some(front_page) = &self.front_page { + ui.horizontal(|ui| { + ui.selectable_value(&mut self.tab, ArcadeTab::Popular, "Popular Games"); + ui.selectable_value(&mut self.tab, ArcadeTab::TopRated, "Top Rated"); + ui.selectable_value(&mut self.tab, ArcadeTab::New, "New Releases"); + }); + + let slice = match self.tab { + ArcadeTab::Popular => &front_page.popular_games_ids, + ArcadeTab::TopRated => &front_page.top_rated_games_ids, + ArcadeTab::New => &front_page.new_games_ids, + }; + + // TODO: Add space for image + egui::Grid::new("arcade_grid") + .num_columns(7) + .spacing([40.0, 4.0]) + .striped(true) + .show(ui, |ui| { + let mut num = 1; + ui.label("#"); + ui.label("Title"); + ui.label("Short Description"); + ui.label("Rating"); + ui.label("Tags"); + ui.label("Size"); + ui.label("Download"); + ui.end_row(); + + for id in slice.iter() { + // TOOD: Optimize this + if let Some(game) = front_page.games.iter().find(|game| game.game_id == *id) + { + ui.label(format!("{num}")); + num += 1; + + ui.label(&game.title); + ui.label(&game.short_description); + ui.label(format!("{}", game.average_rating)); + ui.label("TODO: Tags"); + ui.label(format!( + "{}.mb", + game.rom_size.unwrap_or_default() as f32 / (1024.0 * 1024.0) + )); + + // TODO: Add a list of pending downloads so we dont spam the server + if ui.button("Download").clicked() { + context.task_manager.http.try_download_rom( + game.game_id, + &context.auth_state.get_session().unwrap(), + ) + } + } + } + }); + } else { + ui.spinner(); + }; + } +} + +#[derive(PartialEq, Default)] +pub enum OnlineViewMode { + #[default] + Arcade, + CreatorDashboard, +} + +impl OnlineView { + pub fn draw(&mut self, ctx: &mut AppDrawContext) -> Option { + ctx.ui.label("Online View"); + + ctx.ui.horizontal(|ui| { + ui.selectable_value(&mut self.active_mode, OnlineViewMode::Arcade, "Arcade"); + ui.selectable_value( + &mut self.active_mode, + OnlineViewMode::CreatorDashboard, + "Creator Dashboard", + ); + }); + + match self.active_mode { + OnlineViewMode::Arcade => self.arcade.draw(ctx), + OnlineViewMode::CreatorDashboard => self.dashboard.draw(ctx), + } + + if ctx.ui.button("Back").clicked() { + return Some(ArcadeActiveView::login()); + } + + None + } +} diff --git a/gamercade_app/src/modes/arcade_mode/sign_up.rs b/gamercade_app/src/modes/arcade_mode/sign_up.rs new file mode 100644 index 00000000..f94da06f --- /dev/null +++ b/gamercade_app/src/modes/arcade_mode/sign_up.rs @@ -0,0 +1,83 @@ +use eframe::egui::{Button, TextEdit}; + +use crate::app::AppDrawContext; + +use super::ArcadeActiveView; + +#[derive(Default)] +pub struct SignUpView { + username: String, + password: String, + password_confirm: String, + email: String, + email_confirm: String, +} + +impl SignUpView { + pub fn draw(&mut self, context: &mut AppDrawContext) -> Option { + let AppDrawContext { + ui, task_manager, .. + } = context; + + let mut email_equal = false; + let mut password_equal = false; + + ui.horizontal(|ui| { + ui.label("Username: "); + ui.text_edit_singleline(&mut self.username); + }); + + ui.horizontal(|ui| { + ui.label("Email Address: "); + let email = TextEdit::singleline(&mut self.email); + ui.add(email); + }); + + ui.horizontal(|ui| { + ui.label("Re-Enter Email Address: "); + let email = TextEdit::singleline(&mut self.email_confirm); + ui.add(email); + + if self.email != self.email_confirm { + ui.label("Email doesn't match."); + } else { + email_equal = true; + } + }); + + ui.horizontal(|ui| { + ui.label("Password: "); + let pw_entry = TextEdit::singleline(&mut self.password).password(true); + ui.add(pw_entry); + }); + + ui.horizontal(|ui| { + ui.label("Re-Enter Password: "); + let pw_entry = TextEdit::singleline(&mut self.password_confirm).password(true); + ui.add(pw_entry); + + if self.password != self.password_confirm { + ui.label("Password doesn't match."); + } else { + password_equal = true; + } + }); + + if ui + .add_enabled(email_equal && password_equal, Button::new("Register")) + .clicked() + { + task_manager + .auth + .try_register(&self.username, &self.email, &self.password); + // TODO: Lock the entries while waiting... + // TODO: Show an animation thing... + } + + if ui.button("Cancel").clicked() { + Some(ArcadeActiveView::login()) + } else { + None + } + } +} diff --git a/gamercade_app/src/modes/library_mode/mod.rs b/gamercade_app/src/modes/library_mode/mod.rs new file mode 100644 index 00000000..33617819 --- /dev/null +++ b/gamercade_app/src/modes/library_mode/mod.rs @@ -0,0 +1,102 @@ +use std::process::Command; + +use eframe::egui; + +use crate::{ + app::AppDrawContext, + game_rom_path, + local_directory::{IsDictionary, TagId}, +}; + +#[derive(Default)] +pub struct LibraryModeView {} + +impl LibraryModeView { + pub fn draw(&mut self, context: &mut AppDrawContext) { + let AppDrawContext { ui, directory, .. } = context; + + let tag_directory = directory.tags.get_map(); + + ui.label("Library Mode"); + + let image_source = egui::include_image!("./../../../default-logo.png"); + let image = egui::Image::new(image_source).fit_to_exact_size((100.0, 100.0).into()); + + egui::ScrollArea::vertical().show(ui, |ui| { + egui::Grid::new("game_grid") + .num_columns(6) + .spacing([40.0, 4.0]) + .striped(true) + .show(ui, |ui| { + // Image, Title, Size, Short Description, Tags + ui.label("Game"); + ui.label("Title"); + ui.label("Size (mb)"); + ui.label("Short Description"); + ui.label("Tags"); + ui.end_row(); + + for game in directory.iter_games() { + ui.add(image.clone()); + + ui.label(&game.title); + + let rom_size_text = if let Some(rom_size) = game.rom_size { + let rom_size = rom_size as f32 / (1024.0 * 1024.0); + format!("{rom_size}") + } else { + String::new() + }; + + ui.label(rom_size_text); + + ui.label(&game.short_description); + + let tags = game + .tags + .iter() + .flat_map(|tag| { + tag_directory.get(&TagId(*tag)).map(|tag| tag.0.clone()) + }) + .collect::>() + .join(","); + ui.label(tags); + + if game.file_checksum.is_some() && game.rom_size.is_some() { + if ui.button("Play").clicked() { + println!("Play: {} ({})", game.title, game.id); + + let mut command = Command::new("gccl"); + + command + .arg("console") + .arg("rom") + .arg(game_rom_path(game.id)); + + println!("command: {command:?}"); + + if let Err(e) = command.spawn() { + println!("Error launching game {e}"); + } + } + } else { + ui.label("ROM Missing"); + } + ui.end_row() + } + }); + }); + } + + pub fn sync_against_fs(&mut self) -> Vec { + //TODO: This function + // Check against FS for existing .gcroms + // If they exist... + // 1. ROM is in localDB, do nothing + // 2. ROM is not in localDB, fetch the update by ID + + Vec::default() + } +} + +pub enum FsGame {} diff --git a/gamercade_app/src/modes/mod.rs b/gamercade_app/src/modes/mod.rs new file mode 100644 index 00000000..333d88e1 --- /dev/null +++ b/gamercade_app/src/modes/mod.rs @@ -0,0 +1,15 @@ +mod arcade_mode; +mod library_mode; +mod settings_mode; + +pub use arcade_mode::*; +pub use library_mode::*; +pub use settings_mode::*; + +#[derive(PartialEq, Default)] +pub enum AppMode { + #[default] + Arcade, + Library, + Settings, +} diff --git a/gamercade_app/src/modes/settings_mode/mod.rs b/gamercade_app/src/modes/settings_mode/mod.rs new file mode 100644 index 00000000..6296aab6 --- /dev/null +++ b/gamercade_app/src/modes/settings_mode/mod.rs @@ -0,0 +1,16 @@ +use crate::app::AppDrawContext; + +#[derive(Default)] +pub struct SettingsModeView {} + +impl SettingsModeView { + pub fn draw(&mut self, context: &mut AppDrawContext) { + let AppDrawContext { ui, .. } = context; + ui.label("Settings Mode View"); + } + + // TODO: This func + fn draw_controls_settings(&mut self, context: &mut AppDrawContext) { + // Need to move console's input definitions to a publc crate like core + } +} diff --git a/gamercade_app/src/task_manager/auth.rs b/gamercade_app/src/task_manager/auth.rs new file mode 100644 index 00000000..44cc3eaa --- /dev/null +++ b/gamercade_app/src/task_manager/auth.rs @@ -0,0 +1,154 @@ +use std::{fmt::Debug, sync::Arc}; + +use gamercade_interface::{ + auth::{ + auth_service_client::AuthServiceClient, login_request::Provider, LoginRequest, + SignUpRequest, + }, + Session, +}; +use tokio::sync::{mpsc::Sender, Mutex, OnceCell}; +use tonic::transport::Channel; + +use crate::urls::SERVICE_IP_GRPC; + +use super::{TaskManager, TaskNotification, TaskRequest}; + +#[derive(Default, Debug)] +pub enum AuthState { + // Default State + #[default] + Unauthorized, + + // Holding Session + SessionHeld(Session), +} + +impl AuthState { + pub fn get_session(&self) -> Option { + match self { + AuthState::Unauthorized => None, + AuthState::SessionHeld(session) => Some(session.clone()), + } + } +} + +pub type AuthManager = TaskManager; + +#[derive(Default)] +pub struct AuthManagerState { + client: OnceCell>, +} + +async fn init_auth_client() -> AuthServiceClient { + AuthServiceClient::connect(SERVICE_IP_GRPC).await.unwrap() +} + +pub enum AuthRequest { + Login(LoginRequest), + SignUp(SignUpRequest), +} + +impl Debug for AuthRequest { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Login(_) => f.write_str("Login(Fields Hidden)"), + Self::SignUp(_) => f.write_str("SignUp(Fields Hidden)"), + } + } +} + +impl TaskRequest for AuthRequest { + async fn handle_request( + self, + sender: &Sender, + state: &Arc>, + ) { + let mut lock = state.lock().await; + lock.client.get_or_init(init_auth_client).await; + let client = lock.client.get_mut().unwrap(); + + match self { + AuthRequest::Login(login) => handle_login(login, client, sender).await, + AuthRequest::SignUp(sign_up) => handle_sign_up(sign_up, client, sender).await, + } + } +} + +async fn handle_login( + request: LoginRequest, + client: &mut AuthServiceClient, + sender: &Sender, +) { + println!("Trying to login..."); + match client.login(request).await { + Ok(response) => { + let response = response.into_inner(); + + if let Ok(session) = Session::try_from(response.session.as_slice()) { + sender + .send(TaskNotification::AuthStateChanged(AuthState::SessionHeld( + session, + ))) + .await + .unwrap(); + } else { + // TODO: Handle this + println!("Error parsing session from server") + } + } + Err(e) => { + sender.send(TaskNotification::LoginFailed).await.unwrap(); + println!("{e}"); + } + } +} + +async fn handle_sign_up( + request: SignUpRequest, + client: &mut AuthServiceClient, + sender: &Sender, +) { + println!("Trying to sign up..."); + match client.sign_up(request).await { + Ok(response) => { + let response = response.into_inner(); + + if let Ok(session) = Session::try_from(response.session.as_slice()) { + sender + .send(TaskNotification::AuthStateChanged(AuthState::SessionHeld( + session, + ))) + .await + .unwrap(); + } else { + // TODO: Handle this + println!("Error parsing session from server") + } + } + Err(e) => { + println!("{e}"); + } + } +} + +impl AuthManager { + pub fn try_login(&self, username: &str, password: &str) { + if let Err(_e) = self.sender.try_send(AuthRequest::Login(LoginRequest { + provider: Some(Provider::Username(username.to_string())), + password: password.to_string(), + })) { + panic!("Couldn't send login request over channel."); + }; + } + + pub fn try_register(&self, username: &str, email: &str, password: &str) { + if let Err(_e) = self.sender.try_send(AuthRequest::SignUp(SignUpRequest { + username: username.to_string(), + email: email.to_string(), + password: password.to_string(), + })) { + panic!("Couldn't send login request over channel."); + }; + } +} diff --git a/gamercade_app/src/task_manager/authors.rs b/gamercade_app/src/task_manager/authors.rs new file mode 100644 index 00000000..a6c54c6c --- /dev/null +++ b/gamercade_app/src/task_manager/authors.rs @@ -0,0 +1,66 @@ +use std::sync::Arc; + +use gamercade_interface::{author::author_service_client::AuthorServiceClient, common::Empty}; +use tokio::sync::{mpsc::Sender, Mutex, OnceCell}; +use tonic::{transport::Channel, Request}; + +use crate::{ + local_directory::{PermissionLevel, PermissionLevelId}, + urls::SERVICE_IP_GRPC, +}; + +use super::{TaskManager, TaskNotification, TaskRequest}; + +pub type AuthorManager = TaskManager; + +#[derive(Default)] +pub struct AuthorManagerState { + client: OnceCell>, +} + +async fn init_author_client() -> AuthorServiceClient { + AuthorServiceClient::connect(SERVICE_IP_GRPC).await.unwrap() +} + +impl TaskRequest for AuthorRequest { + async fn handle_request( + self, + notification_tx: &Sender, + state: &Arc>, + ) { + match self { + AuthorRequest::Initialize => { + let lock = state.lock().await; + let response = lock + .client + .get_or_init(init_author_client) + .await + .clone() + .get_global_permission_levels(Request::new(Empty {})) + .await + .unwrap(); + + let mut response = response.into_inner(); + let levels = response + .levels + .drain(..) + .map(|level| { + ( + PermissionLevelId(level.id), + PermissionLevel { + name: level.level_name, + }, + ) + }) + .collect(); + let message = TaskNotification::GlobalPermissionLevels(levels); + notification_tx.send(message).await.unwrap(); + } + } + } +} + +#[derive(Debug)] +pub enum AuthorRequest { + Initialize, +} diff --git a/gamercade_app/src/task_manager/game.rs b/gamercade_app/src/task_manager/game.rs new file mode 100644 index 00000000..212c34e7 --- /dev/null +++ b/gamercade_app/src/task_manager/game.rs @@ -0,0 +1,71 @@ +use std::sync::Arc; + +use gamercade_interface::game::{ + game_service_client::GameServiceClient, GameInfoBasic, UpdateGameRequest, +}; +use tokio::sync::{mpsc::Sender, Mutex, OnceCell}; +use tonic::{transport::Channel, Response}; + +use crate::urls::{WithSession, SERVICE_IP_GRPC}; + +use super::{TaskManager, TaskNotification, TaskRequest}; + +pub type GameManager = TaskManager; + +async fn init_game_client() -> GameServiceClient { + GameServiceClient::connect(SERVICE_IP_GRPC).await.unwrap() +} + +#[derive(Default)] +pub struct GameManagerState { + client: OnceCell>, +} + +#[derive(Debug)] +pub enum GameRequest { + CreateGame(WithSession), + UpdateGame(WithSession), +} + +#[derive(Debug)] +pub enum GameResponse { + CreateGame(Result), + UpdateGame(Result), +} + +impl TaskRequest for GameRequest { + async fn handle_request( + self, + sender: &Sender, + state: &Arc>, + ) { + let mut lock = state.lock().await; + lock.client.get_or_init(init_game_client).await; + let client = lock.client.get_mut().unwrap(); + + match self { + GameRequest::CreateGame(request) => { + let response = client.create_game(request.authorized_request()).await; + sender + .send(TaskNotification::GameResponse(GameResponse::CreateGame( + response + .map(Response::into_inner) + .map_err(|e| e.to_string()), + ))) + .await + .unwrap() + } + GameRequest::UpdateGame(request) => { + let response = client.update_game(request.authorized_request()).await; + sender + .send(TaskNotification::GameResponse(GameResponse::UpdateGame( + response + .map(Response::into_inner) + .map_err(|e| e.to_string()), + ))) + .await + .unwrap() + } + }; + } +} diff --git a/gamercade_app/src/task_manager/http.rs b/gamercade_app/src/task_manager/http.rs new file mode 100644 index 00000000..e19fbc98 --- /dev/null +++ b/gamercade_app/src/task_manager/http.rs @@ -0,0 +1,206 @@ +use std::sync::Arc; + +use gamercade_interface::{Session, SESSION_METADATA_KEY}; + +use nohash_hasher::IntMap; +use tokio::{ + io::AsyncWriteExt, + sync::{mpsc::Sender, Mutex}, +}; + +use crate::{ + game_rom_path, + task_manager::{DownloadRomComplete, TaskNotification}, + urls::{self, WithSession}, + GAME_DIR, +}; + +use super::{TaskManager, TaskRequest}; + +pub type HttpManager = TaskManager; + +#[derive(Default)] +pub struct HttpManagerState { + pub rom_downloads: IntMap, + pub image_downloads: IntMap, +} + +pub struct ActiveDownload { + id: i64, + download_status: DownloadStatus, +} + +pub enum DownloadStatus { + InProgress { + bytes_downloaded: usize, + total_bytes: usize, + }, + Done(Vec), +} + +#[derive(Debug)] +pub enum HttpRequest { + DownloadRom(WithSession), + UploadRom(WithSession), +} + +#[derive(Debug)] +pub enum HttpResponse { + DownloadComplete(DownloadRomComplete), + Upload(Result<(), String>), +} + +#[derive(Debug)] +pub struct DownloadRom { + pub game_id: i64, +} + +#[derive(Debug)] +pub struct UploadRom { + pub game_id: i64, + pub bytes: Vec, +} + +impl TaskRequest for HttpRequest { + async fn handle_request( + self, + sender: &Sender, + state: &Arc>, + ) { + match self { + HttpRequest::DownloadRom(request) => download_file(sender.clone(), request), + HttpRequest::UploadRom(request) => { + let WithSession { + data: request, + session, + } = request; + let session = u128::from_ne_bytes(*session.bytes()); + match reqwest::Client::new() + .post(urls::game_rom_url(request.game_id)) + .header(SESSION_METADATA_KEY, format!("{session:x}")) + .body(request.bytes) + .send() + .await + { + Ok(response) => { + if let Err(_) = response.error_for_status_ref() { + sender + .send(TaskNotification::HttpResponse(HttpResponse::Upload(Err( + response.text().await.unwrap_or_default(), + )))) + .await + .unwrap() + } else { + sender + .send(TaskNotification::HttpResponse(HttpResponse::Upload(Ok(())))) + .await + .unwrap() + } + } + Err(err) => sender + .send(TaskNotification::HttpResponse(HttpResponse::Upload(Err( + err.to_string(), + )))) + .await + .unwrap(), + } + } + } + } +} + +// TODO: May want to keep the join handle around +fn download_file(sender: Sender, request: WithSession) { + tokio::spawn(async move { + let WithSession { + session, + data: request, + } = request; + let session = format!("{:x}", u128::from_ne_bytes(*session.bytes())); + + match reqwest::Client::new() + .get(urls::game_rom_url(request.game_id)) + .header(SESSION_METADATA_KEY, session) + .send() + .await + { + Ok(mut response) => { + println!("download response: {response:?}"); + + if let Err(e) = response.error_for_status_ref() { + println!("Error response: {e}"); + println!("{:?}", response.text().await); + return; + } + + let mut buffer = Vec::new(); + loop { + match response.chunk().await { + Ok(Some(bytes)) => { + buffer.extend_from_slice(&bytes); + } + Ok(None) => { + // Create the directory + let _ = tokio::fs::create_dir_all(GAME_DIR).await; + + // Create and write to the file + match tokio::fs::OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(game_rom_path(request.game_id)) + .await + { + Ok(mut file) => { + if let Err(e) = file.write_all(&buffer).await { + println!("Error writing file: {e}"); + return; + } + + // Notify the main thread that the download is done + sender + .send(TaskNotification::HttpResponse( + HttpResponse::DownloadComplete(DownloadRomComplete { + game_id: request.game_id, + data: buffer, + }), + )) + .await + .unwrap(); + } + Err(e) => println!("Error writing file: {e}"), //TOOD: Could send an error that the download failed + }; + + break; + } + Err(e) => { + println!("Download error: {e}"); + break; + } + } + } + } + Err(err) => println!("Download release Error: {err}"), + } + }); +} + +impl HttpManager { + pub fn try_download_rom(&mut self, game_id: i64, session: &Session) { + self.sender + .try_send(HttpRequest::DownloadRom(WithSession { + session: session.clone(), + data: DownloadRom { game_id }, + })) + .unwrap(); + } + + pub fn try_upload_rom(&mut self, request: UploadRom, session: &Session) { + self.sender + .try_send(HttpRequest::UploadRom(WithSession { + session: session.clone(), + data: request, + })) + .unwrap() + } +} diff --git a/gamercade_app/src/task_manager/mod.rs b/gamercade_app/src/task_manager/mod.rs new file mode 100644 index 00000000..e1e2e6d0 --- /dev/null +++ b/gamercade_app/src/task_manager/mod.rs @@ -0,0 +1,77 @@ +use std::{fmt::Debug, sync::Arc}; + +use tokio::sync::{ + mpsc::{channel, Sender}, + Mutex, +}; + +mod tags; +pub use tags::*; + +mod authors; +pub use authors::*; + +mod super_task_manager; +pub use super_task_manager::*; + +mod auth; +pub use auth::*; + +mod http; +pub use http::*; + +mod game; +pub use game::*; + +mod platform; +pub use platform::*; + +const SUPER_TASK_CHANNEL_SIZE: usize = 256; +const TASK_CHANNEL_LENGTH: usize = 8; + +pub struct TaskManager { + pub state: Arc>, + sender: Sender, +} + +impl TaskManager +where + STATE: Default + Send + 'static, + REQUEST: Send + 'static + TaskRequest + Debug, +{ + pub fn new(notification_tx: Sender) -> Self { + let state = Arc::new(Mutex::new(STATE::default())); + Self { + sender: Self::spawn_task(notification_tx, state.clone()), + state, + } + } + + fn spawn_task( + notification_tx: Sender, + state: Arc>, + ) -> Sender { + let (client_sender, mut receiver) = channel::(TASK_CHANNEL_LENGTH); + + tokio::spawn(async move { + let state = state.clone(); + while let Some(request) = receiver.recv().await { + request.handle_request(¬ification_tx, &state).await + } + }); + + client_sender + } + + pub fn send(&self, message: REQUEST) { + self.sender.try_send(message).unwrap() + } +} + +pub trait TaskRequest { + fn handle_request( + self, + sender: &Sender, + state: &Arc>, + ) -> impl std::future::Future + Send; +} diff --git a/gamercade_app/src/task_manager/platform.rs b/gamercade_app/src/task_manager/platform.rs new file mode 100644 index 00000000..a2393ee8 --- /dev/null +++ b/gamercade_app/src/task_manager/platform.rs @@ -0,0 +1,102 @@ +use std::sync::Arc; + +use gamercade_interface::{ + common::Empty, + game::MultipleGamesInfoResponse, + platform::{ + platform_service_client::PlatformServiceClient, EditableGamesResponse, FrontPageRequest, + FrontPageResponse, GameSearchRequest, VotedGamesResponse, + }, + Session, +}; +use tokio::sync::{mpsc::Sender, Mutex, OnceCell}; +use tonic::transport::Channel; + +use crate::urls::{WithSession, SERVICE_IP_GRPC}; + +use super::{TaskManager, TaskNotification, TaskRequest}; + +pub type PlatformManager = TaskManager; + +async fn init_platform_client() -> PlatformServiceClient { + PlatformServiceClient::connect(SERVICE_IP_GRPC) + .await + .unwrap() +} + +#[derive(Default)] +pub struct PlatformManagerState { + client: OnceCell>, +} + +#[derive(Debug)] +pub enum PlatformRequest { + FrontPage(FrontPageRequest), + Search(GameSearchRequest), + EditableGames(Session), + VotedGames(Session), +} + +#[derive(Debug)] +pub enum PlatformResponse { + FrontPage(FrontPageResponse), + EditableGames(EditableGamesResponse), + VotedGames(VotedGamesResponse), + Search(MultipleGamesInfoResponse), +} + +impl TaskRequest for PlatformRequest { + async fn handle_request( + self, + sender: &Sender, + state: &Arc>, + ) { + let mut lock = state.lock().await; + lock.client.get_or_init(init_platform_client).await; + let client = lock.client.get_mut().unwrap(); + + match self { + PlatformRequest::FrontPage(request) => match client.front_page(request).await { + Ok(response) => sender + .try_send(TaskNotification::PlatformResponse( + PlatformResponse::FrontPage(response.into_inner()), + )) + .unwrap(), + Err(err) => println!("front page response err: {err}"), + }, + PlatformRequest::Search(request) => match client.game_search(request).await { + Ok(response) => sender + .send(TaskNotification::PlatformResponse( + PlatformResponse::Search(response.into_inner()), + )) + .await + .unwrap(), + Err(err) => println!("search response err: {err}"), + }, + PlatformRequest::EditableGames(session) => match client + .get_editable_games(WithSession::new(&session, Empty {}).authorized_request()) + .await + { + Ok(response) => sender + .send(TaskNotification::PlatformResponse( + PlatformResponse::EditableGames(response.into_inner()), + )) + .await + .unwrap(), + Err(err) => println!("editable games response err: {err}"), + }, + PlatformRequest::VotedGames(session) => match client + .get_voted_games(WithSession::new(&session, Empty {}).authorized_request()) + .await + { + Ok(response) => sender + .send(TaskNotification::PlatformResponse( + PlatformResponse::VotedGames(response.into_inner()), + )) + .await + .unwrap(), + Err(err) => println!("voted games response err: {err}"), + }, + } + } +} diff --git a/gamercade_app/src/task_manager/super_task_manager.rs b/gamercade_app/src/task_manager/super_task_manager.rs new file mode 100644 index 00000000..92e064d5 --- /dev/null +++ b/gamercade_app/src/task_manager/super_task_manager.rs @@ -0,0 +1,57 @@ +use tokio::sync::mpsc::{channel, Receiver}; + +use crate::local_directory::{PermissionLevel, PermissionLevelId, Tag, TagId}; + +use super::{ + AuthManager, AuthState, AuthorManager, GameManager, GameResponse, HttpManager, HttpResponse, + PlatformManager, PlatformResponse, TagManager, SUPER_TASK_CHANNEL_SIZE, +}; + +#[derive(Debug)] +pub enum TaskNotification { + GlobalTags(Vec<(TagId, Tag)>), + GlobalPermissionLevels(Vec<(PermissionLevelId, PermissionLevel)>), + AuthStateChanged(AuthState), + LoginFailed, + + // Game + GameResponse(GameResponse), + + // Platform + PlatformResponse(PlatformResponse), + + // Http + HttpResponse(HttpResponse), +} + +#[derive(Debug)] +pub struct DownloadRomComplete { + pub game_id: i64, + pub data: Vec, +} + +pub struct SuperTaskManager { + pub events: Receiver, + pub tags: TagManager, + pub author: AuthorManager, + pub auth: AuthManager, + pub http: HttpManager, + pub game: GameManager, + pub platform: PlatformManager, +} + +impl Default for SuperTaskManager { + fn default() -> Self { + let (event_tx, events) = channel(SUPER_TASK_CHANNEL_SIZE); + + Self { + tags: TagManager::new(event_tx.clone()), + author: AuthorManager::new(event_tx.clone()), + auth: AuthManager::new(event_tx.clone()), + http: HttpManager::new(event_tx.clone()), + game: GameManager::new(event_tx.clone()), + platform: PlatformManager::new(event_tx.clone()), + events, + } + } +} diff --git a/gamercade_app/src/task_manager/tags.rs b/gamercade_app/src/task_manager/tags.rs new file mode 100644 index 00000000..980ff31f --- /dev/null +++ b/gamercade_app/src/task_manager/tags.rs @@ -0,0 +1,59 @@ +use std::sync::Arc; + +use gamercade_interface::{common::Empty, tag::tag_service_client::TagServiceClient}; +use tokio::sync::{mpsc::Sender, Mutex, OnceCell}; +use tonic::{transport::Channel, Request}; + +use crate::{ + local_directory::{Tag, TagId}, + urls::SERVICE_IP_GRPC, +}; + +use super::{TaskManager, TaskNotification, TaskRequest}; + +pub type TagManager = TaskManager; + +#[derive(Default)] +pub struct TagManagerState { + client: OnceCell>, +} + +async fn init_tag_client() -> TagServiceClient { + TagServiceClient::connect(SERVICE_IP_GRPC).await.unwrap() +} + +impl TaskRequest for TagRequest { + async fn handle_request( + self, + notification_tx: &Sender, + state: &Arc>, + ) { + match self { + TagRequest::Initialize => { + let lock = state.lock().await; + let response = lock + .client + .get_or_init(init_tag_client) + .await + .clone() + .get_global_tags(Request::new(Empty {})) + .await + .unwrap(); + + let mut response = response.into_inner(); + let tags = response + .tags + .drain(..) + .map(|tag| (TagId(tag.pid), Tag(tag.name))) + .collect(); + let message = TaskNotification::GlobalTags(tags); + notification_tx.send(message).await.unwrap(); + } + } + } +} + +#[derive(Debug)] +pub enum TagRequest { + Initialize, +} diff --git a/gamercade_app/src/urls.rs b/gamercade_app/src/urls.rs new file mode 100644 index 00000000..4e42a683 --- /dev/null +++ b/gamercade_app/src/urls.rs @@ -0,0 +1,35 @@ +use gamercade_interface::{Session, SESSION_METADATA_KEY, URL_RADIX}; +use radix_fmt::radix; +use tonic::{metadata::MetadataValue, Request}; + +pub const SERVICE_IP_GRPC: &str = "http://127.0.0.1:50051"; +pub const SERVICE_IP_HTTP: &str = "http://127.0.0.1:3000"; + +pub fn game_rom_url(game_id: i64) -> String { + let game_id = radix(game_id, URL_RADIX as u8); + format!("{SERVICE_IP_HTTP}/games/{game_id}") +} + +#[derive(Debug)] +pub struct WithSession { + pub session: Session, + pub data: T, +} + +impl WithSession { + pub fn new(session: &Session, data: T) -> Self { + Self { + session: session.clone(), + data, + } + } + + pub fn authorized_request(self) -> Request { + let mut request = Request::new(self.data); + request.metadata_mut().insert_bin( + SESSION_METADATA_KEY, + MetadataValue::from_bytes(self.session.bytes()), + ); + request + } +} diff --git a/gamercade_audio/Cargo.toml b/gamercade_audio/Cargo.toml index 40b41b6a..31fce02b 100644 --- a/gamercade_audio/Cargo.toml +++ b/gamercade_audio/Cargo.toml @@ -12,8 +12,9 @@ repository = "https://github.com/gamercade-io/gamercade_audio" [dependencies] serde = { version = "1.0.163", features = ["derive"] } strum = { version = "0.24.1", features = ["derive"] } -arrayvec = { version = "0.7.2", features = ["serde"] } -tinystr = "0.7.1" -rtrb = "0.2.3" -fastrand = "1.9.0" -base64 = "0.21.0" \ No newline at end of file +arrayvec = { version = "0.7.4", features = ["serde"] } +tinystr = "0.7.5" +rtrb = "0.3.0" +fastrand = "2.0.2" +base64 = "0.22.0" +bytemuck = "1.15.0" \ No newline at end of file diff --git a/gamercade_audio/src/instruments/index_interpolator.rs b/gamercade_audio/src/instruments/index_interpolator.rs index 17aff164..995efda7 100644 --- a/gamercade_audio/src/instruments/index_interpolator.rs +++ b/gamercade_audio/src/instruments/index_interpolator.rs @@ -6,17 +6,11 @@ use serde::{Deserialize, Serialize}; /// kind of sample lookup. Since the output may require an index at point /// 1.5, we need to know how to convert this value into a non-fractional integer. pub enum IndexInterpolator { - /// Linearly interpolates between the values - /// A value of 1.2 will take the samples at 1 and 2, - /// and combine the result which is (20% of 1) plus (80% of 2). - /// A value of 10.5 will take 50% of the values, summed, at samples 10 and 11. - #[default] - Linear, - /// Uses only the integral part of the number /// 1.2 will be truncated 1 /// 1.5 will be truncated to 1 /// 1.9 will be truncated to 1 + #[default] Truncate, /// Rounds to the nearest neighbor. @@ -24,6 +18,12 @@ pub enum IndexInterpolator { /// 1.5 will round to 2 /// 1.7 will round to 2 NearestNeighbor, + + /// Linearly interpolates between the values + /// A value of 1.2 will take the samples at 1 and 2, + /// and combine the result which is (20% of 1) plus (80% of 2). + /// A value of 10.5 will take 50% of the values, summed, at samples 10 and 11. + Linear, } pub enum IndexInterpolatorResult { diff --git a/gamercade_audio/src/instruments/mod.rs b/gamercade_audio/src/instruments/mod.rs index d98e3037..0ccb3a8a 100644 --- a/gamercade_audio/src/instruments/mod.rs +++ b/gamercade_audio/src/instruments/mod.rs @@ -34,7 +34,7 @@ where }; let bytes: Vec = bytes .chunks_exact(2) - .map(|slice| i16::from_be_bytes([slice[0], slice[1]])) + .map(|slice| *bytemuck::from_bytes(slice)) .collect(); Ok(bytes.into_boxed_slice()) } @@ -43,7 +43,10 @@ pub(crate) fn ser_audio_data(data: &[i16], serializer: S) -> Result = data.iter().flat_map(|x| x.to_be_bytes()).collect(); + let data: Vec = data + .iter() + .flat_map(|x| bytemuck::cast::<_, [u8; 2]>(*x)) + .collect(); if serializer.is_human_readable() { let data = BASE64ENGINE.encode(data); serializer.serialize_str(&data) diff --git a/gamercade_cli/Cargo.toml b/gamercade_cli/Cargo.toml index 867b7376..5958fdaa 100644 --- a/gamercade_cli/Cargo.toml +++ b/gamercade_cli/Cargo.toml @@ -11,5 +11,5 @@ keywords = ["gamedev"] [dependencies] gamercade_fs = { path = "../gamercade_fs" } -clap = { version = "4.2.7", features = ["derive"] } -notify = "5.1.0" +clap = { version = "4.5.4", features = ["derive"] } +notify = "6.1.1" diff --git a/gamercade_cli/src/commands/bundler.rs b/gamercade_cli/src/commands/bundler.rs index 614da9a5..d02196b3 100644 --- a/gamercade_cli/src/commands/bundler.rs +++ b/gamercade_cli/src/commands/bundler.rs @@ -1,7 +1,7 @@ -use std::{path::PathBuf, process::Child}; +use std::{fs, path::PathBuf, process::Child}; use clap::Args; -use gamercade_fs::EditorRom; +use gamercade_fs::{DataPack, EditorRom}; use crate::{commands::try_bundle_files, watch::Watchable}; @@ -17,6 +17,10 @@ pub(crate) struct BundleArgs { #[clap(short, long, value_parser)] assets: Option, + /// Path to provide a game data pack. Any file type. + #[clap(short, long, value_parser)] + data_pack: Option, + /// Path of the output file. #[clap(short, long, value_parser)] output: PathBuf, @@ -43,13 +47,18 @@ impl Watchable for BundleArgs { pub(crate) fn run(args: &BundleArgs) -> Result, String> { let code = read_path(&args.code)?; - let assets = if let Some(assets) = &args.assets { + let mut assets = if let Some(assets) = &args.assets { read_path(assets)? } else { println!("No assets provided, using default data."); ReadFileResult::EditorRom(EditorRom::default()) }; + if let Some(data_pack) = &args.data_pack { + let data = fs::read(data_pack).unwrap(); + assets.set_data_pack(DataPack { data }); + } + let path = match args .output .extension() diff --git a/gamercade_cli/src/commands/console.rs b/gamercade_cli/src/commands/console.rs index 885615f0..12335206 100644 --- a/gamercade_cli/src/commands/console.rs +++ b/gamercade_cli/src/commands/console.rs @@ -1,10 +1,11 @@ use std::{ + fs, path::{Path, PathBuf}, process::Child, }; use clap::{Args, Subcommand}; -use gamercade_fs::EditorRom; +use gamercade_fs::{DataPack, EditorRom}; use crate::watch::Watchable; @@ -36,6 +37,10 @@ enum ConsoleCommand { /// Optional path to the asset provider, .gce or .gcrom. #[clap(short, long, value_parser)] assets: Option, + + /// Optional path to provide a game data pack. Any file type. + #[clap(short, long, value_parser)] + data_pack: Option, }, } @@ -51,11 +56,19 @@ impl Watchable for ConsoleArgs { let mut out = Vec::new(); match &self.mode { - Some(ConsoleCommand::Bundle { code, assets }) => { + Some(ConsoleCommand::Bundle { + code, + assets, + data_pack, + }) => { out.push(code.clone()); if let Some(assets) = assets { out.push(assets.clone()) } + + if let Some(data_pack) = data_pack { + out.push(data_pack.clone()) + } } Some(ConsoleCommand::Rom { rom }) => out.push(rom.clone()), None => (), @@ -83,15 +96,24 @@ pub(crate) fn run(args: &ConsoleArgs) -> Result, String> { ]) .spawn() .map_err(|e| e.to_string())?, - Some(ConsoleCommand::Bundle { code, assets }) => { + Some(ConsoleCommand::Bundle { + code, + assets, + data_pack, + }) => { let code = read_path(code)?; - let assets = if let Some(assets) = assets { + let mut assets = if let Some(assets) = assets { read_path(assets)? } else { ReadFileResult::EditorRom(EditorRom::default()) }; + if let Some(data_pack) = &data_pack { + let data = fs::read(data_pack).unwrap(); + assets.set_data_pack(DataPack { data }); + } + let rom = try_bundle_files(&code, &assets)?; let rom_path = PathBuf::new().with_file_name(BUNDLE_FILENAME); rom.try_save(&rom_path)?; diff --git a/gamercade_cli/src/commands/mod.rs b/gamercade_cli/src/commands/mod.rs index 6d7968ee..4b3e425a 100644 --- a/gamercade_cli/src/commands/mod.rs +++ b/gamercade_cli/src/commands/mod.rs @@ -3,7 +3,7 @@ pub(crate) mod console; use std::path::PathBuf; -use gamercade_fs::{bundle, EditorRom, Rom}; +use gamercade_fs::{bundle, DataPack, EditorRom, Rom}; enum ReadFileResult { Rom(Rom), @@ -11,6 +11,16 @@ enum ReadFileResult { Code(Box<[u8]>), } +impl ReadFileResult { + pub(crate) fn set_data_pack(&mut self, data_pack: DataPack) { + match self { + ReadFileResult::Rom(rom) => rom.data_pack = Some(data_pack), + ReadFileResult::EditorRom(editor_rom) => editor_rom.data_pack = Some(data_pack), + ReadFileResult::Code(_) => println!("Can't set a datapack for a .wasm code fiel"), + } + } +} + fn read_path(path: &PathBuf) -> Result { match path.extension().and_then(|path| path.to_str()) { Some("gcrom") => { diff --git a/gamercade_cli/src/main.rs b/gamercade_cli/src/main.rs index 3ebdd830..2f9b5d16 100644 --- a/gamercade_cli/src/main.rs +++ b/gamercade_cli/src/main.rs @@ -111,7 +111,14 @@ pub fn main() { Err(e) => println!("{e}"), } } - } else if let Err(e) = cli.command.run() { - println!("{e}"); + } else { + match cli.command.run() { + Ok(Some(mut child)) => match child.wait() { + Ok(code) => println!("Process ended with exit status: {code} "), + Err(e) => println!("Process terminated unsuccessfully {e}"), + }, + Ok(None) => println!("Process successful."), + Err(e) => println!("Failed to run: {e}."), + } } } diff --git a/gamercade_console/Cargo.toml b/gamercade_console/Cargo.toml index 2878efa3..34aaaffc 100644 --- a/gamercade_console/Cargo.toml +++ b/gamercade_console/Cargo.toml @@ -15,9 +15,10 @@ gamercade_fs = { path = "../gamercade_fs" } gamercade_core = { path = "../gamercade_core" } gamercade_audio = { path = "../gamercade_audio" } gamercade_sound_engine = { path = "../gamercade_sound_engine" } +gamercade_interface = { path = "../gamercade_interface" } # General Improvements -hashbrown = { version = "0.13.2", features = ["serde"] } +hashbrown = { version = "0.14.3", features = ["serde"] } parking_lot = "0.12.1" # Windowing & Graphics @@ -31,24 +32,24 @@ egui-wgpu = "0.21.0" egui-winit = { version = "0.21.1", default-features = false, features = ["links"] } # Macros & Helpers -paste = "1.0.12" +paste = "1.0.14" # Serialization / File Loading etc serde = { version = "1.0.163", features = ["derive"] } serde_json = "1.0.96" -bytemuck = "1.13.1" +bytemuck = "1.15.0" # Scripting -wasmtime = { version = "8.0.1", features = ["cranelift"] } +wasmtime = "19.0.1" # Random fastrand = "1.9.0" # Audio -cpal = "0.15.2" +cpal = "0.15.3" # Networking -ggrs = "0.9.4" +ggrs = "0.10.0" # File Picker Dialog rfd = "0.11.3" @@ -57,4 +58,4 @@ rfd = "0.11.3" gilrs = "0.10.2" # Cli -clap = { version = "4.2.7", features = ["derive"] } +clap = { version = "4.5.4", features = ["derive"] } diff --git a/gamercade_console/src/console/bindings/audio_binding.rs b/gamercade_console/src/console/bindings/audio_binding.rs index f58a9cb0..6f9f390d 100644 --- a/gamercade_console/src/console/bindings/audio_binding.rs +++ b/gamercade_console/src/console/bindings/audio_binding.rs @@ -14,9 +14,9 @@ macro_rules! derive_audio_api_binding { "env", stringify!($ident), |mut caller: Caller<'_, Contexts>, $($name: $args,)*| { - let mut context = &mut caller.data_mut().audio_context; + let context = &mut caller.data_mut().audio_context; context.changed = true; - context.$ident($($name as $args,)*) + context.$ident($($name,)*) }).unwrap(); } )* diff --git a/gamercade_console/src/console/bindings/data_binding.rs b/gamercade_console/src/console/bindings/data_binding.rs index d982f2b6..b9c7a1c2 100644 --- a/gamercade_console/src/console/bindings/data_binding.rs +++ b/gamercade_console/src/console/bindings/data_binding.rs @@ -13,7 +13,7 @@ macro_rules! derive_data_api_binding { "env", stringify!($ident), |caller: Caller<'_, Contexts>, $($name: $args,)*| { - caller.data().data_context.$ident($($name as $args,)*) + caller.data().data_context.$ident($($name,)*) }).unwrap(); } )* diff --git a/gamercade_console/src/console/bindings/draw_binding.rs b/gamercade_console/src/console/bindings/draw_binding.rs index 81b0b13b..5c80ed0c 100644 --- a/gamercade_console/src/console/bindings/draw_binding.rs +++ b/gamercade_console/src/console/bindings/draw_binding.rs @@ -14,7 +14,7 @@ macro_rules! derive_draw_api_binding { "env", stringify!($ident), |mut caller: Caller<'_, Contexts>, $($name: $args,)*| { - caller.data_mut().draw_context.$ident($($name as $args,)*) + caller.data_mut().draw_context.$ident($($name,)*) }).unwrap(); } )* diff --git a/gamercade_console/src/console/bindings/graphics_parameter_binding.rs b/gamercade_console/src/console/bindings/graphics_parameter_binding.rs index afdb8d54..a115a1c1 100644 --- a/gamercade_console/src/console/bindings/graphics_parameter_binding.rs +++ b/gamercade_console/src/console/bindings/graphics_parameter_binding.rs @@ -13,7 +13,7 @@ macro_rules! derive_graphics_parameter_bindings { "env", stringify!($ident), |caller: Caller<'_, Contexts>, $($name: $args,)*| { - caller.data().graphics_parameter_context.$ident($($name as $args,)*) + caller.data().graphics_parameter_context.$ident($($name,)*) }).unwrap(); } )* diff --git a/gamercade_console/src/console/bindings/multiplayer_binding.rs b/gamercade_console/src/console/bindings/multiplayer_binding.rs index 7ae88b2d..2d570d11 100644 --- a/gamercade_console/src/console/bindings/multiplayer_binding.rs +++ b/gamercade_console/src/console/bindings/multiplayer_binding.rs @@ -14,7 +14,7 @@ macro_rules! derive_multiplayer_api_binding { "env", stringify!($ident), |caller: Caller<'_, Contexts>, $($name: $args,)*| { - caller.data().multiplayer_context.$ident($($name as $args,)*) + caller.data().multiplayer_context.$ident($($name,)*) }).unwrap(); } )* diff --git a/gamercade_console/src/console/bindings/random_binding.rs b/gamercade_console/src/console/bindings/random_binding.rs index 6d82d8be..ec332e69 100644 --- a/gamercade_console/src/console/bindings/random_binding.rs +++ b/gamercade_console/src/console/bindings/random_binding.rs @@ -14,7 +14,7 @@ macro_rules! derive_random_api_binding { "env", stringify!($ident), |caller: Caller<'_, Contexts>, $($name: $args,)*| { - caller.data().random_context.$ident($($name as $args,)*) + caller.data().random_context.$ident($($name,)*) }).unwrap(); } )* diff --git a/gamercade_console/src/console/bindings/text_binding.rs b/gamercade_console/src/console/bindings/text_binding.rs index f7bb01a5..f99b66c5 100644 --- a/gamercade_console/src/console/bindings/text_binding.rs +++ b/gamercade_console/src/console/bindings/text_binding.rs @@ -1,8 +1,9 @@ use crate::api::{TextApi, TextApiBinding}; use paste::paste; use std::str; -use wasmtime::{Caller, Extern, Linker}; +use wasmtime::{Caller, Linker}; +use crate::console::wasm_console::WASM_MEMORY; use crate::console::Contexts; macro_rules! derive_text_api_binding { @@ -15,10 +16,7 @@ macro_rules! derive_text_api_binding { "env", stringify!($ident), |mut caller: Caller<'_, Contexts>, text_ptr: i32, len: i32, $($name: $args,)*| { - let mem = match caller.get_export("memory") { - Some(Extern::Memory(mem)) => mem, - _ => return Err(wasmtime::Error::msg("failed to find host memory")), - }; + let mem = caller.get_export(WASM_MEMORY).unwrap().into_memory().unwrap(); let data = match mem .data(&caller) @@ -34,7 +32,7 @@ macro_rules! derive_text_api_binding { Err(_) => return Err(wasmtime::Error::msg("string is not valid utf-8")), }; - Ok(caller.data().text_context.$ident(text, $($name as $args,)*)) + Ok(caller.data().text_context.$ident(text, $($name,)*)) }).unwrap(); } @@ -43,10 +41,7 @@ macro_rules! derive_text_api_binding { "env", stringify!([<$ident _utf16>]), |mut caller: Caller<'_, Contexts>, text_ptr: i32, len: i32, $($name: $args,)*| { - let mem = match caller.get_export("memory") { - Some(Extern::Memory(mem)) => mem, - _ => return Err(wasmtime::Error::msg("failed to find host memory")), - }; + let mem = caller.get_export(WASM_MEMORY).unwrap().into_memory().unwrap(); let data = match mem .data(&caller) @@ -64,7 +59,7 @@ macro_rules! derive_text_api_binding { Err(_) => return Err(wasmtime::Error::msg("string is not valid utf-16")), }; - Ok(caller.data().text_context.$ident(&text, $($name as $args,)*)) + Ok(caller.data().text_context.$ident(&text, $($name,)*)) }).unwrap(); } )* diff --git a/gamercade_console/src/console/contexts/draw_context.rs b/gamercade_console/src/console/contexts/draw_context.rs index af658fed..d259bb6d 100644 --- a/gamercade_console/src/console/contexts/draw_context.rs +++ b/gamercade_console/src/console/contexts/draw_context.rs @@ -246,8 +246,7 @@ impl DrawApi for DrawContext { fn write_pixel_buffer(&mut self, start_index: usize, data: &[u32]) { (start_index - ..data - .len() + ..(start_index + data.len()) .min(self.frame_buffer.pixel_buffer.len() / BYTES_PER_PIXEL)) .zip(data.iter()) .for_each(|(index, gp)| { diff --git a/gamercade_console/src/console/contexts/mod.rs b/gamercade_console/src/console/contexts/mod.rs index ee862f94..75a7dcb1 100644 --- a/gamercade_console/src/console/contexts/mod.rs +++ b/gamercade_console/src/console/contexts/mod.rs @@ -45,8 +45,8 @@ impl Contexts { input_context: InputContext::new(session.num_players), random_context: RandomContext::new(seed), data_context: DataContext::new(rom.clone()), - graphics_parameter_context: GraphicsParameterContext::default(), - text_context: TextContext::default(), + graphics_parameter_context: GraphicsParameterContext, + text_context: TextContext, multiplayer_context: MultiplayerContext::new(session), audio_context: AudioContext::new(sound_rom, output_sample_rate), } diff --git a/gamercade_console/src/console/mod.rs b/gamercade_console/src/console/mod.rs index 5d2a1f1a..6dc4dc2b 100644 --- a/gamercade_console/src/console/mod.rs +++ b/gamercade_console/src/console/mod.rs @@ -6,12 +6,13 @@ mod wasm_console; pub use contexts::Contexts; use gamercade_fs::Rom; -use ggrs::{Config, GGRSRequest}; +use ggrs::{Config, GgrsRequest}; pub use input::*; pub use network::{SessionDescriptor, WasmConsoleState}; pub use wasm_console::WasmConsole; pub trait Console: Sized + Config { + fn call_datapack(&mut self, len: i32) -> i32; fn call_init(&mut self); fn call_update(&mut self); fn call_draw(&mut self); @@ -20,5 +21,7 @@ pub trait Console: Sized + Config { fn blit(&self, buffer: &mut [u8]); - fn handle_requests(&mut self, requests: Vec>); + fn handle_requests(&mut self, requests: Vec>); + + fn memory_usage(&mut self) -> usize; } diff --git a/gamercade_console/src/console/network.rs b/gamercade_console/src/console/network.rs index baf43685..c47d0f65 100644 --- a/gamercade_console/src/console/network.rs +++ b/gamercade_console/src/console/network.rs @@ -2,25 +2,20 @@ use std::net::SocketAddr; use bytemuck::{Pod, Zeroable}; use gamercade_core::{Buttons, InputState, MouseState}; +use gamercade_interface::{NetworkSession, NetworkedPlayerType}; use gamercade_sound_engine::SoundEngineData; use ggrs::{Config, PlayerType}; -use wasmtime::Global; use super::WasmConsole; #[derive(Clone)] pub struct WasmConsoleState { pub(crate) previous_buttons: Box<[Buttons]>, - pub(crate) memories: Vec>, - pub(crate) mutable_globals: Vec, + pub(crate) before_dp: Vec, + pub(crate) after_dp: Vec, pub(crate) sound_engine_data: SoundEngineData, } -pub struct SaveStateDefinition { - pub(crate) memories: Vec, - pub(crate) mutable_globals: Vec, -} - #[derive(Pod, Zeroable, Clone, Copy, PartialEq, Eq)] #[repr(C)] pub struct NetworkInputState { @@ -40,3 +35,29 @@ pub struct SessionDescriptor { pub player_types: Box<[PlayerType]>, pub port: u16, } + +impl SessionDescriptor { + pub fn new(port: u16, network_session: &NetworkSession) -> Self { + let mut num_players = 0; + + let player_types: Vec<_> = network_session + .players + .iter() + .flat_map(|client| { + let client_type = match client.kind { + NetworkedPlayerType::Local => PlayerType::Local, + NetworkedPlayerType::Remote(addr) => PlayerType::Remote(addr), + }; + + num_players += client.count; + std::iter::repeat(client_type).take(client.count) + }) + .collect(); + + Self { + num_players, + player_types: player_types.into_boxed_slice(), + port, + } + } +} diff --git a/gamercade_console/src/console/wasm_console.rs b/gamercade_console/src/console/wasm_console.rs index 2c33206c..44ce7d74 100644 --- a/gamercade_console/src/console/wasm_console.rs +++ b/gamercade_console/src/console/wasm_console.rs @@ -1,8 +1,8 @@ use std::sync::Arc; use gamercade_sound_engine::{SoundEngine, SoundEngineData, SoundRomInstance}; -use ggrs::GGRSRequest; -use wasmtime::{Engine, ExternType, Instance, Linker, Module, Mutability, Store, TypedFunc}; +use ggrs::GgrsRequest; +use wasmtime::{Config, Engine, Instance, Linker, Module, Store, TypedFunc}; use winit::{ dpi::PhysicalPosition, window::{CursorGrabMode, Window}, @@ -10,11 +10,9 @@ use winit::{ type GameFunc = TypedFunc<(), ()>; -use super::{ - bindings, - network::{SaveStateDefinition, WasmConsoleState}, - Contexts, SessionDescriptor, -}; +pub const WASM_MEMORY: &str = "memory"; + +use super::{bindings, network::WasmConsoleState, Contexts, SessionDescriptor}; use crate::Console; use gamercade_fs::Rom; @@ -23,14 +21,31 @@ pub struct WasmConsole { pub(crate) store: Store, pub(crate) functions: Functions, pub(crate) instance: Instance, - pub(crate) state_definition: SaveStateDefinition, pub(crate) sound_engine: SoundEngine, pub(crate) audio_out: SoundEngineData, + memory_values: MemoryValues, +} + +struct MemoryValues { + image_length: usize, + datapack_start: usize, + datapack_end: usize, +} + +impl MemoryValues { + fn new(image_length: usize) -> Self { + Self { + image_length, + datapack_start: image_length, + datapack_end: image_length, + } + } } #[derive(Clone)] pub(crate) struct Functions { init_fn: Option, + datapack_fn: Option>, update_fn: Option, draw_fn: Option, } @@ -44,6 +59,15 @@ impl Functions { None } }; + + let datapack_fn = match instance.get_typed_func(&mut *store, "datapack") { + Ok(datapack_fn) => Some(datapack_fn), + Err(e) => { + println!("datapack function not found: {e}"); + None + } + }; + let update_fn = match instance.get_typed_func(&mut *store, "update") { Ok(update_fn) => Some(update_fn), Err(e) => { @@ -59,9 +83,10 @@ impl Functions { } }; - if init_fn.is_some() || update_fn.is_some() || draw_fn.is_some() { + if init_fn.is_some() || datapack_fn.is_some() || update_fn.is_some() || draw_fn.is_some() { Self { init_fn, + datapack_fn, update_fn, draw_fn, } @@ -71,6 +96,23 @@ impl Functions { } } +// TODO: Consider if "Host Memory" could +// improve the state management of the VM +fn wasmtime_config() -> Config { + use wasmtime::*; + let mut config = Config::new(); + + config.async_support(false); + config.async_stack_size(0); + config.wasm_threads(false); + config.wasm_tail_call(true); + config.strategy(Strategy::Cranelift); + config.cranelift_opt_level(OptLevel::Speed); + config.static_memory_forced(true); + + config +} + impl WasmConsole { pub fn new( rom: Rom, @@ -92,8 +134,9 @@ impl WasmConsole { // Initialize the contexts let contexts = Contexts::new(&rom, seed, session, &sound_rom, output_sample_rate); - let engine = Engine::default(); + let engine = Engine::new(&wasmtime_config()).unwrap(); let module = Module::new(&engine, &rom.code).unwrap(); + let mut linker = Linker::new(&engine); // TODO: Make this static? Is there a way we can not have to call this @@ -101,41 +144,47 @@ impl WasmConsole { bindings::bind_all_apis(&mut linker); let mut store = Store::new(&engine, contexts); + let instance = linker.instantiate(&mut store, &module).unwrap(); - let functions = Functions::find_functions(&mut store, &instance); - let mut memories = Vec::new(); - let mut mutable_globals = Vec::new(); + let functions = Functions::find_functions(&mut store, &instance); - module.exports().for_each(|export| { - let name = export.name(); - match export.ty() { - ExternType::Global(global) => { - if global.mutability() == Mutability::Var { - mutable_globals.push(name.to_string()) - } - } - ExternType::Memory(_) => memories.push(name.to_string()), - ExternType::Func(_) => (), - ExternType::Table(_) => (), - } - }); + let audio_out = store.data().audio_context.sound_engine_data.clone(); - let state_definition = SaveStateDefinition { - memories, - mutable_globals, - }; + let image_range = module.image_range(); + let image_length = image_range.end as usize - image_range.start as usize; + let mut memory_values = MemoryValues::new(image_length); - let audio_out = store.data().audio_context.sound_engine_data.clone(); + memory_values.image_length = image_length; let mut out = Self { - rom, + rom: rom.clone(), functions, instance, - state_definition, store, sound_engine, audio_out, + memory_values, + }; + + if let Some(data_pack) = &rom.data_pack { + let length = data_pack.data.len() as i32; + + let datapack_start = out.call_datapack(length); + let mut datapack_end = 0; + if datapack_start > 0 { + datapack_end = datapack_start + length; + } + + let memory = &mut instance + .get_memory(&mut out.store, WASM_MEMORY) + .unwrap() + .data_mut(&mut out.store)[datapack_start as usize..datapack_end as usize]; + + memory.copy_from_slice(&data_pack.data); + + out.memory_values.datapack_end = datapack_end as usize; + out.memory_values.datapack_start = datapack_start as usize; }; out.call_init(); @@ -158,32 +207,22 @@ impl WasmConsole { .collect::>() .into_boxed_slice(); - let memories = self - .state_definition - .memories - .iter() - .map(|name| { - self.instance - .get_memory(&mut self.store, name) - .unwrap() - .data(&self.store) - .to_vec() - }) - .collect(); - - let mutable_globals = self - .state_definition - .mutable_globals - .iter() - .map(|name| self.instance.get_global(&mut self.store, name).unwrap()) - .collect(); + let mem = self + .instance + .get_memory(&mut self.store, WASM_MEMORY) + .unwrap(); + + let before_dp = mem.data(&mut self.store) + [self.memory_values.image_length..self.memory_values.datapack_start] + .to_vec(); + let after_dp = mem.data(&mut self.store)[self.memory_values.datapack_end..].to_vec(); let sound_engine_data = self.store.data().audio_context.sound_engine_data.clone(); WasmConsoleState { previous_buttons, - memories, - mutable_globals, + before_dp, + after_dp, sound_engine_data, } } @@ -191,8 +230,8 @@ impl WasmConsole { pub fn load_save_state(&mut self, state: WasmConsoleState) { let WasmConsoleState { previous_buttons, - memories, - mutable_globals, + before_dp, + after_dp, sound_engine_data, } = state; @@ -207,30 +246,15 @@ impl WasmConsole { self.store.data_mut().input_context.input_entries[index].previous = *prev; }); - self.state_definition - .memories - .iter() - .enumerate() - .for_each(|(index, name)| { - let source = &memories[index]; - let destination = self.instance.get_memory(&mut self.store, name).unwrap(); - let destination = &mut destination.data_mut(&mut self.store)[..source.len()]; - destination.copy_from_slice(source) - }); + let memory = &mut self + .instance + .get_memory(&mut self.store, WASM_MEMORY) + .unwrap() + .data_mut(&mut self.store); - self.state_definition - .mutable_globals - .iter() - .enumerate() - .for_each(|(index, name)| { - let source = mutable_globals[index]; - let val = source.get(&mut self.store); - self.instance - .get_global(&mut self.store, name) - .unwrap() - .set(&mut self.store, val) - .unwrap() - }); + memory[self.memory_values.image_length..self.memory_values.datapack_start] + .copy_from_slice(&before_dp); + memory[self.memory_values.datapack_end..].copy_from_slice(&after_dp); } pub(crate) fn sync_audio(&mut self) { @@ -267,7 +291,7 @@ impl WasmConsole { } } -fn call(func: &Option, store: &mut Store) { +fn call(func: Option<&GameFunc>, store: &mut Store) { if let Some(func) = func { func.call(store, ()).unwrap() } @@ -275,15 +299,23 @@ fn call(func: &Option, store: &mut Store) { impl Console for WasmConsole { fn call_init(&mut self) { - call(&self.functions.init_fn, &mut self.store); + call(self.functions.init_fn.as_ref(), &mut self.store); + } + + fn call_datapack(&mut self, len: i32) -> i32 { + if let Some(datapack) = &self.functions.datapack_fn { + datapack.call(&mut self.store, len).unwrap() + } else { + 0 + } } fn call_update(&mut self) { - call(&self.functions.update_fn, &mut self.store); + call(self.functions.update_fn.as_ref(), &mut self.store); } fn call_draw(&mut self) { - call(&self.functions.draw_fn, &mut self.store); + call(self.functions.draw_fn.as_ref(), &mut self.store); } fn rom(&self) -> &Rom { @@ -294,18 +326,18 @@ impl Console for WasmConsole { buffer.copy_from_slice(&self.store.data().draw_context.frame_buffer.pixel_buffer); } - fn handle_requests(&mut self, requests: Vec>) { + fn handle_requests(&mut self, requests: Vec>) { for request in requests { match request { - GGRSRequest::SaveGameState { cell, frame } => { + GgrsRequest::SaveGameState { cell, frame } => { let state = self.generate_save_state(); cell.save(frame, Some(state), None); } - GGRSRequest::LoadGameState { cell, .. } => { + GgrsRequest::LoadGameState { cell, .. } => { let state = cell.load().expect("Failed to load game state"); self.load_save_state(state); } - GGRSRequest::AdvanceFrame { inputs } => { + GgrsRequest::AdvanceFrame { inputs } => { // Copy new inputs into the state self.store .data_mut() @@ -342,4 +374,16 @@ impl Console for WasmConsole { } } } + + fn memory_usage(&mut self) -> usize { + // Used memory in bytes + let ignored_bytes = self.memory_values.image_length + + (self.memory_values.datapack_end - self.memory_values.datapack_start); + let memory = self + .instance + .get_memory(&mut self.store, WASM_MEMORY) + .unwrap(); + + memory.data_size(&self.store) - ignored_bytes + } } diff --git a/gamercade_console/src/gui/framework.rs b/gamercade_console/src/gui/framework.rs index e65ca832..24ccc1ea 100644 --- a/gamercade_console/src/gui/framework.rs +++ b/gamercade_console/src/gui/framework.rs @@ -1,3 +1,8 @@ +use std::{ + collections::VecDeque, + f32::{INFINITY, NEG_INFINITY}, +}; + use egui::{ClippedPrimitive, Context, TexturesDelta}; use egui_wgpu::renderer::{Renderer, ScreenDescriptor}; use ggrs::P2PSession; @@ -22,6 +27,76 @@ pub(crate) struct Framework { // Our stuff pub gui: Gui, + + pub perf_tracker: PerformanceTracker, +} + +#[derive(Default)] +pub struct PerformanceTracker { + render_times_ms: VecDeque, + update_times_ms: VecDeque, + pub frames_per_second: usize, + pub memory_usage: usize, +} + +pub struct PerformanceResult { + pub max_render_time_ms: f32, + pub min_render_time_ms: f32, + + pub max_update_time_ms: f32, + pub min_update_time_ms: f32, + + pub average_render_time_ms: f32, + pub average_update_time_ms: f32, +} + +impl PerformanceTracker { + pub fn push_times(&mut self, render_time_ms: f32, update_time_ms: f32) { + if self.render_times_ms.len() >= self.frames_per_second { + self.render_times_ms.pop_back(); + } + + if self.update_times_ms.len() >= self.frames_per_second { + self.update_times_ms.pop_back(); + } + + self.render_times_ms.push_front(render_time_ms); + self.update_times_ms.push_front(update_time_ms); + } + + fn calc_min_max_avg<'a>(data: &'a mut impl Iterator) -> (f32, f32, f32) { + let mut min = INFINITY; + let mut max = NEG_INFINITY; + let mut sum = 0.0; + let mut count = 0; + + for point in data.by_ref() { + sum += point; + max = max.max(*point); + min = min.min(*point); + count += 1; + } + + let avg = sum / count as f32; + + (min, max, avg) + } + + pub fn calculate_frame_times(&self) -> PerformanceResult { + let (min_render_time_ms, max_render_time_ms, average_render_time_ms) = + Self::calc_min_max_avg(&mut self.render_times_ms.iter()); + let (min_update_time_ms, max_update_time_ms, average_update_time_ms) = + Self::calc_min_max_avg(&mut self.update_times_ms.iter()); + + PerformanceResult { + max_render_time_ms, + min_render_time_ms, + max_update_time_ms, + min_update_time_ms, + average_render_time_ms, + average_update_time_ms, + } + } } impl Framework { @@ -55,6 +130,7 @@ impl Framework { paint_jobs: Vec::new(), textures, gui, + perf_tracker: PerformanceTracker::default(), } } @@ -88,7 +164,15 @@ impl Framework { let raw_input = self.egui_state.take_egui_input(window); let output = self.egui_ctx.run(raw_input, |egui_ctx| { // Draw the application. - self.gui.ui(pixels, window, session, egui_ctx, input, gilrs); + self.gui.ui( + pixels, + window, + session, + egui_ctx, + input, + gilrs, + &self.perf_tracker, + ); }); self.textures.append(output.textures_delta); diff --git a/gamercade_console/src/gui/mod.rs b/gamercade_console/src/gui/mod.rs index 3455bfd6..b464fa6e 100644 --- a/gamercade_console/src/gui/mod.rs +++ b/gamercade_console/src/gui/mod.rs @@ -14,7 +14,9 @@ use crate::{ DEFAULT_WINDOW_RESOLUTION, }; -use self::{controller_gui::ControllerGui, play_mode_gui::PlayModeGui}; +use self::{ + controller_gui::ControllerGui, framework::PerformanceTracker, play_mode_gui::PlayModeGui, +}; pub mod controller_gui; pub mod framework; pub mod play_mode_gui; @@ -59,6 +61,7 @@ impl Gui { ctx: &Context, input: &mut LocalInputManager, gilrs: &mut Gilrs, + perf: &PerformanceTracker, ) { let mut is_open = self.window_open; egui::Window::new("Main Menu") @@ -136,6 +139,26 @@ impl Gui { *session = None; } }); + + ui.separator(); + let averages = perf.calculate_frame_times(); + ui.label("Update Stats:"); + ui.label(format!("avg {}ms", averages.average_update_time_ms)); + ui.label(format!("min {}ms", averages.min_update_time_ms)); + ui.label(format!("max {}ms", averages.max_update_time_ms)); + + ui.separator(); + ui.label("Render Stats:"); + ui.label(format!("avg {}ms", averages.average_render_time_ms)); + ui.label(format!("min {}ms", averages.min_render_time_ms)); + ui.label(format!("max {}ms", averages.max_render_time_ms)); + + ui.separator(); + let mem_mb = perf.memory_usage as f32 / (1024 * 1024) as f32; + let mem_kb = perf.memory_usage as f32 / 1024.0; + let mem_b = perf.memory_usage; + ui.label("Memory Usage:"); + ui.label(format!("{mem_mb}mb, {mem_kb}kb, {mem_b}b")); }); } @@ -149,7 +172,7 @@ impl Gui { ) -> Option> { let rom = match Rom::try_load(&game_path) { Err(e) => { - println!("{e}"); + println!("fast_launch_game: {e}"); return None; } Ok(rom) => rom, @@ -188,6 +211,7 @@ impl Gui { session_descriptor.port, &session_descriptor.player_types, ); + (new_session.max_prediction(), new_session) }; @@ -214,7 +238,7 @@ impl Gui { let rom = match Rom::try_load(path) { Err(e) => { - println!("{e}"); + println!("try_launch_game: {e}"); return None; } Ok(rom) => rom, @@ -232,6 +256,8 @@ fn init_session( players: &[PlayerType], ) -> P2PSession { let mut sess_builder = SessionBuilder::new() + .with_input_delay(rom.frame_rate.default_input_delay()) + .with_sparse_saving_mode(true) .with_num_players(players.len()) .with_fps(rom.frame_rate.frames_per_second()) .unwrap(); diff --git a/gamercade_console/src/main.rs b/gamercade_console/src/main.rs index e81b9c7f..c7a33dd8 100644 --- a/gamercade_console/src/main.rs +++ b/gamercade_console/src/main.rs @@ -9,10 +9,10 @@ use std::{ }; use clap::Parser; -use gamercade_core::Resolution; -use ggrs::{GGRSError, P2PSession, SessionState}; +use gamercade_core::{Ratio, Resolution, Size}; +use ggrs::{GgrsError, P2PSession, SessionState}; use gilrs::Gilrs; -use pixels::{Pixels, SurfaceTexture}; +use pixels::{wgpu::PresentMode, Pixels, PixelsBuilder, SurfaceTexture}; use winit::{ dpi::LogicalSize, event::{DeviceEvent, Event, MouseScrollDelta, VirtualKeyCode}, @@ -150,6 +150,9 @@ fn main() -> Result<(), Box> { } if let Some(console) = &mut framework.gui.wasm_console { + framework.perf_tracker.frames_per_second = + console.rom.frame_rate.frames_per_second(); + // Handle GGRS packets let session = session.as_mut().unwrap(); session.poll_remote_clients(); @@ -199,7 +202,7 @@ fn main() -> Result<(), Box> { Ok(requests) => { console.handle_requests(requests); } - Err(GGRSError::PredictionThreshold) => (), + Err(GgrsError::PredictionThreshold) => (), Err(e) => panic!("{}", e), } } @@ -210,9 +213,22 @@ fn main() -> Result<(), Box> { // Sync the mouse lock state console.sync_mouse(&window); + let update_time_ms = + Instant::now().duration_since(last_update).as_secs_f32() * 1000.0; + let render_start_time = Instant::now(); // Render the game console.call_draw(); console.blit(pixels.frame_mut()); + let render_time_ms = Instant::now() + .duration_since(render_start_time) + .as_secs_f32() + * 1000.0; + + framework + .perf_tracker + .push_times(render_time_ms, update_time_ms); + + framework.perf_tracker.memory_usage = console.memory_usage() }; }; @@ -233,7 +249,10 @@ fn main() -> Result<(), Box> { }); } -const DEFAULT_WINDOW_RESOLUTION: Resolution = Resolution::High; +const DEFAULT_WINDOW_RESOLUTION: Resolution = Resolution { + size: Size::Medium, + ratio: Ratio::Standard, +}; fn init_window(event_loop: &EventLoop<()>) -> Window { let size = LogicalSize::new( @@ -252,5 +271,8 @@ fn init_pixels(window: &Window) -> Pixels { let window_size = window.inner_size(); let surface_texture = SurfaceTexture::new(window_size.width, window_size.height, &window); - Pixels::new(320, 180, surface_texture).unwrap() + PixelsBuilder::new(320, 180, surface_texture) + .present_mode(PresentMode::AutoVsync) + .build() + .unwrap() } diff --git a/gamercade_core/Cargo.toml b/gamercade_core/Cargo.toml index 25c612ea..ccc351d6 100644 --- a/gamercade_core/Cargo.toml +++ b/gamercade_core/Cargo.toml @@ -13,5 +13,5 @@ repository = "https://github.com/gamercade-io/gamercade_rs" serde = { version = "1.0.163", features = ["derive"] } serde-big-array = "0.5.1" base64 = "0.21.0" -bytemuck = { version = "1.13.1", features = ["derive"] } +bytemuck = { version = "1.15.0", features = ["derive"] } strum = { version = "0.24.1", features = ["derive"] } diff --git a/gamercade_core/src/graphics/frame_rate.rs b/gamercade_core/src/graphics/frame_rate.rs index a8f1a66a..1975174b 100644 --- a/gamercade_core/src/graphics/frame_rate.rs +++ b/gamercade_core/src/graphics/frame_rate.rs @@ -1,29 +1,52 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +#[derive(Default, Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "lowercase")] pub enum FrameRate { - SuperSlow, + UltraSlow, + VerySlow, Slow, + Moderate, + #[default] Normal, Fast, - SuperFast, + UltraFast, } -impl Default for FrameRate { - fn default() -> Self { - Self::Normal +impl FrameRate { + pub const fn as_str(&self) -> &str { + match self { + FrameRate::UltraSlow => "Ultra Slow", + FrameRate::VerySlow => "Very Slow", + FrameRate::Slow => "Slow", + FrameRate::Moderate => "Moderate", + FrameRate::Normal => "Normal", + FrameRate::Fast => "Fast", + FrameRate::UltraFast => "Ultra Fast", + } } -} -impl FrameRate { pub const fn frames_per_second(self) -> usize { match self { - FrameRate::SuperSlow => 24, + FrameRate::UltraSlow => 12, + FrameRate::VerySlow => 24, FrameRate::Slow => 30, + FrameRate::Moderate => 48, FrameRate::Normal => 60, FrameRate::Fast => 120, - FrameRate::SuperFast => 240, + FrameRate::UltraFast => 240, + } + } + + pub const fn default_input_delay(self) -> usize { + match self { + FrameRate::UltraSlow => 0, + FrameRate::VerySlow => 0, + FrameRate::Slow => 0, + FrameRate::Moderate => 1, + FrameRate::Normal => 1, + FrameRate::Fast => 2, + FrameRate::UltraFast => 3, } } diff --git a/gamercade_core/src/graphics/resolution.rs b/gamercade_core/src/graphics/resolution.rs index b218eec9..809c8cac 100644 --- a/gamercade_core/src/graphics/resolution.rs +++ b/gamercade_core/src/graphics/resolution.rs @@ -1,49 +1,106 @@ use serde::{Deserialize, Serialize}; -#[non_exhaustive] -#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +const fn standard_resolution(size: Size) -> (i32, i32) { + match size { + Size::UltraLow => (128, 72), + Size::VeryLow => (160, 90), + Size::Low => (320, 180), + Size::Medium => (480, 270), + Size::High => (640, 360), + Size::VeryHigh => (1280, 720), + Size::UltraHigh => (1920, 1080), + } +} + +const fn square_resolution(size: Size) -> (i32, i32) { + match size { + Size::UltraLow => (64, 64), + Size::VeryLow => (128, 128), + Size::Low => (256, 256), + Size::Medium => (384, 384), + Size::High => (512, 512), + Size::VeryHigh => (768, 768), + Size::UltraHigh => (1024, 1024), + } +} + +const fn classic_resolution(size: Size) -> (i32, i32) { + match size { + Size::UltraLow => (120, 90), + Size::VeryLow => (160, 120), + Size::Low => (240, 180), + Size::Medium => (360, 270), + Size::High => (480, 360), + Size::VeryHigh => (960, 720), + Size::UltraHigh => (1440, 1080), + } +} + +#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] -pub enum Resolution { - UltraLow, // 128 x 72 - VeryLow, // 160 x 90 - Low, // 320 x 180 - Medium, // 480 x 270 - High, // 640 x 360 - VeryHigh, // 1280 x 720 - UltraHigh, // 1920 x 1080 +pub enum Size { + UltraLow, + VeryLow, + Low, + #[default] + Medium, + High, + VeryHigh, + UltraHigh, +} +impl Size { + pub const fn as_str(&self) -> &str { + match self { + Size::UltraLow => "Ultra Low", + Size::VeryLow => "Very Low", + Size::Low => "Low", + Size::Medium => "Medium", + Size::High => "High", + Size::VeryHigh => "Very High", + Size::UltraHigh => "Ultra High", + } + } } -impl Resolution { - // Width, Height - pub const ULTRALOW: (i32, i32) = (128, 72); - pub const VERYLOW: (i32, i32) = (160, 90); - pub const LOW: (i32, i32) = (320, 180); - pub const MEDIUM: (i32, i32) = (480, 270); - pub const HIGH: (i32, i32) = (640, 360); - pub const VERYHIGH: (i32, i32) = (1280, 720); - pub const ULTRAHIGH: (i32, i32) = (1920, 1080); +#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum Ratio { + #[default] + Standard, + Square, + Classic, +} - pub const fn width(&self) -> i32 { +impl Ratio { + pub const fn as_str(&self) -> &str { match self { - Self::UltraLow => Self::ULTRALOW.0, - Self::VeryLow => Self::VERYLOW.0, - Self::Low => Self::LOW.0, - Self::Medium => Self::MEDIUM.0, - Self::High => Self::HIGH.0, - Self::VeryHigh => Self::VERYHIGH.0, - Self::UltraHigh => Self::ULTRAHIGH.0, + Ratio::Standard => "Standard (16:9)", + Ratio::Square => "Square (1:1)", + Ratio::Classic => "Classic (4:3)", } } +} + +#[derive(Default, Clone, Copy, Debug, Serialize, Deserialize)] +pub struct Resolution { + pub size: Size, + pub ratio: Ratio, +} + +impl Resolution { + pub const fn width(&self) -> i32 { + self.ratio_helper().0 + } pub const fn height(&self) -> i32 { - match self { - Self::UltraLow => Self::ULTRALOW.1, - Self::VeryLow => Self::VERYLOW.1, - Self::Low => Self::LOW.1, - Self::Medium => Self::MEDIUM.1, - Self::High => Self::HIGH.1, - Self::VeryHigh => Self::VERYHIGH.1, - Self::UltraHigh => Self::ULTRAHIGH.1, + self.ratio_helper().1 + } + + const fn ratio_helper(&self) -> (i32, i32) { + match self.ratio { + Ratio::Standard => standard_resolution(self.size), + Ratio::Square => square_resolution(self.size), + Ratio::Classic => classic_resolution(self.size), } } @@ -52,32 +109,22 @@ impl Resolution { } pub fn try_get_xcord>(&self, value: T) -> Option { - match value.try_into() { - Ok(v) => match 0 <= v && v < self.width() { - true => Some(XCord(v as usize)), - false => None, - }, - _ => None, + let v = value.into(); + match 0 <= v && v < self.width() { + true => Some(XCord(v as usize)), + false => None, } } pub fn try_get_ycord>(&self, value: T) -> Option { - match value.try_into() { - Ok(v) => match 0 <= v && v < self.height() { - true => Some(YCord(v as usize)), - false => None, - }, - _ => None, + let v = value.into(); + match 0 <= v && v < self.height() { + true => Some(YCord(v as usize)), + false => None, } } } -impl Default for Resolution { - fn default() -> Self { - Resolution::Low - } -} - #[non_exhaustive] #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)] pub struct XCord(usize); diff --git a/gamercade_core/src/lib.rs b/gamercade_core/src/lib.rs index be1171a2..12c88e47 100644 --- a/gamercade_core/src/lib.rs +++ b/gamercade_core/src/lib.rs @@ -5,3 +5,5 @@ pub use graphics::*; pub use input::*; pub const BYTES_PER_PIXEL: usize = 4; + +pub const MAX_ROM_SIZE: usize = 1024 * 1024 * 16; // 16mb diff --git a/gamercade_editor/Cargo.toml b/gamercade_editor/Cargo.toml index 7449bf89..4b3e8172 100644 --- a/gamercade_editor/Cargo.toml +++ b/gamercade_editor/Cargo.toml @@ -20,7 +20,7 @@ gamercade_sound_engine = { path = "../gamercade_sound_engine" } serde = { version = "1.0.163", features = ["derive"] } # Window and Rendering -eframe = "0.21.3" +eframe = "0.22.0" # File Dialogs rfd = "0.11.3" @@ -29,9 +29,9 @@ rfd = "0.11.3" image = "0.24.6" # General Improvements -hashbrown = "0.13.2" +hashbrown = "0.14.3" tinystr = "0.7.1" # Audio Things -rtrb = "0.2.3" +rtrb = "0.3.0" hound = "3.5.0" \ No newline at end of file diff --git a/gamercade_editor/src/ui/audio/instrument_editor/interpolator_widget.rs b/gamercade_editor/src/ui/audio/instrument_editor/interpolator_widget.rs index 9b5c870c..961c463d 100644 --- a/gamercade_editor/src/ui/audio/instrument_editor/interpolator_widget.rs +++ b/gamercade_editor/src/ui/audio/instrument_editor/interpolator_widget.rs @@ -21,11 +21,12 @@ impl InterpolatorWidget { .selected_text(format!("{:?}", &interpolator)) .show_ui(ui, |ui| { if ui - .selectable_value(interpolator, IndexInterpolator::Linear, "Linear") + .selectable_value(interpolator, IndexInterpolator::Truncate, "Truncate") .clicked() { should_notify = true; }; + if ui .selectable_value( interpolator, @@ -36,8 +37,9 @@ impl InterpolatorWidget { { should_notify = true; }; + if ui - .selectable_value(interpolator, IndexInterpolator::Truncate, "Truncate") + .selectable_value(interpolator, IndexInterpolator::Linear, "Linear") .clicked() { should_notify = true; diff --git a/gamercade_editor/src/ui/audio/oscilloscope.rs b/gamercade_editor/src/ui/audio/oscilloscope.rs index cefeaf74..80d04dfd 100644 --- a/gamercade_editor/src/ui/audio/oscilloscope.rs +++ b/gamercade_editor/src/ui/audio/oscilloscope.rs @@ -70,7 +70,7 @@ impl Oscilloscope { self.points = std::mem::take(&mut self.next_points); //Find the zero cross - while let (Some(prev), Some(next)) = (self.buffer.get(0), self.buffer.get(1)) { + while let (Some(prev), Some(next)) = (self.buffer.front(), self.buffer.get(1)) { let prev = prev.get_sfx_output() + prev.get_bgm_output(); let next = next.get_sfx_output() + next.get_bgm_output(); if prev < 0.0 && next > 0.0 { diff --git a/gamercade_editor/src/ui/audio/sequences/chain_editor/chain_row.rs b/gamercade_editor/src/ui/audio/sequences/chain_editor/chain_row.rs index 1a0211e1..509f3081 100644 --- a/gamercade_editor/src/ui/audio/sequences/chain_editor/chain_row.rs +++ b/gamercade_editor/src/ui/audio/sequences/chain_editor/chain_row.rs @@ -17,7 +17,7 @@ impl ChainRow { } } - pub(super) fn new(row: usize, entry: &Option, selected_index: usize) -> Self { + pub(super) fn new(row: usize, entry: Option, selected_index: usize) -> Self { let bg_color = if selected_index == row { Some(SELECTED_BG_COLOR) } else { diff --git a/gamercade_editor/src/ui/audio/sequences/chain_editor/mod.rs b/gamercade_editor/src/ui/audio/sequences/chain_editor/mod.rs index 2cab3dcb..48a6209b 100644 --- a/gamercade_editor/src/ui/audio/sequences/chain_editor/mod.rs +++ b/gamercade_editor/src/ui/audio/sequences/chain_editor/mod.rs @@ -62,9 +62,9 @@ impl ChainEditor { ui.input(|input| { if input.modifiers.shift { - self.handle_shift_input(&input, chain, sync); + self.handle_shift_input(input, chain, sync); } else { - self.handle_input(&input) + self.handle_input(input) } }); }; @@ -172,7 +172,8 @@ impl ChainEditor { .enumerate() .for_each(|(row, entry)| { ui.horizontal_centered(|ui| { - let phrase_row = ChainRow::new(row, entry, self.selected_index); + let phrase_row = + ChainRow::new(row, entry.to_owned(), self.selected_index); if phrase_row.draw(ui) { self.selected_index = row; } diff --git a/gamercade_editor/src/ui/audio/sequences/phrase_editor/mod.rs b/gamercade_editor/src/ui/audio/sequences/phrase_editor/mod.rs index f3c294f0..3b26d272 100644 --- a/gamercade_editor/src/ui/audio/sequences/phrase_editor/mod.rs +++ b/gamercade_editor/src/ui/audio/sequences/phrase_editor/mod.rs @@ -122,9 +122,9 @@ impl PhraseEditor { ui.input(|input| { if input.modifiers.shift { - self.handle_shift_input(&input, phrase, sync); + self.handle_shift_input(input, phrase, sync); } else { - self.handle_input(&input) + self.handle_input(input) } }); } @@ -263,7 +263,8 @@ impl PhraseEditor { .enumerate() .for_each(|(row, entry)| { ui.horizontal_centered(|ui| { - let phrase_row = PhraseRow::new(row, entry, self.selected_entry); + let phrase_row = + PhraseRow::new(row, entry.as_ref(), self.selected_entry); if let Some(selected) = phrase_row.draw(ui) { self.selected_entry.index = row; self.selected_entry.mode = selected; diff --git a/gamercade_editor/src/ui/audio/sequences/phrase_editor/phrase_row.rs b/gamercade_editor/src/ui/audio/sequences/phrase_editor/phrase_row.rs index 9d844859..ad8e0759 100644 --- a/gamercade_editor/src/ui/audio/sequences/phrase_editor/phrase_row.rs +++ b/gamercade_editor/src/ui/audio/sequences/phrase_editor/phrase_row.rs @@ -27,7 +27,7 @@ impl PhraseRow { pub(crate) fn new( row: usize, - entry: &Option, + entry: Option<&PhraseEntryType>, selected: SelectedEntry, ) -> Self { let bg_color = if selected.index == row { diff --git a/gamercade_editor/src/ui/audio/sequences/song_editor/mod.rs b/gamercade_editor/src/ui/audio/sequences/song_editor/mod.rs index fee960a4..93fc33af 100644 --- a/gamercade_editor/src/ui/audio/sequences/song_editor/mod.rs +++ b/gamercade_editor/src/ui/audio/sequences/song_editor/mod.rs @@ -89,10 +89,10 @@ impl SongEditor { let song_channels = &mut song.tracks[self.selected_entry.selected_row]; if let Some(selected_channel) = self.selected_entry.selected_channel { let chain = song_channels.get_mut(selected_channel).unwrap(); - self.handle_shift_input(&input, chain, sync); + self.handle_shift_input(input, chain, sync); } } else { - self.handle_input(&input, song); + self.handle_input(input, song); } }); } else { diff --git a/gamercade_editor/src/ui/rom_editor.rs b/gamercade_editor/src/ui/rom_editor.rs index 0f7aba55..8ad50184 100644 --- a/gamercade_editor/src/ui/rom_editor.rs +++ b/gamercade_editor/src/ui/rom_editor.rs @@ -1,9 +1,8 @@ -use eframe::egui::{self, Ui}; -use gamercade_core::{ - FrameRate, - Resolution::{High, Low, Medium, UltraHigh, UltraLow, VeryHigh, VeryLow}, -}; -use gamercade_fs::EditorRom; +use std::fs; + +use eframe::egui::{self, Button, Ui}; +use gamercade_core::{FrameRate, Ratio, Size}; +use gamercade_fs::{DataPack, EditorRom}; #[derive(Debug, Clone, Default)] pub struct RomEditor {} @@ -12,18 +11,56 @@ impl RomEditor { pub fn draw_contents(&self, ui: &mut Ui, rom: &mut EditorRom) { ui.group(|ui| { ui.label(format!( - "Resolution: {} x {}", + "Resolution: {} x {} {}", rom.resolution.width(), - rom.resolution.height() + rom.resolution.height(), + rom.resolution.ratio.as_str(), )); ui.horizontal(|ui| { - ui.selectable_value(&mut rom.resolution, UltraLow, "Ultra Low"); - ui.selectable_value(&mut rom.resolution, VeryLow, "Very Low"); - ui.selectable_value(&mut rom.resolution, Low, "Low"); - ui.selectable_value(&mut rom.resolution, Medium, "Medium"); - ui.selectable_value(&mut rom.resolution, High, "High"); - ui.selectable_value(&mut rom.resolution, VeryHigh, "Very High"); - ui.selectable_value(&mut rom.resolution, UltraHigh, "Ultra High"); + ui.selectable_value( + &mut rom.resolution.ratio, + Ratio::Standard, + Ratio::Standard.as_str(), + ); + ui.selectable_value( + &mut rom.resolution.ratio, + Ratio::Square, + Ratio::Square.as_str(), + ); + ui.selectable_value( + &mut rom.resolution.ratio, + Ratio::Classic, + Ratio::Classic.as_str(), + ); + }); + ui.horizontal(|ui| { + ui.selectable_value( + &mut rom.resolution.size, + Size::UltraLow, + Size::UltraLow.as_str(), + ); + ui.selectable_value( + &mut rom.resolution.size, + Size::VeryLow, + Size::VeryLow.as_str(), + ); + ui.selectable_value(&mut rom.resolution.size, Size::Low, Size::Low.as_str()); + ui.selectable_value( + &mut rom.resolution.size, + Size::Medium, + Size::Medium.as_str(), + ); + ui.selectable_value(&mut rom.resolution.size, Size::High, Size::High.as_str()); + ui.selectable_value( + &mut rom.resolution.size, + Size::VeryHigh, + Size::VeryHigh.as_str(), + ); + ui.selectable_value( + &mut rom.resolution.size, + Size::UltraHigh, + Size::UltraHigh.as_str(), + ); }); }); @@ -33,11 +70,41 @@ impl RomEditor { rom.frame_rate.frames_per_second() )); ui.horizontal(|ui| { - ui.selectable_value(&mut rom.frame_rate, FrameRate::SuperSlow, "Super Slow"); - ui.selectable_value(&mut rom.frame_rate, FrameRate::Slow, "Slow"); - ui.selectable_value(&mut rom.frame_rate, FrameRate::Normal, "Normal"); - ui.selectable_value(&mut rom.frame_rate, FrameRate::Fast, "Fast"); - ui.selectable_value(&mut rom.frame_rate, FrameRate::SuperFast, "Super Fast"); + ui.selectable_value( + &mut rom.frame_rate, + FrameRate::UltraSlow, + FrameRate::UltraSlow.as_str(), + ); + ui.selectable_value( + &mut rom.frame_rate, + FrameRate::VerySlow, + FrameRate::VerySlow.as_str(), + ); + ui.selectable_value( + &mut rom.frame_rate, + FrameRate::Slow, + FrameRate::Slow.as_str(), + ); + ui.selectable_value( + &mut rom.frame_rate, + FrameRate::Moderate, + FrameRate::Moderate.as_str(), + ); + ui.selectable_value( + &mut rom.frame_rate, + FrameRate::Normal, + FrameRate::Normal.as_str(), + ); + ui.selectable_value( + &mut rom.frame_rate, + FrameRate::Fast, + FrameRate::Fast.as_str(), + ); + ui.selectable_value( + &mut rom.frame_rate, + FrameRate::UltraFast, + FrameRate::UltraFast.as_str(), + ); }); }); @@ -57,5 +124,45 @@ impl RomEditor { ); }); }); + + ui.group(|ui| { + let exists = rom.data_pack.is_some(); + let text = if exists { "Exists" } else { "None" }; + ui.label(format!("Data Pack: {text}")); + + ui.horizontal(|ui| { + if ui + .add_enabled(!exists, Button::new("Load Data Pack")) + .clicked() + { + match try_load_data_pack() { + Ok(data_pack) => rom.data_pack = Some(data_pack), + Err(e) => println!("{e}"), + } + } + + if ui + .add_enabled(exists, Button::new("Remove Data Pack")) + .clicked() + { + rom.data_pack = None + } + }); + }); } } + +fn try_load_data_pack() -> Result { + let path = match rfd::FileDialog::new() + .set_title("Load Data Pack...") + .set_directory("/") + .pick_file() + { + Some(path) => path, + None => return Err("No file selected".to_string()), + }; + + let data = fs::read(path).map_err(|e| e.to_string())?; + + Ok(DataPack { data }) +} diff --git a/gamercade_fs/Cargo.toml b/gamercade_fs/Cargo.toml index a029b9d4..ddb9b77e 100644 --- a/gamercade_fs/Cargo.toml +++ b/gamercade_fs/Cargo.toml @@ -16,4 +16,6 @@ gamercade_core = { path = "../gamercade_core" } serde = { version = "1.0.163", features = ["derive"] } bincode = "1.3.3" serde_json = "1.0.96" -zstd = "0.12.3" \ No newline at end of file +zstd = "0.12.3" +base64 = "0.22.0" +bytemuck = "1.15.0" \ No newline at end of file diff --git a/gamercade_fs/src/bundler.rs b/gamercade_fs/src/bundler.rs index a0c2bcc5..75fddad6 100644 --- a/gamercade_fs/src/bundler.rs +++ b/gamercade_fs/src/bundler.rs @@ -1,7 +1,7 @@ use gamercade_audio::SoundRom; use gamercade_core::{FrameRate, GraphicsData, Resolution}; -use crate::Rom; +use crate::{DataPack, Rom}; /// Provides .wasm game code to produce a game Rom pub trait GameCodeProvider { @@ -24,6 +24,7 @@ pub trait GameAssetProvider { fn player_count(&self) -> (usize, usize); fn graphics(&self) -> GraphicsData; fn sounds(&self) -> SoundRom; + fn data_pack(&self) -> Option; } /// Generates a ready-to-use Rom. @@ -39,5 +40,6 @@ where graphics: asset_provider.graphics(), sounds: asset_provider.sounds(), code: code_provider.code().into(), + data_pack: asset_provider.data_pack(), } } diff --git a/gamercade_fs/src/data_pack.rs b/gamercade_fs/src/data_pack.rs new file mode 100644 index 00000000..f7d3da67 --- /dev/null +++ b/gamercade_fs/src/data_pack.rs @@ -0,0 +1,40 @@ +use serde::{Deserialize, Serialize}; + +use base64::{engine::GeneralPurpose, Engine}; +const BASE64ENGINE: GeneralPurpose = base64::engine::general_purpose::STANDARD; + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(transparent)] +pub struct DataPack { + #[serde(serialize_with = "ser_data_pack", deserialize_with = "de_data_pack")] + pub data: Vec, +} + +pub(crate) fn de_data_pack<'de, D>(deserializer: D) -> Result, D::Error> +where + D: serde::Deserializer<'de>, +{ + let bytes = if deserializer.is_human_readable() { + let text: String = serde::Deserialize::deserialize(deserializer)?; + BASE64ENGINE + .decode(text) + .map_err(serde::de::Error::custom)? + } else { + serde::Deserialize::deserialize(deserializer)? + }; + + Ok(bytes) +} + +pub(crate) fn ser_data_pack(data: &[u8], serializer: S) -> Result +where + S: serde::Serializer, +{ + let data: Vec = data.to_vec(); + if serializer.is_human_readable() { + let data = BASE64ENGINE.encode(data); + serializer.serialize_str(&data) + } else { + serializer.serialize_bytes(&data) + } +} diff --git a/gamercade_fs/src/editor_data/editor_rom.rs b/gamercade_fs/src/editor_data/editor_rom.rs index bd7b71d3..f0398032 100644 --- a/gamercade_fs/src/editor_data/editor_rom.rs +++ b/gamercade_fs/src/editor_data/editor_rom.rs @@ -4,7 +4,7 @@ use gamercade_audio::SoundRom; use gamercade_core::{FrameRate, GraphicsData, Resolution}; use serde::{Deserialize, Serialize}; -use crate::GameAssetProvider; +use crate::{DataPack, GameAssetProvider}; use super::{EditorGraphicsData, EditorSoundData}; @@ -15,6 +15,7 @@ pub struct EditorRom { pub player_count: (usize, usize), pub graphics: EditorGraphicsData, pub sounds: EditorSoundData, + pub data_pack: Option, } impl EditorRom { @@ -40,6 +41,7 @@ impl Default for EditorRom { frame_rate: FrameRate::default(), graphics: EditorGraphicsData::default(), sounds: EditorSoundData::default(), + data_pack: None, } } } @@ -64,4 +66,8 @@ impl GameAssetProvider for EditorRom { fn sounds(&self) -> SoundRom { (&self.sounds).into() } + + fn data_pack(&self) -> Option { + self.data_pack.clone() + } } diff --git a/gamercade_fs/src/lib.rs b/gamercade_fs/src/lib.rs index c516e390..2c82cf25 100644 --- a/gamercade_fs/src/lib.rs +++ b/gamercade_fs/src/lib.rs @@ -1,8 +1,10 @@ mod bundler; +mod data_pack; mod editor_data; mod rom; pub use bundler::*; +pub use data_pack::*; pub use editor_data::*; pub use rom::*; diff --git a/gamercade_fs/src/rom.rs b/gamercade_fs/src/rom.rs index e6a02e6e..c170939e 100644 --- a/gamercade_fs/src/rom.rs +++ b/gamercade_fs/src/rom.rs @@ -1,15 +1,11 @@ -use std::{ - fs, - io::{Read, Write}, - path::PathBuf, -}; +use std::{fs, io::Write, path::PathBuf}; use serde::{Deserialize, Serialize}; use gamercade_audio::SoundRom; -use gamercade_core::{FrameRate, GraphicsData, Resolution}; +use gamercade_core::{FrameRate, GraphicsData, Resolution, MAX_ROM_SIZE}; -use crate::{bundle, EditorRom, GameAssetProvider, GameCodeProvider}; +use crate::{bundle, DataPack, EditorRom, GameAssetProvider, GameCodeProvider}; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Rom { @@ -19,6 +15,7 @@ pub struct Rom { pub graphics: GraphicsData, pub sounds: SoundRom, pub code: Box<[u8]>, + pub data_pack: Option, } impl Default for Rom { @@ -30,6 +27,7 @@ impl Default for Rom { sounds: Default::default(), code: Default::default(), player_count: (1, 1), + data_pack: Default::default(), } } } @@ -43,19 +41,27 @@ impl Rom { self.resolution.width() } + pub fn try_load_bytes(bytes: &[u8]) -> Result { + let reader = zstd::Decoder::new(bytes).map_err(|e| e.to_string())?; + bincode::deserialize_from::<_, Self>(reader).map_err(|e| e.to_string()) + } + pub fn try_load(path: &PathBuf) -> Result { let file = fs::File::open(path).map_err(|e| e.to_string())?; match path.extension().and_then(|path| path.to_str()) { Some("gcrom") => { - let mut reader = zstd::Decoder::new(file).map_err(|e| e.to_string())?; - - let mut buffer = Vec::new(); - - // We don't care about how many bytes are read - let _ = reader.read_to_end(&mut buffer).map_err(|e| e.to_string()); - - bincode::deserialize_from::<_, Rom>(&*buffer).map_err(|e| e.to_string()) + match file.metadata() { + Ok(metadata) => { + if metadata.len() > MAX_ROM_SIZE as u64 { + return Err(format!("File exceeds {MAX_ROM_SIZE} bytes.")); + } + } + Err(e) => return Err(e.to_string()), + } + + let reader = zstd::Decoder::new(file).map_err(|e| e.to_string())?; + bincode::deserialize_from::<_, Self>(reader).map_err(|e| e.to_string()) } Some("wasm") => { println!("No assets provided. Using default Asset pack."); @@ -106,4 +112,8 @@ impl GameAssetProvider for Rom { fn sounds(&self) -> SoundRom { self.sounds.clone() } + + fn data_pack(&self) -> Option { + self.data_pack.clone() + } } diff --git a/gamercade_interface/Cargo.toml b/gamercade_interface/Cargo.toml new file mode 100644 index 00000000..de8dcdaa --- /dev/null +++ b/gamercade_interface/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "gamercade_interface" +version = "0.1.0" +edition = "2021" +license = "MIT OR Apache-2.0" +description = "Interface definitions for Gamercade" +homepage = "https://gamercade.io" +repository = "https://github.com/gamercade-io/gamercade_interface" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tonic = "0.10.2" +prost = "0.12.3" +serde = { version = "1.0.163", features = ["derive"] } +crc = "3.2.0" + +[build-dependencies] +tonic-build = "0.10.2" diff --git a/gamercade_interface/README.md b/gamercade_interface/README.md new file mode 100644 index 00000000..7114bd95 --- /dev/null +++ b/gamercade_interface/README.md @@ -0,0 +1,21 @@ +# Gamercade Protos + +Proto Definitions for gRPC between client and back end. + +Banned passwords list from: +https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/10-million-password-list-top-10000.txt + +## License + +Licensed under either of + + * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +#### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in the work by you, as defined in the Apache-2.0 license, shall be +dual licensed as above, without any additional terms or conditions. diff --git a/gamercade_interface/build.rs b/gamercade_interface/build.rs new file mode 100644 index 00000000..a694f1f7 --- /dev/null +++ b/gamercade_interface/build.rs @@ -0,0 +1,35 @@ +use std::fs; + +const OUTPUT_DIR: &str = "src/output"; +const PROTO_DIR: &str = "proto"; + +fn main() -> Result<(), Box> { + // Prepare the output directory + if fs::read_dir(OUTPUT_DIR).is_ok() { + fs::remove_dir_all(OUTPUT_DIR)?; + }; + fs::create_dir(OUTPUT_DIR)?; + + // Gather the list of found proto files + let protos = fs::read_dir(PROTO_DIR) + .expect("Failed to find proto directory.") + .flat_map(|file| { + file.map(|file| match file.path().extension() { + Some(extension) if extension == "proto" => { + Some(file.path().to_string_lossy().to_string()) + } + _ => None, + }) + }) + .flatten() + .collect::>(); + + // Compile and output the proto files + tonic_build::configure() + .out_dir(OUTPUT_DIR) + .protoc_arg("--experimental_allow_proto3_optional") + .include_file("mod.rs") + .compile(&protos, &[PROTO_DIR])?; + + Ok(()) +} diff --git a/gamercade_interface/proto/auth.proto b/gamercade_interface/proto/auth.proto new file mode 100644 index 00000000..3829b7bb --- /dev/null +++ b/gamercade_interface/proto/auth.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; + +import "common.proto"; + +package auth; + +service AuthService { + rpc SignUp(SignUpRequest) returns (SessionResponse); + rpc Login(LoginRequest) returns (SessionResponse); + rpc UpdatePassword(UpdatePasswordRequest) returns (common.Empty); +} + +message SignUpRequest { + string username = 1; + string email = 2; + string password = 3; +} + +message LoginRequest { + string password = 1; + oneof provider { + string username = 2; + string email = 3; + }; +} + +message SessionResponse { + bytes session = 1; +} + +message UpdatePasswordRequest { + string previous_password = 1; + string new_password = 2; +} \ No newline at end of file diff --git a/gamercade_interface/proto/author.proto b/gamercade_interface/proto/author.proto new file mode 100644 index 00000000..96aaad0e --- /dev/null +++ b/gamercade_interface/proto/author.proto @@ -0,0 +1,38 @@ +syntax = "proto3"; + +import "common.proto"; + +package author; + +service AuthorService { + rpc AdjustGameAuthor(AdjustAuthorRequest) returns (AdjustAuthorResponse); + rpc GetGlobalPermissionLevels(common.Empty) returns (GlobalPermissionLevels); +} + +message AdjustAuthorRequest { + sfixed64 game_id = 1; + sfixed64 user_id = 2; + + optional string title = 3; + optional sint32 permission_level_id = 4; +} + +message AdjustAuthorResponse { + sfixed64 game_id = 1; + repeated Author authors = 2; +} + +message Author { + sfixed64 user_id = 1; + string title = 2; + int32 permission_level_id = 3; +} + +message GlobalPermissionLevels { + repeated PermissionLevel levels = 1; +} + +message PermissionLevel { + int32 id = 1; + string level_name = 2; +} \ No newline at end of file diff --git a/gamercade_interface/proto/common.proto b/gamercade_interface/proto/common.proto new file mode 100644 index 00000000..5f9ec363 --- /dev/null +++ b/gamercade_interface/proto/common.proto @@ -0,0 +1,5 @@ +syntax = "proto3"; + +package common; + +message Empty {} diff --git a/gamercade_interface/proto/game.proto b/gamercade_interface/proto/game.proto new file mode 100644 index 00000000..347c3e9d --- /dev/null +++ b/gamercade_interface/proto/game.proto @@ -0,0 +1,55 @@ +syntax = "proto3"; + +import "common.proto"; + +package game; + +service GameService { + rpc GetSingleGameInfo(SingleGameRequest) returns (GameInfoBasic); + rpc GetMultipleGamesInfo(MultipleGamesRequest) returns (MultipleGamesInfoResponse); + rpc GetGameDetailedInfo(SingleGameRequest) returns (GameInfoDetailed); + + rpc CreateGame(UpdateGameRequest) returns (GameInfoBasic); + rpc UpdateGame(UpdateGameRequest) returns (GameInfoBasic); + rpc DeleteGame(SingleGameRequest) returns (common.Empty); +} + +message UpdateGameRequest { + optional sfixed64 game_id = 1; + optional string title = 2; + optional string short_description = 3; + optional string long_description = 4; +} + +message SingleGameRequest { + sfixed64 game_id = 1; +} + +message MultipleGamesRequest { + repeated sfixed64 game_ids = 1; +} + +message MultipleGamesInfoResponse { + repeated GameInfoBasic games_info = 1; +} + +message GameInfoBasic { + sfixed64 game_id = 1; + string title = 2; + string short_description = 3; + float average_rating = 4; + repeated int32 tags = 5; + optional sfixed64 checksum = 6; + optional int64 rom_size = 7; +} + +message GameInfoDetailed { + GameInfoBasic basic_info = 1; + optional string long_description = 2; + repeated GameAuthor authors = 3; +} + +message GameAuthor { + sfixed64 user_id = 1; + string title = 2; +} diff --git a/gamercade_interface/proto/platform.proto b/gamercade_interface/proto/platform.proto new file mode 100644 index 00000000..968c2a1c --- /dev/null +++ b/gamercade_interface/proto/platform.proto @@ -0,0 +1,48 @@ +syntax = "proto3"; + +import "common.proto"; +import "game.proto"; + +package platform; + +service PlatformService { + rpc FrontPage(FrontPageRequest) returns (FrontPageResponse); + rpc GameSearch(GameSearchRequest) returns (game.MultipleGamesInfoResponse); + + rpc GetEditableGames(common.Empty) returns (EditableGamesResponse); + rpc GetVotedGames(common.Empty) returns (VotedGamesResponse); +} + +message FrontPageRequest { + +} + +message GameSearchRequest { + optional string name = 1; + repeated int32 tags = 2; +} + +message FrontPageResponse { + repeated game.GameInfoBasic games = 1; + repeated sfixed64 popular_games_ids = 2; + repeated sfixed64 top_rated_games_ids = 3; + repeated sfixed64 new_games_ids = 4; +} + +message EditableGamesResponse { + repeated EditableGame editable_games = 1; +} + +message EditableGame { + sfixed64 game_id = 1; + int32 permission_level = 2; +} + +message VotedGamesResponse { + repeated VotedGame voted_games = 1; +} + +message VotedGame { + sfixed64 game_id = 1; + bool vote_value = 2; +} \ No newline at end of file diff --git a/gamercade_interface/proto/review.proto b/gamercade_interface/proto/review.proto new file mode 100644 index 00000000..d201c6fb --- /dev/null +++ b/gamercade_interface/proto/review.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +import "common.proto"; +import "game.proto"; + +package review; + +service ReviewService { + rpc ReviewGame(ReviewGameRequest) returns (common.Empty); +} + +message ReviewGameRequest { + sfixed64 game_id = 1; + optional bool rating = 2; +} \ No newline at end of file diff --git a/gamercade_interface/proto/tag.proto b/gamercade_interface/proto/tag.proto new file mode 100644 index 00000000..ad768789 --- /dev/null +++ b/gamercade_interface/proto/tag.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; + +import "common.proto"; + +package tag; + +service TagService { + rpc AdjustGameTag(AdjustGameTagRequest) returns (AdjustGameTagResponse); + rpc GetGlobalTags(common.Empty) returns (GlobalTags); +} + +message AdjustGameTagRequest { + sfixed64 game_id = 1; + int32 tag_id = 2; + bool set_to = 3; +} + +message AdjustGameTagResponse { + sfixed64 game_id = 1; + repeated Tag tags = 2; +} + +message Tag { + int32 pid = 1; + string name = 2; +} + +message GlobalTags { + repeated Tag tags = 1; +} diff --git a/gamercade_interface/proto/user.proto b/gamercade_interface/proto/user.proto new file mode 100644 index 00000000..4d4ef963 --- /dev/null +++ b/gamercade_interface/proto/user.proto @@ -0,0 +1,33 @@ +syntax = "proto3"; + +import "common.proto"; + +package users; + +service UsersService { + rpc GetUserInfo(UserRequest) returns (UserInfo); + rpc GetUsersInfo(UsersRequest) returns (UsersResponse); + + rpc UpdateEmail(UpdateEmailRequest) returns (common.Empty); +} + +message UserRequest { + sfixed64 user_id = 1; +} + +message UserInfo { + sfixed64 user_id = 1; + string username = 2; +} + +message UsersRequest { + repeated sfixed64 user_ids = 1; +} + +message UsersResponse { + repeated UserInfo users = 1; +} + +message UpdateEmailRequest { + string new_email = 1; +} diff --git a/gamercade_interface/src/filter.rs b/gamercade_interface/src/filter.rs new file mode 100644 index 00000000..f01151b7 --- /dev/null +++ b/gamercade_interface/src/filter.rs @@ -0,0 +1,22 @@ +const BANNED_WORDS: [&str; 0] = []; + +/// Checks if the passed in text should be filtered +/// from the banned words list. +pub fn check_single_word_banned(text: &str) -> bool { + BANNED_WORDS.binary_search(&text).is_ok() +} + +/// Checks if the passed in string contains any banned +/// words and should be filtered. +pub fn check_string_contains_banned_text(text: &str) -> bool { + for word in BANNED_WORDS.iter() { + if text.contains(word) { + return true; + } + } + + false +} + +// TODO: Benchmark binary search, hashmap, or Vec lookup for banned words +// TODO: Add the banned words list diff --git a/gamercade_interface/src/lib.rs b/gamercade_interface/src/lib.rs new file mode 100644 index 00000000..d99477fa --- /dev/null +++ b/gamercade_interface/src/lib.rs @@ -0,0 +1,77 @@ +mod output; +pub use output::*; + +mod network_session; +pub use network_session::*; + +pub mod security; + +pub mod filter; + +pub const USERNAME_LENGTH_MIN: usize = 1; +pub const USERNAME_LENGTH_MAX: usize = 31; +pub const EMAIL_MAX_LENGTH: usize = 255; + +pub const GAME_TITLE_MAX_LENGTH: usize = 123; +pub const GAME_SHORT_DESCRIPTION_MAX_LENGTH: usize = 255; +pub const GAME_LONG_DESCRIPTION_MAX_LENGTH: usize = 2047; +pub const RELEASE_NAME_MAX_LENGTH: usize = 123; + +pub const AUTHOR_TITLE_MAX_LENGTH: usize = 31; +pub const REVIEW_COMMENTS_MAX_LENGTH: usize = 1027; + +pub const PERMISSION_LEVEL_EDITOR: i32 = 10; +pub const PERMISSION_LEVEL_OWNER: i32 = 0; + +pub const SESSION_METADATA_KEY: &str = "gc-session-bin"; +pub const URL_RADIX: usize = 16; + +pub const IMAGE_MAX_SIZE_BYTES: usize = 1024 * 1024 * 3; // 3mb +pub const IMAGE_MAX_WIDTH: usize = 300; +pub const IMAGE_MAX_HEIGHT: usize = 300; + +// Checksum Calculator +pub const CRC: crc::Crc = crc::Crc::::new(&crc::CRC_64_XZ); + +#[derive(Debug, Clone)] +pub struct Session([u8; 16]); + +impl Session { + pub fn get_metadata_key() -> &'static str { + SESSION_METADATA_KEY + } + + pub fn new(bytes: [u8; 16]) -> Self { + Self(bytes) + } + + pub fn bytes(&self) -> &[u8; 16] { + &self.0 + } + + pub fn to_vec(&self) -> Vec { + Vec::from_iter(self.0) + } +} + +impl From> for Session { + fn from(value: Vec) -> Self { + Self(value.try_into().unwrap()) + } +} + +impl TryFrom<&[u8]> for Session { + type Error = &'static str; + + fn try_from(value: &[u8]) -> Result { + Ok(Self( + value.try_into().map_err(|_| "Error converting session.")?, + )) + } +} + +impl From for Session { + fn from(value: u128) -> Self { + Self(value.to_le_bytes()) + } +} diff --git a/gamercade_interface/src/network_session.rs b/gamercade_interface/src/network_session.rs new file mode 100644 index 00000000..0a08ecd0 --- /dev/null +++ b/gamercade_interface/src/network_session.rs @@ -0,0 +1,20 @@ +use std::net::SocketAddr; + +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct NetworkSession { + pub players: Box<[NetworkedClient]>, +} + +#[derive(Serialize, Deserialize)] +pub struct NetworkedClient { + pub count: usize, + pub kind: NetworkedPlayerType, +} + +#[derive(Serialize, Deserialize)] +pub enum NetworkedPlayerType { + Local, + Remote(SocketAddr), +} diff --git a/gamercade_interface/src/output/auth.rs b/gamercade_interface/src/output/auth.rs new file mode 100644 index 00000000..ce24f61b --- /dev/null +++ b/gamercade_interface/src/output/auth.rs @@ -0,0 +1,479 @@ +// This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SignUpRequest { + #[prost(string, tag = "1")] + pub username: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub email: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub password: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LoginRequest { + #[prost(string, tag = "1")] + pub password: ::prost::alloc::string::String, + #[prost(oneof = "login_request::Provider", tags = "2, 3")] + pub provider: ::core::option::Option, +} +/// Nested message and enum types in `LoginRequest`. +pub mod login_request { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Provider { + #[prost(string, tag = "2")] + Username(::prost::alloc::string::String), + #[prost(string, tag = "3")] + Email(::prost::alloc::string::String), + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SessionResponse { + #[prost(bytes = "vec", tag = "1")] + pub session: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UpdatePasswordRequest { + #[prost(string, tag = "1")] + pub previous_password: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub new_password: ::prost::alloc::string::String, +} +/// Generated client implementations. +pub mod auth_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct AuthServiceClient { + inner: tonic::client::Grpc, + } + impl AuthServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl AuthServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> AuthServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + AuthServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn sign_up( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/auth.AuthService/SignUp"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("auth.AuthService", "SignUp")); + self.inner.unary(req, path, codec).await + } + pub async fn login( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/auth.AuthService/Login"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("auth.AuthService", "Login")); + self.inner.unary(req, path, codec).await + } + pub async fn update_password( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/auth.AuthService/UpdatePassword", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("auth.AuthService", "UpdatePassword")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod auth_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with AuthServiceServer. + #[async_trait] + pub trait AuthService: Send + Sync + 'static { + async fn sign_up( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn login( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn update_password( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct AuthServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl AuthServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for AuthServiceServer + where + T: AuthService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/auth.AuthService/SignUp" => { + #[allow(non_camel_case_types)] + struct SignUpSvc(pub Arc); + impl< + T: AuthService, + > tonic::server::UnaryService + for SignUpSvc { + type Response = super::SessionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::sign_up(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = SignUpSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/auth.AuthService/Login" => { + #[allow(non_camel_case_types)] + struct LoginSvc(pub Arc); + impl tonic::server::UnaryService + for LoginSvc { + type Response = super::SessionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::login(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = LoginSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/auth.AuthService/UpdatePassword" => { + #[allow(non_camel_case_types)] + struct UpdatePasswordSvc(pub Arc); + impl< + T: AuthService, + > tonic::server::UnaryService + for UpdatePasswordSvc { + type Response = super::super::common::Empty; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_password(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdatePasswordSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for AuthServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for AuthServiceServer { + const NAME: &'static str = "auth.AuthService"; + } +} diff --git a/gamercade_interface/src/output/author.rs b/gamercade_interface/src/output/author.rs new file mode 100644 index 00000000..4ab05e7b --- /dev/null +++ b/gamercade_interface/src/output/author.rs @@ -0,0 +1,423 @@ +// This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AdjustAuthorRequest { + #[prost(sfixed64, tag = "1")] + pub game_id: i64, + #[prost(sfixed64, tag = "2")] + pub user_id: i64, + #[prost(string, optional, tag = "3")] + pub title: ::core::option::Option<::prost::alloc::string::String>, + #[prost(sint32, optional, tag = "4")] + pub permission_level_id: ::core::option::Option, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AdjustAuthorResponse { + #[prost(sfixed64, tag = "1")] + pub game_id: i64, + #[prost(message, repeated, tag = "2")] + pub authors: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Author { + #[prost(sfixed64, tag = "1")] + pub user_id: i64, + #[prost(string, tag = "2")] + pub title: ::prost::alloc::string::String, + #[prost(int32, tag = "3")] + pub permission_level_id: i32, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GlobalPermissionLevels { + #[prost(message, repeated, tag = "1")] + pub levels: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PermissionLevel { + #[prost(int32, tag = "1")] + pub id: i32, + #[prost(string, tag = "2")] + pub level_name: ::prost::alloc::string::String, +} +/// Generated client implementations. +pub mod author_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct AuthorServiceClient { + inner: tonic::client::Grpc, + } + impl AuthorServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl AuthorServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> AuthorServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + AuthorServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn adjust_game_author( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/author.AuthorService/AdjustGameAuthor", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("author.AuthorService", "AdjustGameAuthor")); + self.inner.unary(req, path, codec).await + } + pub async fn get_global_permission_levels( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/author.AuthorService/GetGlobalPermissionLevels", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("author.AuthorService", "GetGlobalPermissionLevels"), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod author_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with AuthorServiceServer. + #[async_trait] + pub trait AuthorService: Send + Sync + 'static { + async fn adjust_game_author( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_global_permission_levels( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct AuthorServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl AuthorServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for AuthorServiceServer + where + T: AuthorService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/author.AuthorService/AdjustGameAuthor" => { + #[allow(non_camel_case_types)] + struct AdjustGameAuthorSvc(pub Arc); + impl< + T: AuthorService, + > tonic::server::UnaryService + for AdjustGameAuthorSvc { + type Response = super::AdjustAuthorResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::adjust_game_author(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = AdjustGameAuthorSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/author.AuthorService/GetGlobalPermissionLevels" => { + #[allow(non_camel_case_types)] + struct GetGlobalPermissionLevelsSvc(pub Arc); + impl< + T: AuthorService, + > tonic::server::UnaryService + for GetGlobalPermissionLevelsSvc { + type Response = super::GlobalPermissionLevels; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_global_permission_levels( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetGlobalPermissionLevelsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for AuthorServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for AuthorServiceServer { + const NAME: &'static str = "author.AuthorService"; + } +} diff --git a/gamercade_interface/src/output/common.rs b/gamercade_interface/src/output/common.rs new file mode 100644 index 00000000..a95ed85f --- /dev/null +++ b/gamercade_interface/src/output/common.rs @@ -0,0 +1,4 @@ +// This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Empty {} diff --git a/gamercade_interface/src/output/game.rs b/gamercade_interface/src/output/game.rs new file mode 100644 index 00000000..9e1cec86 --- /dev/null +++ b/gamercade_interface/src/output/game.rs @@ -0,0 +1,735 @@ +// This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UpdateGameRequest { + #[prost(sfixed64, optional, tag = "1")] + pub game_id: ::core::option::Option, + #[prost(string, optional, tag = "2")] + pub title: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "3")] + pub short_description: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "4")] + pub long_description: ::core::option::Option<::prost::alloc::string::String>, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SingleGameRequest { + #[prost(sfixed64, tag = "1")] + pub game_id: i64, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MultipleGamesRequest { + #[prost(sfixed64, repeated, tag = "1")] + pub game_ids: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MultipleGamesInfoResponse { + #[prost(message, repeated, tag = "1")] + pub games_info: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GameInfoBasic { + #[prost(sfixed64, tag = "1")] + pub game_id: i64, + #[prost(string, tag = "2")] + pub title: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub short_description: ::prost::alloc::string::String, + #[prost(float, tag = "4")] + pub average_rating: f32, + #[prost(int32, repeated, tag = "5")] + pub tags: ::prost::alloc::vec::Vec, + #[prost(sfixed64, optional, tag = "6")] + pub checksum: ::core::option::Option, + #[prost(int64, optional, tag = "7")] + pub rom_size: ::core::option::Option, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GameInfoDetailed { + #[prost(message, optional, tag = "1")] + pub basic_info: ::core::option::Option, + #[prost(string, optional, tag = "2")] + pub long_description: ::core::option::Option<::prost::alloc::string::String>, + #[prost(message, repeated, tag = "3")] + pub authors: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GameAuthor { + #[prost(sfixed64, tag = "1")] + pub user_id: i64, + #[prost(string, tag = "2")] + pub title: ::prost::alloc::string::String, +} +/// Generated client implementations. +pub mod game_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct GameServiceClient { + inner: tonic::client::Grpc, + } + impl GameServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl GameServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> GameServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + GameServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn get_single_game_info( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/game.GameService/GetSingleGameInfo", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("game.GameService", "GetSingleGameInfo")); + self.inner.unary(req, path, codec).await + } + pub async fn get_multiple_games_info( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/game.GameService/GetMultipleGamesInfo", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("game.GameService", "GetMultipleGamesInfo")); + self.inner.unary(req, path, codec).await + } + pub async fn get_game_detailed_info( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/game.GameService/GetGameDetailedInfo", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("game.GameService", "GetGameDetailedInfo")); + self.inner.unary(req, path, codec).await + } + pub async fn create_game( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/game.GameService/CreateGame", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("game.GameService", "CreateGame")); + self.inner.unary(req, path, codec).await + } + pub async fn update_game( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/game.GameService/UpdateGame", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("game.GameService", "UpdateGame")); + self.inner.unary(req, path, codec).await + } + pub async fn delete_game( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/game.GameService/DeleteGame", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("game.GameService", "DeleteGame")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod game_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with GameServiceServer. + #[async_trait] + pub trait GameService: Send + Sync + 'static { + async fn get_single_game_info( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn get_multiple_games_info( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_game_detailed_info( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn create_game( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn update_game( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn delete_game( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct GameServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl GameServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for GameServiceServer + where + T: GameService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/game.GameService/GetSingleGameInfo" => { + #[allow(non_camel_case_types)] + struct GetSingleGameInfoSvc(pub Arc); + impl< + T: GameService, + > tonic::server::UnaryService + for GetSingleGameInfoSvc { + type Response = super::GameInfoBasic; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_single_game_info(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetSingleGameInfoSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/game.GameService/GetMultipleGamesInfo" => { + #[allow(non_camel_case_types)] + struct GetMultipleGamesInfoSvc(pub Arc); + impl< + T: GameService, + > tonic::server::UnaryService + for GetMultipleGamesInfoSvc { + type Response = super::MultipleGamesInfoResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_multiple_games_info(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetMultipleGamesInfoSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/game.GameService/GetGameDetailedInfo" => { + #[allow(non_camel_case_types)] + struct GetGameDetailedInfoSvc(pub Arc); + impl< + T: GameService, + > tonic::server::UnaryService + for GetGameDetailedInfoSvc { + type Response = super::GameInfoDetailed; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_game_detailed_info(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetGameDetailedInfoSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/game.GameService/CreateGame" => { + #[allow(non_camel_case_types)] + struct CreateGameSvc(pub Arc); + impl< + T: GameService, + > tonic::server::UnaryService + for CreateGameSvc { + type Response = super::GameInfoBasic; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_game(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateGameSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/game.GameService/UpdateGame" => { + #[allow(non_camel_case_types)] + struct UpdateGameSvc(pub Arc); + impl< + T: GameService, + > tonic::server::UnaryService + for UpdateGameSvc { + type Response = super::GameInfoBasic; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_game(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateGameSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/game.GameService/DeleteGame" => { + #[allow(non_camel_case_types)] + struct DeleteGameSvc(pub Arc); + impl< + T: GameService, + > tonic::server::UnaryService + for DeleteGameSvc { + type Response = super::super::common::Empty; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::delete_game(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = DeleteGameSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for GameServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for GameServiceServer { + const NAME: &'static str = "game.GameService"; + } +} diff --git a/gamercade_interface/src/output/mod.rs b/gamercade_interface/src/output/mod.rs new file mode 100644 index 00000000..68ff36c5 --- /dev/null +++ b/gamercade_interface/src/output/mod.rs @@ -0,0 +1,25 @@ +// This file is @generated by prost-build. +pub mod auth { + include!("auth.rs"); +} +pub mod author { + include!("author.rs"); +} +pub mod common { + include!("common.rs"); +} +pub mod game { + include!("game.rs"); +} +pub mod platform { + include!("platform.rs"); +} +pub mod review { + include!("review.rs"); +} +pub mod tag { + include!("tag.rs"); +} +pub mod users { + include!("users.rs"); +} diff --git a/gamercade_interface/src/output/platform.rs b/gamercade_interface/src/output/platform.rs new file mode 100644 index 00000000..7024a599 --- /dev/null +++ b/gamercade_interface/src/output/platform.rs @@ -0,0 +1,581 @@ +// This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct FrontPageRequest {} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GameSearchRequest { + #[prost(string, optional, tag = "1")] + pub name: ::core::option::Option<::prost::alloc::string::String>, + #[prost(int32, repeated, tag = "2")] + pub tags: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct FrontPageResponse { + #[prost(message, repeated, tag = "1")] + pub games: ::prost::alloc::vec::Vec, + #[prost(sfixed64, repeated, tag = "2")] + pub popular_games_ids: ::prost::alloc::vec::Vec, + #[prost(sfixed64, repeated, tag = "3")] + pub top_rated_games_ids: ::prost::alloc::vec::Vec, + #[prost(sfixed64, repeated, tag = "4")] + pub new_games_ids: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EditableGamesResponse { + #[prost(message, repeated, tag = "1")] + pub editable_games: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EditableGame { + #[prost(sfixed64, tag = "1")] + pub game_id: i64, + #[prost(int32, tag = "2")] + pub permission_level: i32, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct VotedGamesResponse { + #[prost(message, repeated, tag = "1")] + pub voted_games: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct VotedGame { + #[prost(sfixed64, tag = "1")] + pub game_id: i64, + #[prost(bool, tag = "2")] + pub vote_value: bool, +} +/// Generated client implementations. +pub mod platform_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct PlatformServiceClient { + inner: tonic::client::Grpc, + } + impl PlatformServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl PlatformServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> PlatformServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + PlatformServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn front_page( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/platform.PlatformService/FrontPage", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("platform.PlatformService", "FrontPage")); + self.inner.unary(req, path, codec).await + } + pub async fn game_search( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/platform.PlatformService/GameSearch", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("platform.PlatformService", "GameSearch")); + self.inner.unary(req, path, codec).await + } + pub async fn get_editable_games( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/platform.PlatformService/GetEditableGames", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("platform.PlatformService", "GetEditableGames")); + self.inner.unary(req, path, codec).await + } + pub async fn get_voted_games( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/platform.PlatformService/GetVotedGames", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("platform.PlatformService", "GetVotedGames")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod platform_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with PlatformServiceServer. + #[async_trait] + pub trait PlatformService: Send + Sync + 'static { + async fn front_page( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn game_search( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_editable_games( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_voted_games( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct PlatformServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl PlatformServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for PlatformServiceServer + where + T: PlatformService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/platform.PlatformService/FrontPage" => { + #[allow(non_camel_case_types)] + struct FrontPageSvc(pub Arc); + impl< + T: PlatformService, + > tonic::server::UnaryService + for FrontPageSvc { + type Response = super::FrontPageResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::front_page(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = FrontPageSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/platform.PlatformService/GameSearch" => { + #[allow(non_camel_case_types)] + struct GameSearchSvc(pub Arc); + impl< + T: PlatformService, + > tonic::server::UnaryService + for GameSearchSvc { + type Response = super::super::game::MultipleGamesInfoResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::game_search(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GameSearchSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/platform.PlatformService/GetEditableGames" => { + #[allow(non_camel_case_types)] + struct GetEditableGamesSvc(pub Arc); + impl< + T: PlatformService, + > tonic::server::UnaryService + for GetEditableGamesSvc { + type Response = super::EditableGamesResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_editable_games(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetEditableGamesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/platform.PlatformService/GetVotedGames" => { + #[allow(non_camel_case_types)] + struct GetVotedGamesSvc(pub Arc); + impl< + T: PlatformService, + > tonic::server::UnaryService + for GetVotedGamesSvc { + type Response = super::VotedGamesResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_voted_games(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetVotedGamesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for PlatformServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for PlatformServiceServer { + const NAME: &'static str = "platform.PlatformService"; + } +} diff --git a/gamercade_interface/src/output/review.rs b/gamercade_interface/src/output/review.rs new file mode 100644 index 00000000..02bf3f3f --- /dev/null +++ b/gamercade_interface/src/output/review.rs @@ -0,0 +1,302 @@ +// This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ReviewGameRequest { + #[prost(sfixed64, tag = "1")] + pub game_id: i64, + #[prost(bool, optional, tag = "2")] + pub rating: ::core::option::Option, +} +/// Generated client implementations. +pub mod review_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct ReviewServiceClient { + inner: tonic::client::Grpc, + } + impl ReviewServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl ReviewServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> ReviewServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + ReviewServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn review_game( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/review.ReviewService/ReviewGame", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("review.ReviewService", "ReviewGame")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod review_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with ReviewServiceServer. + #[async_trait] + pub trait ReviewService: Send + Sync + 'static { + async fn review_game( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct ReviewServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl ReviewServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for ReviewServiceServer + where + T: ReviewService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/review.ReviewService/ReviewGame" => { + #[allow(non_camel_case_types)] + struct ReviewGameSvc(pub Arc); + impl< + T: ReviewService, + > tonic::server::UnaryService + for ReviewGameSvc { + type Response = super::super::common::Empty; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::review_game(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ReviewGameSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for ReviewServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for ReviewServiceServer { + const NAME: &'static str = "review.ReviewService"; + } +} diff --git a/gamercade_interface/src/output/tag.rs b/gamercade_interface/src/output/tag.rs new file mode 100644 index 00000000..0fb8f969 --- /dev/null +++ b/gamercade_interface/src/output/tag.rs @@ -0,0 +1,398 @@ +// This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AdjustGameTagRequest { + #[prost(sfixed64, tag = "1")] + pub game_id: i64, + #[prost(int32, tag = "2")] + pub tag_id: i32, + #[prost(bool, tag = "3")] + pub set_to: bool, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AdjustGameTagResponse { + #[prost(sfixed64, tag = "1")] + pub game_id: i64, + #[prost(message, repeated, tag = "2")] + pub tags: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Tag { + #[prost(int32, tag = "1")] + pub pid: i32, + #[prost(string, tag = "2")] + pub name: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GlobalTags { + #[prost(message, repeated, tag = "1")] + pub tags: ::prost::alloc::vec::Vec, +} +/// Generated client implementations. +pub mod tag_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct TagServiceClient { + inner: tonic::client::Grpc, + } + impl TagServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl TagServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> TagServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + TagServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn adjust_game_tag( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/tag.TagService/AdjustGameTag", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("tag.TagService", "AdjustGameTag")); + self.inner.unary(req, path, codec).await + } + pub async fn get_global_tags( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/tag.TagService/GetGlobalTags", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("tag.TagService", "GetGlobalTags")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod tag_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with TagServiceServer. + #[async_trait] + pub trait TagService: Send + Sync + 'static { + async fn adjust_game_tag( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_global_tags( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + } + #[derive(Debug)] + pub struct TagServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl TagServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for TagServiceServer + where + T: TagService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/tag.TagService/AdjustGameTag" => { + #[allow(non_camel_case_types)] + struct AdjustGameTagSvc(pub Arc); + impl< + T: TagService, + > tonic::server::UnaryService + for AdjustGameTagSvc { + type Response = super::AdjustGameTagResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::adjust_game_tag(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = AdjustGameTagSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/tag.TagService/GetGlobalTags" => { + #[allow(non_camel_case_types)] + struct GetGlobalTagsSvc(pub Arc); + impl< + T: TagService, + > tonic::server::UnaryService + for GetGlobalTagsSvc { + type Response = super::GlobalTags; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_global_tags(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetGlobalTagsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for TagServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for TagServiceServer { + const NAME: &'static str = "tag.TagService"; + } +} diff --git a/gamercade_interface/src/output/users.rs b/gamercade_interface/src/output/users.rs new file mode 100644 index 00000000..7fa80fb3 --- /dev/null +++ b/gamercade_interface/src/output/users.rs @@ -0,0 +1,468 @@ +// This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UserRequest { + #[prost(sfixed64, tag = "1")] + pub user_id: i64, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UserInfo { + #[prost(sfixed64, tag = "1")] + pub user_id: i64, + #[prost(string, tag = "2")] + pub username: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UsersRequest { + #[prost(sfixed64, repeated, tag = "1")] + pub user_ids: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UsersResponse { + #[prost(message, repeated, tag = "1")] + pub users: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UpdateEmailRequest { + #[prost(string, tag = "1")] + pub new_email: ::prost::alloc::string::String, +} +/// Generated client implementations. +pub mod users_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct UsersServiceClient { + inner: tonic::client::Grpc, + } + impl UsersServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl UsersServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> UsersServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + UsersServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn get_user_info( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/users.UsersService/GetUserInfo", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("users.UsersService", "GetUserInfo")); + self.inner.unary(req, path, codec).await + } + pub async fn get_users_info( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/users.UsersService/GetUsersInfo", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("users.UsersService", "GetUsersInfo")); + self.inner.unary(req, path, codec).await + } + pub async fn update_email( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/users.UsersService/UpdateEmail", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("users.UsersService", "UpdateEmail")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod users_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with UsersServiceServer. + #[async_trait] + pub trait UsersService: Send + Sync + 'static { + async fn get_user_info( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn get_users_info( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn update_email( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct UsersServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl UsersServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for UsersServiceServer + where + T: UsersService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/users.UsersService/GetUserInfo" => { + #[allow(non_camel_case_types)] + struct GetUserInfoSvc(pub Arc); + impl tonic::server::UnaryService + for GetUserInfoSvc { + type Response = super::UserInfo; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_user_info(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetUserInfoSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/users.UsersService/GetUsersInfo" => { + #[allow(non_camel_case_types)] + struct GetUsersInfoSvc(pub Arc); + impl< + T: UsersService, + > tonic::server::UnaryService + for GetUsersInfoSvc { + type Response = super::UsersResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_users_info(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetUsersInfoSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/users.UsersService/UpdateEmail" => { + #[allow(non_camel_case_types)] + struct UpdateEmailSvc(pub Arc); + impl< + T: UsersService, + > tonic::server::UnaryService + for UpdateEmailSvc { + type Response = super::super::common::Empty; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_email(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateEmailSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for UsersServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for UsersServiceServer { + const NAME: &'static str = "users.UsersService"; + } +} diff --git a/gamercade_interface/src/security/common_passwords.rs b/gamercade_interface/src/security/common_passwords.rs new file mode 100644 index 00000000..c8a1d435 --- /dev/null +++ b/gamercade_interface/src/security/common_passwords.rs @@ -0,0 +1,10005 @@ +// TODO: Could be worth it to generate a build script here which also +// Additionally removes any passwords less than 8 characters long + +pub(crate) const COMMON_PASSWORDS: [&str; 10000] = [ + "?????", + "??????", + "*****", + "******", + "0.0.0.000", + "0.0.000", + "0000", + "00000", + "000000", + "0000000", + "00000000", + "0000000000", + "0000007", + "000001", + "000007", + "000111", + "000123", + "0007", + "000777", + "0069", + "007007", + "007bond", + "0101", + "010101", + "01011", + "01011900", + "01011910", + "01011960", + "01011970", + "01011971", + "01011972", + "01011973", + "01011974", + "01011975", + "01011976", + "01011977", + "01011978", + "01011979", + "01011980", + "01011981", + "01011982", + "01011983", + "01011984", + "01011985", + "01011986", + "01011987", + "01011988", + "01011989", + "01011990", + "01011991", + "01011992", + "01011993", + "01011994", + "01011995", + "01011999", + "01012000", + "01012001", + "01012009", + "01012010", + "01012011", + "010180", + "010191", + "010203", + "01020304", + "01021985", + "01021987", + "01021988", + "01021989", + "01021990", + "01021992", + "01022010", + "01031981", + "01031983", + "01031984", + "01031985", + "01031986", + "01031988", + "01031989", + "010390", + "01041980", + "01041983", + "01041985", + "01041987", + "01041988", + "01041990", + "01041992", + "01041993", + "01051980", + "01051985", + "01051986", + "01051988", + "01051989", + "01051990", + "01061983", + "01061986", + "01061987", + "01061988", + "01061990", + "01061992", + "01071984", + "01071986", + "01071987", + "01071988", + "01071990", + "01081985", + "01081989", + "01081990", + "01081992", + "01091985", + "01091987", + "01091988", + "01091989", + "01091992", + "01101987", + "01121986", + "01121987", + "01121988", + "01121990", + "0123", + "012345", + "0123456", + "01234567", + "0123456789", + "0192837465", + "02011971", + "02011975", + "02011976", + "02011977", + "02011979", + "02011980", + "02011981", + "02011982", + "02011983", + "02011984", + "02011985", + "02011986", + "02011987", + "02011988", + "02011989", + "02011990", + "0202", + "020202", + "02021971", + "02021973", + "02021976", + "02021978", + "02021979", + "02021980", + "02021981", + "02021982", + "02021983", + "02021984", + "02021985", + "02021986", + "02021987", + "02021988", + "02021989", + "02021990", + "02021991", + "02031973", + "02031974", + "02031975", + "02031977", + "02031978", + "02031979", + "02031980", + "02031981", + "02031982", + "02031983", + "02031984", + "02031985", + "02031986", + "02031987", + "02031988", + "02031989", + "02031990", + "02031991", + "02041972", + "02041973", + "02041974", + "02041975", + "02041976", + "02041977", + "02041978", + "02041979", + "02041980", + "02041981", + "02041982", + "02041983", + "02041984", + "02041985", + "02041986", + "02041987", + "02041988", + "02041989", + "02051970", + "02051972", + "02051973", + "02051975", + "02051976", + "02051977", + "02051978", + "02051979", + "02051980", + "02051981", + "02051982", + "02051983", + "02051984", + "02051985", + "02051986", + "02051987", + "02051988", + "02051989", + "02051990", + "02061971", + "02061972", + "02061974", + "02061976", + "02061977", + "02061978", + "02061979", + "02061980", + "02061981", + "02061982", + "02061983", + "02061984", + "02061985", + "02061986", + "02061987", + "02061988", + "02061989", + "02061990", + "02071971", + "02071975", + "02071976", + "02071977", + "02071978", + "02071979", + "02071980", + "02071981", + "02071982", + "02071983", + "02071984", + "02071985", + "02071986", + "02071987", + "02071988", + "02071989", + "02081970", + "02081973", + "02081974", + "02081976", + "02081977", + "02081979", + "02081980", + "02081981", + "02081982", + "02081983", + "02081984", + "02081985", + "02081986", + "02081987", + "02081988", + "02081989", + "02091971", + "02091973", + "02091975", + "02091976", + "02091977", + "02091978", + "02091980", + "02091981", + "02091982", + "02091983", + "02091984", + "02091985", + "02091986", + "02091987", + "02091988", + "02091989", + "02101973", + "02101976", + "02101977", + "02101978", + "02101979", + "02101980", + "02101981", + "02101983", + "02101984", + "02101985", + "02101986", + "02101987", + "02101988", + "02101989", + "02111987", + "03011987", + "03011991", + "03021986", + "030303", + "03031984", + "03031986", + "03031987", + "03031988", + "03031990", + "03031991", + "03031992", + "03031993", + "03041980", + "03041983", + "03041984", + "03041986", + "03041987", + "03041989", + "03041991", + "03051986", + "03051987", + "03051988", + "03061985", + "03061986", + "03061987", + "03061988", + "03071985", + "03071986", + "03071987", + "03081989", + "03082006", + "03091983", + "03091988", + "03101991", + "03111987", + "04021990", + "04031991", + "040404", + "04041983", + "04041985", + "04041986", + "04041987", + "04041988", + "04041990", + "04041991", + "04051985", + "04051988", + "04061984", + "04061986", + "04061987", + "04061991", + "04071986", + "04071987", + "04071988", + "04081987", + "04091986", + "04111988", + "04111991", + "0420", + "05011987", + "05021987", + "05021988", + "05031987", + "05031990", + "05031991", + "05041985", + "050505", + "05051985", + "05051986", + "05051987", + "05051989", + "05051990", + "05051991", + "05061986", + "05061988", + "05061989", + "05061990", + "05071984", + "05071985", + "05071988", + "05081986", + "05081988", + "05081992", + "05091987", + "05091988", + "05111986", + "05121988", + "05121990", + "06011982", + "06011988", + "06021986", + "06021987", + "06031983", + "06031992", + "06041984", + "06041987", + "06041988", + "06051986", + "060606", + "06061981", + "06061985", + "06061986", + "06061987", + "06061988", + "06071983", + "06081987", + "06101989", + "0660", + "07021980", + "07021991", + "07031989", + "07041987", + "07041988", + "07041989", + "07051987", + "07051990", + "07061988", + "070707", + "07071977", + "07071982", + "07071984", + "07071985", + "07071987", + "07071988", + "07071989", + "07071990", + "07081984", + "07081986", + "07081987", + "07091982", + "07091988", + "07091990", + "07101984", + "07101987", + "08011986", + "08021990", + "08031985", + "08031986", + "08031987", + "08041985", + "08041986", + "08051987", + "08051989", + "08051990", + "08061987", + "08071985", + "08071987", + "08071988", + "080808", + "08081986", + "08081988", + "08081989", + "08081990", + "08101986", + "08111984", + "08121986", + "08121987", + "0815", + "09021988", + "09021989", + "09031987", + "09031988", + "09041985", + "09041986", + "09041987", + "09051945", + "09051984", + "09051986", + "09051987", + "09081985", + "09081988", + "090909", + "09090909", + "09091986", + "09091988", + "0911", + "09111987", + "0987", + "098765", + "09876543", + "0987654321", + "1000", + "100000", + "1000000", + "1001", + "100100", + "10011980", + "10011983", + "10011986", + "10011988", + "10011990", + "10011992", + "1002", + "100200", + "10021986", + "10021987", + "1003", + "10031980", + "10031987", + "10031988", + "10031989", + "10031990", + "10031991", + "10031993", + "1004", + "10041983", + "10041984", + "10041986", + "10041987", + "10041990", + "10041991", + "1005", + "100500", + "10051987", + "10051988", + "10051990", + "10061984", + "10061985", + "10061986", + "10061987", + "10061989", + "1007", + "10071985", + "10071986", + "10071987", + "10071988", + "10071989", + "10071990", + "1008", + "10081983", + "10081985", + "10081987", + "10081989", + "10081990", + "10091984", + "10091985", + "10091986", + "1010", + "10101", + "101010", + "10101010", + "10101980", + "10101985", + "10101986", + "10101988", + "10101989", + "10101990", + "101091m", + "1011", + "101101", + "101112", + "10111986", + "1012", + "10121985", + "10121986", + "10121987", + "1013", + "1014", + "1015", + "1016", + "1017", + "1018", + "1020", + "10203", + "102030", + "10203040", + "1022", + "1023", + "1024", + "1025", + "1026", + "1027", + "1028", + "1029", + "102938", + "10293847", + "1029384756", + "1030", + "1031", + "1066", + "1101", + "11011987", + "11011989", + "11011990", + "11011991", + "1102", + "11021985", + "1103", + "11031983", + "11031986", + "11031988", + "1104", + "11041985", + "11041990", + "11041991", + "11051984", + "11051986", + "11051987", + "11051988", + "11051990", + "11061984", + "11061985", + "11061986", + "11061987", + "11061989", + "11061991", + "11071985", + "11071986", + "11071987", + "11071988", + "11071989", + "11081986", + "11081987", + "11081988", + "11081989", + "11081990", + "1109", + "11091984", + "11091985", + "11091986", + "11091989", + "11091990", + "111000", + "11101986", + "1111", + "11111", + "111111", + "1111111", + "11111111", + "111111111", + "1111111111", + "111111a", + "111111q", + "111112", + "11111986", + "11111987", + "11111991", + "11111a", + "11111q", + "11112222", + "1112", + "111213", + "11121985", + "11121986", + "11121987", + "111222", + "111222333", + "111333", + "1114", + "1115", + "111555", + "1117", + "111777", + "111999", + "111qqq", + "1120", + "1121", + "112112", + "1122", + "112211", + "11221122", + "11223", + "112233", + "11223344", + "1122334455", + "1123", + "112358", + "11235813", + "1123581321", + "1124", + "1125", + "1129", + "115599", + "1200", + "1201", + "12011985", + "12011987", + "12011989", + "120120", + "12021984", + "12021985", + "12021988", + "12021990", + "12021991", + "12031985", + "12031987", + "12031988", + "12031990", + "1204", + "12041986", + "12041988", + "12041990", + "12041991", + "1205", + "12051985", + "12051986", + "12051987", + "12051988", + "12051989", + "12051990", + "1206", + "12061986", + "12061987", + "12061988", + "120676", + "120689", + "1207", + "12071984", + "12071987", + "12071988", + "12071989", + "12071990", + "12071991", + "12071992", + "1208", + "12081983", + "12081984", + "12081985", + "12081987", + "12081988", + "12081990", + "12081993", + "1209", + "12091986", + "12091988", + "12091991", + "1210", + "12101984", + "12101985", + "12101988", + "12101989", + "12101990", + "1211", + "12111984", + "12111985", + "12111990", + "12111991", + "1212", + "12121", + "121212", + "12121212", + "1212121212", + "12121982", + "12121985", + "12121986", + "12121987", + "12121988", + "12121989", + "12121990", + "12121991", + "1213", + "12131213", + "121314", + "12131415", + "1214", + "1215", + "1216", + "1220", + "1221", + "122112", + "12211221", + "1223", + "122333", + "1224", + "1225", + "1226", + "1227", + "1228", + "123", + "1230", + "123000", + "12301230", + "123098", + "1231", + "12312", + "123123", + "12312312", + "123123123", + "1231234", + "123123a", + "123123q", + "12321", + "1232323q", + "12332", + "123321", + "123321123", + "123321a", + "123321q", + "1234", + "1234123", + "12341234", + "1234321", + "12344321", + "12345", + "123450", + "1234509876", + "123451", + "1234512345", + "123454321", + "123455", + "1234554321", + "123456", + "1234560", + "1234561", + "123456123", + "1234566", + "123456654321", + "1234567", + "12345678", + "123456789", + "1234567890", + "1234567890", + "1234567890a", + "1234567890q", + "1234567891", + "12345678910", + "1234567899", + "123456789a", + "123456789d", + "123456789m", + "123456789q", + "123456789qwe", + "123456789s", + "123456789z", + "12345678a", + "12345678q", + "12345679", + "1234567a", + "1234567q", + "1234568", + "123456a", + "123456aa", + "123456k", + "123456l", + "123456m", + "123456n", + "123456q", + "123456qqq", + "123456qw", + "123456qwe", + "123456qwerty", + "123456r", + "123456ru", + "123456s", + "123456t", + "123456z", + "123457", + "123459", + "12345a", + "12345abc", + "12345m", + "12345q", + "12345qaz", + "12345qw", + "12345qwe", + "12345qwer", + "12345qwert", + "12345qwerty", + "12345r", + "12345s", + "12345t", + "12345z", + "123465", + "12348765", + "1234abcd", + "1234asdf", + "1234qw", + "1234qwe", + "1234qwer", + "1234rewq", + "1234zxcv", + "1235", + "123567", + "1235789", + "12365", + "123654", + "12365478", + "123654789", + "1236987", + "12369874", + "123698745", + "123789", + "123789456", + "123890", + "123987", + "123aaa", + "123abc", + "123asd", + "123ewq", + "123qaz", + "123qq123", + "123qw", + "123qwe", + "123qwe123", + "123qweasd", + "123qweasdzxc", + "123qwer", + "123qwert", + "123qwerty", + "123zxc", + "1245", + "124578", + "125125", + "1269", + "128500", + "12qw12", + "12qw12qw", + "12qw34er", + "12qwas", + "12qwaszx", + "13011987", + "13011988", + "13021985", + "13021987", + "13021990", + "13021991", + "13031986", + "13031987", + "13031989", + "13041987", + "13041988", + "13041989", + "13051986", + "13051987", + "13051990", + "13061985", + "13061986", + "13061987", + "13061991", + "13071982", + "13071984", + "13071985", + "13071987", + "13071989", + "13071990", + "13081985", + "13081986", + "13091984", + "13091986", + "13091987", + "13091988", + "13101982", + "13101987", + "13101988", + "13101992", + "13111984", + "13111990", + "13121983", + "13121985", + "1313", + "131313", + "13131313", + "132435", + "13243546", + "132456", + "132465", + "134679", + "134679852", + "135246", + "1357", + "13579", + "135790", + "135791", + "1357911", + "135792468", + "1357924680", + "135798642", + "1366613", + "1369", + "14011986", + "14011987", + "14011988", + "14011989", + "14021983", + "14021985", + "14021986", + "14021987", + "14021989", + "14021990", + "14031986", + "14031988", + "14031989", + "14041986", + "14041987", + "14041988", + "14041992", + "14051983", + "14051990", + "14061988", + "14061991", + "14071986", + "14071987", + "14071988", + "14081985", + "14081988", + "14081990", + "14091987", + "14091990", + "14101986", + "14101987", + "14101988", + "14111986", + "14121989", + "1414", + "141414", + "14141414", + "141627", + "142536", + "142857", + "143143", + "145236", + "147147", + "147258", + "14725836", + "147258369", + "147369", + "147741", + "147852", + "147852369", + "147896", + "1478963", + "14789632", + "147896325", + "147963", + "14881488", + "1492", + "15011983", + "15011985", + "15011986", + "15011987", + "15011988", + "15011990", + "15021983", + "15021985", + "15021986", + "15021990", + "15031988", + "15031990", + "15031991", + "15041987", + "15041988", + "15051981", + "15051985", + "15051986", + "15051987", + "15051989", + "15051990", + "15051992", + "15061984", + "15061985", + "15061988", + "15071983", + "15071985", + "15071986", + "15071987", + "15071988", + "15071990", + "150781", + "15081986", + "15081988", + "15081989", + "15081990", + "15081991", + "15091985", + "15091987", + "15091988", + "15091989", + "15101986", + "15101991", + "15111984", + "15111988", + "15111989", + "15121983", + "15121987", + "1515", + "151515", + "15151515", + "153624", + "15426378", + "159159", + "159357", + "159357a", + "159632", + "15975", + "159753", + "1598753", + "159951", + "16011986", + "16011987", + "16011989", + "16021987", + "16021988", + "16021990", + "16031986", + "16031988", + "16031990", + "16041985", + "16041988", + "16051985", + "16051987", + "16051988", + "16051989", + "16051990", + "16061985", + "16061986", + "16061987", + "16061988", + "16071987", + "16071991", + "16081986", + "16091987", + "16091988", + "16091990", + "16101986", + "16101987", + "16111982", + "16111990", + "16121986", + "16121987", + "16121991", + "1616", + "161616", + "162534", + "1701", + "17011987", + "17011990", + "17021985", + "17021987", + "17021989", + "17031987", + "17041985", + "17041986", + "17041987", + "17041991", + "17051983", + "17051987", + "17051988", + "17051989", + "17051990", + "17061986", + "17061987", + "17061988", + "17061989", + "17061991", + "17071985", + "17071986", + "17071987", + "17071989", + "17071990", + "17091985", + "17091987", + "17101986", + "17101987", + "17111985", + "17111987", + "17121985", + "17121987", + "1717", + "171717", + "17171717", + "172839", + "1776", + "18011985", + "18011986", + "18011987", + "18011988", + "18021984", + "18021986", + "18021987", + "18021988", + "18021992", + "18031986", + "18031988", + "18031991", + "18041986", + "18041990", + "18041991", + "18051987", + "18051988", + "18051989", + "18051990", + "18061985", + "18061990", + "18061991", + "18071986", + "18071989", + "18071990", + "18081988", + "18091985", + "18091986", + "18091987", + "18101985", + "18101987", + "18111983", + "18111986", + "18111987", + "1812", + "18121812", + "18121983", + "18121984", + "18121985", + "18121987", + "18121990", + "1818", + "181818", + "18436572", + "187187", + "19011987", + "19011989", + "19021990", + "19021991", + "19031985", + "19031987", + "19041985", + "19041986", + "1905", + "19051983", + "19051986", + "19051987", + "19061985", + "19061987", + "19061990", + "19061991", + "19061992", + "19071986", + "19071988", + "19071989", + "19071990", + "19081986", + "19081987", + "19091983", + "19091988", + "19091990", + "19101986", + "19101987", + "19101990", + "19111985", + "19111986", + "19111987", + "19121988", + "19121989", + "1919", + "191919", + "192837", + "19283746", + "192837465", + "1941", + "19411945", + "1942", + "1943", + "1944", + "1945", + "1946", + "1947", + "1948", + "1949", + "1950", + "1951", + "1952", + "1953", + "1954", + "1955", + "1956", + "1957", + "1958", + "1959", + "1960", + "1961", + "1962", + "1963", + "1964", + "19641964", + "1965", + "19651965", + "1966", + "19661966", + "1967", + "19671967", + "1968", + "19681968", + "1969", + "19691969", + "196969", + "1970", + "19701970", + "1971", + "19711971", + "1972", + "19721972", + "1973", + "19731973", + "1974", + "19741974", + "1975", + "19751975", + "1976", + "19761976", + "1977", + "19771977", + "1978", + "19781978", + "1979", + "19791979", + "1980", + "19801980", + "1981", + "19811981", + "1982", + "19821982", + "1983", + "19831983", + "1984", + "19841984", + "1985", + "19851985", + "1986", + "19861986", + "1987", + "19871987", + "1988", + "19881988", + "1989", + "19891989", + "1990", + "19901990", + "1991", + "19911991", + "1992", + "19921992", + "1993", + "19931993", + "1994", + "19941994", + "1995", + "19951995", + "1996", + "19961996", + "1997", + "19971997", + "1998", + "19981998", + "1999", + "19991999", + "199999", + "1a2b3c", + "1a2b3c4d", + "1a2s3d", + "1a2s3d4f", + "1Dragon", + "1Master", + "1Passwor", + "1passwor", + "1Pussy", + "1q1q1q", + "1q1q1q1q", + "1q2q3q", + "1q2w3e", + "1q2w3e4r", + "1q2w3e4r5", + "1q2w3e4r5t", + "1q2w3e4r5t6y", + "1qa2ws", + "1qa2ws3ed", + "1qaz", + "1qaz1qaz", + "1qaz2ws", + "1qaz2wsx", + "1qaz2wsx3edc", + "1qazxsw2", + "1qazxsw23edc", + "1qazzaq1", + "1qw23er4", + "1qwerty", + "1x2zkg8w", + "1z2x3c", + "1z2x3c4v", + "2000", + "200000", + "20002000", + "2001", + "2001112", + "20011983", + "20011988", + "20011989", + "20012001", + "2002", + "20021985", + "20021986", + "20021988", + "20022002", + "2003", + "20031985", + "20031986", + "20031987", + "20031988", + "20031990", + "20031991", + "20031992", + "20032003", + "2004", + "20041985", + "20041986", + "20041988", + "20041990", + "2005", + "20051983", + "20051985", + "20051987", + "20051988", + "20051989", + "20052005", + "2006", + "20061983", + "20061984", + "20061986", + "20061987", + "20061988", + "20061990", + "20061991", + "2007", + "20071984", + "20071986", + "20071988", + "2008", + "20081986", + "20081990", + "20081991", + "20082008", + "2009", + "20091986", + "20091988", + "20091991", + "20092009", + "2010", + "20101987", + "20101988", + "20102010", + "20111986", + "20121986", + "20121988", + "20121989", + "2020", + "202020", + "20202020", + "21011988", + "21011989", + "21011991", + "21021985", + "21021987", + "21021988", + "21021989", + "21021990", + "21031984", + "21031985", + "21031986", + "21031987", + "21031988", + "21031990", + "21041985", + "21041987", + "21041991", + "21041992", + "21051986", + "21051988", + "21051990", + "21051991", + "21061985", + "21061986", + "21061988", + "21071987", + "21071989", + "21071992", + "21081985", + "21081987", + "21091989", + "21101983", + "21101986", + "21101987", + "21101988", + "21101989", + "21111983", + "21111985", + "21111986", + "21111989", + "21111990", + "2112", + "21121985", + "21121986", + "21121989", + "21122112", + "2121", + "212121", + "21212121", + "2128506", + "22011985", + "22011986", + "22011988", + "22011992", + "22021985", + "22021986", + "22021988", + "22021989", + "22021990", + "22031984", + "22031986", + "22031991", + "22041985", + "22041986", + "22041987", + "22041988", + "22051986", + "22051987", + "22051988", + "22051989", + "22051991", + "22061941", + "22061984", + "22061985", + "22061987", + "22061988", + "22061989", + "22061990", + "22071983", + "22071984", + "22071985", + "22071986", + "22071987", + "22071988", + "22071989", + "22071990", + "22071991", + "22071992", + "22081983", + "22081986", + "22081991", + "22091984", + "22091986", + "22091988", + "22091990", + "22091991", + "2211", + "22111985", + "22111988", + "22121983", + "22121986", + "22121987", + "22121989", + "2222", + "22222", + "222222", + "2222222", + "22222222", + "2222222222", + "222333", + "222777", + "223322", + "223344", + "224466", + "225588", + "23011985", + "23011990", + "23021983", + "23021985", + "23021986", + "23021988", + "23021989", + "23021992", + "23031983", + "23031986", + "23031987", + "23031990", + "23041986", + "23041987", + "23041988", + "23041991", + "23051983", + "23051985", + "23051986", + "23051987", + "23051990", + "23051991", + "23061987", + "23061989", + "23061990", + "23061992", + "23071985", + "23091985", + "23091986", + "23091987", + "23091989", + "23091991", + "23101987", + "23111986", + "23111987", + "23111989", + "23121986", + "2323", + "232323", + "23232323", + "2345", + "23456", + "234567", + "23456789", + "235689", + "23skidoo", + "24011985", + "24011987", + "24011990", + "24021988", + "24021991", + "24031987", + "24031988", + "24031990", + "24041984", + "24041985", + "24041986", + "24041988", + "24051989", + "24051990", + "24061985", + "24061986", + "24061987", + "24061988", + "24061992", + "24071987", + "24071990", + "24071991", + "24071992", + "24081988", + "24091986", + "24091991", + "24101984", + "24101986", + "24101988", + "24101989", + "24101990", + "24101991", + "24111987", + "24111989", + "24111990", + "24121986", + "24121987", + "24121988", + "24121989", + "2424", + "242424", + "24242424", + "2468", + "24680", + "246810", + "24682468", + "2469", + "25011985", + "25011986", + "25011990", + "25011993", + "25021985", + "25021986", + "25021988", + "25031983", + "25031984", + "25031987", + "25031991", + "25041985", + "25041987", + "25041988", + "25041991", + "25051980", + "25051985", + "25051987", + "25051988", + "25061985", + "25061986", + "25061987", + "25071983", + "25071985", + "25071987", + "25071990", + "25081985", + "25081986", + "25081988", + "25081989", + "25091987", + "25091989", + "25091990", + "25091991", + "25101988", + "25101989", + "25111987", + "25111991", + "25121985", + "25121987", + "2525", + "252525", + "25252525", + "2580", + "25800852", + "25802580", + "258258", + "258369", + "258456", + "258852", + "258963", + "26011986", + "26011990", + "26021987", + "26021992", + "26031984", + "26031986", + "26031987", + "26031988", + "26031990", + "26031991", + "26041986", + "26041991", + "26051986", + "26051988", + "26061985", + "26061986", + "26061987", + "26061989", + "26061991", + "26071984", + "26071986", + "26071987", + "26071989", + "26081986", + "26091986", + "26101986", + "26101987", + "26111985", + "26121989", + "2626", + "262626", + "27011988", + "27021990", + "27021991", + "27021992", + "27031986", + "27031987", + "27031989", + "27031992", + "27041985", + "27041990", + "27051987", + "27061983", + "27061985", + "27061988", + "27071987", + "27071988", + "27081986", + "27081990", + "27091985", + "27091991", + "27111985", + "27111989", + "27111990", + "2727", + "272727", + "27272727", + "28011987", + "28011988", + "28021983", + "28021985", + "28021986", + "28021990", + "28021992", + "28031982", + "28041987", + "28041992", + "28051985", + "28051986", + "28051987", + "28051990", + "28061986", + "28061988", + "28071985", + "28071986", + "28071987", + "28081986", + "28081990", + "28101986", + "28121984", + "28121989", + "2828", + "282828", + "29011982", + "29011985", + "29011987", + "29031988", + "29031990", + "29041985", + "29041988", + "29041989", + "29051985", + "29051989", + "29051990", + "29051992", + "29061985", + "29061986", + "29061988", + "29061989", + "29061990", + "29071983", + "29071985", + "29081985", + "29081990", + "29091987", + "29111988", + "29111989", + "29121987", + "292929", + "2fast4u", + "3000gt", + "30011985", + "30011986", + "30011987", + "30011990", + "30031986", + "30031988", + "30031992", + "30041985", + "30041986", + "30041987", + "30041991", + "30051985", + "30051986", + "30051987", + "30051988", + "30051989", + "3006", + "30061983", + "30061987", + "30061988", + "30071986", + "30081984", + "30091989", + "30101988", + "30111987", + "30121985", + "30121986", + "30121987", + "30121988", + "3030", + "303030", + "31011987", + "31011990", + "31031987", + "31031988", + "31051982", + "31051985", + "31051987", + "31051991", + "31051993", + "31071990", + "31101987", + "31121985", + "31121986", + "31121987", + "31121988", + "31121990", + "311311", + "3131", + "313131", + "314159", + "31415926", + "315475", + "321123", + "321321", + "321321321", + "321456", + "321654", + "321654987", + "32167", + "321678", + "3232", + "323232", + "332211", + "3333", + "33333", + "333333", + "3333333", + "33333333", + "333444", + "333666", + "333777", + "334455", + "336699", + "3434", + "343434", + "345678", + "353535", + "357159", + "357357", + "357951", + "362436", + "3636", + "363636", + "369258", + "369258147", + "369369", + "369852", + "369963", + "373737", + "383838", + "393939", + "3ip76k2", + "3x7PxR", + "4040", + "404040", + "4121", + "4128", + "414141", + "415263", + "4200", + "420000", + "420247", + "420420", + "4242", + "424242", + "426hemi", + "4321", + "43214321", + "434343", + "4417", + "44332211", + "4444", + "44444", + "444444", + "4444444", + "44444444", + "445566", + "4545", + "454545", + "45454545", + "456123", + "456321", + "456456", + "456456456", + "456654", + "4567", + "45678", + "456789", + "456852", + "45M2DO5BS", + "464646", + "4711", + "474747", + "4815162342", + "484848", + "494949", + "49ers", + "4ever", + "4runner", + "5000", + "5050", + "505050", + "50cent", + "50spanks", + "5150", + "515000", + "51505150", + "515151", + "5201314", + "5252", + "525252", + "5329", + "535353", + "5424", + "54321", + "543210", + "5454", + "545454", + "5551212", + "5555", + "55555", + "555555", + "5555555", + "55555555", + "5555555555", + "555666", + "555777", + "556677", + "5656", + "565656", + "5678", + "567890", + "575757", + "57chevy", + "585858", + "5Wr2i7H8", + "606060", + "609609609", + "616161", + "626262", + "635241", + "636363", + "646464", + "654123", + "65432", + "654321", + "654654", + "655321", + "656565", + "66613666", + "6666", + "66666", + "666666", + "6666666", + "66666666", + "666777", + "666999", + "6751520", + "676767", + "686868", + "6969", + "69696", + "696969", + "69696969", + "6996", + "7007", + "717171", + "727272", + "73501505", + "737373", + "74108520", + "741741", + "741852", + "741852963", + "741963", + "747474", + "753159", + "753951", + "757575", + "7654321", + "767676", + "7734", + "7753191", + "777333", + "777666", + "7777", + "77777", + "777777", + "7777777", + "77777777", + "7777777777", + "7777777a", + "777888", + "7779311", + "777999", + "778899", + "784512", + "786786", + "787878", + "787898", + "789123", + "7894", + "78945", + "789456", + "78945612", + "789456123", + "7894561230", + "7895123", + "7896321", + "789654", + "789654123", + "789789", + "789789789", + "789987", + "794613", + "797979", + "7uGd5HIp2J", + "808080", + "818181", + "81fukkc", + "852456", + "852852", + "858585", + "8675309", + "868686", + "875421", + "87654321", + "878787", + "8888", + "88888", + "888888", + "8888888", + "88888888", + "888999", + "8989", + "898989", + "8J4yE3Uz", + "90210", + "906090", + "909090", + "911911", + "9293709b13", + "9379992", + "951357", + "951753", + "9562876", + "963852", + "963852741", + "963963", + "969696", + "987123", + "987321", + "987456", + "987456321", + "9876", + "98765", + "987654", + "9876543", + "98765432", + "987654321", + "9876543210", + "987987", + "989898", + "996633", + "998877", + "999666", + "9999", + "99999", + "999999", + "9999999", + "99999999", + "999999999", + "9999999999", + "a11111", + "a1234", + "a12345", + "a123456", + "a1234567", + "a12345678", + "a123456789", + "a1a1a1", + "a1a2a3", + "a1b2c3", + "a1b2c3d4", + "a1s2d3", + "a1s2d3f4", + "aaa111", + "aaaa", + "aaaaa", + "aaaaaa", + "aaaaaaa", + "aaaaaaaa", + "aaaaaaaaaa", + "aaasss", + "aaliyah", + "aardvark", + "aaron", + "aaron1", + "abacab", + "abbott", + "abby", + "abc12", + "abc123", + "ABC123", + "abc1234", + "abc12345", + "abcabc", + "abcd", + "abcd123", + "abcd1234", + "abcde", + "abcdef", + "abcdefg", + "abcdefgh", + "aberdeen", + "abgrtyu", + "abigail", + "abnormal", + "abraham", + "abrakadabra", + "absolut", + "absolute", + "absolutely", + "abstr", + "access", + "access14", + "accord", + "account", + "aceace", + "achilles", + "achtung", + "acidburn", + "acmilan", + "action", + "active", + "acura", + "adam", + "adam12", + "adams", + "addict", + "addison", + "adelina", + "adgjmp", + "adgjmptw", + "adidas", + "admin", + "admiral", + "adonis", + "adrenalin", + "adrian", + "adriana", + "adriano", + "adrienne", + "adult", + "adults", + "advance", + "advent", + "aezakmi", + "africa", + "afrika", + "again", + "agent007", + "aggies", + "aikido", + "aikman", + "aileen", + "airborne", + "airbus", + "airforce", + "airman", + "airplane", + "airport", + "airwolf", + "aisan", + "akira", + "alabama", + "aladin", + "alan", + "alanis", + "alaska", + "albany", + "albatros", + "albert", + "alberta", + "alberto", + "albina", + "albion", + "alcatraz", + "alchemy", + "alcohol", + "alejandr", + "alejandro", + "aleksandr", + "aleksandra", + "aleksey", + "alena", + "alenka", + "alessandro", + "alex", + "alex12", + "alex123", + "alexalex", + "alexande", + "alexander", + "alexandr", + "alexandra", + "alexandre", + "alexey", + "alexia", + "alexis", + "alfa", + "alfred", + "alfredo", + "algebra", + "alibaba", + "alice", + "alice1", + "alicia", + "alien", + "aliens", + "alina", + "alinka", + "alisa", + "alisha", + "alison", + "alissa", + "alive", + "all4one", + "allan", + "allegro", + "allen", + "alleycat", + "allgood", + "alliance", + "allison", + "allmine", + "allsop", + "allstar", + "almighty", + "almond", + "aloha", + "alone", + "alpha", + "alpha1", + "alphabet", + "alpine", + "altima", + "alucard", + "always", + "alyssa", + "amadeus", + "amand", + "amanda", + "amanda1", + "amateur", + "amateurs", + "amazing", + "amazon", + "amber", + "amber1", + "ambers", + "ambrose", + "ambrosia", + "amelia", + "americ", + "america", + "america1", + "american", + "amerika", + "amethyst", + "amigo", + "amigos", + "amorcit", + "amore", + "amstel", + "amsterda", + "amsterdam", + "anaconda", + "Anai", + "anakin", + "anal", + "analsex", + "ananas", + "anarchy", + "anastasi", + "anastasia", + "anastasiya", + "anchor", + "anders", + "andersen", + "anderson", + "andre", + "andrea", + "andrea1", + "andreas", + "andrei", + "andres", + "andrew", + "Andrew", + "ANDREW", + "andrew1", + "andrey", + "andromed", + "andromeda", + "andy", + "andyod22", + "anfield", + "angel", + "angel1", + "angel123", + "angela", + "angelic", + "angelica", + "angelika", + "angelina", + "angelo", + "angels", + "angelus", + "angie", + "angus", + "angus1", + "anhyeuem", + "animal", + "animals", + "anime", + "anita", + "anna", + "annabell", + "anne", + "annette", + "annie", + "annie1", + "annika", + "annmarie", + "another", + "answer", + "antares", + "antelope", + "anthon", + "anthony", + "Anthony", + "anthony1", + "anthrax", + "antoine", + "anton", + "antoni", + "antonia", + "antonina", + "antonio", + "antony", + "anubis", + "anything", + "aolsucks", + "apache", + "apollo", + "apollo13", + "apple", + "apple1", + "apple123", + "applepie", + "apples", + "april", + "april1", + "aprilia", + "aptiva", + "aquarius", + "aragorn", + "aramis", + "arcadia", + "archange", + "archer", + "archie", + "area51", + "argentin", + "argentina", + "ariana", + "ariane", + "arianna", + "ariel", + "aries", + "arizona", + "arjay", + "arkansas", + "arlene", + "armada", + "armagedon", + "armand", + "armando", + "armani", + "armstron", + "army", + "arnold", + "around", + "arrow", + "arrows", + "arsenal", + "arsenal1", + "artem", + "artemis", + "artemka", + "arthur", + "artist", + "artur", + "arturo", + "asasas", + "asd123", + "asd222", + "asdasd", + "asdasdasd", + "asddsa", + "asdf", + "asdf12", + "asdf123", + "asdf1234", + "asdfasdf", + "asdffdsa", + "asdfg", + "asdfgh", + "asdfgh01", + "asdfghj", + "asdfghjk", + "asdfghjkl", + "asdfjkl", + "asdfzxcv", + "asdqwe", + "asdqwe123", + "asdzxc", + "asgard", + "ashle", + "ashlee", + "ashleigh", + "ashley", + "ashley1", + "ashton", + "asia", + "asian", + "asians", + "asimov", + "aspen", + "aspire", + "aspirine", + "assasin", + "assass", + "assassin", + "assfuck", + "asshole", + "asshole1", + "assholes", + "assman", + "assword", + "asterix", + "astra", + "astral", + "astrid", + "astro", + "astros", + "athena", + "athens", + "athlon", + "atlanta", + "atlantic", + "atlantis", + "atlas", + "atomic", + "attack", + "atticus", + "attila", + "attitude", + "aubrey", + "auburn", + "audi", + "audia4", + "audio", + "auditt", + "audrey", + "auggie", + "august", + "augusta", + "augustus", + "aurora", + "aussie", + "austin", + "austin1", + "austin31", + "australi", + "australia", + "austria", + "auto", + "autumn", + "avalanch", + "avalon", + "avatar", + "avenger", + "avenue", + "aviation", + "awesome", + "awesome1", + "awful", + "awnyce", + "azamat", + "azazaz", + "azazel", + "azert", + "azerty", + "azertyui", + "azertyuiop", + "azsxdc", + "azsxdcfv", + "azzer", + "baba", + "babe", + "babes", + "babies", + "baby", + "babybaby", + "babyblue", + "babyboy", + "babycake", + "babydoll", + "babyface", + "babygirl", + "babylon", + "babylon5", + "babylove", + "bacardi", + "bacchus", + "back", + "backdoor", + "backup", + "bacon", + "badass", + "badboy", + "baddog", + "badger", + "badgers", + "badgirl", + "badman", + "baggins", + "baggio", + "bagira", + "bahamut", + "bailey", + "bailey1", + "baker", + "balance", + "baldwin", + "ball", + "baller", + "ballet", + "ballin", + "balloon", + "balloons", + "balls", + "bambam", + "bambi", + "bamboo", + "banan", + "banana", + "bananas", + "banane", + "bandit", + "bang", + "bangbang", + "banger", + "bangkok", + "bank", + "banker", + "banner", + "banshee", + "banzai", + "baracuda", + "barbados", + "barbar", + "barbara", + "barber", + "barbie", + "barcelon", + "barcelona", + "barefoot", + "barfly", + "baritone", + "barker", + "barkley", + "barley", + "barnes", + "barney", + "baron", + "barrett", + "barron", + "barry", + "barry1", + "barselona", + "barsik", + "bart", + "bartman", + "barton", + "base", + "basebal", + "baseball", + "BASEBALL", + "Baseball", + "baseball1", + "basket", + "basketba", + "basketball", + "bass", + "basset", + "bassman", + "bastard", + "bastards", + "bathing", + "batman", + "Batman", + "batman1", + "battery", + "battle", + "baxter", + "bayern", + "baylor", + "bball", + "bbbb", + "bbbbb", + "bbbbbb", + "bbbbbbb", + "bbbbbbbb", + "bcfields", + "bdsm", + "beach", + "beaches", + "beacon", + "beagle", + "beaker", + "beamer", + "bean", + "beaner", + "beanie", + "beans", + "bear", + "bearbear", + "bearcat", + "bearcats", + "beardog", + "bears", + "beast", + "Beast1", + "beastie", + "beater", + "beatle", + "beatles", + "beatrice", + "beautifu", + "beautiful", + "beauty", + "beaver", + "beavis", + "because", + "becker", + "beckham", + "becky", + "bedford", + "beech", + "beefcake", + "beemer", + "beer", + "beerbeer", + "beerman", + "beetle", + "beezer", + "behappy", + "believe", + "belinda", + "bell", + "bella", + "bella1", + "belle", + "belmont", + "beloved", + "benben", + "bender", + "benessere", + "benfica", + "beng", + "bengals", + "benito", + "benjamin", + "bennett", + "bennie", + "benny", + "benoit", + "benson", + "bentley", + "beowulf", + "beretta", + "berger", + "bergkamp", + "berkeley", + "berlin", + "bermuda", + "bernard", + "bernie", + "berry", + "bert", + "bertha", + "bertie", + "bessie", + "best", + "bestbuy", + "beta", + "beth", + "bethany", + "better", + "betty", + "beverly", + "bhbirf", + "bian", + "bianca", + "biao", + "biatch", + "bicycle", + "bigass", + "bigballs", + "bigbang", + "bigbear", + "bigben", + "bigbig", + "bigbird", + "bigblock", + "bigblue", + "bigbob", + "bigboobs", + "bigbooty", + "bigboss", + "bigboy", + "bigbutt", + "bigcat", + "bigcock", + "bigdaddy", + "bigdawg", + "bigdick", + "bigdicks", + "bigdog", + "bigfish", + "bigfoot", + "bigger", + "biggie", + "biggles", + "biggun", + "bigguns", + "bigguy", + "bighead", + "bigmac", + "bigman", + "bigmike", + "bigmoney", + "bigone", + "bigones", + "bigpimp", + "bigpoppa", + "bigred", + "bigsexy", + "bigtime", + "bigtit", + "bigtits", + "biit", + "bike", + "biker", + "bikini", + "bilbo", + "bill", + "billabon", + "billie", + "billy", + "billy1", + "billybob", + "billyboy", + "bimbo", + "bimmer", + "bing", + "bingo", + "bingo1", + "binladen", + "biology", + "bird", + "bird33", + "birddog", + "birdie", + "birdman", + "birgit", + "birthday", + "biscuit", + "bishop", + "bismillah", + "bitch", + "bitch1", + "bitchass", + "bitches", + "bitchy", + "biteme", + "bitter", + "bizkit", + "blabla", + "blablabla", + "black", + "black1", + "blackbir", + "blackcat", + "blackdog", + "blackhaw", + "blackie", + "blackjac", + "blackjack", + "blacklab", + "blackman", + "blackout", + "blacks", + "blacky", + "blade", + "blades", + "blahblah", + "blaine", + "blake", + "blam", + "blanca", + "blanche", + "blanco", + "blast", + "blaster", + "blaze", + "blazer", + "bleach", + "bledsoe", + "blessed", + "blessing", + "blink182", + "blizzard", + "blond", + "blonde", + "blondes", + "blondie", + "blood", + "bloody", + "blossom", + "blow", + "blowfish", + "blowjob", + "blowme", + "blubber", + "blue", + "blue12", + "blue123", + "blue1234", + "blue22", + "blue32", + "blue42", + "blue99", + "blueball", + "bluebell", + "bluebird", + "blueblue", + "blueboy", + "bluedog", + "blueeyes", + "bluefish", + "bluejays", + "bluemoon", + "blues", + "blues1", + "bluesky", + "bluesman", + "bmw325", + "bmwbmw", + "boat", + "boater", + "boating", + "bob123", + "bobafett", + "bobbie", + "bobbob", + "bobby", + "bobby1", + "bobcat", + "bobdole", + "bobdylan", + "bobmarley", + "bobo", + "bobobo", + "body", + "boeing", + "bogart", + "bogdan", + "bogey", + "bohica", + "boiler", + "bolitas", + "bollocks", + "bollox", + "bologna", + "bolton", + "bomb", + "bombay", + "bomber", + "bombers", + "bonanza", + "bonbon", + "bond", + "bond007", + "bondage", + "bone", + "bonehead", + "boner", + "bones", + "bongo", + "bonita", + "bonjour", + "bonjovi", + "bonkers", + "bonner", + "bonnie", + "bonsai", + "boob", + "boobear", + "boobie", + "boobies", + "booboo", + "boobs", + "booger", + "boogie", + "book", + "booker", + "bookie", + "books", + "bookworm", + "boom", + "boomboom", + "boomer", + "boomer1", + "booster", + "bootie", + "boots", + "bootsie", + "bootsy", + "booty", + "bootys", + "booyah", + "boozer", + "borabora", + "bordeaux", + "borders", + "boricua", + "boris", + "borussia", + "bosco", + "boss", + "bossman", + "boston", + "bottle", + "bottom", + "boubou", + "boulder", + "bounce", + "bounty", + "bowler", + "bowling", + "bowman", + "bowser", + "bowtie", + "bowwow", + "boxcar", + "boxer", + "boxers", + "boxing", + "boxster", + "boyboy", + "boys", + "boytoy", + "boyz", + "bozo", + "br0d3r", + "br549", + "brad", + "bradford", + "bradley", + "brady", + "brain", + "brains", + "brand", + "brandi", + "brando", + "brandon", + "brandon1", + "brandy", + "brandy1", + "brasil", + "braves", + "bravo", + "brazil", + "breaker", + "breanna", + "breast", + "breasts", + "breeze", + "brenda", + "brendan", + "brennan", + "brent", + "brest", + "brett", + "brewer", + "brewster", + "brian", + "brian1", + "briana", + "brianna", + "bricks", + "bridge", + "bridget", + "briggs", + "bright", + "brighton", + "brigitte", + "bristol", + "british", + "britney", + "brittany", + "brittney", + "broadway", + "brodie", + "broken", + "broker", + "bronco", + "broncos", + "broncos1", + "bronson", + "bronze", + "brook", + "brooke", + "brooklyn", + "brooks", + "brother", + "brothers", + "brown", + "brown1", + "brownie", + "browning", + "browns", + "bruce", + "bruce1", + "brucelee", + "bruins", + "bruiser", + "bruno", + "bruno1", + "brutus", + "bryan", + "bryant", + "bubba", + "bubba1", + "bubba123", + "bubba69", + "bubbas", + "bubble", + "bubbles", + "bubbles1", + "buceta", + "buck", + "bucket", + "buckeye", + "buckeyes", + "buckley", + "buckshot", + "budapest", + "buddah", + "buddha", + "buddie", + "buddy", + "buddy1", + "buddy123", + "buddyboy", + "budgie", + "budlight", + "budman", + "budweise", + "budweiser", + "buffalo", + "buffalo1", + "buffet", + "buffett", + "buffy", + "buffy1", + "bugger", + "bugs", + "builder", + "building", + "bukkake", + "bull", + "bulldog", + "bulldog1", + "bulldogs", + "bullet", + "bullfrog", + "bulls", + "bullseye", + "bullshit", + "bumble", + "bumbum", + "bummer", + "bumper", + "bunghole", + "bungle", + "bunker", + "bunnies", + "bunny", + "bunny1", + "burger", + "burn", + "burner", + "burning", + "burnout", + "burns", + "burrito", + "burton", + "bush", + "bushido", + "business", + "buste", + "busted", + "buster", + "Buster", + "buster1", + "busty", + "butch", + "butcher", + "butkus", + "butler", + "butt", + "butter", + "buttercu", + "buttercup", + "butterfl", + "butterfly", + "butters", + "buttfuck", + "butthead", + "butthole", + "buttman", + "button", + "buttons", + "butts", + "buzz", + "buzzard", + "buzzer", + "byebye", + "bynthytn", + "byteme", + "c2h5oh", + "cabbage", + "cabernet", + "cable", + "cabron", + "caca", + "cactus", + "cadillac", + "caesar", + "cafc91", + "caitlin", + "calgary", + "calibra", + "calico", + "caliente", + "californ", + "california", + "caligula", + "calimero", + "call", + "callaway", + "callie", + "callisto", + "callum", + "calvin", + "camaro", + "camaross", + "camber", + "cambiami", + "camden", + "camel", + "camelot", + "camels", + "cameltoe", + "camera", + "camero", + "cameron", + "cameron1", + "camil", + "camila", + "camilla", + "camille", + "campbell", + "camper", + "camping", + "canada", + "canadian", + "cancel", + "cancer", + "cancun", + "candace", + "candice", + "candle", + "candy", + "candy1", + "candyass", + "candyman", + "cang", + "cannabis", + "cannibal", + "cannon", + "canon", + "cantona", + "canuck", + "canucks", + "canyon", + "capecod", + "capetown", + "capital", + "capone", + "caprice", + "capricor", + "capricorn", + "capslock", + "captain", + "captain1", + "caramel", + "caravan", + "carbon", + "card", + "cardiff", + "cardinal", + "cardinals", + "cards", + "carebear", + "carina", + "carl", + "carla", + "carlito", + "carlitos", + "carlo", + "carlos", + "carlton", + "carman", + "carmel", + "carmen", + "carmex2", + "carnage", + "carnival", + "carol", + "carole", + "carolin", + "carolina", + "caroline", + "carolyn", + "carpedie", + "carpente", + "carpet", + "carrera", + "carrie", + "carroll", + "carrot", + "carrots", + "cars", + "carson", + "carter", + "cartman", + "cartoon", + "cartoons", + "carver", + "casanova", + "cascade", + "caserta", + "casey", + "casey1", + "cash", + "cashmone", + "cashmoney", + "casino", + "casio", + "casper", + "casper1", + "cassandr", + "cassandra", + "cassidy", + "cassie", + "caster", + "castillo", + "castle", + "castor", + "castro", + "cat123", + "catalina", + "catcat", + "catch22", + "catcher", + "catdog", + "catfish", + "catherin", + "catherine", + "cathy", + "catman", + "catnip", + "cats", + "cattle", + "catwoman", + "caught", + "cavalier", + "caveman", + "cayman", + "cbr600", + "cbr900rr", + "ccbill", + "cccc", + "ccccc", + "cccccc", + "ccccccc", + "cccccccc", + "cdtnbr", + "cdtnkfyf", + "ceasar", + "cecile", + "cecilia", + "cedric", + "celeb", + "celebrity", + "celeron", + "celeste", + "celica", + "celine", + "celtic", + "celtics", + "cement", + "ceng", + "center", + "central", + "century", + "cerberus", + "cessna", + "cevthrb", + "cfitymrf", + "cgfhnfr", + "chacha", + "chad", + "chai", + "chains", + "chainsaw", + "chair", + "challeng", + "chambers", + "champ", + "champion", + "champs", + "chan", + "chance", + "chandler", + "chandra", + "chanel", + "chang", + "change", + "changed", + "changeme", + "changes", + "channel", + "chantal", + "chao", + "chaos", + "chaos1", + "chapman", + "charger", + "chargers", + "charisma", + "charity", + "charlene", + "charles", + "Charles", + "charles1", + "charley", + "charli", + "charlie", + "Charlie", + "charlie1", + "charlie2", + "charlott", + "charlotte", + "charlton", + "charly", + "charmed", + "charon", + "charter", + "chase", + "chase1", + "chaser", + "chavez", + "cheater", + "check", + "Check", + "checker", + "checkers", + "cheddar", + "cheech", + "cheeks", + "cheeky", + "cheerleaers", + "cheers", + "cheese", + "cheese1", + "cheetah", + "chef", + "chelle", + "chelse", + "chelsea", + "chelsea1", + "chemical", + "cheng", + "cherokee", + "cherries", + "cherry", + "cheryl", + "cheshire", + "chessie", + "chester", + "chester1", + "chestnut", + "chevelle", + "chevrole", + "chevrolet", + "chevy", + "chevy1", + "chevys", + "chewie", + "chewy", + "cheyenne", + "chiara", + "chicago", + "chicago1", + "chichi", + "chick", + "chicken", + "chicken1", + "chickens", + "chicks", + "chico", + "chief", + "chiefs", + "children", + "chill", + "chilli", + "chillin", + "chilly", + "chimera", + "china", + "chinese", + "chinook", + "chip", + "chipmunk", + "chipper", + "chippy", + "chips", + "chiquita", + "chivas", + "chloe", + "chloe1", + "chocha", + "chocolat", + "chocolate", + "choice", + "choke", + "chong", + "choochoo", + "chopin", + "chopper", + "chou", + "chouchou", + "chris", + "chris1", + "chris123", + "chrisbln", + "chriss", + "chrissy", + "christ", + "christa", + "christi", + "christia", + "christian", + "christie", + "christin", + "christina", + "christine", + "christma", + "christmas", + "christop", + "christopher", + "christy", + "chrome", + "chronic", + "chrono", + "chrysler", + "chuai", + "chuang", + "chubby", + "chuck", + "chuckie", + "chuckles", + "chucky", + "chui", + "chun", + "chunky", + "chuo", + "church", + "ciccio", + "cicero", + "cigar", + "cigars", + "cinder", + "cindy", + "cindy1", + "cinema", + "cinnamon", + "circle", + "circus", + "cirrus", + "cisco", + "citadel", + "citizen", + "citroen", + "city", + "civic", + "cjkysirj", + "cjkywt", + "claire", + "clancy", + "clapton", + "clarence", + "clarinet", + "clarissa", + "clark", + "clarke", + "classic", + "classics", + "claude", + "claudi", + "claudia", + "claudio", + "clay", + "claymore", + "clayton", + "clement", + "clemente", + "clemson", + "cleo", + "cleopatr", + "cleopatra", + "clevelan", + "cliff", + "clifford", + "clifton", + "climax", + "climber", + "clinton", + "clipper", + "clippers", + "clips", + "clit", + "clitoris", + "clock", + "close", + "closer", + "cloud", + "cloud9", + "clouds", + "cloudy", + "clover", + "clovis", + "clown", + "clowns", + "club", + "clutch", + "clyde", + "cnfybckfd", + "coach", + "cobain", + "cobalt", + "cobra", + "cobra1", + "cobras", + "cocacola", + "cocaine", + "cock", + "cocker", + "cocks", + "cocksuck", + "cocksucker", + "coco", + "cococo", + "coconut", + "codered", + "cody", + "coffee", + "cohiba", + "coke", + "cold", + "coldbeer", + "coldplay", + "cole", + "coleman", + "colin", + "colleen", + "college", + "collie", + "collin", + "collins", + "colnago", + "colombia", + "colonel", + "colonial", + "colorado", + "colors", + "colt45", + "colton", + "coltrane", + "columbia", + "columbus", + "comanche", + "combat", + "comedy", + "comein", + "comet", + "comfort", + "comics", + "coming", + "command", + "commande", + "commando", + "common", + "compact", + "company", + "compaq", + "compaq1", + "compass", + "complete", + "compton", + "compute", + "computer", + "Computer", + "conan", + "concord", + "concorde", + "concrete", + "condom", + "condor", + "confused", + "cong", + "connect", + "conner", + "connie", + "connor", + "conover", + "conquest", + "conrad", + "consumer", + "contact", + "content", + "contest", + "contra", + "contract", + "control", + "conway", + "cookie", + "cookie1", + "cookies", + "cool", + "coolcat", + "coolcool", + "cooldude", + "cooler", + "coolguy", + "coolio", + "coolman", + "coolness", + "cooper", + "coors", + "cooter", + "copper", + "coral", + "corey", + "corinne", + "corleone", + "corndog", + "cornell", + "cornwall", + "corolla", + "corona", + "corrado", + "corsair", + "corvette", + "corwin", + "cosmic", + "cosmo", + "cosmos", + "costello", + "cosworth", + "cottage", + "cotton", + "coucou", + "cougar", + "cougars", + "counter", + "country", + "county", + "courage", + "courtney", + "coventry", + "cowboy", + "cowboy1", + "cowboys", + "cowboys1", + "cowgirl", + "coyote", + "crack", + "cracker", + "crackers", + "craig", + "cramps", + "crappy", + "crash", + "crawford", + "crazy", + "crazy1", + "crazybab", + "cream", + "creampie", + "creamy", + "create", + "creation", + "creative", + "creature", + "credit", + "cricket", + "cricket1", + "criminal", + "crimson", + "cristian", + "cristina", + "critter", + "crjhgbjy", + "cromwell", + "cross", + "crow", + "cruise", + "cruiser", + "crunch", + "crusader", + "crusher", + "crusty", + "crysis", + "crystal", + "crystal1", + "cthtuf", + "cthulhu", + "cthutq", + "ctrhtn", + "cuan", + "cubbies", + "cubs", + "cubswin", + "cucumber", + "cuddles", + "cuervo", + "cumcum", + "cumming", + "cumshot", + "cumslut", + "cunt", + "cunts", + "cupcake", + "cupoi", + "curious", + "curtis", + "custom", + "customer", + "cutie", + "cutiepie", + "cutlass", + "cutter", + "cvthnm", + "cxfcnmt", + "cyber", + "cyborg", + "cyclone", + "cyclops", + "cygnus", + "cygnusx1", + "cynthia", + "cypress", + "cyprus", + "cyrano", + "dabears", + "dabomb", + "dada", + "dadada", + "daddy", + "daddy1", + "daddyo", + "daemon", + "daewoo", + "dagger", + "daisey", + "daisy", + "daisy1", + "daisydog", + "dakota", + "dakota1", + "dale", + "dalejr", + "dallas", + "Dallas", + "dallas1", + "dalshe", + "dalton", + "damage", + "daman", + "damian", + "damien", + "dammit", + "damnit", + "damon", + "dana", + "dance", + "dancer", + "dancing", + "dandan", + "dang", + "danger", + "danie", + "daniel", + "Daniel", + "daniel1", + "daniela", + "daniele", + "danielle", + "daniels", + "daniil", + "danila", + "danni", + "danny", + "danny1", + "dannyboy", + "dante", + "danzig", + "daphne", + "darina", + "darius", + "dark", + "darkange", + "darkangel", + "darklord", + "darkman", + "darkness", + "darkside", + "darkstar", + "darlene", + "darling", + "darrell", + "darren", + "darryl", + "darwin", + "data", + "datsun", + "daughter", + "dave", + "david", + "David", + "david1", + "david123", + "davide", + "davids", + "davidson", + "davies", + "davinci", + "davis", + "dawg", + "dawn", + "dawson", + "daylight", + "dayton", + "daytona", + "dbnfkbr", + "dbrnjh", + "dbrnjhbz", + "dddd", + "ddddd", + "dddddd", + "ddddddd", + "dddddddd", + "deacon", + "dead", + "deadhead", + "deadly", + "deadman", + "deadpool", + "dean", + "deanna", + "death", + "death1", + "death666", + "deaths", + "debbie", + "deborah", + "december", + "decker", + "deedee", + "deejay", + "deep", + "deeper", + "deepthroat", + "deer", + "deeznuts", + "deeznutz", + "default", + "defender", + "defense", + "defiant", + "deftones", + "dejavu", + "delaney", + "delaware", + "delete", + "delfin", + "delight", + "delilah", + "dell", + "delldell", + "delmar", + "delphi", + "delpiero", + "delta", + "delta1", + "deluxe", + "demo", + "demon", + "demons", + "denali", + "deng", + "deniro", + "denis", + "denise", + "deniska", + "denmark", + "dennis", + "dental", + "dentist", + "denver", + "depeche", + "deputy", + "derek", + "derf", + "derparol", + "derrick", + "descent", + "desert", + "design", + "designer", + "desire", + "desiree", + "deskjet", + "desmond", + "destin", + "destiny", + "destiny1", + "destroy", + "detroit", + "deutsch", + "devil", + "devil666", + "devildog", + "deville", + "devils", + "devin", + "devo", + "devon", + "dexter", + "dfcbkbq", + "dfkthbz", + "dfkthf", + "dfktynby", + "dfktynbyf", + "dfvgbh", + "dharma", + "diablo", + "diablo2", + "dialog", + "diamond", + "diamond1", + "diamonds", + "dian", + "diana", + "diane", + "dianne", + "diao", + "diaper", + "dick", + "dickens", + "dickhead", + "dickie", + "dicks", + "dicky", + "diego", + "diehard", + "diesel", + "dietcoke", + "dieter", + "digger", + "diggler", + "digimon", + "digital", + "digital1", + "dilbert", + "dildo", + "dilligaf", + "dillon", + "dima", + "dimas", + "dimitri", + "dimples", + "dinamo", + "dinara", + "dindom", + "ding", + "dingdong", + "dingle", + "dingo", + "dinner", + "dino", + "dinosaur", + "dipshit", + "direct", + "director", + "dirt", + "dirtbike", + "dirty", + "dirty1", + "disco", + "discover", + "discus", + "disney", + "diver", + "divine", + "diving", + "divorce", + "dixie", + "django", + "dkflbckfd", + "dkflbr", + "dkflbvbh", + "dmitriy", + "dnsadm", + "doberman", + "doctor", + "dodge", + "dodge1", + "dodger", + "dodgeram", + "dodgers", + "dodgers1", + "dododo", + "dog123", + "dogbert", + "dogbone", + "dogboy", + "dogcat", + "dogdog", + "dogface", + "dogfood", + "dogg", + "dogger", + "doggie", + "doggies", + "doggy", + "doggy1", + "doghouse", + "dogman", + "dogpound", + "dogs", + "dogshit", + "dogwood", + "doitnow", + "doktor", + "dolemite", + "dollar", + "dollars", + "dolly", + "dolores", + "dolphin", + "dolphin1", + "dolphins", + "domain", + "dome", + "domingo", + "dominic", + "dominik", + "dominion", + "dominiqu", + "domino", + "donald", + "dong", + "donkey", + "donna", + "donner", + "donnie", + "donovan", + "dontknow", + "donuts", + "doobie", + "doodle", + "doodoo", + "doofus", + "doogie", + "dookie", + "dooley", + "doom", + "doomsday", + "door", + "doors", + "dorian", + "doris", + "dorothy", + "dotcom", + "dottie", + "double", + "doubled", + "douche", + "doudou", + "doug", + "doughboy", + "dougie", + "douglas", + "down", + "downer", + "download", + "downtown", + "draco", + "dracula", + "drago", + "dragon", + "Dragon", + "DRAGON", + "dragon1", + "Dragon1", + "dragon12", + "dragon69", + "dragonba", + "dragonball", + "dragonballz", + "dragonfl", + "dragons", + "dragoon", + "dragster", + "drake", + "drakon", + "draven", + "dream", + "dreamcas", + "dreamer", + "dreams", + "drew", + "drifter", + "driller", + "drive", + "driven", + "driver", + "drizzt", + "droopy", + "drowssap", + "drpepper", + "drum", + "drummer", + "drummer1", + "drums", + "dthjybrf", + "duan", + "duane", + "dublin", + "ducati", + "duchess", + "duck", + "duckie", + "ducks", + "dude", + "dudedude", + "dudeman", + "dudley", + "duffer", + "duffman", + "duke", + "dukeduke", + "dumbass", + "dummy", + "duncan", + "dundee", + "dungeon", + "dunlop", + "dupont", + "durango", + "duster", + "dustin", + "dusty", + "dusty1", + "dutch", + "dutchess", + "dwayne", + "dwight", + "dylan", + "dylan1", + "dynamite", + "dynamo", + "dynasty", + "eagle", + "eagle1", + "eagles", + "eagles1", + "earl", + "earnhard", + "earth", + "earthlink", + "easter", + "eastern", + "easton", + "eastside", + "eastwood", + "easy", + "eating", + "eatme", + "eatmenow", + "eatpussy", + "eatshit", + "ebony", + "eclipse", + "eclipse1", + "eddie", + "eddie1", + "edgar", + "edison", + "eduard", + "eduardo", + "edward", + "edward1", + "edwards", + "eeee", + "eeeee", + "eeeeee", + "eeeeeee", + "eeeeeeee", + "eeyore", + "egghead", + "eggman", + "eggplant", + "eight", + "eileen", + "einstein", + "ekaterina", + "elaine", + "elcamino", + "eldorado", + "eleanor", + "electra", + "electric", + "electro", + "electron", + "elefant", + "element", + "elements", + "elena", + "eleonora", + "elephant", + "eleven", + "elijah", + "elisabet", + "elite", + "elizabet", + "elizabeth", + "elizaveta", + "ellen", + "ellie", + "elliot", + "elliott", + "elvira", + "elvis", + "elvis1", + "elvisp", + "elway7", + "elwood", + "emerald", + "emerson", + "emil", + "emilia", + "emilie", + "emilio", + "emily", + "emily1", + "eminem", + "emma", + "emmanuel", + "emmett", + "emmitt", + "emperor", + "empire", + "energy", + "enforcer", + "engage", + "engine", + "engineer", + "england", + "english", + "enigma", + "enjoy", + "enrico", + "enter", + "enter1", + "enterme", + "enternow", + "enterpri", + "enterprise", + "enters", + "entrance", + "entropy", + "entry", + "epsilon", + "eraser", + "erection", + "eric", + "erica", + "ericsson", + "erik", + "erika", + "erin", + "ernest", + "ernesto", + "ernie", + "erotic", + "erotica", + "errors", + "escalade", + "escape", + "escort", + "eskimo", + "espresso", + "esquire", + "esther", + "estrella", + "eternal", + "eternity", + "ethan", + "eugene", + "eunice", + "eureka", + "europa", + "europe", + "evan", + "evangelion", + "evelyn", + "everest", + "everett", + "everlast", + "everton", + "evgeniy", + "evil", + "evolutio", + "evolution", + "excalibu", + "excalibur", + "exchange", + "excite", + "Exigen", + "Exigent", + "exodus", + "exotic", + "experienced", + "expert", + "explore", + "explorer", + "express", + "extra", + "extreme", + "f**k", + "f00tball", + "fabian", + "fabie", + "Fabie", + "fabio", + "fabric", + "face", + "facebook", + "facial", + "factory", + "faggot", + "fairlane", + "faith", + "faith1", + "faithful", + "falcon", + "falcon1", + "falcons", + "fallen", + "fallon", + "fallout", + "family", + "famous", + "fandango", + "fang", + "fanny", + "fantasia", + "fantasy", + "fantomas", + "farley", + "farm", + "farmboy", + "farmer", + "farscape", + "farside", + "fart", + "fashion", + "fast", + "fastball", + "faster", + "fatass", + "fatboy", + "fatcat", + "father", + "fatima", + "fatman", + "fatty", + "favorite6", + "fduecn", + "fearless", + "feather", + "february", + "federal", + "federico", + "feelgood", + "feet", + "felicia", + "felipe", + "felix", + "felix1", + "fellatio", + "fellow", + "female", + "females", + "fender", + "fender1", + "feng", + "fenris", + "fenway", + "fergie", + "fergus", + "ferguson", + "fernand", + "fernando", + "ferrari", + "ferrari1", + "ferret", + "ferris", + "fester", + "festival", + "fetish", + "ffff", + "fffff", + "ffffff", + "ffffffff", + "fghtkm", + "fgtkmcby", + "fick", + "ficken", + "fiction", + "fidelio", + "fields", + "fiesta", + "figaro", + "fight", + "fighter", + "films", + "filter", + "filthy", + "finally", + "finance", + "finder", + "finger", + "fingers", + "finish", + "finland", + "fire", + "fireball", + "firebird", + "fireblad", + "firefigh", + "firefire", + "firefly", + "firefox", + "fireman", + "firenze", + "firewall", + "first", + "fischer", + "fish", + "fishbone", + "fisher", + "fishes", + "fishfish", + "fishhead", + "fishin", + "fishing", + "fishing1", + "fishman", + "fishon", + "fisting", + "fitness", + "fitter", + "five", + "fkbyjxrf", + "fktrcfylh", + "Fktrcfylh", + "fktrcfylhf", + "fktrctq", + "fktyrf", + "flame", + "flamengo", + "flames", + "flamingo", + "flanker", + "flash", + "flash1", + "flasher", + "flatron", + "fletch", + "fletcher", + "flexible", + "flicks", + "flight", + "flip", + "flipflop", + "flipper", + "floppy", + "florence", + "flores", + "florian", + "florida", + "florida1", + "flounder", + "flower", + "flower2", + "flowers", + "floyd", + "fluff", + "fluffy", + "flyboy", + "flyers", + "flyfish", + "flying", + "focus", + "foobar", + "food", + "foolish", + "foot", + "footbal", + "football", + "Football", + "FOOTBALL", + "football1", + "footjob", + "force", + "ford", + "fordf150", + "forest", + "foreve", + "forever", + "forever1", + "forfun", + "forget", + "forgetit", + "forgot", + "forlife", + "format", + "formula", + "formula1", + "forrest", + "forsaken", + "fortress", + "fortuna", + "fortune", + "forum", + "forward", + "foryou", + "fossil", + "foster", + "fosters", + "fountain", + "four", + "fowler", + "foxtrot", + "foxy", + "foxylady", + "franc", + "france", + "frances", + "francesc", + "francesco", + "francis", + "francisc", + "franco", + "francois", + "frank", + "frank1", + "frankie", + "franklin", + "franks", + "franky", + "fraser", + "freak", + "freaks", + "freaky", + "freckles", + "fred", + "freddie", + "freddy", + "frederic", + "frederik", + "fredfred", + "fredrick", + "free", + "freebird", + "freedom", + "freedom1", + "freee", + "freefall", + "freefree", + "freeman", + "freepass", + "freeporn", + "freesex", + "freeuser", + "freeway", + "freeze", + "french", + "fresh", + "friday", + "friend", + "friendly", + "friends", + "friendster", + "fright", + "frisco", + "frisky", + "fritz", + "frodo", + "frodo1", + "frog", + "frogger", + "froggy", + "frogman", + "frogs", + "front242", + "frontier", + "frost", + "frosty", + "frozen", + "fubar", + "fuck_inside", + "fuck", + "fuck123", + "fuck69", + "fucked", + "fucker", + "fuckers", + "fuckface", + "fuckfuck", + "fuckhead", + "fuckher", + "fuckin", + "fucking", + "fuckinside", + "fuckit", + "fuckme", + "fuckme2", + "fuckoff", + "fuckoff1", + "fuckthis", + "fucku", + "fucku2", + "fuckyo", + "fuckyou", + "FUCKYOU", + "fuckyou1", + "fuckyou2", + "fugazi", + "fujitsu", + "fulham", + "fullmoon", + "function", + "funfun", + "funky", + "funny", + "funstuff", + "funtime", + "furball", + "fusion", + "futbol", + "futurama", + "future", + "fuzzy", + "fyfcnfcbz", + "fyfnjkbq", + "fylhtq", + "fytxrf", + "fyutkbyf", + "fyutkjxtr", + "gabber", + "gabby", + "gabrie", + "gabriel", + "gabriel1", + "gabriela", + "gabriele", + "gabriell", + "gadget", + "gagged", + "gagging", + "galant", + "galaxy", + "galina", + "galore", + "gambit", + "gambler", + "game", + "gameboy", + "gamecock", + "gamecube", + "gameover", + "games", + "gamma", + "gandalf", + "gandalf1", + "ganesh", + "gang", + "gangbang", + "gangsta", + "gangster", + "gannibal", + "garage", + "garbage", + "garcia", + "garden", + "garfield", + "gargoyle", + "garion", + "garnet", + "garrett", + "gary", + "gasman", + "gaston", + "gateway", + "gateway1", + "gatit", + "gator", + "gator1", + "gatorade", + "gators", + "gatsby", + "gawker", + "gbhfvblf", + "gbpltw", + "gegcbr", + "geheim", + "gemini", + "gene", + "general", + "generic", + "genesis", + "genesis1", + "geneva", + "geng", + "genius", + "geoffrey", + "georg", + "george", + "George", + "GEORGE", + "george1", + "georgia", + "georgie", + "gerald", + "gerard", + "gerbil", + "german", + "germany", + "geronimo", + "gerrard", + "gertrude", + "gesperrt", + "getmoney", + "getout", + "getsome", + "getting", + "gfhjkm", + "gfhjkm1", + "gfhjkm123", + "gfhjkmgfhjkm", + "gggg", + "ggggg", + "gggggg", + "ggggggg", + "gggggggg", + "ghbdtn", + "ghbdtn123", + "ghbdtnbr", + "ghblehjr", + "ghbrjk", + "ghbywtccf", + "ghetto", + "ghhh47hj7649", + "ghjcnbnenrf", + "ghjcnj", + "ghjcnjgfhjkm", + "ghjcnjnfr", + "ghjuhfvvf", + "ghost", + "ghost1", + "ghostrider", + "ghosts", + "gianni", + "giant", + "giants", + "gibson", + "gideon", + "gidget", + "giggle", + "giggles", + "gilbert", + "gilles", + "gillian", + "gilligan", + "gina", + "ginger", + "ginger1", + "giorgi", + "giorgio", + "giovanni", + "giraffe", + "girl", + "girls", + "giuseppe", + "gizmo", + "gizmo1", + "gizmodo", + "gjkbyf", + "glacier", + "gladiato", + "gladiator", + "gladys", + "glamour", + "glasgow", + "glass", + "glasses", + "glenn", + "global", + "globus", + "glock", + "gloria", + "glory", + "glow", + "gmoney", + "gn56gn56", + "goalie", + "goat", + "goaway", + "gobears", + "goblin", + "goblue", + "gobucks", + "gocubs", + "goddess", + "godfathe", + "godfather", + "godlike", + "godsmack", + "godzilla", + "gofast", + "gofish", + "goforit", + "gogo", + "gogogo", + "gohome", + "goirish", + "goku", + "gold", + "goldberg", + "golden", + "golden1", + "goldeneye", + "goldfing", + "goldfish", + "goldie", + "goldstar", + "goldwing", + "golf", + "GOLF", + "golfball", + "golfer", + "golfer1", + "golfgolf", + "golfing", + "goliath", + "gollum", + "gonavy", + "gong", + "gonzales", + "gonzalez", + "gonzo", + "gonzo1", + "goober", + "good", + "Good123654", + "goodboy", + "goodbye", + "goodday", + "goodgirl", + "goodie", + "goodluck", + "goodman", + "goodtime", + "goofy", + "google", + "googoo", + "gooner", + "goose", + "gopher", + "gordo", + "gordon", + "gordon24", + "gore", + "gorgeous", + "gorilla", + "gotcha", + "goten", + "gotenks", + "goth", + "gotham", + "gothic", + "gotmilk", + "gotohell", + "gotribe", + "govols", + "grace", + "grace1", + "gracie", + "graham", + "gramma", + "granada", + "grand", + "grandam", + "grande", + "grandma", + "grandpa", + "granite", + "granny", + "grant", + "grapes", + "graphics", + "grass", + "grateful", + "gratis", + "gravity", + "grease", + "great", + "great1", + "greatone", + "greece", + "greedy", + "green", + "green1", + "green123", + "greenbay", + "greenday", + "greene", + "greens", + "greg", + "gregor", + "gregory", + "gremlin", + "grendel", + "gretchen", + "gretzky", + "griffey", + "griffin", + "grimace", + "grin", + "grinch", + "gringo", + "grisha", + "grizzly", + "gromit", + "groove", + "groovy", + "groucho", + "groups", + "grover", + "grumpy", + "grunt", + "gryphon", + "gsxr1000", + "gsxr750", + "gthcbr", + "gtnhjdbx", + "guai", + "guang", + "guardian", + "guess", + "guest", + "guido", + "guiness", + "guinness", + "guitar", + "guitar1", + "guitars", + "gumby", + "gundam", + "gunnar", + "gunner", + "gunners", + "gunther", + "gustav", + "gustavo", + "guyver", + "gymnast", + "gypsy", + "habibi", + "hack", + "hacked", + "hacker", + "hacking", + "haggis", + "haha", + "hahaha", + "hahahaha", + "hailey", + "hair", + "hairball", + "hairy", + "hal9000", + "haley", + "halflife", + "halifax", + "hall", + "hallie", + "hallo", + "hallo123", + "hambone", + "hamburg", + "hamilton", + "hamish", + "hamlet", + "hammer", + "hammers", + "hammond", + "hampton", + "hamster", + "handball", + "handsome", + "handyman", + "hang", + "hank", + "hanna", + "hannah", + "hannah1", + "hannibal", + "hans", + "hansen", + "hansol", + "hansolo", + "hanson", + "hanuman", + "happiness", + "happy", + "happy1", + "happy123", + "happy2", + "happyday", + "harald", + "harbor", + "hard", + "hardball", + "hardcock", + "hardcore", + "harddick", + "harder", + "hardon", + "hardone", + "hardrock", + "hardware", + "harlem", + "harley", + "Harley", + "HARLEY", + "harley1", + "harman", + "harmony", + "harold", + "harper", + "harrier", + "harris", + "harrison", + "harry", + "harry1", + "harrypotter", + "harvard", + "harvest", + "harvey", + "hassan", + "hastings", + "hate", + "hatred", + "hattrick", + "havana", + "havefun", + "having", + "hawaii", + "hawaii50", + "hawaiian", + "hawk", + "hawkeye", + "hawkeyes", + "hayabusa", + "hayden", + "hayley", + "head", + "health", + "heart", + "hearts", + "heat", + "heater", + "heather", + "Heather", + "heather1", + "heaven", + "heckfy", + "hector", + "hedgehog", + "heels", + "hehehe", + "heidi", + "heidi1", + "heineken", + "heinrich", + "hejsan", + "helen", + "helena", + "helene", + "hell", + "hellboy", + "hellfire", + "hello", + "hello1", + "hello12", + "hello123", + "hello2", + "hellokitty", + "helloo", + "hellos", + "hellsing", + "hellyeah", + "helmet", + "helmut", + "help", + "helper", + "helpme", + "hendrix", + "heng", + "henry", + "henry1", + "hentai", + "herbert", + "herbie", + "hercules", + "here", + "herewego", + "heritage", + "herman", + "hermes", + "heroes", + "herring", + "hershey", + "hesoyam", + "hetfield", + "hewitt", + "hewlett", + "heyhey", + "heynow", + "hfytnrb", + "hhhh", + "hhhhh", + "hhhhhh", + "hhhhhhhh", + "hidden", + "higgins", + "high", + "highbury", + "highheel", + "highland", + "highlander", + "highway", + "hihihi", + "hiking", + "hilary", + "hill", + "hillary", + "hilton", + "hiphop", + "hippie", + "history", + "hitachi", + "hithere", + "hitler", + "hitman", + "HIZIAD", + "hjccbz", + "hjvfirf", + "hobbes", + "hobbit", + "hockey", + "hockey1", + "hoffman", + "hogtied", + "hohoho", + "hokies", + "hola", + "holden", + "hole", + "holein1", + "holes", + "holiday", + "holidays", + "holland", + "hollie", + "hollow", + "holly", + "holly1", + "hollywoo", + "hollywood", + "holmes", + "holycow", + "holyshit", + "home", + "homeboy", + "homemade", + "homer", + "homer1", + "homerj", + "homers", + "homerun", + "homework", + "honda", + "honda1", + "hondas", + "honey", + "honey1", + "honeybee", + "honeys", + "hong", + "hongkong", + "honolulu", + "honor", + "hookem", + "hooker", + "hookup", + "hooligan", + "hooper", + "hoops", + "hoosier", + "hoosiers", + "hooter", + "hooters", + "hootie", + "hoover", + "hope", + "hopeful", + "hopeless", + "hopkins", + "hopper", + "horace", + "hores", + "horizon", + "horndog", + "hornet", + "hornets", + "horney", + "horny", + "Horny", + "horny1", + "horse", + "horses", + "hotass", + "hotbox", + "hotboy", + "hotdog", + "hotgirls", + "hothot", + "hotone", + "hotpussy", + "hotred", + "hotrod", + "hotsex", + "hotshot", + "hotstuff", + "hott", + "hottest", + "hottie", + "hotties", + "houdini", + "hounddog", + "house", + "house1", + "houses", + "houston", + "hover", + "howard", + "howdy", + "howell", + "htubcnhfwbz", + "huai", + "huang", + "hubert", + "hudson", + "huge", + "hughes", + "hugo", + "hummer", + "hung", + "hungry", + "hunt", + "hunte", + "hunter", + "Hunter", + "hunter1", + "hunting", + "hurley", + "hurrican", + "hurricane", + "husker", + "huskers", + "huskies", + "hustler", + "hyperion", + "hyundai", + "iamgod", + "ib6ub9", + "ibanez", + "iceberg", + "icecream", + "icecube", + "icehouse", + "iceman", + "icu812", + "idefix", + "idiot", + "idontkno", + "idontknow", + "idunno", + "iforget", + "iforgot", + "igor", + "iguana", + "ihateyou", + "iiii", + "iiiii", + "iiiiii", + "ijrjkfl", + "iklo", + "ilikeit", + "ilikepie", + "illini", + "illinois", + "illusion", + "ilove", + "ilovegod", + "iloveme", + "ilovesex", + "iloveu", + "iloveyo", + "iloveyou", + "iloveyou1", + "iloveyou2", + "imagine", + "imation", + "immortal", + "impact", + "impala", + "imperial", + "implants", + "impreza", + "incubus", + "india", + "indian", + "indiana", + "indians", + "indigo", + "infantry", + "inferno", + "infiniti", + "infinity", + "ingrid", + "inlove", + "insane", + "insanity", + "insert", + "inside", + "insight", + "insomnia", + "inspiron", + "install", + "instant", + "integra", + "intel", + "inter", + "intercourse", + "interne", + "internet", + "intrepid", + "intruder", + "inuyasha", + "iomega", + "ipswich", + "ireland", + "irene", + "irina", + "irinka", + "irish", + "irish1", + "irishka", + "irishman", + "iriska", + "ironmaiden", + "ironman", + "irving", + "isaac", + "isabel", + "isabell", + "isabella", + "isabelle", + "isaiah", + "iscool", + "island", + "islander", + "israel", + "istanbul", + "istheman", + "italia", + "italian", + "italy", + "itisme", + "itsme", + "ivan", + "ivanov", + "ivanova", + "iverson", + "iverson3", + "iwantu", + "jabber", + "jabroni", + "jack", + "jackal", + "jackass", + "jackass1", + "jackie", + "jackjack", + "jackoff", + "jackpot", + "jackson", + "jackson1", + "jackson5", + "jacob", + "jacob1", + "jacobs", + "jacques", + "jade", + "jaeger", + "jagger", + "jaguar", + "jaguars", + "jaime", + "jajaja", + "jakarta", + "jake", + "jakejake", + "jamaica", + "james", + "james007", + "james1", + "james123", + "jamesbon", + "jamesbond", + "jameson", + "jamess", + "jamie", + "jamie1", + "jammer", + "jammin", + "jane", + "janelle", + "janet", + "janice", + "janine", + "january", + "japan", + "japanese", + "jared", + "jarhead", + "jarvis", + "jasmin", + "jasmine", + "jasmine1", + "jason", + "jason1", + "jasper", + "java", + "javelin", + "javier", + "jaybird", + "jayden", + "jayhawk", + "jayhawks", + "jayjay", + "jayson", + "jazz", + "jazzman", + "jazzy", + "jean", + "jeanette", + "jeanne", + "jeannie", + "jedi", + "jeep", + "jeeper", + "jeepster", + "jeff", + "jefferso", + "jeffery", + "jeffrey", + "jello", + "jelly", + "jellybea", + "jellybean", + "jenifer", + "jenjen", + "jenkins", + "jenn", + "jenna", + "jennaj", + "jennie", + "jennife", + "jennifer", + "Jennifer", + "jenny", + "jenny1", + "jensen", + "jeremiah", + "jeremy", + "jeremy1", + "jericho", + "jerk", + "jerkoff", + "jermaine", + "jerome", + "jerry", + "jerry1", + "jersey", + "jesper", + "jess", + "jesse", + "jessic", + "jessica", + "Jessica", + "jessica1", + "jessie", + "jester", + "jesus", + "jesus1", + "jeter2", + "jethro", + "jets", + "jetski", + "jewel", + "jewels", + "jewish", + "jezebel", + "jiang", + "jiao", + "jiggaman", + "jill", + "jillian", + "jimbo", + "jimbo1", + "jimbob", + "jimjim", + "jimmie", + "jimmy", + "jimmy1", + "jimmys", + "jing", + "jingle", + "jiong", + "jjjj", + "jjjjj", + "jjjjjj", + "jjjjjjj", + "jjjjjjjj", + "jktxrf", + "jktymrf", + "joanna", + "joanne", + "jocelyn", + "jockey", + "joe123", + "joebob", + "joecool", + "joejoe", + "joel", + "joemama", + "joey", + "johann", + "johanna", + "johannes", + "john", + "john123", + "john316", + "johnboy", + "johncena", + "johndeer", + "johndoe", + "johngalt", + "johnjohn", + "johnny", + "johnny5", + "johnson", + "johnson1", + "jojo", + "jojojo", + "joker", + "joker1", + "jokers", + "jomama", + "jonas", + "jonathan", + "jonathon", + "jones", + "jones1", + "jonjon", + "jonny", + "jorda", + "jordan", + "Jordan", + "JORDAN", + "jordan1", + "jordan23", + "Jordan23", + "jorge", + "jose", + "joseph", + "joseph1", + "josephin", + "josh", + "joshu", + "joshua", + "Joshua", + "joshua1", + "journey", + "joyce", + "joyjoy", + "jrcfyf", + "jsbach", + "juan", + "juanita", + "jubilee", + "judith", + "judy", + "juggalo", + "jughead", + "juice", + "juicy", + "jules", + "julia", + "julian", + "juliana", + "julie", + "julie1", + "julien", + "juliet", + "juliette", + "julius", + "july", + "jumbo", + "jump", + "jumper", + "june", + "junebug", + "jungle", + "junio", + "junior", + "junior1", + "juniper", + "junk", + "junkie", + "junkmail", + "jupiter", + "just4fun", + "just4me", + "justdoit", + "justice", + "justin", + "justin1", + "justine", + "justme", + "justus", + "juventus", + "k.lvbkf", + "kaboom", + "kahlua", + "kahuna", + "kaiser", + "kaitlyn", + "kakashka", + "kaktus", + "kalina", + "kamasutra", + "kamikaze", + "kamila", + "kane", + "kang", + "kangaroo", + "kansas", + "karachi", + "karate", + "karen", + "karen1", + "karin", + "karina", + "karine", + "karma", + "karolina", + "kashmir", + "kasper", + "katana", + "katarina", + "kate", + "katerina", + "katherin", + "katherine", + "kathleen", + "kathryn", + "kathy", + "katie", + "katie1", + "katrin", + "katrina", + "kawasaki", + "kayla", + "kaylee", + "kayleigh", + "kazantip", + "kcchiefs", + "kcj9wx5n", + "keegan", + "keenan", + "keeper", + "keepout", + "keisha", + "keith", + "keller", + "kelley", + "kellie", + "kelly", + "kelly1", + "kelsey", + "kelvin", + "kendall", + "kendra", + "keng", + "kenken", + "kennedy", + "kenneth", + "kenny", + "kenobi", + "kenshin", + "kent", + "kentucky", + "kenwood", + "kenworth", + "kermit", + "kernel", + "kerouac", + "kerry", + "kerstin", + "kestrel", + "kevin", + "kevin1", + "keyboard", + "keystone", + "keywest", + "kfgjxrf", + "kfhbcf", + "khan", + "kickass", + "kicker", + "kidrock", + "kids", + "kieran", + "kiki", + "kikiki", + "kill", + "killa", + "killbill", + "kille", + "killer", + "KILLER", + "killer1", + "killer12", + "killer123", + "killers", + "killjoy", + "killkill", + "killme", + "kilroy", + "kimball", + "kimber", + "kimberly", + "kimkim", + "kimmie", + "kinder", + "king", + "kingdom", + "kingfish", + "kingking", + "kingkong", + "kingpin", + "kings", + "kingston", + "kinky", + "kipper", + "kirby", + "kirill", + "kirk", + "kirkland", + "kirsten", + "kirsty", + "kiss", + "kisses", + "kissing", + "kisskiss", + "kissme", + "kissmyass", + "kitchen", + "kiteboy", + "kitkat", + "kitten", + "kittens", + "kittie", + "kitty", + "kitty1", + "kittycat", + "kittykat", + "kittys", + "kiwi", + "kjkszpj", + "kjrjvjnbd", + "kkkk", + "kkkkk", + "kkkkkk", + "kkkkkkk", + "kkkkkkkk", + "klaste", + "klaster", + "kleopatra", + "klingon", + "klizma", + "klondike", + "knickers", + "knicks", + "knight", + "knights", + "knock", + "knockers", + "knopka", + "knuckles", + "kodiak", + "kojak", + "koko", + "kokoko", + "kokomo", + "kolbasa", + "kolobok", + "kolokol", + "komodo", + "kong", + "konstantin", + "kool", + "koolaid", + "Kordell1", + "korn", + "koroleva", + "korova", + "koshka", + "kosmos", + "kostya", + "kotaku", + "kotenok", + "kramer", + "krasotka", + "kris", + "krishna", + "krissy", + "krista", + "kristen", + "kristi", + "kristian", + "kristin", + "kristina", + "kristine", + "kristy", + "krokodil", + "krolik", + "kronos", + "krusty", + "krypton", + "krystal", + "ksenia", + "ksusha", + "ktyjxrf", + "kuai", + "kuang", + "kume", + "kungfu", + "kurt", + "kyle", + "labrador", + "labtec", + "lacrosse", + "ladder", + "laddie", + "ladies", + "lady", + "ladybug", + "laetitia", + "lagnaf", + "laguna", + "lakers", + "lakers1", + "lakeside", + "lakewood", + "lakota", + "lala", + "lalakers", + "lalala", + "lalalala", + "lambda", + "lambert", + "lamer", + "lamont", + "lance", + "lancelot", + "lancer", + "lander", + "landon", + "lane", + "lang", + "lansing", + "lantern", + "laptop", + "lara", + "larisa", + "larissa", + "larkin", + "larry", + "larry1", + "larson", + "laser", + "lassie", + "lasvegas", + "latin", + "latina", + "latinas", + "latino", + "laura", + "laura1", + "laurel", + "lauren", + "laurence", + "laurent", + "laurie", + "lawrence", + "lawson", + "lawyer", + "lazarus", + "lback", + "leader", + "leanne", + "leather", + "leavemealone", + "ledzep", + "leeds", + "leedsutd", + "leelee", + "lefty", + "legacy", + "legend", + "legion", + "legolas", + "legos", + "leigh", + "leinad", + "lekker", + "lemans", + "lemmein", + "lemon", + "lemonade", + "lemons", + "lena", + "leng", + "lennon", + "lenny", + "leoleo", + "leon", + "leonard", + "leonardo", + "leonid", + "leopard", + "leopold", + "leroy", + "lesbian", + "lesbians", + "lesley", + "leslie", + "lespaul", + "lestat", + "lester", + "letmei", + "letmein", + "letmein1", + "Letmein1", + "letmein2", + "letsdoit", + "letsgo", + "letter", + "lewis", + "lexmark", + "lexus", + "lfitymrf", + "lfybbk", + "lhfrjy", + "liang", + "liao", + "liberty", + "library", + "lick", + "licker", + "licking", + "lickit", + "lickme", + "life", + "lifehack", + "lifetime", + "light", + "lighter", + "lighting", + "lightnin", + "lightning", + "lights", + "lilbit", + "lilian", + "liliana", + "lilith", + "lillian", + "lillie", + "lilly", + "limewire", + "limited", + "lincoln", + "linda", + "linda1", + "linden", + "lindros", + "lindsay", + "lindsey", + "lineage", + "lineage2", + "ling", + "link", + "linkin", + "links", + "lion", + "lionel", + "lionking", + "lions", + "lips", + "lipstick", + "liquid", + "lisa", + "lisalisa", + "lister", + "lithium", + "little", + "little1", + "live", + "liverpoo", + "liverpool", + "liverpool1", + "living", + "lizard", + "lizzie", + "lkjhgf", + "lkjhgfds", + "lkjhgfdsa", + "llamas", + "llll", + "lllll", + "llllll", + "llllllll", + "lloyd", + "loaded", + "lobo", + "lobster", + "lockdown", + "locks", + "loco", + "logan", + "logan1", + "logger", + "logitech", + "loki", + "lokiloki", + "lokomotiv", + "lol123", + "lola", + "lolipop", + "lolita", + "lollipop", + "lollol", + "lollypop", + "lolo", + "lolol", + "lololo", + "london", + "london1", + "lonely", + "lonesome", + "lonestar", + "lonewolf", + "long", + "longbow", + "longdong", + "longer", + "longhair", + "longhorn", + "longjohn", + "look", + "looker", + "looking", + "lookout", + "looney", + "loose", + "looser", + "lopez", + "lord", + "loren", + "lorena", + "lorenzo", + "loretta", + "lori", + "lorraine", + "loser", + "loser1", + "losers", + "lost", + "lottie", + "lotus", + "loud", + "louie", + "louis", + "louise", + "loulou", + "love", + "LOVE", + "love1", + "love12", + "love123", + "love69", + "lovebug", + "loveit", + "loveless", + "lovelife", + "lovelove", + "lovely", + "loveme", + "lover", + "lover1", + "loverboy", + "lovers", + "lovesex", + "loveya", + "loveyou", + "loving", + "lowell", + "lowrider", + "ltybcrf", + "luan", + "luca", + "lucas", + "lucas1", + "lucia", + "luciano", + "lucifer", + "lucille", + "luck", + "lucky", + "lucky1", + "lucky13", + "lucky7", + "luckydog", + "luckyone", + "lucy", + "ludmila", + "ludwig", + "luis", + "luke", + "lulu", + "lumber", + "lumina", + "luna", + "lunchbox", + "lust", + "luther", + "lvbnhbq", + "lynn", + "m123456", + "macaroni", + "macbeth", + "macdaddy", + "machine", + "macintos", + "mack", + "mackie", + "macleod", + "macmac", + "macman", + "macross", + "mad", + "madcat", + "madcow", + "madden", + "maddie", + "maddog", + "madeline", + "madina", + "madison", + "madison1", + "madmad", + "madman", + "madmax", + "madness", + "madonna", + "madrid", + "maestro", + "magazine", + "magelan", + "magellan", + "maggi", + "maggie", + "maggie1", + "maggot", + "magic", + "magic1", + "magic32", + "magical", + "magician", + "magick", + "magicman", + "magnet", + "magneto", + "magnolia", + "magnum", + "magnus", + "magpie", + "magpies", + "mahler", + "maiden", + "mail", + "Mailcreated5240", + "mailman", + "maison", + "majestic", + "major", + "makaka", + "makaveli", + "maksim", + "maksimka", + "malachi", + "malaka", + "malcolm", + "malibu", + "malice", + "malina", + "malish", + "mallard", + "mallory", + "mallrats", + "malone", + "mama", + "mama123", + "mamacita", + "mamama", + "mamamama", + "mamamia", + "mamapapa", + "mamas", + "mammoth", + "manager", + "manchest", + "manchester", + "mancity", + "mandarin", + "mandingo", + "mandrake", + "mandy", + "mandy1", + "manfred", + "mang", + "manga", + "mango", + "maniac", + "manila", + "mankind", + "manman", + "mann", + "manning", + "manolo", + "manowar", + "manson", + "mantis", + "mantle", + "manuel", + "manuela", + "manutd", + "maple", + "maradona", + "marathon", + "marble", + "marc", + "marcel", + "marcello", + "marcelo", + "march", + "marcia", + "marcius2", + "marco", + "marcos", + "marcus", + "margaret", + "margarit", + "margarita", + "margie", + "mari", + "maria", + "maria1", + "mariah", + "mariam", + "marian", + "mariana", + "marianna", + "marianne", + "marie", + "marie1", + "marijuan", + "marijuana", + "marika", + "marilyn", + "marin", + "marina", + "marine", + "marine1", + "mariner", + "mariners", + "marines", + "marines1", + "marino", + "marino13", + "mario", + "mario1", + "marion", + "mariposa", + "marisa", + "marissa", + "marius", + "mariya", + "marjorie", + "mark", + "marker", + "market", + "markie", + "markiz", + "markus", + "marlboro", + "Marlboro", + "marlene", + "marley", + "marlin", + "marlon", + "marquis", + "marriage", + "married", + "mars", + "marseill", + "marseille", + "marsha", + "marshal", + "marshall", + "martha", + "marti", + "martin", + "Martin", + "martin1", + "martina", + "martine", + "martinez", + "martini", + "marty", + "marvel", + "marvin", + "mary", + "maryann", + "maryjane", + "maryland", + "masamune", + "maserati", + "mash4077", + "mason", + "mason1", + "massage", + "massimo", + "massive", + "maste", + "master", + "Master", + "MASTER", + "master1", + "Master1", + "master12", + "masterbate", + "masterbating", + "masterp", + "masters", + "matador", + "matchbox", + "mathew", + "matilda", + "matrix", + "matrix1", + "matt", + "matteo", + "matthe", + "matthew", + "Matthew", + "matthew1", + "matthews", + "matthias", + "mattie", + "matty", + "mature", + "maureen", + "maurice", + "maveric", + "maverick", + "Maverick", + "max123", + "max333", + "maxdog", + "maxell", + "maxim", + "maxima", + "maxime", + "maximo", + "maximum", + "maximus", + "maxine", + "maxmax", + "maxwell", + "maxwell1", + "maxx", + "maxxxx", + "mayday", + "mayhem", + "maynard", + "mazafaka", + "mazda", + "mazda6", + "mazda626", + "mazdarx7", + "mcdonald", + "mckenzie", + "mclaren", + "meadow", + "meagan", + "meat", + "meatball", + "meathead", + "meatloaf", + "mechanic", + "media", + "medic", + "medical", + "medicine", + "medina", + "medion", + "medusa", + "medved", + "mega", + "megadeth", + "megaman", + "megan", + "megan1", + "megane", + "megapass", + "megatron", + "meghan", + "meister", + "melanie", + "melina", + "melinda", + "meliss", + "melissa", + "melissa1", + "mellon", + "mellow", + "melody", + "melrose", + "melvin", + "member", + "meme", + "mememe", + "memorex", + "memory", + "memphis", + "menace", + "meng", + "mental", + "mentor", + "meow", + "meowmeow", + "mephisto", + "mercede", + "mercedes", + "Mercedes", + "mercury", + "meredith", + "meridian", + "merlin", + "Merlin", + "merlin1", + "merlot", + "mermaid", + "mersedes", + "messiah", + "met2002", + "metal", + "metall", + "metallic", + "metallica", + "method", + "metroid", + "mets", + "mexican", + "mexico", + "miami", + "mian", + "miao", + "michae", + "michael", + "Michael", + "MICHAEL", + "michael1", + "Michael1", + "michael2", + "michaela", + "michaels", + "michal", + "micheal", + "michel", + "michele", + "michell", + "michelle", + "Michelle", + "michigan", + "mick", + "mickey", + "mickey1", + "micro", + "microlab", + "micron", + "microphone", + "microsof", + "microsoft", + "middle", + "midget", + "midnight", + "midnite", + "midway", + "mierda", + "mighty", + "miguel", + "mihail", + "mikael", + "mike", + "mike123", + "mikemike", + "mikey", + "mikey1", + "milan", + "milana", + "milano", + "mildred", + "milena", + "miles", + "military", + "milk", + "milkman", + "millenium", + "miller", + "miller1", + "millie", + "million", + "millions", + "millwall", + "milo", + "milton", + "mimi", + "mine", + "minecraft", + "minemine", + "minerva", + "ming", + "mingus", + "minime", + "minimoni", + "ministry", + "minnie", + "miracle", + "mirage", + "miranda", + "miriam", + "mirror", + "mischief", + "misery", + "misfit", + "Misfit99", + "misfits", + "misha", + "mishka", + "missie", + "mission", + "mississippi", + "missouri", + "missy", + "missy1", + "mister", + "mistress", + "misty", + "misty1", + "mitch", + "mitchell", + "mittens", + "mizzou", + "mmmm", + "mmmmm", + "mmmmmm", + "mmmmmmm", + "mmmmmmmm", + "mnbvcx", + "mnbvcxz", + "mobile", + "mobydick", + "model", + "models", + "modelsne", + "modena", + "modern", + "mohamed", + "mohammad", + "mohammed", + "mohawk", + "mojo", + "mollie", + "molly", + "molly1", + "mollydog", + "moloko", + "molson", + "mommy", + "momo", + "momomo", + "momoney", + "monaco", + "monalisa", + "monarch", + "monday", + "mondeo", + "mone", + "money", + "money1", + "money12", + "money123", + "moneyman", + "moneys", + "mongoose", + "monic", + "monica", + "monika", + "monique", + "monitor", + "monk", + "monke", + "monkey", + "monkey1", + "monkey12", + "monkeybo", + "monkeys", + "monopoly", + "monroe", + "monster", + "monster1", + "monsters", + "montag", + "montana", + "monte", + "montecar", + "montgom240", + "montreal", + "montrose", + "monty", + "monty1", + "moocow", + "mookie", + "moomoo", + "moon", + "moonbeam", + "moondog", + "mooney", + "moonligh", + "moonlight", + "moonshin", + "moore", + "moose", + "moose1", + "mooses", + "mopar", + "morales", + "mordor", + "more", + "moreno", + "morgan", + "morgan1", + "moritz", + "morning", + "moron", + "morpheus", + "morris", + "morrison", + "morrowind", + "mortal", + "mortgage", + "mortimer", + "morton", + "moscow", + "moses", + "moskva", + "mother", + "mother1", + "motherfucker", + "motherlode", + "mothers", + "motion", + "motley", + "motocros", + "motor", + "motorola", + "mountain", + "mouse", + "mouse1", + "mouth", + "movie", + "movies", + "mozart", + "mudvayne", + "muffin", + "muhammad", + "mulder", + "mullet", + "mulligan", + "multiplelo", + "munch", + "munchkin", + "munich", + "muppet", + "murder", + "murphy", + "murray", + "murzik", + "musashi", + "muscle", + "muscles", + "mushroom", + "music", + "music1", + "musica", + "musical", + "musicman", + "muslim", + "mustafa", + "mustang", + "MUSTANG", + "Mustang", + "mustang1", + "Mustang1", + "mustang6", + "mustangs", + "mustard", + "mutant", + "mybaby", + "mydick", + "mygirl", + "mykids", + "mylife", + "mylove", + "myname", + "mynameis", + "mypass", + "mypassword", + "myrtle", + "myself", + "mystery", + "mystic", + "nadine", + "naked", + "namaste", + "nana", + "nancy", + "nancy1", + "nang", + "nanook", + "napalm", + "napass", + "napoleon", + "napoli", + "napster", + "narnia", + "naruto", + "nascar", + "nascar24", + "nastia", + "nasty", + "nasty1", + "nastya", + "natali", + "natalia", + "natalie", + "nataly", + "natasha", + "natasha1", + "nathalie", + "nathan", + "nathan1", + "nation", + "national", + "native", + "natural", + "nature", + "naughty", + "nautica", + "nautilus", + "navajo", + "navigator", + "navy", + "navyseal", + "nazgul", + "nbvjatq", + "ncc1701", + "ncc1701a", + "ncc1701d", + "ncc1701e", + "ncc74656", + "ne1469", + "nebraska", + "needles", + "nellie", + "nelson", + "nemesis", + "neng", + "neon", + "neptune", + "netscape", + "network", + "nevada", + "never", + "nevermind", + "nevermore", + "nevets", + "neville", + "newark", + "newbie", + "newcastl", + "newcastle", + "newlife", + "newman", + "newpass", + "newpass6", + "newport", + "news", + "newton", + "newyork", + "newyork1", + "nextel", + "nfnmzyf", + "nfytxrf", + "nguyen", + "niang", + "niao", + "nice", + "niceass", + "niceguy", + "nicholas", + "nichole", + "nick", + "nickel", + "nico", + "nicol", + "nicola", + "nicolas", + "nicole", + "nicole1", + "nigga", + "nigger", + "night", + "nightmar", + "nightmare", + "nights", + "nightwish", + "nike", + "nikita", + "nikitos", + "nikki", + "nikki1", + "nikola", + "nikolai", + "nikolas", + "nikolay", + "nimbus", + "nimrod", + "nina", + "nine", + "nineball", + "nineinch", + "niners", + "ning", + "ninja", + "ninja1", + "ninjas", + "nintendo", + "nipper", + "nipple", + "nipples", + "nirvana", + "nirvana1", + "nissan", + "nitram", + "nitro", + "nittany", + "nnnnnn", + "nnnnnnnn", + "nobody", + "noelle", + "nofear", + "nokia", + "nokia1", + "nokia6233", + "nokia6300", + "nokian73", + "nolimit", + "nomad", + "nomore", + "noname", + "noname123", + "none", + "nonenone", + "nong", + "nonono", + "noodle", + "noodles", + "nookie", + "nopass", + "norbert", + "normal", + "norman", + "normandy", + "norris", + "north", + "northern", + "norton", + "norway", + "norwich", + "nostromo", + "notebook", + "nothing", + "notused", + "nounours", + "nova", + "novell", + "november", + "noway", + "nthvbyfnjh", + "ntktajy", + "nuan", + "nuclear", + "nude", + "nudes", + "nudist", + "nugget", + "nuggets", + "number", + "number1", + "nurses", + "nutmeg", + "nuts", + "nutter", + "nuttertools", + "nwo4life", + "nygiants", + "nyjets", + "nylons", + "nymets", + "nympho", + "oakland", + "oakley", + "oasis", + "oatmeal", + "obelix", + "oberon", + "obiwan", + "oblivion", + "obsidian", + "ocean", + "oceans", + "october", + "octopus", + "odessa", + "odyssey", + "office", + "officer", + "offshore", + "ohshit", + "ohyeah", + "oicu812", + "oilers", + "oklahoma", + "okokok", + "oksana", + "older", + "oldman", + "oleg", + "olenka", + "olesya", + "olga", + "olive", + "oliver", + "oliver1", + "olivia", + "olivier", + "olympus", + "omega", + "omega1", + "onelove", + "onetime", + "onetwo", + "onion", + "online", + "onlyme", + "oooo", + "ooooo", + "oooooo", + "oooooooo", + "open", + "opendoor", + "opennow", + "openup", + "operator", + "optimist", + "optimus", + "option", + "options", + "oracle", + "orange", + "orange1", + "oranges", + "orchard", + "orchid", + "oregon", + "oreo", + "orgasm", + "orient", + "original", + "orioles", + "orion", + "orion1", + "orlando", + "oscar", + "oscar1", + "osiris", + "othello", + "otis", + "ottawa", + "otto", + "ou812", + "ou8122", + "ou8123", + "outback", + "outkast", + "outlaw", + "outside", + "over", + "overkill", + "overlord", + "oxford", + "oxygen", + "oyster", + "ozzy", + "p0015123", + "p0o9i8u7", + "p4ssw0rd", + "pa55w0rd", + "pa55word", + "pablo", + "pacers", + "pacific", + "pacino", + "packard", + "packer", + "packers", + "packers1", + "pacman", + "paco", + "paddle", + "padres", + "page", + "pain", + "paint", + "paintbal", + "paintball", + "painter", + "painting", + "pajero", + "pakistan", + "palace", + "paladin", + "palermo", + "pallmall", + "palmer", + "palmtree", + "paloma", + "pamela", + "panama", + "panasoni", + "panasonic", + "pancake", + "pancakes", + "pancho", + "panda", + "panda1", + "pandas", + "pandora", + "pang", + "panter", + "pantera", + "pantera1", + "panther", + "panther1", + "panthers", + "panties", + "pants", + "pantyhos", + "panzer", + "paolo", + "papa", + "papamama", + "paper", + "papers", + "papillon", + "papito", + "paradigm", + "paradise", + "paradox", + "paramedi", + "paranoid", + "paris", + "paris1", + "park", + "parker", + "parol", + "parola", + "parrot", + "partner", + "party", + "pasadena", + "pascal", + "pass", + "pass123", + "pass1234", + "passat", + "passes", + "passion", + "passme", + "passpass", + "passport", + "passw0rd", + "Passw0rd", + "passwd", + "passwor", + "Passwor1", + "password", + "Password", + "PASSWORD", + "password1", + "Password1", + "password12", + "password123", + "Password123", + "password2", + "password9", + "password99", + "passwords", + "passwort", + "pastor", + "pasword", + "patch", + "patches", + "patches1", + "pathetic", + "pathfind", + "patience", + "patric", + "patrice", + "patrici", + "patricia", + "patrick", + "Patrick", + "patrick1", + "patriot", + "patriots", + "patrol", + "patton", + "patty", + "paul", + "paula", + "paulie", + "paulina", + "pauline", + "pavel", + "pavement", + "pavilion", + "pavlov", + "payday", + "payton", + "pdtplf", + "peace", + "peace1", + "peach", + "peaches", + "peaches1", + "peachy", + "peacock", + "peanut", + "peanuts", + "pearl", + "pearljam", + "pearls", + "pearson", + "pebble", + "pebbles", + "pecker", + "pedro", + "peekaboo", + "peepee", + "peeper", + "peewee", + "pegasus", + "peggy", + "pelican", + "pencil", + "penelope", + "penetration", + "peng", + "penguin", + "penguin1", + "penguins", + "penis", + "penny", + "penny1", + "pentagon", + "penthous", + "pentium", + "people", + "pepe", + "pepito", + "peppe", + "pepper", + "pepper1", + "peppers", + "pepsi", + "pepsi1", + "perfect", + "perfect1", + "perkins", + "perry", + "persik", + "person", + "persona", + "personal", + "pervert", + "pete", + "peter", + "peter1", + "peterbil", + "peterpan", + "peters", + "peterson", + "petra", + "petrov", + "petrova", + "petunia", + "peugeot", + "peyton", + "phantom", + "pharmacy", + "phat", + "pheonix", + "phialpha", + "phil", + "philip", + "philippe", + "philips", + "phillies", + "phillip", + "phillips", + "philly", + "phish", + "phoebe", + "Phoeni", + "phoenix", + "Phoenix", + "phoenix1", + "phone", + "photo", + "photos", + "phpbb", + "phyllis", + "physics", + "pian", + "piano", + "pianoman", + "piao", + "piazza", + "picard", + "picasso", + "piccolo", + "pickle", + "pickles", + "picks", + "pickup", + "pics", + "picture", + "pictures", + "pierce", + "piercing", + "pierre", + "pigeon", + "piggy", + "piglet", + "pigpen", + "pikachu", + "pillow", + "pilot", + "pimp", + "pimpdadd", + "pimpin", + "pimping", + "pinball", + "pineappl", + "pineapple", + "pinetree", + "ping", + "pingpong", + "pinhead", + "pink", + "pinkfloy", + "pinkfloyd", + "pinky", + "pinky1", + "pinnacle", + "pioneer", + "pipeline", + "piper", + "pippen", + "pippin", + "pippo", + "piramida", + "pirate", + "pirates", + "pisces", + "pissing", + "pissoff", + "pistol", + "pistons", + "pitbull", + "pitch", + "pixies", + "pizdec", + "pizza", + "pizza1", + "pizzaman", + "pizzas", + "placebo", + "planes", + "planet", + "plasma", + "plastic", + "plastics", + "platinum", + "plato", + "platon", + "platypus", + "play", + "playa", + "playball", + "playboy", + "playboy1", + "player", + "players", + "playing", + "playmate", + "playstat", + "playstation", + "playtime", + "please", + "pleasure", + "ploppy", + "plumber", + "pluto", + "plymouth", + "pobeda", + "pocket", + "poetry", + "point", + "pointer", + "poipoi", + "poison", + "poiuy", + "poiuyt", + "poiuytre", + "poiuytrewq", + "pokemon", + "pokemon1", + "poker", + "poker1", + "poland", + "polaris", + "police", + "polina", + "polish", + "polly", + "PolniyPizdec0211", + "polo", + "polopolo", + "polska", + "pompey", + "poncho", + "pong", + "pontiac", + "pony", + "poochie", + "poodle", + "pooh", + "poohbear", + "pookey", + "pookie", + "pool", + "pool6123", + "poontang", + "poop", + "pooper", + "poopie", + "poopoo", + "pooppoop", + "poopy", + "pooter", + "popcorn", + "popeye", + "popo", + "popopo", + "popova", + "popper", + "poppop", + "poppy", + "poptart", + "porkchop", + "porn", + "pornking", + "porno", + "porno1", + "pornos", + "pornporn", + "pornstar", + "porsche", + "porsche1", + "porsche9", + "portal", + "porter", + "portland", + "portugal", + "poseidon", + "positive", + "possum", + "post", + "postal", + "postman", + "potato", + "pothead", + "potter", + "powder", + "powell", + "power", + "power1", + "power123", + "powers", + "pppp", + "ppppp", + "pppppp", + "ppppppp", + "pppppppp", + "praise", + "prayer", + "preacher", + "precious", + "predator", + "prelude", + "premier", + "premium", + "presario", + "presiden", + "president", + "presley", + "pressure", + "presto", + "preston", + "pretty", + "priest", + "primus", + "prince", + "prince1", + "princes", + "princess", + "Princess", + "pringles", + "printer", + "printing", + "prissy", + "private", + "private1", + "privet", + "probes", + "prodigy", + "profit", + "program", + "progress", + "project", + "promise", + "property", + "prophet", + "prospect", + "prosper", + "protect", + "proton", + "proview", + "prowler", + "proxy", + "prozac", + "psycho", + "public", + "puck", + "puddin", + "pudding", + "puffin", + "puffy", + "pufunga7782", + "pulsar", + "pumper", + "pumpkin", + "pumpkin1", + "pumpkins", + "punch", + "punisher", + "punk", + "punker", + "punkin", + "punkrock", + "puppet", + "puppies", + "puppy", + "puppydog", + "pupsik", + "purdue", + "purpl", + "purple", + "purple1", + "pushkin", + "puss", + "pussey", + "pussie", + "pussies", + "pussy", + "PUSSY", + "pussy1", + "Pussy1", + "pussy123", + "pussy69", + "pussycat", + "pussyman", + "pussys", + "putter", + "puzzle", + "pyramid", + "python", + "q11111", + "q12345", + "q123456", + "q1234567", + "q123456789", + "q1q1q1", + "q1q2q3", + "q1w2e3", + "q1w2e3r", + "q1w2e3r4", + "q1w2e3r4t5", + "q1w2e3r4t5y6", + "q2w3e4", + "q2w3e4r5", + "qawsed", + "qawsedrf", + "qaz123", + "qazqaz", + "qazws", + "qazwsx", + "qazwsx1", + "qazwsx12", + "qazwsx123", + "qazwsxed", + "qazwsxedc", + "qazwsxedc123", + "qazwsxedcrfv", + "qazxcv", + "qazxsw", + "qazxswedc", + "qazzaq", + "qiang", + "qiao", + "qing", + "qiong", + "qqq111", + "qqqq", + "qqqqq", + "qqqqq1", + "qqqqqq", + "qqqqqqq", + "qqqqqqqq", + "qqqwww", + "quality", + "quan", + "quantum", + "quartz", + "quasar", + "quattro", + "quebec", + "queen", + "queenie", + "queens", + "quentin", + "quest", + "question", + "quincy", + "qwaszx", + "qwe123", + "qwe123qwe", + "qwe321", + "qweasd", + "qweasd123", + "qweasdzxc", + "qwedsa", + "qweqwe", + "qweqweqwe", + "qwer", + "qwer12", + "qwer123", + "qwer1234", + "qwerasdf", + "qwerasdfzxcv", + "qwerqwer", + "qwert", + "qwert1", + "qwert123", + "qwert12345", + "qwert40", + "qwerty", + "QWERTY", + "qwerty1", + "Qwerty1", + "qwerty11", + "qwerty12", + "qwerty123", + "qwerty1234", + "qwerty12345", + "qwerty123456", + "qwerty7", + "qwertyqwerty", + "qwertyu", + "qwertyui", + "qwertyuio", + "qwertyuiop", + "qwertz", + "qwqwqw", + "qwqwqwqw", + "r2d2c3po", + "rabbit", + "rabbits", + "rabota", + "race", + "racecar", + "racer", + "racerx", + "rachael", + "rachel", + "rachel1", + "rachelle", + "racing", + "radar", + "radical", + "radio", + "radiohea", + "radiohead", + "rafael", + "rage", + "ragnarok", + "raider", + "raiders", + "raiders1", + "railroad", + "rain", + "rainbow", + "rainbow1", + "rainbow6", + "rainbows", + "rainman", + "rainyday", + "raistlin", + "raleigh", + "ralph", + "rambler", + "rambo", + "ramirez", + "rammstein", + "ramona", + "ramones", + "rampage", + "ramrod", + "ramses", + "ramsey", + "ranch", + "rancid", + "randall", + "random", + "randy", + "randy1", + "rang", + "ranger", + "Ranger", + "ranger1", + "rangers", + "rangers1", + "raphael", + "raptor", + "raquel", + "rascal", + "rasdzv3", + "rasmus", + "rasputin", + "rasta", + "rastaman", + "ratboy", + "rated", + "ratman", + "raven", + "raven1", + "ravens", + "raymond", + "rayray", + "razor", + "razz", + "rbhbkk", + "rctybz", + "reader", + "readers", + "reading", + "ready", + "reagan", + "real", + "reality", + "really", + "realmadrid", + "reaper", + "reason", + "rebecca", + "rebecca1", + "rebel", + "rebel1", + "rebels", + "reckless", + "record", + "records", + "recovery", + "red123", + "redalert", + "redbaron", + "redbird", + "redbone", + "redbull", + "redcar", + "reddevil", + "reddog", + "reddwarf", + "redeye", + "redfish", + "redfox", + "redhat", + "redhead", + "redhot", + "redline", + "redman", + "redneck", + "redred", + "redrose", + "redrum", + "reds", + "redskin", + "redskins", + "redsox", + "redsox1", + "redstar", + "redwing", + "redwings", + "redwood", + "reebok", + "reefer", + "referee", + "reflex", + "reggae", + "reggie", + "regina", + "reginald", + "register", + "reilly", + "reload", + "remember", + "remingto", + "remote", + "renata", + "renato", + "renault", + "renee", + "renegade", + "reng", + "repair", + "report", + "reptile", + "republic", + "rereirf", + "rescue", + "research", + "reserve", + "resident", + "respect", + "restart", + "retard", + "retire", + "retired", + "revenge", + "review", + "revolution", + "revolver", + "reynolds", + "rfgecnf", + "rfhbyf", + "rfhfylfi", + "rfhnjirf", + "rfnthbyf", + "rfntymrf", + "rfrfirf", + "rfrnec", + "rfvfcenhf", + "rhbcnbyf", + "rhfcjnrf", + "rhiannon", + "rhino", + "rhjrjlbk", + "rhonda", + "rhtdtlrj", + "ricard", + "ricardo", + "riccardo", + "rich", + "richard", + "Richard", + "richard1", + "richards", + "richie", + "richmond", + "rick", + "ricky", + "rico", + "ride", + "rider", + "riders", + "ridge", + "right", + "rightnow", + "riley", + "rimmer", + "ring", + "ringo", + "ripken", + "ripley", + "ripper", + "ripple", + "rita", + "river", + "rivera", + "rivers", + "rjhjkm", + "rjhjktdf", + "rjirfrgbde", + "rjntyjr", + "rjycnfynby", + "road", + "roadkill", + "roadking", + "roadrunn", + "roadrunner", + "roadster", + "robbie", + "rober", + "robert", + "Robert", + "ROBERT", + "robert1", + "roberta", + "roberto", + "roberts", + "robin", + "robin1", + "robins", + "robinson", + "robocop", + "robot", + "robotech", + "robotics", + "rochelle", + "rock", + "rocker", + "rocket", + "rockets", + "rockford", + "rockhard", + "rockie", + "rockies", + "rockin", + "rocknrol", + "rocknroll", + "rockon", + "rocks", + "rockstar", + "rockwell", + "rocky", + "rocky1", + "rodeo", + "rodman", + "rodney", + "roger", + "roger1", + "rogers", + "rogue", + "roland", + "roll", + "roller", + "rollin", + "rolling", + "rollins", + "rolltide", + "roma", + "roman", + "romance", + "romano", + "romans", + "romantic", + "romashka", + "romeo", + "romero", + "rommel", + "ronald", + "ronaldo", + "rong", + "ronnie", + "roofer", + "rookie", + "rooney", + "rooster", + "rootbeer", + "rosario", + "roscoe", + "rose", + "rosebud", + "rosemary", + "roses", + "rosie", + "ross", + "roswell", + "rotten", + "rough", + "route66", + "rover", + "rovers", + "roxanne", + "royal", + "royals", + "royalty", + "rrrr", + "rrrrr", + "rrrrrr", + "rrrrrrrr", + "rtyuehe", + "ruan", + "rubber", + "rubble", + "ruby", + "rudeboy", + "rudolf", + "rudy", + "rufus", + "rugby", + "rugby1", + "rugger", + "rules", + "rulez", + "RuleZ", + "rumble", + "runaway", + "runescape", + "runner", + "running", + "rupert", + "rush", + "rush2112", + "ruslan", + "russel", + "russell", + "russia", + "russian", + "rustam", + "rusty", + "rusty1", + "rusty2", + "ryan", + "s123456", + "sabbath", + "sabina", + "sabine", + "sabres", + "sabrina", + "sabrina1", + "sacred", + "sadie", + "sadie1", + "safari", + "safety", + "sahara", + "saigon", + "sailboat", + "sailing", + "sailor", + "saint", + "saints", + "sairam", + "saiyan", + "sakura", + "salamander", + "salami", + "salasana", + "saleen", + "salem", + "sales", + "sally", + "sally1", + "salman", + "salmon", + "salome", + "salomon", + "salope", + "Salsero", + "salvador", + "sam123", + "samanth", + "samantha", + "Samantha", + "samara", + "sambo", + "samiam", + "samira", + "samm", + "sammie", + "sammy", + "sammy1", + "sammy123", + "samoht", + "sampson", + "samsam", + "samson", + "samsun", + "samsung", + "samsung1", + "samtron", + "samuel", + "samurai", + "sanchez", + "sancho", + "sand", + "sander", + "sanders", + "sandie", + "sandiego", + "sandman", + "sandr", + "sandra", + "Sandra", + "sandrine", + "sandro", + "sandwich", + "sandy", + "sandy1", + "sanford", + "sanfran", + "sang", + "sanity", + "santa", + "santafe", + "santana", + "santiago", + "santos", + "sapper", + "sapphire", + "sara", + "sarah", + "sarah1", + "saratoga", + "sasasa", + "sascha", + "sasha_007", + "sasha", + "sasha1", + "saskia", + "sassy", + "sassy1", + "sasuke", + "satan", + "satan666", + "satana", + "saturday", + "saturn", + "SaUn", + "sauron", + "sausage", + "sausages", + "savage", + "savanna", + "savannah", + "savior", + "sawyer", + "sayang", + "scamper", + "scania", + "scanner", + "scarface", + "scarlet", + "scarlett", + "schalke", + "schatz", + "scheisse", + "schmidt", + "school", + "science", + "scissors", + "scooby", + "scoobydo", + "scoobydoo", + "scooter", + "scooter1", + "score", + "scorpio", + "scorpio1", + "scorpion", + "scotch", + "scotland", + "scott", + "scott1", + "scottie", + "scotty", + "scout", + "scrabble", + "scrapper", + "scrappy", + "scratch", + "scream", + "screamer", + "screen", + "screw", + "screwy", + "script", + "scruffy", + "scuba", + "scuba1", + "scully", + "seabee", + "seadoo", + "seagull", + "seahawks", + "seamus", + "sean", + "searay", + "search", + "season", + "seattle", + "sebastia", + "sebastian", + "sebring", + "second", + "secret", + "secret1", + "secrets", + "secure", + "security", + "sedona", + "seeker", + "seeking", + "segblue2", + "seinfeld", + "sekret", + "select", + "selena", + "selina", + "seminole", + "semper", + "semperfi", + "senator", + "senators", + "seneca", + "seng", + "senior", + "senna", + "sensei", + "sentinel", + "septembe", + "september", + "serega", + "serena", + "serenity", + "sergbest", + "sergeant", + "sergei", + "sergey", + "sergi", + "sergio", + "series", + "serpent", + "sersolution", + "server", + "service", + "services", + "sesame", + "seven", + "seven7", + "sevens", + "sex", + "sex123", + "sex4me", + "sex69", + "sexgod", + "sexman", + "sexo", + "sexsex", + "sexsexsex", + "sexual", + "sexx", + "sexxx", + "sexxxx", + "sexxxy", + "sexxy", + "sexy", + "sexy1", + "sexy69", + "sexybabe", + "sexyboy", + "sexygirl", + "sexylady", + "sexyman", + "sexysexy", + "seymour", + "sf49ers", + "shado", + "shadow", + "Shadow", + "SHADOW", + "shadow1", + "shadow12", + "shadows", + "shady", + "shag", + "shaggy", + "shai", + "shakira", + "shalom", + "shaman", + "shampoo", + "shamrock", + "shamus", + "shan", + "shane", + "shaney14", + "shang", + "shanghai", + "shania", + "shanna", + "shannon", + "shannon1", + "shanti", + "shao", + "shaolin", + "shark", + "sharks", + "sharky", + "sharon", + "sharp", + "shasta", + "shauna", + "shaved", + "shawn", + "shawna", + "shazam", + "shearer", + "sheba", + "sheba1", + "sheeba", + "sheena", + "sheep", + "sheepdog", + "shei", + "sheila", + "shelby", + "sheldon", + "shell", + "shelley", + "shelly", + "shemale", + "shen", + "sheng", + "shepherd", + "sheridan", + "sheriff", + "sherlock", + "sherman", + "sherri", + "sherry", + "sherwood", + "shibby", + "shiloh", + "shiner", + "shinobi", + "shirley", + "shit", + "shitface", + "shithead", + "shitty", + "shock", + "shocker", + "shodan", + "shoes", + "shogun", + "shojou", + "shonuf", + "shooter", + "shopper", + "shopping", + "short", + "shorty", + "shotgun", + "shou", + "shovel", + "show", + "shower", + "showme", + "showtime", + "shrimp", + "shuai", + "shuang", + "shui", + "shun", + "shuo", + "shuttle", + "shutup", + "shyshy", + "sick", + "sidekick", + "sidney", + "siemens", + "sierra", + "sigma", + "sigmachi", + "signal", + "silence", + "silent", + "silly", + "silver", + "silver1", + "silverad", + "silvia", + "simba", + "simba1", + "simmons", + "simon", + "simon1", + "simona", + "simone", + "simple", + "simpson", + "simpsons", + "sims", + "simsim", + "sinatra", + "sinbad", + "sinclair", + "singapor", + "singer", + "single", + "sinister", + "sinned", + "sinner", + "siobhan", + "sirius", + "sissy", + "sister", + "sisters", + "site", + "sites", + "sithlord", + "sixers", + "sixpack", + "sixsix", + "sixty", + "sixty9", + "skate", + "skateboard", + "skater", + "skeeter", + "skibum", + "skidoo", + "skiing", + "skillet", + "skinhead", + "skinner", + "skinny", + "skip", + "skipper", + "skippy", + "skittles", + "skorpion", + "skydive", + "skyhawk", + "skylar", + "skylark", + "skyler", + "skyline", + "skywalke", + "skywalker", + "slacker", + "slamdunk", + "slammer", + "slapper", + "slappy", + "slapshot", + "slater", + "slave", + "slave1", + "slavik", + "slayer", + "slayer1", + "sleep", + "sleeper", + "sleepy", + "slick", + "slick1", + "slider", + "slim", + "slimshad", + "slimshady", + "slinky", + "slipknot", + "slippery", + "slonik", + "sloppy", + "slowhand", + "slugger", + "sluggo", + "slut", + "sluts", + "slutty", + "smackdow", + "smackdown", + "small", + "smart", + "smart1", + "smashing", + "smeghead", + "smegma", + "smelly", + "smile", + "smiles", + "smiley", + "smirnoff", + "smirnov", + "smith", + "smiths", + "smitty", + "smoke", + "smoke1", + "smoker", + "smokes", + "smokey", + "smokey1", + "smokie", + "smokin", + "smoking", + "smooth", + "smoothie", + "smudge", + "smut", + "snake", + "snake1", + "snakes", + "snapon", + "snapper", + "snapple", + "snappy", + "snatch", + "sneakers", + "sneaky", + "snicker", + "snickers", + "sniffing", + "sniper", + "snooker", + "snoop", + "snoopdog", + "snoopy", + "snoopy1", + "snow", + "snowball", + "snowbird", + "snowboar", + "snowboard", + "snowflak", + "snowman", + "snuffy", + "snuggles", + "sobaka", + "socce", + "soccer", + "soccer1", + "soccer10", + "soccer12", + "socrates", + "sofia", + "softail", + "softball", + "Software", + "software", + "Sojdlg123aljg", + "solaris", + "soldier", + "soleil", + "solitude", + "solnce", + "solo", + "solomon", + "solution", + "some", + "someday", + "someone", + "somerset", + "somethin", + "something", + "sommer", + "sonata", + "song", + "sonia", + "sonic", + "sonics", + "sonny", + "sonoma", + "sony", + "sonyericsson", + "sonyfuck", + "sonysony", + "sooner", + "sooners", + "sophi", + "sophia", + "sophie", + "soprano", + "Soso123aljg", + "soul", + "soulmate", + "sound", + "south", + "southern", + "southpar", + "southpark", + "southpaw", + "sowhat", + "space", + "spaceman", + "spam", + "spanish", + "spank", + "spanker", + "spanking", + "spankme", + "spanky", + "spanner", + "sparkle", + "sparkles", + "sparks", + "sparky", + "sparky1", + "sparrow", + "sparta", + "spartak", + "spartan", + "spartan1", + "spartans", + "spawn", + "speaker", + "speakers", + "spears", + "special", + "specialk", + "spectre", + "spectrum", + "speed", + "speedo", + "speedway", + "speedy", + "spence", + "spencer", + "spencer1", + "sperma", + "sphinx", + "spice", + "spider", + "spider1", + "spiderma", + "spiderman", + "spidey", + "spike", + "spike1", + "spiker", + "spikes", + "spikey", + "spinner", + "spiral", + "spirit", + "spitfire", + "splash", + "spliff", + "splinter", + "spock", + "spoiled", + "sponge", + "spongebo", + "spongebob", + "spooge", + "spooky", + "spoon", + "spoons", + "sport", + "sporting", + "sports", + "sporty", + "spot", + "spotty", + "spread", + "spring", + "springer", + "springs", + "sprint", + "sprinter", + "sprite", + "sprout", + "spud", + "spunky", + "spurs", + "spurs1", + "sputnik", + "spyder", + "sqdwfe", + "squall", + "square", + "squash", + "squeak", + "squeeze", + "squirrel", + "squirt", + "srinivas", + "ssss", + "sssss", + "ssssss", + "sssssss", + "ssssssss", + "stacey", + "stacie", + "stacy", + "stafford", + "stalin", + "stalker", + "stallion", + "stan", + "standard", + "stanford", + "stang", + "stanislav", + "stanley", + "staples", + "star", + "star69", + "starbuck", + "starcraf", + "starcraft", + "stardust", + "starfire", + "starfish", + "stargate", + "starligh", + "starman", + "starr", + "stars", + "starship", + "starstar", + "start", + "start1", + "starter", + "startrek", + "starwar", + "starwars", + "stasik", + "state", + "static", + "station", + "status", + "stayout", + "stealth", + "steam", + "steaua", + "steel", + "steele", + "steeler", + "steelers", + "stefan", + "stefanie", + "stefano", + "steffen", + "steffi", + "stella", + "stellar", + "stepan", + "steph", + "stephan", + "stephane", + "stephani", + "stephanie", + "stephen", + "stephen1", + "stereo", + "sterlin", + "sterling", + "sterva", + "steve", + "steve1", + "steven", + "stevens", + "stevie", + "stewart", + "stick", + "stickman", + "sticks", + "sticky", + "stiffy", + "stigmata", + "stimpy", + "sting", + "stinger", + "stingray", + "stinker", + "stinky", + "stock", + "stocking", + "stocks", + "stockton", + "stolen", + "stone", + "stone1", + "Stone55", + "stonecol", + "stonecold", + "stoned", + "stoner", + "stones", + "stoney", + "stop", + "storage", + "store", + "stories", + "storm", + "storm1", + "stormy", + "straight", + "strange", + "stranger", + "strap", + "stratfor", + "stratus", + "strawber", + "strawberry", + "stream", + "streaming", + "street", + "streets", + "strength", + "stress", + "stretch", + "strider", + "strike", + "striker", + "string", + "strip", + "stripper", + "stroke", + "stroker", + "strong", + "stryker", + "stuart", + "stubby", + "stud", + "student", + "studio", + "studly", + "studman", + "stuff", + "stumpy", + "stunner", + "stupid", + "stupid1", + "style", + "styles", + "stylus", + "suan", + "subaru", + "sublime", + "submit", + "suburban", + "subway", + "subzero", + "success", + "success1", + "suck", + "suckdick", + "sucked", + "sucker", + "suckers", + "sucking", + "suckit", + "suckme", + "suckmydick", + "sucks", + "sugar", + "sugar1", + "suicide", + "sullivan", + "sultan", + "summer", + "summer1", + "summer69", + "summer99", + "summers", + "summit", + "sundance", + "sunday", + "sundevil", + "sunfire", + "sunflowe", + "sunflower", + "sunlight", + "sunny", + "sunny1", + "sunnyday", + "sunrise", + "sunset", + "sunshin", + "sunshine", + "super", + "super1", + "super12", + "super123", + "superb", + "superfly", + "superior", + "superma", + "superman", + "Superman", + "superman1", + "supernov", + "supernova", + "supersta", + "superstar", + "support", + "supra", + "supreme", + "surf", + "surfer", + "surfing", + "survivor", + "susan", + "susana", + "susanna", + "susanne", + "sushi", + "suslik", + "sutton", + "suzanne", + "suzuki", + "sveta", + "svetik", + "svetlana", + "svoboda", + "swallow", + "sweden", + "swedish", + "sweet", + "sweet1", + "sweetie", + "sweetnes", + "sweetness", + "sweetpea", + "sweets", + "sweety", + "swimmer", + "swimming", + "swinger", + "swingers", + "swinging", + "switch", + "swoosh", + "sword", + "swordfis", + "swordfish", + "swords", + "sydney", + "sylveste", + "sylvia", + "syncmaster", + "synergy", + "syracuse", + "system", + "systems", + "syzygy", + "tabasco", + "tabitha", + "taco", + "tacobell", + "tacoma", + "taekwondo", + "talbot", + "talisman", + "talks", + "talon", + "tamara", + "tammy", + "tang", + "tango", + "tank", + "tanker", + "tanner", + "tantra", + "tanya", + "tanya1", + "tara", + "tarakan", + "tardis", + "target", + "tarheel", + "tarheels", + "tarpon", + "tartar", + "tarzan", + "tasha", + "tasha1", + "tatarin", + "tatiana", + "tattoo", + "tatyana", + "taurus", + "taxman", + "taylor", + "taylor1", + "tazman", + "tazmania", + "tbone", + "tdutybq", + "tdutybz", + "teacher", + "team", + "tech", + "technics", + "techno", + "teddy", + "teddy1", + "teddybea", + "teddybear", + "teen", + "teenage", + "teens", + "tekken", + "telefon", + "telephon", + "telephone", + "temp", + "temp123", + "tempest", + "templar", + "temple", + "temppass", + "tenchi", + "tender", + "teng", + "tennesse", + "tennis", + "tequila", + "terefon", + "teresa", + "terminal", + "terminat", + "terminator", + "terra", + "terrapin", + "terrell", + "terror", + "terry", + "test", + "test1", + "test12", + "test123", + "test1234", + "tester", + "testing", + "testing1", + "testpass", + "testtest", + "tetsuo", + "texas", + "texas1", + "thailand", + "thanatos", + "thanks", + "thankyou", + "theater", + "theatre", + "thebear", + "theboss", + "thecat", + "thecrow", + "thecure", + "thedog", + "thedon", + "thedoors", + "thedude", + "theend", + "theforce", + "thegame", + "thegreat", + "their", + "thekid", + "theking", + "thelma", + "theman", + "theodore", + "theone", + "there", + "theresa", + "therock", + "therock1", + "these", + "thesims", + "thethe", + "thewho", + "thierry", + "thing", + "thirteen", + "this", + "thisisit", + "thoma", + "thomas", + "Thomas", + "THOMAS", + "thomas1", + "thompson", + "thong", + "thongs", + "thor", + "thrasher", + "three", + "threesom", + "throat", + "thuglife", + "thumb", + "thumbs", + "thumper", + "thunder", + "thunder1", + "thunderb", + "thursday", + "thx1138", + "tian", + "tiao", + "tiberius", + "tiburon", + "ticket", + "tickle", + "tiffany", + "tiffany1", + "tiger", + "tiger1", + "tiger123", + "tiger2", + "tigercat", + "tigers", + "tigers1", + "tigge", + "tigger", + "Tigger", + "tigger1", + "tigger2", + "tight", + "tights", + "timber", + "time", + "timeout", + "timmy", + "timosha", + "timothy", + "timtim", + "tina", + "ting", + "tinker", + "tinkerbe", + "tinkerbell", + "tinman", + "tintin", + "tiny", + "tipper", + "titan", + "titanic", + "titanium", + "titans", + "titleist", + "tits", + "titten", + "titties", + "titts", + "titty", + "tkbpfdtnf", + "toast", + "toaster", + "tobias", + "toby", + "today", + "todd", + "toejam", + "toffee", + "together", + "toilet", + "tokiohotel", + "toledo", + "tolkien", + "tomahawk", + "tomas", + "tomato", + "tomcat", + "tommie", + "tommy", + "tommy1", + "tommyboy", + "tomorrow", + "tomtom", + "tong", + "tongue", + "tonight", + "tony", + "toocool", + "tool", + "toolbox", + "toolman", + "toon", + "toonarmy", + "tootie", + "tootsie", + "topcat", + "topdog", + "topgun", + "tophat", + "topher", + "topper", + "toriamos", + "torino", + "tornado", + "toronto", + "torpedo", + "torres", + "toshiba", + "tosser", + "toto", + "tototo", + "tottenha", + "tottenham", + "touching", + "tower", + "towers", + "town", + "toyota", + "trace", + "tracer", + "tracey", + "track", + "tracker", + "tractor", + "tracy", + "trader", + "traffic", + "trailer", + "train", + "trainer", + "training", + "trains", + "tralala", + "trance", + "tranny", + "trans", + "transam", + "transfer", + "transit", + "Translator", + "trapper", + "trauma", + "travel", + "traveler", + "travis", + "treasure", + "treble", + "trebor", + "tree", + "treefrog", + "trees", + "treetop", + "trevor", + "trfnthbyf", + "trial", + "triangle", + "tribal", + "tricia", + "tricky", + "trident", + "trigger", + "trinidad", + "trinitro", + "trinity", + "trip", + "triple", + "tripleh", + "tripod", + "tripper", + "trisha", + "tristan", + "triton", + "triumph", + "trixie", + "trojan", + "trojans", + "troll", + "trombone", + "trooper", + "tropical", + "trouble", + "trouble1", + "trout", + "troy", + "truck", + "trucker", + "trucking", + "trucks", + "truelove", + "truman", + "trumpet", + "trunks", + "trust", + "trustme", + "trustno1", + "Trustno1", + "truth", + "tsunami", + "tttttt", + "tttttttt", + "tuan", + "tucker", + "tuesday", + "tujhrf", + "tulips", + "tuna", + "tunafish", + "tundra", + "tuning", + "tupac", + "turbo", + "turbo1", + "turkey", + "Turkey50", + "turner", + "turnip", + "turtle", + "tuscl", + "tweety", + "twelve", + "twenty", + "twiggy", + "twilight", + "twinkie", + "twinkle", + "twins", + "twisted", + "twister", + "tycoon", + "tyler", + "tyler1", + "typhoon", + "tyrone", + "tyson", + "tyson1", + "ufkbyf", + "ukraine", + "ultima", + "ultimate", + "ultra", + "umbrella", + "umpire", + "undead", + "underdog", + "underground", + "undertak", + "undertaker", + "unicorn", + "unique", + "united", + "universa", + "universal", + "universe", + "university", + "unknown", + "unlock", + "unreal", + "uptown", + "upyours", + "uranus", + "ursula", + "usa123", + "usarmy", + "user", + "username", + "usmarine", + "usmc", + "usnavy", + "Usuckballz1", + "utopia", + "uuuuuu", + "vacation", + "vader", + "vader1", + "vadim", + "vagabond", + "vagina", + "valencia", + "valentin", + "valentina", + "valentine", + "valera", + "valeri", + "valeria", + "valerie", + "valhalla", + "valkyrie", + "valley", + "vampir", + "vampire", + "vampires", + "vancouve", + "vanessa", + "vanessa1", + "vanguard", + "vanhalen", + "vanilla", + "varvara", + "vasilisa", + "vauxhall", + "vbkfirf", + "vector", + "vectra", + "vedder", + "vegas", + "vegeta", + "vegitto", + "vehpbr", + "velocity", + "velvet", + "vendetta", + "venera", + "venice", + "venom", + "ventura", + "venture", + "venus", + "vera", + "verbatim", + "veritas", + "verizon", + "vermont", + "vernon", + "verona", + "veronica", + "veronika", + "versace", + "vertigo", + "vette", + "vfczyz", + "vfhbyf", + "vfhecz", + "vfhufhbnf", + "vfibyf", + "vfitymrf", + "vfksirf", + "vfndtq", + "vfntvfnbrf", + "vfrcbv", + "vfrcbvrf", + "vfvekz", + "vfvfgfgf", + "vfvjxrf", + "vh5150", + "viagra", + "vickie", + "victor", + "victoria", + "Victoria", + "victory", + "video", + "videos", + "vienna", + "vietnam", + "viewsoni", + "viewsonic", + "viking", + "vikings", + "vikings1", + "viktor", + "viktoria", + "viktoriya", + "villa", + "village", + "vincent", + "vinnie", + "vintage", + "violet", + "violetta", + "violin", + "viper", + "viper1", + "vipergts", + "vipers", + "virgil", + "virgin", + "virginia", + "virginie", + "virtual", + "virus", + "visa", + "vision", + "visual", + "vitalik", + "vitamin", + "vivian", + "vjcrdf", + "vjkjrj", + "vjqgfhjkm", + "vkontakte", + "vlad", + "vladik", + "vladimir", + "vladislav", + "vodka", + "volcano", + "volcom", + "volkov", + "volkswag", + "volley", + "volleyba", + "volume", + "volvo", + "voodoo", + "vortex", + "voyager", + "voyager1", + "voyeur", + "VQsaBLPzLa", + "vsegda", + "vSjasnel12", + "vulcan", + "vvvv", + "vvvvvv", + "w_pass", + "waffle", + "wagner", + "walker", + "wallace", + "wallet", + "walleye", + "wally", + "walmart", + "walnut", + "walrus", + "walter", + "walton", + "wanderer", + "wang", + "wanker", + "wanking", + "wanted", + "wapbbs", + "warcraft", + "wareagle", + "warez", + "warhamme", + "warhammer", + "warlock", + "warlord", + "warner", + "warning", + "warren", + "warrior", + "warrior1", + "warriors", + "warthog", + "wasabi", + "washburn", + "washingt", + "washington", + "wasser", + "wassup", + "wasted", + "watch", + "watcher", + "water", + "water1", + "waterboy", + "waterloo", + "waters", + "watford", + "watson", + "wayne", + "wealth", + "weare138", + "wearing", + "weasel", + "weather", + "weaver", + "webber", + "webhompas", + "webmaste", + "webmaster", + "webster", + "wedding", + "weed", + "weed420", + "weekend", + "weezer", + "weiner", + "weird", + "welcom", + "welcome", + "welcome1", + "Welcome1", + "welder", + "welkom", + "wendy", + "wendy1", + "weng", + "werder", + "werdna", + "werewolf", + "werner", + "wert", + "werty", + "wertyu", + "wesley", + "west", + "western", + "westham", + "weston", + "westside", + "westwood", + "wetpussy", + "wetter", + "wg8e3wjf", + "what", + "whatever", + "whatsup", + "whatthe", + "whatwhat", + "wheels", + "whiplash", + "whiskers", + "whiskey", + "whisky", + "whisper", + "whistler", + "white", + "white1", + "whiteboy", + "whiteout", + "whitesox", + "whitey", + "whitney", + "whocares", + "whore", + "whynot", + "wibble", + "wicked", + "widget", + "wifey", + "wilbur", + "wild", + "wildbill", + "wildcard", + "wildcat", + "wildcats", + "wilder", + "wildfire", + "wildman", + "wildone", + "wildwood", + "will", + "willia", + "william", + "William", + "william1", + "williams", + "willie", + "willis", + "willow", + "willy", + "wilson", + "wind", + "windmill", + "window", + "windows", + "windsor", + "windsurf", + "winger", + "wingman", + "wingnut", + "wings", + "winner", + "winner1", + "winners", + "winnie", + "winona", + "winston", + "winston1", + "winter", + "winter1", + "wireless", + "wisdom", + "wiseguy", + "wishbone", + "wives", + "wizard", + "wizard1", + "wizards", + "wolf", + "wolf359", + "wolfen", + "wolfgang", + "wolfie", + "wolfman", + "wolfpac", + "wolfpack", + "wolverin", + "wolverine", + "wolves", + "woman", + "wombat", + "women", + "wonder", + "wonderboy", + "wonderful", + "wood", + "woodie", + "woodland", + "woodstoc", + "woody", + "woody1", + "woofer", + "woofwoof", + "woohoo", + "wookie", + "woowoo", + "word", + "wordpass", + "wordup", + "work", + "working", + "workout", + "world", + "wormix", + "worthy", + "wowwow", + "WP2003WP", + "wraith", + "wrangler", + "wrench", + "wrestle", + "wrestler", + "wrestlin", + "wrestling", + "wright", + "wrinkle1", + "writer", + "wutang", + "wwww", + "wwwwww", + "wwwwwww", + "wwwwwwww", + "wxcvbn", + "wyoming", + "xanadu", + "xander", + "xavier", + "xbox360", + "xerxes", + "xfiles", + "xian", + "xiang", + "xiao", + "xing", + "xiong", + "xtreme", + "xuan", + "xxx123", + "xxxpass", + "xxxx", + "xxxxx", + "xxxxxx", + "xxxxxxx", + "xxxxxxxx", + "xyz123", + "yamaha", + "yamahar1", + "yamato", + "yang", + "yankee", + "yankees", + "yankees1", + "yankees2", + "yasmin", + "yaya", + "ybrbnf", + "ybrjkfq", + "yeah", + "yeahbaby", + "yellow", + "yessir", + "yesyes", + "yfcntymrf", + "yfnfif", + "yfnfkb", + "yfnfkmz", + "ying", + "yjdsqgfhjkm", + "yoda", + "yogibear", + "yolanda", + "yomama", + "yong", + "yosemite", + "young", + "young1", + "yourmom", + "yousuck", + "youtube", + "yoyo", + "yoyoma", + "yoyoyo", + "ytrewq", + "yuan", + "yugioh", + "yummy", + "yumyum", + "yvette", + "yvonne", + "yyyy", + "yyyyyy", + "yyyyyyyy", + "yzerman", + "z1x2c3", + "z1x2c3v4", + "zachary", + "zachary1", + "zack", + "zalupa", + "zander", + "zang", + "zanzibar", + "zaphod", + "zappa", + "zapper", + "zaq123", + "zaq12wsx", + "zaq1xsw2", + "zaqwsx", + "zaqwsxcde", + "zaqxsw", + "zaqxswcde", + "zaraza", + "zarina", + "zasada", + "zazaza", + "zebra", + "zeng", + "zenith", + "zephyr", + "zeppelin", + "zero", + "zerocool", + "zeus", + "zhai", + "zhang", + "zhao", + "zhei", + "zheng", + "zhjckfd", + "zhong", + "zhou", + "zhuai", + "zhuang", + "zhui", + "zhun", + "zhuo", + "zidane", + "ziggy", + "zigzag", + "zildjian", + "zipper", + "zippo", + "zippy", + "zodiac", + "zoloto", + "zombie", + "zong", + "zorro", + "zouzou", + "zuan", + "zvezda", + "zxasqw", + "zxasqw12", + "zxc123", + "zxcasd", + "zxcasdqwe", + "zxcasdqwe123", + "zxcv", + "zxcv123", + "zxcv1234", + "zxcvb", + "zxcvbn", + "zxcvbnm", + "zxcvbnm1", + "zxcvbnm123", + "zxczxc", + "zxzxzx", + "zyjxrf", + "zzzxxx", + "zzzz", + "zzzzz", + "zzzzzz", + "zzzzzzz", + "zzzzzzzz", +]; diff --git a/gamercade_interface/src/security/mod.rs b/gamercade_interface/src/security/mod.rs new file mode 100644 index 00000000..4055ba2d --- /dev/null +++ b/gamercade_interface/src/security/mod.rs @@ -0,0 +1,3 @@ +mod common_passwords; + +pub mod password; diff --git a/gamercade_interface/src/security/password.rs b/gamercade_interface/src/security/password.rs new file mode 100644 index 00000000..d4b21e2b --- /dev/null +++ b/gamercade_interface/src/security/password.rs @@ -0,0 +1,111 @@ +use super::common_passwords::COMMON_PASSWORDS; + +pub enum PasswordValidationError { + TooShort, + TooLong, + InvalidCharacters, + CommonPassword, +} + +impl ToString for PasswordValidationError { + fn to_string(&self) -> String { + match self { + Self::TooShort => "Password is too short. Must be 8 or more characters.", + Self::TooLong => "Password is too long. Must be 64 or less characters", + Self::InvalidCharacters => "Password contains invalid characters.", + Self::CommonPassword => "Password is a commonly used and insecure.", + } + .to_string() + } +} + +pub enum PasswordStrength { + VeryWeak, + Weak, + Medium, + Strong, + VeryStrong, +} + +impl PasswordStrength { + fn increment(self) -> Self { + match self { + Self::VeryWeak => Self::Weak, + Self::Weak => Self::Medium, + Self::Medium => Self::Strong, + Self::Strong => Self::VeryStrong, + Self::VeryStrong => Self::VeryStrong, + } + } +} + +/// Returns the length of a password including strength based on length. +pub fn length_check(password: &str) -> Result { + // Length Checks + let len = password.len(); + + match len { + x if (0..8).contains(&x) => Err(PasswordValidationError::TooShort), + 8 => Ok(PasswordStrength::VeryWeak), + x if (9..12).contains(&x) => Ok(PasswordStrength::Weak), + x if (12..17).contains(&x) => Ok(PasswordStrength::Medium), + x if (17..20).contains(&x) => Ok(PasswordStrength::Strong), + x if (20..65).contains(&x) => Ok(PasswordStrength::VeryStrong), + _ => Err(PasswordValidationError::TooLong), + } +} + +/// Returns true if the password exists in the common password database. +/// Any common password should be rejected for security reasons. +pub fn is_common_password(password: &str) -> bool { + // TODO: Benchmark binary search, hashmap, or Vec lookup for common passwords + COMMON_PASSWORDS.binary_search(&password).is_ok() +} + +/// Check the strength of the password. Will return Ok with the strength, +/// otherwise returns an Err with the reason for rejecting. +pub fn get_password_strength(password: &str) -> Result { + // First check length + let mut strength = length_check(password)?; + + // Character Checks + if !password.is_ascii() { + return Err(PasswordValidationError::InvalidCharacters); + } + + // Common Password Check + if is_common_password(password) { + return Err(PasswordValidationError::CommonPassword); + } + + // Strength Increment + let mut has_lower = false; + let mut has_upper = false; + let mut has_number = false; + let mut has_special_character = false; + + for char in password.chars() { + if !has_lower && char.is_ascii_lowercase() { + has_lower = true + } + + if !has_upper && char.is_ascii_uppercase() { + has_upper = true + } + + if !has_number && char.is_ascii_digit() { + has_number = true + } + + if !has_special_character && char.is_ascii_punctuation() { + has_special_character = true + } + + if has_lower && has_upper && has_number && has_special_character { + strength = strength.increment(); + break; + } + } + + Ok(strength) +} diff --git a/gamercade_rs/Cargo.toml b/gamercade_rs/Cargo.toml index fa901dac..8c8df8af 100644 --- a/gamercade_rs/Cargo.toml +++ b/gamercade_rs/Cargo.toml @@ -9,4 +9,4 @@ repository = "https://github.com/gamercade-io/gamercade_console" keywords = ["gamedev"] [dependencies] -paste = "1.0.12" +paste = "1.0.14" \ No newline at end of file diff --git a/gamercade_rs/src/raw.rs b/gamercade_rs/src/raw.rs index 7f36b6d1..36234ad2 100644 --- a/gamercade_rs/src/raw.rs +++ b/gamercade_rs/src/raw.rs @@ -8,10 +8,8 @@ extern "C" { pub fn stop_channel(channel: i32); pub fn play_note(note_id: i32, instrument_index: i32, channel: i32); pub fn play_frequency(frequency: f32, instrument_index: i32, channel: i32); -} -// Data -extern "C" { + // Data pub fn height() -> i32; pub fn width() -> i32; pub fn fps() -> i32; @@ -25,10 +23,8 @@ extern "C" { pub fn bgm_length_frames(bgm_index: i32) -> i32; pub fn sfx_length_secs(sfx_index: i32) -> f32; pub fn sfx_length_frames(sfx_index: i32) -> i32; -} -// Graphics Params -extern "C" { + // Graphics Params pub fn palette_index(palette_index: i32) -> i32; pub fn sprite_sheet_index(sprite_sheet_index: i32) -> i32; pub fn sprite_index(sprite_index: i32) -> i32; @@ -43,10 +39,8 @@ extern "C" { flip_x: i32, flip_y: i32, ) -> i32; -} -// Draw -extern "C" { + // Draw pub fn clear_screen(graphics_parameters: i32); pub fn set_pixel(graphics_parameters: i32, x: i32, y: i32); pub fn circle(graphics_parameters: i32, x: i32, y: i32, radius: i32); @@ -56,24 +50,18 @@ extern "C" { pub fn line(graphics_parameters: i32, x0: i32, y0: i32, x1: i32, y1: i32); pub fn sprite(graphics_parameters: i32, transparency_mask: i64, x: i32, y: i32); pub fn write_pixel_buffer(start_index: i32, parameters_ptr: i32, len: i32); -} -// Text -extern "C" { + // Text pub fn console_log(text_ptr: i32, len: i32); pub fn console_log_utf16(text_ptr: i32, len: i32); -} -// Random -extern "C" { + // Random pub fn set_seed(seed: i32); pub fn random_int_range(min: i32, max: i32) -> i32; pub fn random_float() -> f32; pub fn random_float_range(min: f32, max: f32) -> f32; -} -// Input -extern "C" { + // Input pub fn button_a_pressed(player_id: i32) -> i32; pub fn button_a_released(player_id: i32) -> i32; pub fn button_a_held(player_id: i32) -> i32; @@ -152,10 +140,8 @@ extern "C" { pub fn raw_input_state(player_id: i32) -> i64; pub fn raw_mouse_state(player_id: i32) -> i64; -} -// Multiplayer -extern "C" { + // Multiplayer pub fn num_players() -> i32; pub fn is_local_player(player_id: i32) -> i32; pub fn is_remote_player(player_id: i32) -> i32; diff --git a/gamercade_sound_engine/Cargo.toml b/gamercade_sound_engine/Cargo.toml index 874bf130..09683696 100644 --- a/gamercade_sound_engine/Cargo.toml +++ b/gamercade_sound_engine/Cargo.toml @@ -16,9 +16,9 @@ path = "src/bin/audio_test.rs" [dependencies] gamercade_audio = { path = "../gamercade_audio/" } -cpal = "0.15.2" -arrayvec = { version = "0.7.2", features = ["serde"] } -rtrb = "0.2.3" +cpal = "0.15.3" +arrayvec = { version = "0.7.4", features = ["serde"] } +rtrb = "0.3.0" # for .wav hound = "3.5.0"