From 60e54ed2ccb790131555b8cda098f132260046f4 Mon Sep 17 00:00:00 2001 From: Garen Tyler Date: Tue, 2 May 2023 16:46:53 -0600 Subject: [PATCH] Server list ping (async structure) --- Cargo.lock | 467 ++++++------------ Cargo.toml | 32 +- crates/composition-protocol/Cargo.toml | 8 +- crates/composition-protocol/src/packet/mod.rs | 5 +- crates/composition-protocol/src/util.rs | 54 +- src/config.rs | 6 +- src/lib.rs | 7 +- src/main.rs | 12 +- src/net.rs | 4 +- src/server/mod.rs | 5 +- 10 files changed, 237 insertions(+), 363 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f0f3464..774ea2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,57 +2,60 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "anstream" -version = "0.2.6" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" dependencies = [ "anstyle", "anstyle-parse", + "anstyle-query", "anstyle-wincon", - "concolor-override", - "concolor-query", + "colorchoice", "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "0.3.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" [[package]] name = "anstyle-parse" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7d1bb534e9efed14f3e5f44e7dd1a4f709384023a4165199a4241e18dff0116" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" dependencies = [ "utf8parse", ] [[package]] -name = "anstyle-wincon" -version = "0.2.0" +name = "anstyle-query" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3127af6145b149f3287bb9a0d10ad9c5692dba8c53ad48285e5bec4063834fa" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" dependencies = [ "anstyle", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] name = "anyhow" -version = "1.0.69" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "autocfg" @@ -60,6 +63,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + [[package]] name = "bitflags" version = "1.3.2" @@ -84,12 +93,6 @@ version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfg-if" version = "1.0.0" @@ -98,9 +101,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.2.1" +version = "4.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046ae530c528f252094e4a77886ee1374437744b2bff1497aa898bbddbbb29b3" +checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" dependencies = [ "clap_builder", "clap_derive", @@ -109,9 +112,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.2.1" +version = "4.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "223163f58c9a40c3b0a43e1c4b50a9ce09f007ea2cb1ec258a687945b4b7929f" +checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" dependencies = [ "anstream", "anstyle", @@ -129,7 +132,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.13", + "syn", ] [[package]] @@ -138,16 +141,20 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "composition" version = "0.1.0" dependencies = [ + "base64", "clap", "composition-protocol", - "ctrlc", - "futures", "once_cell", - "quartz_nbt", "serde", "serde_json", "tokio", @@ -156,7 +163,6 @@ dependencies = [ "tracing", "tracing-appender", "tracing-subscriber", - "uuid", ] [[package]] @@ -170,35 +176,11 @@ dependencies = [ "tracing", ] -[[package]] -name = "concolor-override" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a855d4a1978dc52fb0536a04d384c2c0c1aa273597f08b77c8c4d3b2eec6037f" - -[[package]] -name = "concolor-query" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d11d52c3d7ca2e6d0040212be9e4dbbcd78b6447f535b6b561f449427944cf" -dependencies = [ - "windows-sys 0.45.0", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - [[package]] name = "crossbeam-channel" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if", "crossbeam-utils", @@ -213,25 +195,15 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "ctrlc" -version = "3.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbcf33c2a618cbe41ee43ae6e9f2e48368cd9f9db2896f10167d8d762679f639" -dependencies = [ - "nix", - "windows-sys 0.45.0", -] - [[package]] name = "errno" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -244,75 +216,12 @@ dependencies = [ "libc", ] -[[package]] -name = "flate2" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - [[package]] name = "futures-core" version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.13", -] - [[package]] name = "futures-sink" version = "0.3.28" @@ -320,28 +229,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] -name = "futures-task" -version = "0.3.28" +name = "hashbrown" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" @@ -364,6 +255,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "io-lifetimes" version = "1.0.10" @@ -401,15 +302,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" [[package]] name = "linux-raw-sys" -version = "0.3.1" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" +checksum = "b64f40e5e03e0d54f03845c8197d0291253cdbedfb1cb46b13c2c117554a9f4c" [[package]] name = "lock_api" @@ -436,15 +337,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" -[[package]] -name = "miniz_oxide" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - [[package]] name = "mio" version = "0.8.6" @@ -457,18 +349,6 @@ dependencies = [ "windows-sys 0.45.0", ] -[[package]] -name = "nix" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" -dependencies = [ - "bitflags", - "cfg-if", - "libc", - "static_assertions", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -501,15 +381,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" -[[package]] -name = "packet_logger" -version = "0.1.0" -dependencies = [ - "anyhow", - "composition-protocol", - "tokio", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -539,12 +410,6 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "proc-macro2" version = "1.0.56" @@ -554,31 +419,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "quartz_nbt" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348031720b71761481d77969dcb3c89ab06f04132ee1503aca1bd9313eef5e67" -dependencies = [ - "anyhow", - "byteorder", - "cesu8", - "flate2", - "quartz_nbt_macros", - "serde", -] - -[[package]] -name = "quartz_nbt_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "289baa0c8a4d1f840d2de528a7f8c29e0e9af48b3018172b3edad4f716e8daed" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "quote" version = "1.0.26" @@ -599,16 +439,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.3" +version = "0.37.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" +checksum = "8bbfc1d1c7c40c01715f47d71444744a81669ca84e8b63e25a55e169b1f86433" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -625,35 +465,44 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.152" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "serde_json" -version = "1.0.94" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +dependencies = [ + "serde", +] + [[package]] name = "sharded-slab" version = "0.1.4" @@ -672,15 +521,6 @@ dependencies = [ "libc", ] -[[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - [[package]] name = "smallvec" version = "1.10.0" @@ -697,12 +537,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -711,20 +545,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", @@ -733,22 +556,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -815,14 +638,14 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn", ] [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -833,11 +656,36 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" dependencies = [ "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] [[package]] @@ -866,13 +714,13 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -898,9 +746,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -912,9 +760,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775c11906edafc97bc378816b94585fbd9a054eabaf86fdd0ced94af449efab7" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] name = "utf8parse" @@ -922,12 +770,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" - [[package]] name = "valuable" version = "0.1.0" @@ -968,7 +810,7 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets 0.42.1", + "windows-targets 0.42.2", ] [[package]] @@ -982,17 +824,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows_aarch64_gnullvm 0.42.1", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm 0.42.1", - "windows_x86_64_msvc 0.42.1", + "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]] @@ -1012,9 +854,9 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" @@ -1024,9 +866,9 @@ checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" @@ -1036,9 +878,9 @@ checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" @@ -1048,9 +890,9 @@ checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" @@ -1060,9 +902,9 @@ checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" @@ -1072,9 +914,9 @@ checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" @@ -1084,12 +926,21 @@ checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" +dependencies = [ + "memchr", +] diff --git a/Cargo.toml b/Cargo.toml index 84eaa45..29a946d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [workspace] -members = [ "crates/*" ] +members = ["crates/*"] [workspace.dependencies] -tracing = { version = "0.1", features = ["log"] } composition-protocol = { path = "./crates/composition-protocol" } +tracing = { version = "0.1.37", features = ["log"] } [package] name = "composition" @@ -15,29 +15,29 @@ license = "MIT" build = "build.rs" [dependencies] -ctrlc = "3.1.8" -clap = { version = "4.2.1", features = ["derive"] } +base64 = "0.21.0" +clap = { version = "4.2.7", features = ["derive"] } composition-protocol = { workspace = true } +once_cell = "1.17.1" +serde = { version = "1.0.160", features = ["serde_derive"] } +serde_json = "1.0.96" +tokio = { version = "1.28.0", features = ["full"] } +tokio-util = "0.7.8" +toml = "0.7.3" tracing = { workspace = true } -tracing-subscriber = { version = "*", features = ["tracing-log"] } -tracing-appender = "0.2" -toml = "0.5" -once_cell = "1.17" -serde = { version = "1.0.114", features = ["serde_derive"] } -serde_json = "1.0.59" -quartz_nbt = { version = "0.2.6", features = ["serde"] } -tokio = { version = "1", features = ["full"] } -uuid = "0.8.2" -tokio-util = "0.7.7" -futures = "0.3.28" +tracing-subscriber = { version = "0.3.17", features = ["tracing-log"] } +tracing-appender = "0.2.2" # Unused but possibly useful dependencies: # async-trait = "0.1.48" # backtrace = "0.3.50" -# base64 = "0.12.3" # colorful = "0.2.1" +# ctrlc = "3.1.8" # fastnbt = "*" +# futures = "0.3.28" # mojang-api = "0.6.1" # ozelot = "0.9.0" # Ozelot 0.9.0 supports protocol version 578 (1.15.2) +# quartz_nbt = { version = "0.2.6", features = ["serde"] } # radix64 = "0.6.2" # toml = "0.5.6" +# uuid = "0.8.2" diff --git a/crates/composition-protocol/Cargo.toml b/crates/composition-protocol/Cargo.toml index 8cc17f1..b9f6983 100644 --- a/crates/composition-protocol/Cargo.toml +++ b/crates/composition-protocol/Cargo.toml @@ -7,8 +7,8 @@ description = "The Minecraft protocol implemented in a network-agnostic way" license = "MIT" [dependencies] -anyhow = "1.0.69" +anyhow = "1.0.71" +byteorder = "1.4.3" +serde_json = "1.0.96" +thiserror = "1.0.40" tracing = { workspace = true } -byteorder = "1" -serde_json = "1.0.94" -thiserror = "1.0.39" diff --git a/crates/composition-protocol/src/packet/mod.rs b/crates/composition-protocol/src/packet/mod.rs index 1a9337c..f11e293 100644 --- a/crates/composition-protocol/src/packet/mod.rs +++ b/crates/composition-protocol/src/packet/mod.rs @@ -36,11 +36,14 @@ macro_rules! generic_packet { is_serverbound, data ); - + tracing::debug!("data before: {:?}", data); let (data, packet_length) = crate::util::parse_varint(data)?; + tracing::debug!("data after packet length ({}): {:?}", packet_length, data); let (data, packet_data) = crate::util::take_bytes(packet_length as usize)(data)?; + tracing::debug!("data after packet data ({:?}): {:?}", packet_data, data); let (packet_data, packet_id) = crate::util::parse_varint(packet_data)?; + tracing::debug!("packet_data after packet_id ({}): {:?}", packet_id, packet_data); let (_packet_data, packet_body) = Self::parse_body(client_state, packet_id, is_serverbound, packet_data)?; diff --git a/crates/composition-protocol/src/util.rs b/crates/composition-protocol/src/util.rs index 2ed2deb..28c3847 100644 --- a/crates/composition-protocol/src/util.rs +++ b/crates/composition-protocol/src/util.rs @@ -6,38 +6,41 @@ pub type ParseResult<'data, T> = crate::Result<(&'data [u8], T)>; pub fn take_bytes(num: usize) -> impl Fn(&'_ [u8]) -> ParseResult<'_, &'_ [u8]> { move |data| { - if data.len() < num { - Err(ProtocolError::NotEnoughData) - } else { - Ok(data.split_at(num)) + use std::cmp::Ordering; + + match data.len().cmp(&num) { + Ordering::Greater => Ok((&data[num..], &data[..num])), + Ordering::Equal => Ok((&[], data)), + Ordering::Less => Err(ProtocolError::NotEnoughData), } } } #[tracing::instrument] -pub fn parse_varint(mut data: &[u8]) -> ParseResult<'_, i32> { +pub fn parse_varint(data: &[u8]) -> ParseResult<'_, i32> { trace!("{:?}", data); - let mut output = 0i32; - let mut bytes_read = 0i32; + let mut output = 0u32; + let mut bytes_read = 0; - loop { - let (d, next_byte) = take_bytes(1usize)(data)?; - data = d; - - if next_byte.is_empty() { + for i in 0..=5 { + if i == 5 { + // VarInts can only have 5 bytes maximum. + return Err(ProtocolError::InvalidData); + } else if data.len() <= i { return Err(ProtocolError::NotEnoughData); } - output |= ((next_byte[0] & 0x7f) as i32) << (bytes_read * 7); - bytes_read += 1; - if next_byte[0] & 0x80 != 0x80 { - break; - } - if bytes_read >= 5 { + let byte = data[i]; + output |= ((byte & 0x7f) as u32) << (7 * i); + + if byte & 0x80 != 0x80 { + // We found the last byte of the VarInt. + bytes_read = i + 1; break; } } - Ok((data, output)) + + Ok((&data[bytes_read..], output as i32)) } #[tracing::instrument] pub fn serialize_varint(value: i32) -> Vec { @@ -154,11 +157,24 @@ impl Position { mod tests { use super::*; + #[test] + fn take_bytes_works() { + let data: [u8; 5] = [0, 1, 2, 3, 4]; + + assert_eq!(take_bytes(3)(&data).unwrap(), (&data[3..], &data[..3])); + assert_eq!(take_bytes(1)(&data).unwrap().0.len(), data.len() - 1); + assert_eq!(take_bytes(1)(&data).unwrap().0[0], 1); + assert_eq!(take_bytes(1)(&[0, 1]).unwrap().0.len(), 1); + assert_eq!(take_bytes(1)(&[1]).unwrap().0.len(), 0); + assert!(take_bytes(1)(&[]).is_err()); + } + fn get_varints() -> Vec<(i32, Vec)> { vec![ (0, vec![0x00]), (1, vec![0x01]), (2, vec![0x02]), + (16, vec![0x10]), (127, vec![0x7f]), (128, vec![0x80, 0x01]), (255, vec![0xff, 0x01]), diff --git a/src/config.rs b/src/config.rs index d25955a..b4418f0 100644 --- a/src/config.rs +++ b/src/config.rs @@ -53,8 +53,8 @@ impl Default for Config { motd: "Hello world!".to_owned(), server_icon: PathBuf::from("server-icon.png"), server_icon_bytes: include_bytes!("./server-icon.png").to_vec(), - protocol_version: 761, - game_version: "1.19.3".to_owned(), + protocol_version: 762, + game_version: "1.19.4".to_owned(), server_version, server_threads: None, } @@ -83,7 +83,7 @@ impl Config { } if let Ok(cfg) = read_file(config_path) { - let cfg: Result = toml::from_slice(&cfg); + let cfg: Result = toml::from_str(&String::from_utf8_lossy(&cfg)); if let Ok(cfg) = cfg { config = cfg; } else { diff --git a/src/lib.rs b/src/lib.rs index 903d82d..e206d72 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,12 +10,7 @@ pub static START_TIME: OnceCell = OnceCell::new(); /// Start the server. #[tracing::instrument] -pub async fn start_server( - start_time: Instant, -) -> (server::Server, tokio_util::sync::CancellationToken) { - START_TIME - .set(start_time) - .expect("could not set START_TIME"); +pub async fn start_server() -> (server::Server, tokio_util::sync::CancellationToken) { server::Server::new(format!("0.0.0.0:{}", Config::instance().port)).await } diff --git a/src/main.rs b/src/main.rs index 217f9cb..f0626e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,11 @@ -use std::time::Instant; use tracing::{info, instrument, warn}; use tracing_subscriber::prelude::*; #[instrument] pub fn main() { - let start_time = Instant::now(); + composition::START_TIME + .set(std::time::Instant::now()) + .expect("could not set composition::START_TIME"); // Set up logging. let file_writer = @@ -58,8 +59,11 @@ pub fn main() { .unwrap() .block_on(async move { info!("Starting {} on port {}", config.server_version, config.port); - let (mut server, running) = composition::start_server(start_time).await; - info!("Done! Start took {:?}", start_time.elapsed()); + let (mut server, running) = composition::start_server().await; + info!( + "Done! Start took {:?}", + composition::START_TIME.get().unwrap().elapsed() + ); // The main server loop. loop { diff --git a/src/net.rs b/src/net.rs index 2dca72f..33f9b15 100644 --- a/src/net.rs +++ b/src/net.rs @@ -110,7 +110,9 @@ impl NetworkClient { let mut bytes_consumed = 0; while !data.is_empty() { - match GenericPacket::parse_uncompressed(self.state.into(), true, data) { + let p = GenericPacket::parse_uncompressed(self.state.into(), true, data); + trace!("{} got {:?}", self.id, p); + match p { Ok((d, packet)) => { debug!("Got packet {:?} from client {}", packet, self.id); bytes_consumed += data.len() - d.len(); diff --git a/src/server/mod.rs b/src/server/mod.rs index 2af1db1..93a05d2 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -212,6 +212,7 @@ impl Server { received_ping, }; let config = Config::instance(); + use base64::Engine; client.queue_packet(CS00StatusResponse { response: json!({ "version": { @@ -225,7 +226,9 @@ impl Server { }, "description": { "text": config.motd - } + }, + "favicon": format!("data:image/png;base64,{}", base64::engine::general_purpose::STANDARD_NO_PAD.encode(&config.server_icon_bytes)), + "enforcesSecureChat": true }), }); }