commit a15dbf5c632006361368531865491a2e119be146 Author: darkstack <1835601+darkstack@users.noreply.github.com> Date: Mon Mar 24 01:13:30 2025 +0100 Init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..051a993 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2400 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aead" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aes" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" +dependencies = [ + "aes-soft", + "aesni", + "cipher", +] + +[[package]] +name = "aes-gcm" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "aes-soft" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" +dependencies = [ + "cipher", + "opaque-debug", +] + +[[package]] +name = "aesni" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" +dependencies = [ + "cipher", + "opaque-debug", +] + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.3.0", + "futures-lite 2.6.0", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite 2.6.0", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.0", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-std" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 2.6.0", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite 2.6.0", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytes" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "c_vec" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd7a427adc0135366d99db65b36dae9237130997e560ed61118041fb72be6e8" + +[[package]] +name = "cc" +version = "1.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const_fn" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f8a2ca5ac02d09563609681103aada9e1777d54fc57a5acd7a41404f9c93b6e" + +[[package]] +name = "cookie" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" +dependencies = [ + "aes-gcm", + "base64", + "hkdf", + "hmac", + "percent-encoding", + "rand 0.8.5", + "sha2", + "time", + "version_check", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpuid-bool" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-mac" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" +dependencies = [ + "cipher", +] + +[[package]] +name = "curl" +version = "0.4.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9fb4d13a1be2b58f14d60adba57c9834b78c62fd86c3e76a148f732686e9265" +dependencies = [ + "curl-sys", + "libc", + "openssl-probe", + "openssl-sys", + "schannel", + "socket2", + "windows-sys 0.52.0", +] + +[[package]] +name = "curl-sys" +version = "0.4.80+curl-8.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55f7df2eac63200c3ab25bde3b2268ef2ee56af3d238e76d61f01c3c49bff734" +dependencies = [ + "cc", + "libc", + "libnghttp2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", + "windows-sys 0.52.0", +] + +[[package]] +name = "cynic" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c99c59968c8aa7f90d84240ab6ded4d3864125ce36b5b044554542cebc974946" +dependencies = [ + "cynic-proc-macros", + "ref-cast", + "serde", + "serde_json", + "static_assertions", + "surf", + "thiserror", +] + +[[package]] +name = "cynic-codegen" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332695dddff7f260dfda1e97502b6440d443816f576994548b7751494991d2e3" +dependencies = [ + "cynic-parser", + "darling", + "once_cell", + "ouroboros", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 2.0.100", + "thiserror", +] + +[[package]] +name = "cynic-parser" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbb0f21f2f8d3134c2e887a16564c165694231f48b6ae2769193299081ecf662" +dependencies = [ + "indexmap", + "lalrpop-util", + "logos", +] + +[[package]] +name = "cynic-proc-macros" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7880789c425a73aff3ba286b2a9c794f330d4770769a42a1493d6175e4606c1" +dependencies = [ + "cynic-codegen", + "darling", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.100", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "discard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "flume" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bebadab126f8120d410b677ed95eee4ba6eb7c6dd8e34a5ec88a08050e26132" +dependencies = [ + "futures-core", + "futures-sink", + "spinning_top", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand 2.3.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "ghash" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hkdf" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "hmac" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +dependencies = [ + "crypto-mac", + "digest", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes 1.10.1", + "fnv", + "itoa", +] + +[[package]] +name = "http-client" +version = "6.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1947510dc91e2bf586ea5ffb412caad7673264e14bb39fb9078da114a94ce1a5" +dependencies = [ + "async-std", + "async-trait", + "cfg-if", + "http-types", + "isahc", + "log", +] + +[[package]] +name = "http-types" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" +dependencies = [ + "anyhow", + "async-channel 1.9.0", + "async-std", + "base64", + "cookie", + "futures-lite 1.13.0", + "infer", + "pin-project-lite", + "rand 0.7.3", + "serde", + "serde_json", + "serde_qs", + "serde_urlencoded", + "url", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "infer" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "isahc" +version = "0.9.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2948a0ce43e2c2ef11d7edf6816508998d99e13badd1150be0914205df9388a" +dependencies = [ + "bytes 0.5.6", + "crossbeam-utils", + "curl", + "curl-sys", + "flume", + "futures-lite 1.13.0", + "http", + "log", + "once_cell", + "slab", + "sluice", + "tracing", + "tracing-futures", + "url", + "waker-fn", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "ladose-caller" +version = "0.1.0" +dependencies = [ + "async-std", + "cynic", + "cynic-codegen", + "sdl2", + "serde", + "surf", + "toml", +] + +[[package]] +name = "lalrpop-util" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d05b3fe34b8bd562c338db725dfa9beb9451a48f65f129ccb9538b48d2c93b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libnghttp2-sys" +version = "0.1.11+1.64.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6c24e48a7167cffa7119da39d577fa482e66c688a4aac016bee862e1a713c4" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "libz-sys" +version = "1.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +dependencies = [ + "value-bag", +] + +[[package]] +name = "logos" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7251356ef8cb7aec833ddf598c6cb24d17b689d20b993f9d11a3d764e34e6458" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59f80069600c0d66734f5ff52cc42f2dabd6b29d205f333d61fd7832e9e9963f" +dependencies = [ + "beef", + "fnv", + "lazy_static", + "proc-macro2", + "quote", + "regex-syntax", + "syn 2.0.100", +] + +[[package]] +name = "logos-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24fb722b06a9dc12adb0963ed585f19fc61dc5413e6a9be9422ef92c091e731d" +dependencies = [ + "logos-codegen", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "once_cell" +version = "1.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ouroboros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" +dependencies = [ + "heck", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand 2.3.0", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "polyval" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" +dependencies = [ + "cpuid-bool", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "version_check", + "yansi", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdl2" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b498da7d14d1ad6c839729bd4ad6fc11d90a57583605f3b4df2cd709a9cd380" +dependencies = [ + "bitflags 1.3.2", + "c_vec", + "lazy_static", + "libc", + "sdl2-sys", +] + +[[package]] +name = "sdl2-sys" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951deab27af08ed9c6068b7b0d05a93c91f0a8eb16b6b816a5e73452a43521d3" +dependencies = [ + "cfg-if", + "libc", + "version-compare", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_qs" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" +dependencies = [ + "percent-encoding", + "serde", + "thiserror", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +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]] +name = "sha1" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "sluice" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" +dependencies = [ + "async-channel 1.9.0", + "futures-core", + "futures-io", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spinning_top" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9eb1a2f4c41445a3a0ff9abc5221c5fcd28e1f13cd7c0397706f9ac938ddb0" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "standback" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" +dependencies = [ + "version_check", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stdweb" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" +dependencies = [ + "discard", + "rustc_version", + "stdweb-derive", + "stdweb-internal-macros", + "stdweb-internal-runtime", + "wasm-bindgen", +] + +[[package]] +name = "stdweb-derive" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_derive", + "syn 1.0.109", +] + +[[package]] +name = "stdweb-internal-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" +dependencies = [ + "base-x", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "serde_json", + "sha1", + "syn 1.0.109", +] + +[[package]] +name = "stdweb-internal-runtime" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "surf" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718b1ae6b50351982dedff021db0def601677f2120938b070eadb10ba4038dd7" +dependencies = [ + "async-std", + "async-trait", + "cfg-if", + "encoding_rs", + "futures-util", + "getrandom 0.2.15", + "http-client", + "http-types", + "log", + "mime_guess", + "once_cell", + "pin-project-lite", + "serde", + "serde_json", + "web-sys", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "time" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" +dependencies = [ + "const_fn", + "libc", + "standback", + "stdweb", + "time-macros", + "version_check", + "winapi", +] + +[[package]] +name = "time-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" +dependencies = [ + "proc-macro-hack", + "time-macros-impl", +] + +[[package]] +name = "time-macros-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "standback", + "syn 1.0.109", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +dependencies = [ + "memchr", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..eeae482 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "ladose-caller" +version = "0.1.0" +edition = "2024" + +[dependencies] +cynic = { version = "3", features = ["http-surf"] } +surf = "2" +async-std = "1.10" +toml = "0.8.20" +serde = "1.0.219" +[build-dependencies] +cynic-codegen = { version = "3" } + + + +[dependencies.sdl2] +version = "0.37" +default-features = false +features = ["ttf","image","gfx","mixer"] diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..dc6f2ef --- /dev/null +++ b/build.rs @@ -0,0 +1,8 @@ +fn main() { + cynic_codegen::register_schema("startgg") + .from_sdl_file("schemas/startgg.gql") + .unwrap() + .as_default() + .unwrap(); +} + diff --git a/font/achemine_bold.ttf b/font/achemine_bold.ttf new file mode 100644 index 0000000..0aa810e Binary files /dev/null and b/font/achemine_bold.ttf differ diff --git a/font/achemine_italic.ttf b/font/achemine_italic.ttf new file mode 100644 index 0000000..a6fde88 Binary files /dev/null and b/font/achemine_italic.ttf differ diff --git a/font/achemine_regular.ttf b/font/achemine_regular.ttf new file mode 100644 index 0000000..84be0af Binary files /dev/null and b/font/achemine_regular.ttf differ diff --git a/font/vcr.ttf b/font/vcr.ttf new file mode 100644 index 0000000..dcca687 Binary files /dev/null and b/font/vcr.ttf differ diff --git a/schemas/startgg.gql b/schemas/startgg.gql new file mode 100644 index 0000000..1b3b959 --- /dev/null +++ b/schemas/startgg.gql @@ -0,0 +1,2733 @@ +type Query { + """ + Returns the authenticated user + """ + currentUser: User + """ + Returns an entrant given its id + """ + entrant(id: ID!): Entrant + """ + Returns an event given its id or slug + """ + event(id: ID, slug: String): Event + """ + Returns a league given its id or slug + """ + league(id: ID, slug: String): League + """ + Paginated, filterable list of leagues + """ + leagues(query: LeagueQuery!): LeagueConnection + """ + Returns a participant given its id + """ + participant(id: ID!, isAdmin: Boolean): Participant + """ + Returns a phase given its id + """ + phase(id: ID): Phase + """ + Returns a phase group given its id + """ + phaseGroup(id: ID): PhaseGroup + """ + Returns a player given an id + """ + player(id: ID!): Player + """ + Returns a phase seed given its id + """ + seed(id: ID): Seed + """ + Returns a set given its id + """ + set(id: ID!): Set + """ + A shop entity + """ + shop(id: ID, slug: String): Shop + """ + Returns an stream given its id + """ + stream(id: ID!): Streams + """ + Returns all the stream queues for a given tournament + """ + streamQueue(tournamentId: ID!, includePlayerStreams: Boolean): [StreamQueue] + """ + Returns a team given its id + """ + team(id: ID, slug: String, inviteCode: String): Team + """ + Returns a tournament given its id or slug + """ + tournament(id: ID, slug: String): Tournament + """ + Paginated, filterable list of tournaments + """ + tournaments(query: TournamentQuery!): TournamentConnection + """ + Returns a user given a user slug of the form user/abc123, or id + """ + user(id: ID, slug: String): User + """ + Returns a videogame given its id + """ + videogame(id: ID, slug: String): Videogame + """ + Returns paginated list of videogames matching the search criteria. + """ + videogames(query: VideogameQuery!): VideogameConnection +} + +""" +A user +""" +type User { + """ + Authorizations to external services (i.e. Twitch, Twitter) + """ + authorizations(types: [SocialConnectionType]): [ProfileAuthorization] + id: ID + bio: String + """ + Public facing user birthday that respects user publishing settings + """ + birthday: String + """ + Uniquely identifying token for user. Same as the hashed part of the slug + """ + discriminator: String + email: String + """ + Events this user has competed in + """ + events(query: UserEventsPaginationQuery): EventConnection + genderPronoun: String + images(type: String): [Image] + """ + Leagues this user has competed in + """ + leagues(query: UserLeaguesPaginationQuery): LeagueConnection + """ + Public location info for this user + """ + location: Address + """ + Public facing user name that respects user publishing settings + """ + name: String + """ + player for user + """ + player: Player + slug: String + """ + Tournaments this user is organizing or competing in + """ + tournaments(query: UserTournamentsPaginationQuery): TournamentConnection +} + +""" +Represents the name of the third-party social service (e.g Twitter) for OAuth +""" +enum SocialConnectionType { + """ + + """ + TWITTER + """ + + """ + TWITCH + """ + + """ + DISCORD + """ + + """ + MIXER + """ + + """ + XBOX +} + +""" +An OAuth ProfileAuthorization object +""" +type ProfileAuthorization { + id: ID + """ + The id given by the external service + """ + externalId: String + """ + The username given by the external service (including discriminator if discord) + """ + externalUsername: String + stream: Stream + """ + The name of the external service providing this auth i.e. "twitch" + """ + type: AuthorizationType + url: String +} + +""" +A Stream object +""" +type Stream { + id: ID + """ + Whether the stream is currently live. May be slightly delayed. + """ + isOnline: Boolean + """ + The name of the stream + """ + name: String + """ + The name of the external service providing this auth i.e. "twitch" + """ + type: StreamType +} + +""" +Represents the type of stream service +""" +enum StreamType { + """ + + """ + TWITCH + """ + + """ + MIXER + """ + + """ + YOUTUBE +} + +""" +Represents the name of the third-party service (e.g Twitter) for OAuth +""" +enum AuthorizationType { + """ + + """ + TWITTER + """ + + """ + TWITCH + """ + + """ + STEAM + """ + + """ + DISCORD + """ + + """ + XBOX + """ + + """ + EPIC + """ + + """ + BATTLENET + """ + + """ + MIXER +} + +input UserEventsPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: UserEventsPaginationFilter +} + +input UserEventsPaginationFilter { + videogameId: [ID] + eventType: Int + minEntrantCount: Int + maxEntrantCount: Int + location: LocationFilterType + search: PaginationSearchType +} + +input LocationFilterType { + countryCode: String + state: String + city: String +} + +input PaginationSearchType { + fieldsToSearch: [String] + searchString: String +} + +type EventConnection { + pageInfo: PageInfo + nodes: [Event] +} + +type PageInfo { + total: Int + totalPages: Int + page: Int + perPage: Int + sortBy: String + filter: JSON +} + +""" +The `JSON` scalar type represents JSON values as specified by + [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSON + +""" +An event in a tournament +""" +type Event { + id: ID + """ + How long before the event start will the check-in end (in seconds) + """ + checkInBuffer: Int + """ + How long the event check-in will last (in seconds) + """ + checkInDuration: Int + """ + Whether check-in is enabled for this event + """ + checkInEnabled: Boolean + """ + Rough categorization of event tier, denoting relative importance in the competitive scene + """ + competitionTier: Int + """ + When the event was created (unix timestamp) + """ + createdAt: Timestamp + """ + Last date attendees are able to create teams for team events + """ + deckSubmissionDeadline: Timestamp + """ + Maximum number of participants each Entrant can have + """ + entrantSizeMax: Int @deprecated(reason: "Migrate to teamRosterSize") + """ + Minimum number of participants each Entrant can have + """ + entrantSizeMin: Int @deprecated(reason: "Migrate to teamRosterSize") + """ + The entrants that belong to an event, paginated by filter criteria + """ + entrants(query: EventEntrantPageQuery): EntrantConnection + """ + Whether the event has decks + """ + hasDecks: Boolean + """ + Are player tasks enabled for this event + """ + hasTasks: Boolean + images(type: String): [Image] + """ + Whether the event is an online event or not + """ + isOnline: Boolean + league: League + """ + Markdown field for match rules/instructions + """ + matchRulesMarkdown: String + """ + Title of event set by organizer + """ + name: String + """ + Gets the number of entrants in this event + """ + numEntrants: Int + """ + The phase groups that belong to an event. + """ + phaseGroups: [PhaseGroup] + """ + The phases that belong to an event. + """ + phases( + """ + Filter phases by state. If not specified will default to all phases + """ + state: ActivityState + """ + Optionally only return results for this phase + """ + phaseId: ID + ): [Phase] + """ + TO settings for prizing + """ + prizingInfo: JSON + publishing: JSON + """ + Markdown field for event rules/instructions + """ + rulesMarkdown: String + """ + Id of the event ruleset + """ + rulesetId: Int + """ + Settings pulled from the event ruleset, if one exists + """ + rulesetSettings: JSON @deprecated(reason: "Use ruleset") + """ + Paginated sets for this Event + """ + sets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + slug: String + """ + Paginated list of standings + """ + standings(query: StandingPaginationQuery!): StandingConnection + """ + When does this event start? + """ + startAt: Timestamp + """ + The state of the Event. + """ + state: ActivityState + """ + Paginated stations on this event + """ + stations(query: StationFilter): StationsConnection + """ + Last date attendees are able to create teams for team events + """ + teamManagementDeadline: Timestamp + """ + If this is a teams event, returns whether or not teams can set custom names + """ + teamNameAllowed: Boolean + """ + Team roster size requirements + """ + teamRosterSize: TeamRosterSize + tournament: Tournament + """ + The type of the event, whether an entrant will have one participant or multiple + """ + type: Int + """ + When the event was last modified (unix timestamp) + """ + updatedAt: Timestamp + """ + Whether the event uses the new EventSeeds for seeding + """ + useEventSeeds: Boolean + """ + The entrant (if applicable) for a given user in this event + """ + userEntrant( + """ + User to get entrant for. Defaults to currently logged in user. + """ + userId: ID + ): Entrant + videogame: Videogame + """ + The waves being used by the event + """ + waves( + """ + Waves filtered by phaseId, returns all if not set. + """ + phaseId: ID + ): [Wave] +} + +""" +Represents a Unix Timestamp. Supports up to 53 bit int values, + as that is JavaScript's internal memory allocation for integer values. +""" +scalar Timestamp + +input EventEntrantPageQuery { + page: Int + perPage: Int + sortBy: String + filter: EventEntrantPageQueryFilter +} + +input EventEntrantPageQueryFilter { + name: String +} + +type EntrantConnection { + pageInfo: PageInfo + nodes: [Entrant] +} + +""" +An entrant in an event +""" +type Entrant { + id: ID + event: Event + """ + Entrant's seed number in the first phase of the event. + """ + initialSeedNum: Int + isDisqualified: Boolean + """ + The entrant name as it appears in bracket: gamerTag of the participant or team name + """ + name: String + """ + Paginated sets for this entrant + """ + paginatedSets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + participants: [Participant] + seeds: [Seed] + skill: Int + """ + Standing for this entrant given an event. All entrants queried must be in the same event (for now). + """ + standing: Standing + stream: Streams @deprecated(reason: "DEPRECATED. Use streams instead, which supports multiple stream types and teams.") + streams: [Streams] + """ + Team linked to this entrant, if one exists + """ + team: Team +} + +""" +Different sort type configurations used when displaying multiple sets +""" +enum SetSortType { + """ + Sets will not be sorted. + """ + NONE + """ + Sets are sorted in the suggested order that they be called to be played. The order of completed sets is reversed. + """ + CALL_ORDER + """ + Sets are sorted by relevancy dependent on the state and progress of the event. + """ + MAGIC + """ + Sets are sorted in the order that they were started. + """ + RECENT + """ + Deprecated. This is equivalent to CALL_ORDER + """ + STANDARD + """ + Sets sorted by round and identifier + """ + ROUND +} + +input SetFilters { + """ + Only return Sets for these Entrants + """ + entrantIds: [ID] + """ + Only return Sets for this Entrant size. For example, to fetch 1v1 Sets only, filter by an entrantSize of 1 + """ + entrantSize: [Int] + """ + Only return Sets that have an attached VOD + """ + hasVod: Boolean + """ + Do not return empty Sets. For example, set this to true to filter out sets that are waiting for progressions. + """ + hideEmpty: Boolean + """ + Return sets that contain a bye + """ + showByes: Boolean + """ + Only return Sets that are in an Online event. If omitted, Sets for both online and offline Events are returned + """ + isEventOnline: Boolean + """ + Only return Sets in certain geographical areas. + """ + location: SetFilterLocation + """ + Only return Sets for these Participants + """ + participantIds: [ID] + """ + Only return Sets in these PhaseGroups + """ + phaseGroupIds: [ID] + """ + Only return Sets in these Phases + """ + phaseIds: [ID] + """ + Only return Sets in these Events + """ + eventIds: [ID] + """ + Only return Sets in these Tournaments + """ + tournamentIds: [ID] + """ + Only return Sets for these Players + """ + playerIds: [ID] + """ + Only return Sets for these Rounds + """ + roundNumber: Int + """ + Only returns Sets that are in these states + """ + state: [Int] + """ + Only return Sets that are assigned to these Station IDs + """ + stationIds: [ID] + """ + Only return Sets that are assigned to these Station numbers + """ + stationNumbers: [Int] + """ + Only return sets created or updated since this timestamp + """ + updatedAfter: Timestamp +} + +""" +Filter Sets by geographical constraints. +""" +input SetFilterLocation { + """ + Only return Sets in this state. Only applicable to US states + """ + state: String + """ + Only return Sets in this country. Expects a valid two-letter country code + """ + country: String + distanceFrom: SetFilterLocationDistanceFrom +} + +""" +Only return Sets that are a certain distance away from a specified point +""" +input SetFilterLocationDistanceFrom { + """ + Point at which to perform distance calculation + """ + point: SetFilterLocationDistanceFromPoint + """ + Distance from the point to include results in + """ + radius: String +} + +input SetFilterLocationDistanceFromPoint { + lat: Float + lon: Float +} + +type SetConnection { + pageInfo: PageInfo + nodes: [Set] +} + +""" +A set +""" +type Set { + id: ID + """ + The time this set was marked as completed + """ + completedAt: Timestamp + """ + The time this set was created + """ + createdAt: Timestamp + displayScore(mainEntrantId: ID): String + """ + Event that this set belongs to. + """ + event: Event + """ + Full round text of this set. + """ + fullRoundText: String + game(orderNum: Int!): Game + games: [Game] + """ + Whether this set contains a placeholder entrant + """ + hasPlaceholder: Boolean + """ + The letters that describe a unique identifier within the pool. Eg. F, AT + """ + identifier: String + images(type: String): [Image] + lPlacement: Int + """ + Phase group that this Set belongs to. + """ + phaseGroup: PhaseGroup + """ + The sets that are affected from resetting this set + """ + resetAffectedData: ResetAffectedData + """ + The round number of the set. Negative numbers are losers bracket + """ + round: Int + """ + Indicates whether the set is in best of or total games mode. This instructs + which field is used to figure out how many games are in this set. + """ + setGamesType: Int + """ + A possible spot in a set. Use this to get all entrants in a set. Use this for all bracket types (FFA, elimination, etc) + """ + slots(includeByes: Boolean = false): [SetSlot] + """ + The start time of the Set. If there is no startAt time on the Set, will pull it from phaseGroup rounds configuration. + """ + startAt: Timestamp + startedAt: Timestamp + state: Int + """ + Tournament event station for a set + """ + station: Stations + """ + Tournament event stream for a set + """ + stream: Streams + """ + If setGamesType is in total games mode, this defined the number of games in the set. + """ + totalGames: Int + """ + Url of a VOD for this set + """ + vodUrl: String + wPlacement: Int + winnerId: Int +} + +""" +A game represents a single game within a set. +""" +type Game { + id: ID + """ + Score of entrant 1. For smash, this is equivalent to stocks remaining. + """ + entrant1Score: Int + """ + Score of entrant 2. For smash, this is equivalent to stocks remaining. + """ + entrant2Score: Int + images(type: String): [Image] + orderNum: Int + """ + Selections for this game such as character, etc. + """ + selections: [GameSelection] + """ + The stage that this game was played on (if applicable) + """ + stage: Stage + state: Int + winnerId: Int +} + +""" +An image +""" +type Image { + id: ID + height: Float + ratio: Float + type: String + url: String + width: Float +} + +""" +A selection for this game. i.e. character/stage selection, etc +""" +type GameSelection { + """ + If this is a character selection, returns the selected character. + """ + character: Character + id: ID + """ + The entrant who this selection is for + """ + entrant: Entrant + orderNum: Int + """ + The participant who this selection is for. This is only populated if there are + selections for multiple participants of a single entrant + """ + participant: Participant + selectionType: GameSelectionType + selectionValue: Int +} + +""" +A character in a videogame +""" +type Character { + id: ID + images(type: String): [Image] + """ + Name of Character + """ + name: String +} + +""" +A participant of a tournament; either a spectator or competitor +""" +type Participant { + id: ID + """ + If this participant was checked-in by admin + """ + checkedIn: Boolean + """ + The time this participant was checked-in by admin + """ + checkedInAt: Timestamp + """ + Info for connected accounts to external services. + """ + connectedAccounts: JSON + """ + Contact Info selected during registration. Falls back to User.location and/or + User.name if necessary. These fields are for admin use only. If you are not a + tournament admin or the participant being queried, these fields will be null. + Do not display this information publicly. + """ + contactInfo: ContactInfo + """ + Email of the user, only available to admins within 18 months of tournament completion for tournament administrators. + """ + email: String + """ + Entrants associated with this Participant, if applicable + """ + entrants: [Entrant] + """ + The events this participant registered for within a Tournament. + """ + events: [Event] + """ + The tag that was used when the participant registered, e.g. Mang0 + """ + gamerTag: String + images(type: String): [Image] + player: Player + """ + The prefix that the user set for this Tournament, e.g. C9 + """ + prefix: String + """ + Tournament Admin viewable field. Shows details for required social connections + """ + requiredConnections: [ProfileAuthorization] + """ + The user this participant is associated to. + """ + user: User + """ + If this participant is verified as actually being in the tournament + """ + verified: Boolean +} + +""" +Name, address, etc +""" +type ContactInfo { + id: ID + """ + Participant City Name + """ + city: String + """ + Participant Country Name + """ + country: String + """ + Participant Country (region) id + """ + countryId: Int + name: String + """ + First Name + """ + nameFirst: String + """ + Last Name + """ + nameLast: String + """ + Participant State Name + """ + state: String + """ + Participant State (region) id + """ + stateId: Int + """ + Zip or Postal Code + """ + zipcode: String +} + +""" +A player +""" +type Player { + id: ID + gamerTag: String + prefix: String + """ + Most recent active & published rankings + """ + rankings(limit: Int, videogameId: ID): [PlayerRank] + """ + Recent sets for this player. + """ + recentSets( + """ + Use this to get H2H history between two players + """ + opponentId: ID + ): [Set] @deprecated(reason: "Use the sets field instead.") + """ + Recent standings + """ + recentStandings( + videogameId: ID + """ + Number of recent standings to fetch. Default value is 3. Maximum value is 20. + """ + limit: Int + ): [Standing] + """ + Set history for this player. + """ + sets( + page: Int + perPage: Int + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + user: User +} + +""" +A player's ranks +""" +type PlayerRank { + id: ID + """ + The player's placement on the ranking + """ + rank: Int + title: String +} + +""" +A standing indicates the placement of something within a container. +""" +type Standing { + id: ID + """ + The containing entity that contextualizes this standing. Event standings, for + example, represent an entrant's standing in the entire event vs. Set standings + which is an entrant's standing in only a single set within an event. + """ + container: StandingContainer + """ + If the entity this standing is assigned to can be resolved into an entrant, this will provide the entrant. + """ + entrant: Entrant + isFinal: Boolean + """ + Metadata that goes along with this standing. Can take on different forms based on standing group type and settings. + """ + metadata: JSON + placement: Int + """ + The player(s) tied to this standing's entity + """ + player: Player + standing: Int @deprecated(reason: "The \"placement\" field is identical and will eventually replace \"standing\"") + stats: StandingStats + totalPoints: Float +} + +""" +The containing entity that this standing is for +""" +union StandingContainer = Tournament | Event | PhaseGroup | Set + +""" +A tournament +""" +type Tournament { + id: ID + addrState: String + """ + Admin-only view of admins for this tournament + """ + admins( + """ + Which roles to show + """ + roles: [String] + ): [User] + city: String + countryCode: String + """ + When the tournament was created (unix timestamp) + """ + createdAt: Timestamp + currency: String + """ + When the tournament ends + """ + endAt: Timestamp + """ + When does event registration close + """ + eventRegistrationClosesAt: Timestamp + events(limit: Int, filter: EventFilter): [Event] + """ + True if tournament has at least one offline event + """ + hasOfflineEvents: Boolean + hasOnlineEvents: Boolean + hashtag: String + images(type: String): [Image] + """ + True if tournament has at least one online event + """ + isOnline: Boolean + """ + Is tournament registration open + """ + isRegistrationOpen: Boolean + lat: Float + links: TournamentLinks + lng: Float + mapsPlaceId: String + """ + The tournament name + """ + name: String + """ + Number of attendees including spectators, if public + """ + numAttendees: Int + """ + The user who created the tournament + """ + owner: User + """ + Paginated, queryable list of participants + """ + participants(query: ParticipantPaginationQuery!, isAdmin: Boolean): ParticipantConnection + postalCode: String + primaryContact: String + primaryContactType: String + """ + Publishing settings for this tournament + """ + publishing: JSON + """ + When does registration for the tournament end + """ + registrationClosesAt: Timestamp + rules: String + """ + The short slug used to form the url + """ + shortSlug: String + """ + The slug used to form the url + """ + slug: String + """ + When the tournament Starts + """ + startAt: Timestamp + """ + State of the tournament, can be ActivityState::CREATED, ActivityState::ACTIVE, or ActivityState::COMPLETED + """ + state: Int + stations(page: Int, perPage: Int): StationsConnection + streamQueue: [StreamQueue] + streams: [Streams] + """ + When is the team creation deadline + """ + teamCreationClosesAt: Timestamp + """ + Paginated, queryable list of teams + """ + teams(query: TeamPaginationQuery!): TeamConnection + """ + The timezone of the tournament + """ + timezone: String + """ + The type of tournament from TournamentType + """ + tournamentType: Int + """ + When the tournament was last modified (unix timestamp) + """ + updatedAt: Timestamp + """ + Build Tournament URL + """ + url( + """ + Tournament tab to add to URL + """ + tab: String + """ + Generate a relative URL. Defaults to true. Setting to false will generate an absolute URL + """ + relative: Boolean = true + ): String + venueAddress: String + venueName: String + """ + List of all waves in this tournament + """ + waves: [Wave] +} + +input EventFilter { + videogameId: [ID] + type: [Int] + published: Boolean + id: ID + ids: [ID] + slug: String + fantasyEventId: ID + fantasyRosterHash: String +} + +type TournamentLinks { + facebook: String + discord: String +} + +input ParticipantPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: ParticipantPageFilter +} + +input ParticipantPageFilter { + id: ID + ids: [ID] + eventIds: [ID] + search: PaginationSearchType + gamerTag: String + unpaid: Boolean + incompleteTeam: Boolean + missingDeck: Boolean + checkedIn: Boolean + notCheckedIn: Boolean +} + +type ParticipantConnection { + pageInfo: PageInfo + nodes: [Participant] +} + +type StationsConnection { + pageInfo: PageInfo + nodes: [Stations] +} + +""" +Stations, such as a stream setup, at an event +""" +type Stations { + id: ID + canAutoAssign: Boolean + clusterNumber: String + clusterPrefix: Int + enabled: Boolean + identifier: Int + numSetups: Int + number: Int + prefix: String + queue: JSON + queueDepth: Int + state: Int + updatedAt: Timestamp +} + +""" +A Stream queue object +""" +type StreamQueue { + id: String + """ + The sets on the stream + """ + sets: [Set] + """ + The stream on the queue + """ + stream: Streams +} + +""" +Tournament Stream +""" +type Streams { + id: ID + enabled: Boolean + followerCount: Int + isOnline: Boolean + numSetups: Int + parentStreamId: Int + streamGame: String + streamId: String + streamLogo: String + streamName: String + streamSource: StreamSource + streamStatus: String + streamType: Int + streamTypeId: Int +} + +""" +Represents the source of a stream +""" +enum StreamSource { + """ + Stream is on twitch.tv channel + """ + TWITCH + """ + Stream is on smashcast.tv channel + """ + HITBOX + """ + Stream is on a stream.me channel + """ + STREAMME + """ + Stream is on a mixer.com channel + """ + MIXER + """ + Stream is on a youtube.com channel + """ + YOUTUBE +} + +input TeamPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: TeamPaginationFilter +} + +input TeamPaginationFilter { + globalTeamId: ID + eventState: ActivityState + eventId: ID + eventIds: [ID] + minEntrantCount: Int + maxEntrantCount: Int + search: PaginationSearchType + type: Int + tournamentId: ID + memberStatus: [TeamMemberStatus] + videogameId: [ID] + isLeague: Boolean + upcoming: Boolean + past: Boolean + rosterComplete: Boolean + rosterIncomplete: Boolean +} + +""" +Represents the state of an activity +""" +enum ActivityState { + """ + Activity is created + """ + CREATED + """ + Activity is active or in progress + """ + ACTIVE + """ + Activity is done + """ + COMPLETED + """ + Activity is ready to be started + """ + READY + """ + Activity is invalid + """ + INVALID + """ + Activity, like a set, has been called to start + """ + CALLED + """ + Activity is queued to run + """ + QUEUED +} + +""" +Membership status of a team member +""" +enum TeamMemberStatus { + """ + + """ + UNKNOWN + """ + + """ + ACCEPTED + """ + + """ + INVITED + """ + + """ + REQUEST + """ + + """ + ALUM + """ + + """ + HIATUS + """ + + """ + OPEN_SPOT +} + +type TeamConnection { + pageInfo: PageInfo + nodes: [Team] +} + +""" +A team, either at the global level or within the context of an event +""" +interface Team { + id: ID + """ + Uniquely identifying token for team. Same as the hashed part of the slug + """ + discriminator: String + entrant: Entrant @deprecated(reason: "Use the entrant field off the EventTeam type") + event: Event @deprecated(reason: "Use the event field off the EventTeam type") + images(type: String): [Image] + members(status: [TeamMemberStatus]): [TeamMember] + name: String +} + +""" +A member of a team +""" +type TeamMember { + id: ID + isAlternate: Boolean + isCaptain: Boolean + """ + The type of the team member + """ + memberType: TeamMemberType + participant: Participant + player: Player + """ + The status of the team member + """ + status: TeamMemberStatus +} + +""" +Membership type of a team member +""" +enum TeamMemberType { + """ + + """ + PLAYER + """ + + """ + STAFF +} + +""" +A wave in a tournament +""" +type Wave { + id: ID + """ + The Wave Identifier + """ + identifier: String + """ + Unix time the wave is scheduled to start. + """ + startAt: Timestamp +} + +""" +A group within a phase +""" +type PhaseGroup { + id: ID + """ + The bracket type of this group's phase. + """ + bracketType: BracketType + """ + URL for this phase groups's bracket. + """ + bracketUrl: String + """ + Unique identifier for this group within the context of its phase + """ + displayIdentifier: String + """ + For the given phase group, this is the start time of the first round that occurs in the group. + """ + firstRoundTime: Timestamp + numRounds: Int + paginatedSeeds(query: SeedPaginationQuery!, eventId: ID): SeedConnection @deprecated(reason: "Please use 'seeds', which is now paginated") + """ + Paginated sets on this phaseGroup + """ + paginatedSets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection @deprecated(reason: "Please use 'sets', which is now paginated") + """ + The phase associated with this phase group + """ + phase: Phase + """ + The progressions out of this phase group + """ + progressionsOut: [Progression] + rounds: [Round] + seedMap: JSON + """ + Paginated seeds for this phase group + """ + seeds(query: SeedPaginationQuery!, eventId: ID): SeedConnection + """ + Paginated sets on this phaseGroup + """ + sets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + """ + Paginated list of standings + """ + standings(query: StandingGroupStandingPageFilter): StandingConnection + """ + Unix time the group is scheduled to start. This info could also be on the wave instead. + """ + startAt: Timestamp + state: Int + tiebreakOrder: JSON + wave: Wave +} + +""" +The type of Bracket format that a Phase is configured with. +""" +enum BracketType { + """ + + """ + SINGLE_ELIMINATION + """ + + """ + DOUBLE_ELIMINATION + """ + + """ + ROUND_ROBIN + """ + + """ + SWISS + """ + + """ + EXHIBITION + """ + + """ + CUSTOM_SCHEDULE + """ + + """ + MATCHMAKING + """ + + """ + ELIMINATION_ROUNDS + """ + + """ + RACE + """ + + """ + CIRCUIT +} + +input SeedPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: SeedPageFilter +} + +input SeedPageFilter { + id: ID + entrantName: String + checkInState: [Int] + phaseGroupId: [ID] + eventCheckInGroupId: ID + phaseId: [ID] + eventId: ID + search: PaginationSearchType +} + +type SeedConnection { + pageInfo: PageInfo + nodes: [Seed] +} + +""" +A seed for an entrant +""" +type Seed { + id: ID + """ + Map of Participant ID to checked in boolean + """ + checkedInParticipants: JSON + entrant: Entrant + groupSeedNum: Int + isBye: Boolean + phase: Phase + phaseGroup: PhaseGroup + placeholderName: String + placement: Int + """ + The player(s) associated with this seed's entrant + """ + players: [Player] + progressionSeedId: Int + """ + Source progression information + """ + progressionSource: Progression + seedNum: Int + """ + Entrant's win/loss record for this standing. Scores do not include byes. + """ + setRecordWithoutByes(phaseGroupId: ID!): JSON + standings( + """ + The container of the standing groups to get standings for. If null, will return all standings. + """ + containerType: String + ): [Standing] +} + +""" +A phase in an event +""" +type Phase { + id: ID + """ + The bracket type of this phase. + """ + bracketType: BracketType + """ + The Event that this phase belongs to + """ + event: Event + """ + Number of phase groups in this phase + """ + groupCount: Int + """ + Is the phase an exhibition or not. + """ + isExhibition: Boolean + """ + Name of phase e.g. Round 1 Pools + """ + name: String + """ + The number of seeds this phase contains. + """ + numSeeds: Int + paginatedSeeds(query: SeedPaginationQuery!, eventId: ID): SeedConnection @deprecated(reason: "Please use 'seeds' instead") + """ + Phase groups under this phase, paginated + """ + phaseGroups(query: PhaseGroupPageQuery): PhaseGroupConnection + """ + The relative order of this phase within an event + """ + phaseOrder: Int + """ + Paginated seeds for this phase + """ + seeds(query: SeedPaginationQuery!, eventId: ID): SeedConnection + """ + Paginated sets for this Phase + """ + sets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + """ + State of the phase + """ + state: ActivityState + waves: [Wave] +} + +input PhaseGroupPageQuery { + page: Int + perPage: Int + sortBy: String + entrantIds: [ID] + filter: PhaseGroupPageQueryFilter +} + +input PhaseGroupPageQueryFilter { + id: [ID] + waveId: ID +} + +type PhaseGroupConnection { + pageInfo: PageInfo + nodes: [PhaseGroup] +} + +""" +A connection between a placement in an origin phase group to a destination seed. +""" +type Progression { + id: ID + originOrder: Int + originPhase: Phase + originPhaseGroup: PhaseGroup + originPlacement: Int +} + +""" +A round within a phase group +""" +type Round { + id: ID + """ + If applicable, bestOf is the number of games + one must win a majority out of to win a set in this round + """ + bestOf: Int + """ + Indicates this round's order in the phase group + """ + number: Int + """ + The time that this round is scheduled to start at + """ + startAt: Timestamp +} + +input StandingGroupStandingPageFilter { + page: Int + perPage: Int + sortBy: String +} + +type StandingConnection { + pageInfo: PageInfo + nodes: [Standing] +} + +""" +Any stats related to this standing. This type is experimental and very likely to change in the future. +""" +type StandingStats { + score: Score +} + +""" +The score that led to this standing being awarded. The meaning of this field can +vary by standing type and is not used for some standing types. +""" +type Score { + """ + The name of this score. e.g. "Kills" or "Stocks" + """ + label: String + """ + The raw score value + """ + value: Float + """ + Like value, but formatted for race format events. Formatted according to the race config for the front end to use. + """ + displayValue: String +} + +""" +The type of selection i.e. is it for a character or something else +""" +enum GameSelectionType { + """ + Character selection + """ + CHARACTER +} + +""" +Video Stage +""" +type Stage { + id: ID + """ + Stage name + """ + name: String +} + +type ResetAffectedData { + affectedSetCount: Int + affectedSets: [Set] + affectedPhaseGroupCount: Int +} + +""" +A slot in a set where a seed currently or will eventually exist in order to participate in the set. +""" +type SetSlot { + id: ID + entrant: Entrant + """ + Pairs with prereqType, is the ID of the prereq. + """ + prereqId: String + """ + Given a set prereq type, defines the placement required in the origin set to end up in this slot. + """ + prereqPlacement: Int + """ + Describes where the entity in this slot comes from. + """ + prereqType: String + seed: Seed + """ + The index of the slot. Unique per set. + """ + slotIndex: Int + """ + The standing within this set for the seed currently assigned to this slot. + """ + standing: Standing +} + +""" +A league +""" +type League { + id: ID + addrState: String + city: String + countryCode: String + """ + When the tournament was created (unix timestamp) + """ + createdAt: Timestamp + currency: String + """ + When the tournament ends + """ + endAt: Timestamp + entrantCount: Int + eventOwners(query: EventOwnersQuery): EventOwnerConnection + """ + When does event registration close + """ + eventRegistrationClosesAt: Timestamp + """ + Paginated list of events in a league + """ + events(query: LeagueEventsQuery): EventConnection + """ + Hacked "progression" into this final event + """ + finalEventId: Int @deprecated(reason: "No longer used") + """ + True if tournament has at least one offline event + """ + hasOfflineEvents: Boolean + hasOnlineEvents: Boolean + hashtag: String + images(type: String): [Image] + """ + True if tournament has at least one online event + """ + isOnline: Boolean + lat: Float + links: TournamentLinks + lng: Float + mapsPlaceId: String + """ + The tournament name + """ + name: String + """ + Top X number of people in the standings who progress to final event + """ + numProgressingToFinalEvent: Int @deprecated(reason: "No longer used") + numUniquePlayers: Int + postalCode: String + primaryContact: String + primaryContactType: String + """ + Publishing settings for this tournament + """ + publishing: JSON + """ + When does registration for the tournament end + """ + registrationClosesAt: Timestamp + rules: String + """ + The short slug used to form the url + """ + shortSlug: String + """ + Whether standings for this league should be visible + """ + showStandings: Boolean + slug: String + """ + Paginated list of standings + """ + standings(query: StandingGroupStandingPageFilter): StandingConnection + """ + When the tournament Starts + """ + startAt: Timestamp + """ + State of the tournament, can be ActivityState::CREATED, ActivityState::ACTIVE, or ActivityState::COMPLETED + """ + state: Int + """ + When is the team creation deadline + """ + teamCreationClosesAt: Timestamp + tiers: [EventTier] + """ + The timezone of the tournament + """ + timezone: String + """ + The type of tournament from TournamentType + """ + tournamentType: Int + """ + When the tournament was last modified (unix timestamp) + """ + updatedAt: Timestamp + """ + Build Tournament URL + """ + url( + """ + Tournament tab to add to URL + """ + tab: String + """ + Generate a relative URL. Defaults to true. Setting to false will generate an absolute URL + """ + relative: Boolean = true + ): String + venueAddress: String + venueName: String + videogames: [Videogame] +} + +input EventOwnersQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String +} + +type EventOwnerConnection { + pageInfo: PageInfo + nodes: [EventOwner] +} + +""" +Name and Gamertag of the owner of an event in a league +""" +type EventOwner { + eventId: ID + email: String + gamerTag: String + fullName: String +} + +input LeagueEventsQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: LeagueEventsFilter +} + +input LeagueEventsFilter { + search: PaginationSearchType + pointMappingGroupIds: [ID] + tierIds: [ID] + userId: ID + upcoming: Boolean + leagueEntrantId: ID +} + +""" +Used for league application tiers +""" +type EventTier { + id: ID + """ + Name of this tier + """ + name: String +} + +""" +A videogame +""" +type Videogame { + id: ID + """ + All characters for this videogame + """ + characters: [Character] + displayName: String + images(type: String): [Image] + name: String + slug: String + """ + All stages for this videogame + """ + stages: [Stage] +} + +input StandingPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: StandingPageFilter +} + +input StandingPageFilter { + id: ID + ids: [ID] + search: PaginationSearchType +} + +input StationFilter { + page: Int + perPage: Int +} + +""" +Team roster size requirements +""" +type TeamRosterSize { + maxAlternates: Int + maxPlayers: Int + minAlternates: Int + minPlayers: Int +} + +input UserLeaguesPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: UserLeaguesPaginationFilter +} + +input UserLeaguesPaginationFilter { + videogameId: [ID] + upcoming: Boolean + past: Boolean + search: PaginationSearchType +} + +type LeagueConnection { + pageInfo: PageInfo + nodes: [League] +} + +""" +A user's address +""" +type Address { + id: ID + city: String + country: String + countryId: Int + state: String + stateId: Int +} + +input UserTournamentsPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: UserTournamentsPaginationFilter +} + +input UserTournamentsPaginationFilter { + past: Boolean + upcoming: Boolean + search: PaginationSearchType + videogameId: [ID] + tournamentView: String + excludeId: [ID] +} + +type TournamentConnection { + pageInfo: PageInfo + nodes: [Tournament] +} + +input LeagueQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: LeaguePageFilter + sort: TournamentPaginationSort +} + +input LeaguePageFilter { + id: ID + ids: [ID] + """ + ID of the user that owns this league. + """ + ownerId: ID + afterDate: Timestamp + beforeDate: Timestamp + computedUpdatedAt: Timestamp + name: String + isFeatured: Boolean + hasBannerImages: Boolean + activeShops: Boolean + past: Boolean + published: Boolean + publiclySearchable: Boolean + upcoming: Boolean + videogameIds: [ID] +} + +enum TournamentPaginationSort { + """ + + """ + startAt + """ + + """ + endAt + """ + + """ + eventRegistrationClosesAt + """ + + """ + computedUpdatedAt +} + +""" +A shop +""" +type Shop { + id: ID + levels(query: ShopLevelsQuery): ShopLevelConnection + messages(query: ShopOrderMessagesQuery): ShopOrderMessageConnection + name: String + slug: String + url: String +} + +input ShopLevelsQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String +} + +type ShopLevelConnection { + pageInfo: PageInfo + nodes: [ShopLevel] +} + +""" +A shop level +""" +type ShopLevel { + id: ID + currAmount: Float + description: String + goalAmount: Float + images(type: String): [Image] + name: String +} + +input ShopOrderMessagesQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String +} + +type ShopOrderMessageConnection { + pageInfo: PageInfo + nodes: [ShopOrderMessage] +} + +""" +The message and player info for a shop order +""" +type ShopOrderMessage { + id: ID + """ + The player's gamertag. Returns null if anonymous message type + """ + gamertag: String + """ + The order message + """ + message: String + """ + The player's name. Returns null unless name & tag display is selected + """ + name: String + """ + The player who left the comment + """ + player: Player + """ + The total order amount + """ + total: Float +} + +input TournamentQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: TournamentPageFilter + sort: TournamentPaginationSort +} + +input TournamentPageFilter { + id: ID + ids: [ID] + """ + ID of the user that owns this tournament. + """ + ownerId: ID + """ + If true, filter to only tournaments the currently authed user is an admin of + """ + isCurrentUserAdmin: Boolean + countryCode: String + addrState: String + location: TournamentLocationFilter + afterDate: Timestamp + beforeDate: Timestamp + computedUpdatedAt: Timestamp + name: String + venueName: String + isFeatured: Boolean + isLeague: Boolean + hasBannerImages: Boolean + activeShops: Boolean + regOpen: Boolean + past: Boolean + published: Boolean + publiclySearchable: Boolean + staffPicks: Boolean + hasOnlineEvents: Boolean + topGames: TopGameFilter + upcoming: Boolean + videogameIds: [ID] + sortByScore: Boolean +} + +input TournamentLocationFilter { + """ + Latitude, Longitude + """ + distanceFrom: String + """ + e.g. 50mi + """ + distance: String +} + +input TopGameFilter { + """ + Array of which # top game you want to filter on.e.g. [2, 3] will filter on the 2nd and 3rd top games + """ + gameNums: [Int] +} + +input VideogameQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: VideogamePageFilter +} + +input VideogamePageFilter { + id: [ID] + name: String + forUser: ID +} + +type VideogameConnection { + pageInfo: PageInfo + nodes: [Videogame] +} + +type Mutation { + """ + Delete a phase by id + """ + deletePhase(phaseId: ID!): Boolean + """ + Delete a station by id + """ + deleteStation(stationId: ID!): Boolean + """ + Delete a wave by id + """ + deleteWave(waveId: ID!): Boolean + """ + Generate tournament registration Token on behalf of user + """ + generateRegistrationToken(registration: TournamentRegistrationInput!, userId: ID!): String + """ + Update a set to called state + """ + markSetCalled(setId: ID!): Set + """ + Update a set to called state + """ + markSetInProgress(setId: ID!): Set + """ + Register for tournament + """ + registerForTournament(registration: TournamentRegistrationInput, registrationToken: String): Participant + """ + Report set winner or game stats for a H2H bracket set. If winnerId is + supplied, mark set as complete. gameData parameter will overwrite any existing + reported game data. + """ + reportBracketSet(setId: ID!, winnerId: ID, isDQ: Boolean, gameData: [BracketSetGameDataInput]): [Set] + """ + Resets set to initial state, can affect other sets and phase groups + """ + resetSet(setId: ID!, resetDependentSets: Boolean): Set + """ + Automatically attempt to resolve all schedule conflicts. Returns a list of changed seeds + """ + resolveScheduleConflicts(tournamentId: ID!, options: ResolveConflictsOptions): [Seed] + """ + Swap two seed ids in a phase + """ + swapSeeds(phaseId: ID!, seed1Id: ID!, seed2Id: ID!): [Seed] + """ + Update game stats for a H2H bracket set. Set winner cannot be changed with + this function, use the resetSet mutation instead. + """ + updateBracketSet(setId: ID!, winnerId: ID, isDQ: Boolean, gameData: [BracketSetGameDataInput]): Set + """ + Update set of phase groups in a phase + """ + updatePhaseGroups(groupConfigs: [PhaseGroupUpdateInput]!): [PhaseGroup] + """ + Update the seeding for a phase + """ + updatePhaseSeeding(phaseId: ID!, seedMapping: [UpdatePhaseSeedInfo]!, options: UpdatePhaseSeedingOptions): Phase + """ + Create or update a Phase + """ + upsertPhase(phaseId: ID, eventId: ID, payload: PhaseUpsertInput!): Phase + """ + Add or update a station by id + """ + upsertStation(stationId: ID, tournamentId: ID, fields: StationUpsertInput!): Stations + """ + Add or update a wave by id + """ + upsertWave(waveId: ID, tournamentId: ID, fields: WaveUpsertInput!): Wave +} + +input TournamentRegistrationInput { + eventIds: [ID] +} + +""" +Game specific H2H set data such as character, stage, and stock info +""" +input BracketSetGameDataInput { + """ + Entrant ID of game winner + """ + winnerId: ID + """ + Game number + """ + gameNum: Int! + """ + Score for entrant 1 (if applicable). For smash, this is stocks remaining. + """ + entrant1Score: Int + """ + Score for entrant 2 (if applicable). For smash, this is stocks remaining. + """ + entrant2Score: Int + """ + ID of the stage that was played for this game (if applicable) + """ + stageId: ID + """ + List of selections for the game, typically character selections. + """ + selections: [BracketSetGameSelectionInput] +} + +""" +Game specific H2H selections made by the entrants, such as character info +""" +input BracketSetGameSelectionInput { + """ + Entrant ID that made selection + """ + entrantId: ID! + """ + Character selected by this entrant for this game. + """ + characterId: Int +} + +input ResolveConflictsOptions { + lockedSeeds: [ResolveConflictsLockedSeedConfig] +} + +input ResolveConflictsLockedSeedConfig { + eventId: ID! + numSeeds: Int! +} + +input PhaseGroupUpdateInput { + phaseGroupId: ID! + stationId: ID + waveId: ID +} + +input UpdatePhaseSeedInfo { + seedId: ID! + seedNum: ID! + phaseGroupId: ID +} + +input UpdatePhaseSeedingOptions { + """ + Validate that seedMapping exactly accounts for all entrants in the phase + """ + strictMode: Boolean +} + +input PhaseUpsertInput { + """ + The name of the Phase. For example, "Top 8" or "Pools" + """ + name: String + """ + The number of pools to configure for the Phase. Only applies to brackets that support pools + """ + groupCount: Int + bracketType: BracketType +} + +input StationUpsertInput { + number: Int! + clusterId: ID +} + +input WaveUpsertInput { + identifier: String! + startAt: Timestamp! + endAt: Timestamp! +} + +""" +A set of actions available for an entity to take +""" +interface ActionSet { + id: ID +} + +""" +Bracket-specific configuration +""" +interface BracketConfig { + id: ID + bracketType: BracketType +} + +""" +Comparison operator +""" +enum Comparator { + """ + + """ + GREATER_THAN + """ + + """ + GREATER_THAN_OR_EQUAL + """ + + """ + EQUAL + """ + + """ + LESS_THAN_OR_EQUAL + """ + + """ + LESS_THAN +} + +""" +An event-level Team, in the context of some competition +""" +type EventTeam implements Team { + id: ID + """ + Uniquely identifying token for team. Same as the hashed part of the slug + """ + discriminator: String + entrant: Entrant @deprecated(reason: "Use the entrant field off the EventTeam type") + event: Event @deprecated(reason: "Use the event field off the EventTeam type") + globalTeam: GlobalTeam + images(type: String): [Image] + members(status: [TeamMemberStatus]): [TeamMember] + name: String +} + +""" +Global Team +""" +type GlobalTeam implements Team { + id: ID + """ + Uniquely identifying token for team. Same as the hashed part of the slug + """ + discriminator: String + entrant: Entrant @deprecated(reason: "Use the entrant field off the EventTeam type") + event: Event @deprecated(reason: "Use the event field off the EventTeam type") + eventTeams(query: TeamPaginationQuery): EventTeamConnection + images(type: String): [Image] + """ + Leagues-level teams for leagues this team is competing in + """ + leagueTeams(query: TeamPaginationQuery): EventTeamConnection + members(status: [TeamMemberStatus]): [TeamMember] + name: String +} + +type EventTeamConnection { + pageInfo: PageInfo + nodes: [EventTeam] +} + +""" +Match-level configuration +""" +interface MatchConfig { + id: ID + bracketType: BracketType +} + +""" +Different options available for verifying player-reported match results +""" +enum MatchConfigVerificationMethod { + """ + + """ + TWITCH + """ + + """ + STREAM_ME + """ + + """ + ANY + """ + + """ + MIXER + """ + + """ + YOUTUBE +} + +""" +Race specific bracket configuration +""" +type RaceBracketConfig implements BracketConfig { + automaticEndTime: Timestamp + id: ID + automaticStartTime: Timestamp + bracketType: BracketType + goalTargetComparator: Comparator + goalTargetValue: String + limitMode: RaceLimitMode + limitValue: Int + raceType: RaceType +} + +""" +Enforces limits on the amount of allowable Race submissions +""" +enum RaceLimitMode { + """ + + """ + BEST_ALL + """ + + """ + FIRST_ALL + """ + + """ + PLAYTIME +} + +""" +Race type +""" +enum RaceType { + """ + + """ + GOALS + """ + + """ + TIMED +} + +""" +Race specific match configuration +""" +type RaceMatchConfig implements MatchConfig { + id: ID + bracketType: BracketType + """ + Can players report results? + """ + playerReportingEnabled: Boolean + """ + Accepted methods of verification that players can use + """ + verificationMethods: [MatchConfigVerificationMethod] + """ + Are players required to submit verification of their reported results? + """ + verificationRequired: Boolean +} + +""" +A set of actions available for a team to take +""" +type TeamActionSet implements ActionSet { + id: ID +} + diff --git a/smash.gql b/smash.gql new file mode 100644 index 0000000..1b3b959 --- /dev/null +++ b/smash.gql @@ -0,0 +1,2733 @@ +type Query { + """ + Returns the authenticated user + """ + currentUser: User + """ + Returns an entrant given its id + """ + entrant(id: ID!): Entrant + """ + Returns an event given its id or slug + """ + event(id: ID, slug: String): Event + """ + Returns a league given its id or slug + """ + league(id: ID, slug: String): League + """ + Paginated, filterable list of leagues + """ + leagues(query: LeagueQuery!): LeagueConnection + """ + Returns a participant given its id + """ + participant(id: ID!, isAdmin: Boolean): Participant + """ + Returns a phase given its id + """ + phase(id: ID): Phase + """ + Returns a phase group given its id + """ + phaseGroup(id: ID): PhaseGroup + """ + Returns a player given an id + """ + player(id: ID!): Player + """ + Returns a phase seed given its id + """ + seed(id: ID): Seed + """ + Returns a set given its id + """ + set(id: ID!): Set + """ + A shop entity + """ + shop(id: ID, slug: String): Shop + """ + Returns an stream given its id + """ + stream(id: ID!): Streams + """ + Returns all the stream queues for a given tournament + """ + streamQueue(tournamentId: ID!, includePlayerStreams: Boolean): [StreamQueue] + """ + Returns a team given its id + """ + team(id: ID, slug: String, inviteCode: String): Team + """ + Returns a tournament given its id or slug + """ + tournament(id: ID, slug: String): Tournament + """ + Paginated, filterable list of tournaments + """ + tournaments(query: TournamentQuery!): TournamentConnection + """ + Returns a user given a user slug of the form user/abc123, or id + """ + user(id: ID, slug: String): User + """ + Returns a videogame given its id + """ + videogame(id: ID, slug: String): Videogame + """ + Returns paginated list of videogames matching the search criteria. + """ + videogames(query: VideogameQuery!): VideogameConnection +} + +""" +A user +""" +type User { + """ + Authorizations to external services (i.e. Twitch, Twitter) + """ + authorizations(types: [SocialConnectionType]): [ProfileAuthorization] + id: ID + bio: String + """ + Public facing user birthday that respects user publishing settings + """ + birthday: String + """ + Uniquely identifying token for user. Same as the hashed part of the slug + """ + discriminator: String + email: String + """ + Events this user has competed in + """ + events(query: UserEventsPaginationQuery): EventConnection + genderPronoun: String + images(type: String): [Image] + """ + Leagues this user has competed in + """ + leagues(query: UserLeaguesPaginationQuery): LeagueConnection + """ + Public location info for this user + """ + location: Address + """ + Public facing user name that respects user publishing settings + """ + name: String + """ + player for user + """ + player: Player + slug: String + """ + Tournaments this user is organizing or competing in + """ + tournaments(query: UserTournamentsPaginationQuery): TournamentConnection +} + +""" +Represents the name of the third-party social service (e.g Twitter) for OAuth +""" +enum SocialConnectionType { + """ + + """ + TWITTER + """ + + """ + TWITCH + """ + + """ + DISCORD + """ + + """ + MIXER + """ + + """ + XBOX +} + +""" +An OAuth ProfileAuthorization object +""" +type ProfileAuthorization { + id: ID + """ + The id given by the external service + """ + externalId: String + """ + The username given by the external service (including discriminator if discord) + """ + externalUsername: String + stream: Stream + """ + The name of the external service providing this auth i.e. "twitch" + """ + type: AuthorizationType + url: String +} + +""" +A Stream object +""" +type Stream { + id: ID + """ + Whether the stream is currently live. May be slightly delayed. + """ + isOnline: Boolean + """ + The name of the stream + """ + name: String + """ + The name of the external service providing this auth i.e. "twitch" + """ + type: StreamType +} + +""" +Represents the type of stream service +""" +enum StreamType { + """ + + """ + TWITCH + """ + + """ + MIXER + """ + + """ + YOUTUBE +} + +""" +Represents the name of the third-party service (e.g Twitter) for OAuth +""" +enum AuthorizationType { + """ + + """ + TWITTER + """ + + """ + TWITCH + """ + + """ + STEAM + """ + + """ + DISCORD + """ + + """ + XBOX + """ + + """ + EPIC + """ + + """ + BATTLENET + """ + + """ + MIXER +} + +input UserEventsPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: UserEventsPaginationFilter +} + +input UserEventsPaginationFilter { + videogameId: [ID] + eventType: Int + minEntrantCount: Int + maxEntrantCount: Int + location: LocationFilterType + search: PaginationSearchType +} + +input LocationFilterType { + countryCode: String + state: String + city: String +} + +input PaginationSearchType { + fieldsToSearch: [String] + searchString: String +} + +type EventConnection { + pageInfo: PageInfo + nodes: [Event] +} + +type PageInfo { + total: Int + totalPages: Int + page: Int + perPage: Int + sortBy: String + filter: JSON +} + +""" +The `JSON` scalar type represents JSON values as specified by + [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSON + +""" +An event in a tournament +""" +type Event { + id: ID + """ + How long before the event start will the check-in end (in seconds) + """ + checkInBuffer: Int + """ + How long the event check-in will last (in seconds) + """ + checkInDuration: Int + """ + Whether check-in is enabled for this event + """ + checkInEnabled: Boolean + """ + Rough categorization of event tier, denoting relative importance in the competitive scene + """ + competitionTier: Int + """ + When the event was created (unix timestamp) + """ + createdAt: Timestamp + """ + Last date attendees are able to create teams for team events + """ + deckSubmissionDeadline: Timestamp + """ + Maximum number of participants each Entrant can have + """ + entrantSizeMax: Int @deprecated(reason: "Migrate to teamRosterSize") + """ + Minimum number of participants each Entrant can have + """ + entrantSizeMin: Int @deprecated(reason: "Migrate to teamRosterSize") + """ + The entrants that belong to an event, paginated by filter criteria + """ + entrants(query: EventEntrantPageQuery): EntrantConnection + """ + Whether the event has decks + """ + hasDecks: Boolean + """ + Are player tasks enabled for this event + """ + hasTasks: Boolean + images(type: String): [Image] + """ + Whether the event is an online event or not + """ + isOnline: Boolean + league: League + """ + Markdown field for match rules/instructions + """ + matchRulesMarkdown: String + """ + Title of event set by organizer + """ + name: String + """ + Gets the number of entrants in this event + """ + numEntrants: Int + """ + The phase groups that belong to an event. + """ + phaseGroups: [PhaseGroup] + """ + The phases that belong to an event. + """ + phases( + """ + Filter phases by state. If not specified will default to all phases + """ + state: ActivityState + """ + Optionally only return results for this phase + """ + phaseId: ID + ): [Phase] + """ + TO settings for prizing + """ + prizingInfo: JSON + publishing: JSON + """ + Markdown field for event rules/instructions + """ + rulesMarkdown: String + """ + Id of the event ruleset + """ + rulesetId: Int + """ + Settings pulled from the event ruleset, if one exists + """ + rulesetSettings: JSON @deprecated(reason: "Use ruleset") + """ + Paginated sets for this Event + """ + sets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + slug: String + """ + Paginated list of standings + """ + standings(query: StandingPaginationQuery!): StandingConnection + """ + When does this event start? + """ + startAt: Timestamp + """ + The state of the Event. + """ + state: ActivityState + """ + Paginated stations on this event + """ + stations(query: StationFilter): StationsConnection + """ + Last date attendees are able to create teams for team events + """ + teamManagementDeadline: Timestamp + """ + If this is a teams event, returns whether or not teams can set custom names + """ + teamNameAllowed: Boolean + """ + Team roster size requirements + """ + teamRosterSize: TeamRosterSize + tournament: Tournament + """ + The type of the event, whether an entrant will have one participant or multiple + """ + type: Int + """ + When the event was last modified (unix timestamp) + """ + updatedAt: Timestamp + """ + Whether the event uses the new EventSeeds for seeding + """ + useEventSeeds: Boolean + """ + The entrant (if applicable) for a given user in this event + """ + userEntrant( + """ + User to get entrant for. Defaults to currently logged in user. + """ + userId: ID + ): Entrant + videogame: Videogame + """ + The waves being used by the event + """ + waves( + """ + Waves filtered by phaseId, returns all if not set. + """ + phaseId: ID + ): [Wave] +} + +""" +Represents a Unix Timestamp. Supports up to 53 bit int values, + as that is JavaScript's internal memory allocation for integer values. +""" +scalar Timestamp + +input EventEntrantPageQuery { + page: Int + perPage: Int + sortBy: String + filter: EventEntrantPageQueryFilter +} + +input EventEntrantPageQueryFilter { + name: String +} + +type EntrantConnection { + pageInfo: PageInfo + nodes: [Entrant] +} + +""" +An entrant in an event +""" +type Entrant { + id: ID + event: Event + """ + Entrant's seed number in the first phase of the event. + """ + initialSeedNum: Int + isDisqualified: Boolean + """ + The entrant name as it appears in bracket: gamerTag of the participant or team name + """ + name: String + """ + Paginated sets for this entrant + """ + paginatedSets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + participants: [Participant] + seeds: [Seed] + skill: Int + """ + Standing for this entrant given an event. All entrants queried must be in the same event (for now). + """ + standing: Standing + stream: Streams @deprecated(reason: "DEPRECATED. Use streams instead, which supports multiple stream types and teams.") + streams: [Streams] + """ + Team linked to this entrant, if one exists + """ + team: Team +} + +""" +Different sort type configurations used when displaying multiple sets +""" +enum SetSortType { + """ + Sets will not be sorted. + """ + NONE + """ + Sets are sorted in the suggested order that they be called to be played. The order of completed sets is reversed. + """ + CALL_ORDER + """ + Sets are sorted by relevancy dependent on the state and progress of the event. + """ + MAGIC + """ + Sets are sorted in the order that they were started. + """ + RECENT + """ + Deprecated. This is equivalent to CALL_ORDER + """ + STANDARD + """ + Sets sorted by round and identifier + """ + ROUND +} + +input SetFilters { + """ + Only return Sets for these Entrants + """ + entrantIds: [ID] + """ + Only return Sets for this Entrant size. For example, to fetch 1v1 Sets only, filter by an entrantSize of 1 + """ + entrantSize: [Int] + """ + Only return Sets that have an attached VOD + """ + hasVod: Boolean + """ + Do not return empty Sets. For example, set this to true to filter out sets that are waiting for progressions. + """ + hideEmpty: Boolean + """ + Return sets that contain a bye + """ + showByes: Boolean + """ + Only return Sets that are in an Online event. If omitted, Sets for both online and offline Events are returned + """ + isEventOnline: Boolean + """ + Only return Sets in certain geographical areas. + """ + location: SetFilterLocation + """ + Only return Sets for these Participants + """ + participantIds: [ID] + """ + Only return Sets in these PhaseGroups + """ + phaseGroupIds: [ID] + """ + Only return Sets in these Phases + """ + phaseIds: [ID] + """ + Only return Sets in these Events + """ + eventIds: [ID] + """ + Only return Sets in these Tournaments + """ + tournamentIds: [ID] + """ + Only return Sets for these Players + """ + playerIds: [ID] + """ + Only return Sets for these Rounds + """ + roundNumber: Int + """ + Only returns Sets that are in these states + """ + state: [Int] + """ + Only return Sets that are assigned to these Station IDs + """ + stationIds: [ID] + """ + Only return Sets that are assigned to these Station numbers + """ + stationNumbers: [Int] + """ + Only return sets created or updated since this timestamp + """ + updatedAfter: Timestamp +} + +""" +Filter Sets by geographical constraints. +""" +input SetFilterLocation { + """ + Only return Sets in this state. Only applicable to US states + """ + state: String + """ + Only return Sets in this country. Expects a valid two-letter country code + """ + country: String + distanceFrom: SetFilterLocationDistanceFrom +} + +""" +Only return Sets that are a certain distance away from a specified point +""" +input SetFilterLocationDistanceFrom { + """ + Point at which to perform distance calculation + """ + point: SetFilterLocationDistanceFromPoint + """ + Distance from the point to include results in + """ + radius: String +} + +input SetFilterLocationDistanceFromPoint { + lat: Float + lon: Float +} + +type SetConnection { + pageInfo: PageInfo + nodes: [Set] +} + +""" +A set +""" +type Set { + id: ID + """ + The time this set was marked as completed + """ + completedAt: Timestamp + """ + The time this set was created + """ + createdAt: Timestamp + displayScore(mainEntrantId: ID): String + """ + Event that this set belongs to. + """ + event: Event + """ + Full round text of this set. + """ + fullRoundText: String + game(orderNum: Int!): Game + games: [Game] + """ + Whether this set contains a placeholder entrant + """ + hasPlaceholder: Boolean + """ + The letters that describe a unique identifier within the pool. Eg. F, AT + """ + identifier: String + images(type: String): [Image] + lPlacement: Int + """ + Phase group that this Set belongs to. + """ + phaseGroup: PhaseGroup + """ + The sets that are affected from resetting this set + """ + resetAffectedData: ResetAffectedData + """ + The round number of the set. Negative numbers are losers bracket + """ + round: Int + """ + Indicates whether the set is in best of or total games mode. This instructs + which field is used to figure out how many games are in this set. + """ + setGamesType: Int + """ + A possible spot in a set. Use this to get all entrants in a set. Use this for all bracket types (FFA, elimination, etc) + """ + slots(includeByes: Boolean = false): [SetSlot] + """ + The start time of the Set. If there is no startAt time on the Set, will pull it from phaseGroup rounds configuration. + """ + startAt: Timestamp + startedAt: Timestamp + state: Int + """ + Tournament event station for a set + """ + station: Stations + """ + Tournament event stream for a set + """ + stream: Streams + """ + If setGamesType is in total games mode, this defined the number of games in the set. + """ + totalGames: Int + """ + Url of a VOD for this set + """ + vodUrl: String + wPlacement: Int + winnerId: Int +} + +""" +A game represents a single game within a set. +""" +type Game { + id: ID + """ + Score of entrant 1. For smash, this is equivalent to stocks remaining. + """ + entrant1Score: Int + """ + Score of entrant 2. For smash, this is equivalent to stocks remaining. + """ + entrant2Score: Int + images(type: String): [Image] + orderNum: Int + """ + Selections for this game such as character, etc. + """ + selections: [GameSelection] + """ + The stage that this game was played on (if applicable) + """ + stage: Stage + state: Int + winnerId: Int +} + +""" +An image +""" +type Image { + id: ID + height: Float + ratio: Float + type: String + url: String + width: Float +} + +""" +A selection for this game. i.e. character/stage selection, etc +""" +type GameSelection { + """ + If this is a character selection, returns the selected character. + """ + character: Character + id: ID + """ + The entrant who this selection is for + """ + entrant: Entrant + orderNum: Int + """ + The participant who this selection is for. This is only populated if there are + selections for multiple participants of a single entrant + """ + participant: Participant + selectionType: GameSelectionType + selectionValue: Int +} + +""" +A character in a videogame +""" +type Character { + id: ID + images(type: String): [Image] + """ + Name of Character + """ + name: String +} + +""" +A participant of a tournament; either a spectator or competitor +""" +type Participant { + id: ID + """ + If this participant was checked-in by admin + """ + checkedIn: Boolean + """ + The time this participant was checked-in by admin + """ + checkedInAt: Timestamp + """ + Info for connected accounts to external services. + """ + connectedAccounts: JSON + """ + Contact Info selected during registration. Falls back to User.location and/or + User.name if necessary. These fields are for admin use only. If you are not a + tournament admin or the participant being queried, these fields will be null. + Do not display this information publicly. + """ + contactInfo: ContactInfo + """ + Email of the user, only available to admins within 18 months of tournament completion for tournament administrators. + """ + email: String + """ + Entrants associated with this Participant, if applicable + """ + entrants: [Entrant] + """ + The events this participant registered for within a Tournament. + """ + events: [Event] + """ + The tag that was used when the participant registered, e.g. Mang0 + """ + gamerTag: String + images(type: String): [Image] + player: Player + """ + The prefix that the user set for this Tournament, e.g. C9 + """ + prefix: String + """ + Tournament Admin viewable field. Shows details for required social connections + """ + requiredConnections: [ProfileAuthorization] + """ + The user this participant is associated to. + """ + user: User + """ + If this participant is verified as actually being in the tournament + """ + verified: Boolean +} + +""" +Name, address, etc +""" +type ContactInfo { + id: ID + """ + Participant City Name + """ + city: String + """ + Participant Country Name + """ + country: String + """ + Participant Country (region) id + """ + countryId: Int + name: String + """ + First Name + """ + nameFirst: String + """ + Last Name + """ + nameLast: String + """ + Participant State Name + """ + state: String + """ + Participant State (region) id + """ + stateId: Int + """ + Zip or Postal Code + """ + zipcode: String +} + +""" +A player +""" +type Player { + id: ID + gamerTag: String + prefix: String + """ + Most recent active & published rankings + """ + rankings(limit: Int, videogameId: ID): [PlayerRank] + """ + Recent sets for this player. + """ + recentSets( + """ + Use this to get H2H history between two players + """ + opponentId: ID + ): [Set] @deprecated(reason: "Use the sets field instead.") + """ + Recent standings + """ + recentStandings( + videogameId: ID + """ + Number of recent standings to fetch. Default value is 3. Maximum value is 20. + """ + limit: Int + ): [Standing] + """ + Set history for this player. + """ + sets( + page: Int + perPage: Int + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + user: User +} + +""" +A player's ranks +""" +type PlayerRank { + id: ID + """ + The player's placement on the ranking + """ + rank: Int + title: String +} + +""" +A standing indicates the placement of something within a container. +""" +type Standing { + id: ID + """ + The containing entity that contextualizes this standing. Event standings, for + example, represent an entrant's standing in the entire event vs. Set standings + which is an entrant's standing in only a single set within an event. + """ + container: StandingContainer + """ + If the entity this standing is assigned to can be resolved into an entrant, this will provide the entrant. + """ + entrant: Entrant + isFinal: Boolean + """ + Metadata that goes along with this standing. Can take on different forms based on standing group type and settings. + """ + metadata: JSON + placement: Int + """ + The player(s) tied to this standing's entity + """ + player: Player + standing: Int @deprecated(reason: "The \"placement\" field is identical and will eventually replace \"standing\"") + stats: StandingStats + totalPoints: Float +} + +""" +The containing entity that this standing is for +""" +union StandingContainer = Tournament | Event | PhaseGroup | Set + +""" +A tournament +""" +type Tournament { + id: ID + addrState: String + """ + Admin-only view of admins for this tournament + """ + admins( + """ + Which roles to show + """ + roles: [String] + ): [User] + city: String + countryCode: String + """ + When the tournament was created (unix timestamp) + """ + createdAt: Timestamp + currency: String + """ + When the tournament ends + """ + endAt: Timestamp + """ + When does event registration close + """ + eventRegistrationClosesAt: Timestamp + events(limit: Int, filter: EventFilter): [Event] + """ + True if tournament has at least one offline event + """ + hasOfflineEvents: Boolean + hasOnlineEvents: Boolean + hashtag: String + images(type: String): [Image] + """ + True if tournament has at least one online event + """ + isOnline: Boolean + """ + Is tournament registration open + """ + isRegistrationOpen: Boolean + lat: Float + links: TournamentLinks + lng: Float + mapsPlaceId: String + """ + The tournament name + """ + name: String + """ + Number of attendees including spectators, if public + """ + numAttendees: Int + """ + The user who created the tournament + """ + owner: User + """ + Paginated, queryable list of participants + """ + participants(query: ParticipantPaginationQuery!, isAdmin: Boolean): ParticipantConnection + postalCode: String + primaryContact: String + primaryContactType: String + """ + Publishing settings for this tournament + """ + publishing: JSON + """ + When does registration for the tournament end + """ + registrationClosesAt: Timestamp + rules: String + """ + The short slug used to form the url + """ + shortSlug: String + """ + The slug used to form the url + """ + slug: String + """ + When the tournament Starts + """ + startAt: Timestamp + """ + State of the tournament, can be ActivityState::CREATED, ActivityState::ACTIVE, or ActivityState::COMPLETED + """ + state: Int + stations(page: Int, perPage: Int): StationsConnection + streamQueue: [StreamQueue] + streams: [Streams] + """ + When is the team creation deadline + """ + teamCreationClosesAt: Timestamp + """ + Paginated, queryable list of teams + """ + teams(query: TeamPaginationQuery!): TeamConnection + """ + The timezone of the tournament + """ + timezone: String + """ + The type of tournament from TournamentType + """ + tournamentType: Int + """ + When the tournament was last modified (unix timestamp) + """ + updatedAt: Timestamp + """ + Build Tournament URL + """ + url( + """ + Tournament tab to add to URL + """ + tab: String + """ + Generate a relative URL. Defaults to true. Setting to false will generate an absolute URL + """ + relative: Boolean = true + ): String + venueAddress: String + venueName: String + """ + List of all waves in this tournament + """ + waves: [Wave] +} + +input EventFilter { + videogameId: [ID] + type: [Int] + published: Boolean + id: ID + ids: [ID] + slug: String + fantasyEventId: ID + fantasyRosterHash: String +} + +type TournamentLinks { + facebook: String + discord: String +} + +input ParticipantPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: ParticipantPageFilter +} + +input ParticipantPageFilter { + id: ID + ids: [ID] + eventIds: [ID] + search: PaginationSearchType + gamerTag: String + unpaid: Boolean + incompleteTeam: Boolean + missingDeck: Boolean + checkedIn: Boolean + notCheckedIn: Boolean +} + +type ParticipantConnection { + pageInfo: PageInfo + nodes: [Participant] +} + +type StationsConnection { + pageInfo: PageInfo + nodes: [Stations] +} + +""" +Stations, such as a stream setup, at an event +""" +type Stations { + id: ID + canAutoAssign: Boolean + clusterNumber: String + clusterPrefix: Int + enabled: Boolean + identifier: Int + numSetups: Int + number: Int + prefix: String + queue: JSON + queueDepth: Int + state: Int + updatedAt: Timestamp +} + +""" +A Stream queue object +""" +type StreamQueue { + id: String + """ + The sets on the stream + """ + sets: [Set] + """ + The stream on the queue + """ + stream: Streams +} + +""" +Tournament Stream +""" +type Streams { + id: ID + enabled: Boolean + followerCount: Int + isOnline: Boolean + numSetups: Int + parentStreamId: Int + streamGame: String + streamId: String + streamLogo: String + streamName: String + streamSource: StreamSource + streamStatus: String + streamType: Int + streamTypeId: Int +} + +""" +Represents the source of a stream +""" +enum StreamSource { + """ + Stream is on twitch.tv channel + """ + TWITCH + """ + Stream is on smashcast.tv channel + """ + HITBOX + """ + Stream is on a stream.me channel + """ + STREAMME + """ + Stream is on a mixer.com channel + """ + MIXER + """ + Stream is on a youtube.com channel + """ + YOUTUBE +} + +input TeamPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: TeamPaginationFilter +} + +input TeamPaginationFilter { + globalTeamId: ID + eventState: ActivityState + eventId: ID + eventIds: [ID] + minEntrantCount: Int + maxEntrantCount: Int + search: PaginationSearchType + type: Int + tournamentId: ID + memberStatus: [TeamMemberStatus] + videogameId: [ID] + isLeague: Boolean + upcoming: Boolean + past: Boolean + rosterComplete: Boolean + rosterIncomplete: Boolean +} + +""" +Represents the state of an activity +""" +enum ActivityState { + """ + Activity is created + """ + CREATED + """ + Activity is active or in progress + """ + ACTIVE + """ + Activity is done + """ + COMPLETED + """ + Activity is ready to be started + """ + READY + """ + Activity is invalid + """ + INVALID + """ + Activity, like a set, has been called to start + """ + CALLED + """ + Activity is queued to run + """ + QUEUED +} + +""" +Membership status of a team member +""" +enum TeamMemberStatus { + """ + + """ + UNKNOWN + """ + + """ + ACCEPTED + """ + + """ + INVITED + """ + + """ + REQUEST + """ + + """ + ALUM + """ + + """ + HIATUS + """ + + """ + OPEN_SPOT +} + +type TeamConnection { + pageInfo: PageInfo + nodes: [Team] +} + +""" +A team, either at the global level or within the context of an event +""" +interface Team { + id: ID + """ + Uniquely identifying token for team. Same as the hashed part of the slug + """ + discriminator: String + entrant: Entrant @deprecated(reason: "Use the entrant field off the EventTeam type") + event: Event @deprecated(reason: "Use the event field off the EventTeam type") + images(type: String): [Image] + members(status: [TeamMemberStatus]): [TeamMember] + name: String +} + +""" +A member of a team +""" +type TeamMember { + id: ID + isAlternate: Boolean + isCaptain: Boolean + """ + The type of the team member + """ + memberType: TeamMemberType + participant: Participant + player: Player + """ + The status of the team member + """ + status: TeamMemberStatus +} + +""" +Membership type of a team member +""" +enum TeamMemberType { + """ + + """ + PLAYER + """ + + """ + STAFF +} + +""" +A wave in a tournament +""" +type Wave { + id: ID + """ + The Wave Identifier + """ + identifier: String + """ + Unix time the wave is scheduled to start. + """ + startAt: Timestamp +} + +""" +A group within a phase +""" +type PhaseGroup { + id: ID + """ + The bracket type of this group's phase. + """ + bracketType: BracketType + """ + URL for this phase groups's bracket. + """ + bracketUrl: String + """ + Unique identifier for this group within the context of its phase + """ + displayIdentifier: String + """ + For the given phase group, this is the start time of the first round that occurs in the group. + """ + firstRoundTime: Timestamp + numRounds: Int + paginatedSeeds(query: SeedPaginationQuery!, eventId: ID): SeedConnection @deprecated(reason: "Please use 'seeds', which is now paginated") + """ + Paginated sets on this phaseGroup + """ + paginatedSets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection @deprecated(reason: "Please use 'sets', which is now paginated") + """ + The phase associated with this phase group + """ + phase: Phase + """ + The progressions out of this phase group + """ + progressionsOut: [Progression] + rounds: [Round] + seedMap: JSON + """ + Paginated seeds for this phase group + """ + seeds(query: SeedPaginationQuery!, eventId: ID): SeedConnection + """ + Paginated sets on this phaseGroup + """ + sets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + """ + Paginated list of standings + """ + standings(query: StandingGroupStandingPageFilter): StandingConnection + """ + Unix time the group is scheduled to start. This info could also be on the wave instead. + """ + startAt: Timestamp + state: Int + tiebreakOrder: JSON + wave: Wave +} + +""" +The type of Bracket format that a Phase is configured with. +""" +enum BracketType { + """ + + """ + SINGLE_ELIMINATION + """ + + """ + DOUBLE_ELIMINATION + """ + + """ + ROUND_ROBIN + """ + + """ + SWISS + """ + + """ + EXHIBITION + """ + + """ + CUSTOM_SCHEDULE + """ + + """ + MATCHMAKING + """ + + """ + ELIMINATION_ROUNDS + """ + + """ + RACE + """ + + """ + CIRCUIT +} + +input SeedPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: SeedPageFilter +} + +input SeedPageFilter { + id: ID + entrantName: String + checkInState: [Int] + phaseGroupId: [ID] + eventCheckInGroupId: ID + phaseId: [ID] + eventId: ID + search: PaginationSearchType +} + +type SeedConnection { + pageInfo: PageInfo + nodes: [Seed] +} + +""" +A seed for an entrant +""" +type Seed { + id: ID + """ + Map of Participant ID to checked in boolean + """ + checkedInParticipants: JSON + entrant: Entrant + groupSeedNum: Int + isBye: Boolean + phase: Phase + phaseGroup: PhaseGroup + placeholderName: String + placement: Int + """ + The player(s) associated with this seed's entrant + """ + players: [Player] + progressionSeedId: Int + """ + Source progression information + """ + progressionSource: Progression + seedNum: Int + """ + Entrant's win/loss record for this standing. Scores do not include byes. + """ + setRecordWithoutByes(phaseGroupId: ID!): JSON + standings( + """ + The container of the standing groups to get standings for. If null, will return all standings. + """ + containerType: String + ): [Standing] +} + +""" +A phase in an event +""" +type Phase { + id: ID + """ + The bracket type of this phase. + """ + bracketType: BracketType + """ + The Event that this phase belongs to + """ + event: Event + """ + Number of phase groups in this phase + """ + groupCount: Int + """ + Is the phase an exhibition or not. + """ + isExhibition: Boolean + """ + Name of phase e.g. Round 1 Pools + """ + name: String + """ + The number of seeds this phase contains. + """ + numSeeds: Int + paginatedSeeds(query: SeedPaginationQuery!, eventId: ID): SeedConnection @deprecated(reason: "Please use 'seeds' instead") + """ + Phase groups under this phase, paginated + """ + phaseGroups(query: PhaseGroupPageQuery): PhaseGroupConnection + """ + The relative order of this phase within an event + """ + phaseOrder: Int + """ + Paginated seeds for this phase + """ + seeds(query: SeedPaginationQuery!, eventId: ID): SeedConnection + """ + Paginated sets for this Phase + """ + sets( + page: Int + perPage: Int + """ + How to sort these sets + """ + sortType: SetSortType + """ + Supported filter options to filter down set results. + """ + filters: SetFilters + ): SetConnection + """ + State of the phase + """ + state: ActivityState + waves: [Wave] +} + +input PhaseGroupPageQuery { + page: Int + perPage: Int + sortBy: String + entrantIds: [ID] + filter: PhaseGroupPageQueryFilter +} + +input PhaseGroupPageQueryFilter { + id: [ID] + waveId: ID +} + +type PhaseGroupConnection { + pageInfo: PageInfo + nodes: [PhaseGroup] +} + +""" +A connection between a placement in an origin phase group to a destination seed. +""" +type Progression { + id: ID + originOrder: Int + originPhase: Phase + originPhaseGroup: PhaseGroup + originPlacement: Int +} + +""" +A round within a phase group +""" +type Round { + id: ID + """ + If applicable, bestOf is the number of games + one must win a majority out of to win a set in this round + """ + bestOf: Int + """ + Indicates this round's order in the phase group + """ + number: Int + """ + The time that this round is scheduled to start at + """ + startAt: Timestamp +} + +input StandingGroupStandingPageFilter { + page: Int + perPage: Int + sortBy: String +} + +type StandingConnection { + pageInfo: PageInfo + nodes: [Standing] +} + +""" +Any stats related to this standing. This type is experimental and very likely to change in the future. +""" +type StandingStats { + score: Score +} + +""" +The score that led to this standing being awarded. The meaning of this field can +vary by standing type and is not used for some standing types. +""" +type Score { + """ + The name of this score. e.g. "Kills" or "Stocks" + """ + label: String + """ + The raw score value + """ + value: Float + """ + Like value, but formatted for race format events. Formatted according to the race config for the front end to use. + """ + displayValue: String +} + +""" +The type of selection i.e. is it for a character or something else +""" +enum GameSelectionType { + """ + Character selection + """ + CHARACTER +} + +""" +Video Stage +""" +type Stage { + id: ID + """ + Stage name + """ + name: String +} + +type ResetAffectedData { + affectedSetCount: Int + affectedSets: [Set] + affectedPhaseGroupCount: Int +} + +""" +A slot in a set where a seed currently or will eventually exist in order to participate in the set. +""" +type SetSlot { + id: ID + entrant: Entrant + """ + Pairs with prereqType, is the ID of the prereq. + """ + prereqId: String + """ + Given a set prereq type, defines the placement required in the origin set to end up in this slot. + """ + prereqPlacement: Int + """ + Describes where the entity in this slot comes from. + """ + prereqType: String + seed: Seed + """ + The index of the slot. Unique per set. + """ + slotIndex: Int + """ + The standing within this set for the seed currently assigned to this slot. + """ + standing: Standing +} + +""" +A league +""" +type League { + id: ID + addrState: String + city: String + countryCode: String + """ + When the tournament was created (unix timestamp) + """ + createdAt: Timestamp + currency: String + """ + When the tournament ends + """ + endAt: Timestamp + entrantCount: Int + eventOwners(query: EventOwnersQuery): EventOwnerConnection + """ + When does event registration close + """ + eventRegistrationClosesAt: Timestamp + """ + Paginated list of events in a league + """ + events(query: LeagueEventsQuery): EventConnection + """ + Hacked "progression" into this final event + """ + finalEventId: Int @deprecated(reason: "No longer used") + """ + True if tournament has at least one offline event + """ + hasOfflineEvents: Boolean + hasOnlineEvents: Boolean + hashtag: String + images(type: String): [Image] + """ + True if tournament has at least one online event + """ + isOnline: Boolean + lat: Float + links: TournamentLinks + lng: Float + mapsPlaceId: String + """ + The tournament name + """ + name: String + """ + Top X number of people in the standings who progress to final event + """ + numProgressingToFinalEvent: Int @deprecated(reason: "No longer used") + numUniquePlayers: Int + postalCode: String + primaryContact: String + primaryContactType: String + """ + Publishing settings for this tournament + """ + publishing: JSON + """ + When does registration for the tournament end + """ + registrationClosesAt: Timestamp + rules: String + """ + The short slug used to form the url + """ + shortSlug: String + """ + Whether standings for this league should be visible + """ + showStandings: Boolean + slug: String + """ + Paginated list of standings + """ + standings(query: StandingGroupStandingPageFilter): StandingConnection + """ + When the tournament Starts + """ + startAt: Timestamp + """ + State of the tournament, can be ActivityState::CREATED, ActivityState::ACTIVE, or ActivityState::COMPLETED + """ + state: Int + """ + When is the team creation deadline + """ + teamCreationClosesAt: Timestamp + tiers: [EventTier] + """ + The timezone of the tournament + """ + timezone: String + """ + The type of tournament from TournamentType + """ + tournamentType: Int + """ + When the tournament was last modified (unix timestamp) + """ + updatedAt: Timestamp + """ + Build Tournament URL + """ + url( + """ + Tournament tab to add to URL + """ + tab: String + """ + Generate a relative URL. Defaults to true. Setting to false will generate an absolute URL + """ + relative: Boolean = true + ): String + venueAddress: String + venueName: String + videogames: [Videogame] +} + +input EventOwnersQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String +} + +type EventOwnerConnection { + pageInfo: PageInfo + nodes: [EventOwner] +} + +""" +Name and Gamertag of the owner of an event in a league +""" +type EventOwner { + eventId: ID + email: String + gamerTag: String + fullName: String +} + +input LeagueEventsQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: LeagueEventsFilter +} + +input LeagueEventsFilter { + search: PaginationSearchType + pointMappingGroupIds: [ID] + tierIds: [ID] + userId: ID + upcoming: Boolean + leagueEntrantId: ID +} + +""" +Used for league application tiers +""" +type EventTier { + id: ID + """ + Name of this tier + """ + name: String +} + +""" +A videogame +""" +type Videogame { + id: ID + """ + All characters for this videogame + """ + characters: [Character] + displayName: String + images(type: String): [Image] + name: String + slug: String + """ + All stages for this videogame + """ + stages: [Stage] +} + +input StandingPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: StandingPageFilter +} + +input StandingPageFilter { + id: ID + ids: [ID] + search: PaginationSearchType +} + +input StationFilter { + page: Int + perPage: Int +} + +""" +Team roster size requirements +""" +type TeamRosterSize { + maxAlternates: Int + maxPlayers: Int + minAlternates: Int + minPlayers: Int +} + +input UserLeaguesPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: UserLeaguesPaginationFilter +} + +input UserLeaguesPaginationFilter { + videogameId: [ID] + upcoming: Boolean + past: Boolean + search: PaginationSearchType +} + +type LeagueConnection { + pageInfo: PageInfo + nodes: [League] +} + +""" +A user's address +""" +type Address { + id: ID + city: String + country: String + countryId: Int + state: String + stateId: Int +} + +input UserTournamentsPaginationQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: UserTournamentsPaginationFilter +} + +input UserTournamentsPaginationFilter { + past: Boolean + upcoming: Boolean + search: PaginationSearchType + videogameId: [ID] + tournamentView: String + excludeId: [ID] +} + +type TournamentConnection { + pageInfo: PageInfo + nodes: [Tournament] +} + +input LeagueQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: LeaguePageFilter + sort: TournamentPaginationSort +} + +input LeaguePageFilter { + id: ID + ids: [ID] + """ + ID of the user that owns this league. + """ + ownerId: ID + afterDate: Timestamp + beforeDate: Timestamp + computedUpdatedAt: Timestamp + name: String + isFeatured: Boolean + hasBannerImages: Boolean + activeShops: Boolean + past: Boolean + published: Boolean + publiclySearchable: Boolean + upcoming: Boolean + videogameIds: [ID] +} + +enum TournamentPaginationSort { + """ + + """ + startAt + """ + + """ + endAt + """ + + """ + eventRegistrationClosesAt + """ + + """ + computedUpdatedAt +} + +""" +A shop +""" +type Shop { + id: ID + levels(query: ShopLevelsQuery): ShopLevelConnection + messages(query: ShopOrderMessagesQuery): ShopOrderMessageConnection + name: String + slug: String + url: String +} + +input ShopLevelsQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String +} + +type ShopLevelConnection { + pageInfo: PageInfo + nodes: [ShopLevel] +} + +""" +A shop level +""" +type ShopLevel { + id: ID + currAmount: Float + description: String + goalAmount: Float + images(type: String): [Image] + name: String +} + +input ShopOrderMessagesQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String +} + +type ShopOrderMessageConnection { + pageInfo: PageInfo + nodes: [ShopOrderMessage] +} + +""" +The message and player info for a shop order +""" +type ShopOrderMessage { + id: ID + """ + The player's gamertag. Returns null if anonymous message type + """ + gamertag: String + """ + The order message + """ + message: String + """ + The player's name. Returns null unless name & tag display is selected + """ + name: String + """ + The player who left the comment + """ + player: Player + """ + The total order amount + """ + total: Float +} + +input TournamentQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: TournamentPageFilter + sort: TournamentPaginationSort +} + +input TournamentPageFilter { + id: ID + ids: [ID] + """ + ID of the user that owns this tournament. + """ + ownerId: ID + """ + If true, filter to only tournaments the currently authed user is an admin of + """ + isCurrentUserAdmin: Boolean + countryCode: String + addrState: String + location: TournamentLocationFilter + afterDate: Timestamp + beforeDate: Timestamp + computedUpdatedAt: Timestamp + name: String + venueName: String + isFeatured: Boolean + isLeague: Boolean + hasBannerImages: Boolean + activeShops: Boolean + regOpen: Boolean + past: Boolean + published: Boolean + publiclySearchable: Boolean + staffPicks: Boolean + hasOnlineEvents: Boolean + topGames: TopGameFilter + upcoming: Boolean + videogameIds: [ID] + sortByScore: Boolean +} + +input TournamentLocationFilter { + """ + Latitude, Longitude + """ + distanceFrom: String + """ + e.g. 50mi + """ + distance: String +} + +input TopGameFilter { + """ + Array of which # top game you want to filter on.e.g. [2, 3] will filter on the 2nd and 3rd top games + """ + gameNums: [Int] +} + +input VideogameQuery { + page: Int = 1 + """ + How many nodes to return for the page. Maximum value of 500 + """ + perPage: Int = 25 + sortBy: String + filter: VideogamePageFilter +} + +input VideogamePageFilter { + id: [ID] + name: String + forUser: ID +} + +type VideogameConnection { + pageInfo: PageInfo + nodes: [Videogame] +} + +type Mutation { + """ + Delete a phase by id + """ + deletePhase(phaseId: ID!): Boolean + """ + Delete a station by id + """ + deleteStation(stationId: ID!): Boolean + """ + Delete a wave by id + """ + deleteWave(waveId: ID!): Boolean + """ + Generate tournament registration Token on behalf of user + """ + generateRegistrationToken(registration: TournamentRegistrationInput!, userId: ID!): String + """ + Update a set to called state + """ + markSetCalled(setId: ID!): Set + """ + Update a set to called state + """ + markSetInProgress(setId: ID!): Set + """ + Register for tournament + """ + registerForTournament(registration: TournamentRegistrationInput, registrationToken: String): Participant + """ + Report set winner or game stats for a H2H bracket set. If winnerId is + supplied, mark set as complete. gameData parameter will overwrite any existing + reported game data. + """ + reportBracketSet(setId: ID!, winnerId: ID, isDQ: Boolean, gameData: [BracketSetGameDataInput]): [Set] + """ + Resets set to initial state, can affect other sets and phase groups + """ + resetSet(setId: ID!, resetDependentSets: Boolean): Set + """ + Automatically attempt to resolve all schedule conflicts. Returns a list of changed seeds + """ + resolveScheduleConflicts(tournamentId: ID!, options: ResolveConflictsOptions): [Seed] + """ + Swap two seed ids in a phase + """ + swapSeeds(phaseId: ID!, seed1Id: ID!, seed2Id: ID!): [Seed] + """ + Update game stats for a H2H bracket set. Set winner cannot be changed with + this function, use the resetSet mutation instead. + """ + updateBracketSet(setId: ID!, winnerId: ID, isDQ: Boolean, gameData: [BracketSetGameDataInput]): Set + """ + Update set of phase groups in a phase + """ + updatePhaseGroups(groupConfigs: [PhaseGroupUpdateInput]!): [PhaseGroup] + """ + Update the seeding for a phase + """ + updatePhaseSeeding(phaseId: ID!, seedMapping: [UpdatePhaseSeedInfo]!, options: UpdatePhaseSeedingOptions): Phase + """ + Create or update a Phase + """ + upsertPhase(phaseId: ID, eventId: ID, payload: PhaseUpsertInput!): Phase + """ + Add or update a station by id + """ + upsertStation(stationId: ID, tournamentId: ID, fields: StationUpsertInput!): Stations + """ + Add or update a wave by id + """ + upsertWave(waveId: ID, tournamentId: ID, fields: WaveUpsertInput!): Wave +} + +input TournamentRegistrationInput { + eventIds: [ID] +} + +""" +Game specific H2H set data such as character, stage, and stock info +""" +input BracketSetGameDataInput { + """ + Entrant ID of game winner + """ + winnerId: ID + """ + Game number + """ + gameNum: Int! + """ + Score for entrant 1 (if applicable). For smash, this is stocks remaining. + """ + entrant1Score: Int + """ + Score for entrant 2 (if applicable). For smash, this is stocks remaining. + """ + entrant2Score: Int + """ + ID of the stage that was played for this game (if applicable) + """ + stageId: ID + """ + List of selections for the game, typically character selections. + """ + selections: [BracketSetGameSelectionInput] +} + +""" +Game specific H2H selections made by the entrants, such as character info +""" +input BracketSetGameSelectionInput { + """ + Entrant ID that made selection + """ + entrantId: ID! + """ + Character selected by this entrant for this game. + """ + characterId: Int +} + +input ResolveConflictsOptions { + lockedSeeds: [ResolveConflictsLockedSeedConfig] +} + +input ResolveConflictsLockedSeedConfig { + eventId: ID! + numSeeds: Int! +} + +input PhaseGroupUpdateInput { + phaseGroupId: ID! + stationId: ID + waveId: ID +} + +input UpdatePhaseSeedInfo { + seedId: ID! + seedNum: ID! + phaseGroupId: ID +} + +input UpdatePhaseSeedingOptions { + """ + Validate that seedMapping exactly accounts for all entrants in the phase + """ + strictMode: Boolean +} + +input PhaseUpsertInput { + """ + The name of the Phase. For example, "Top 8" or "Pools" + """ + name: String + """ + The number of pools to configure for the Phase. Only applies to brackets that support pools + """ + groupCount: Int + bracketType: BracketType +} + +input StationUpsertInput { + number: Int! + clusterId: ID +} + +input WaveUpsertInput { + identifier: String! + startAt: Timestamp! + endAt: Timestamp! +} + +""" +A set of actions available for an entity to take +""" +interface ActionSet { + id: ID +} + +""" +Bracket-specific configuration +""" +interface BracketConfig { + id: ID + bracketType: BracketType +} + +""" +Comparison operator +""" +enum Comparator { + """ + + """ + GREATER_THAN + """ + + """ + GREATER_THAN_OR_EQUAL + """ + + """ + EQUAL + """ + + """ + LESS_THAN_OR_EQUAL + """ + + """ + LESS_THAN +} + +""" +An event-level Team, in the context of some competition +""" +type EventTeam implements Team { + id: ID + """ + Uniquely identifying token for team. Same as the hashed part of the slug + """ + discriminator: String + entrant: Entrant @deprecated(reason: "Use the entrant field off the EventTeam type") + event: Event @deprecated(reason: "Use the event field off the EventTeam type") + globalTeam: GlobalTeam + images(type: String): [Image] + members(status: [TeamMemberStatus]): [TeamMember] + name: String +} + +""" +Global Team +""" +type GlobalTeam implements Team { + id: ID + """ + Uniquely identifying token for team. Same as the hashed part of the slug + """ + discriminator: String + entrant: Entrant @deprecated(reason: "Use the entrant field off the EventTeam type") + event: Event @deprecated(reason: "Use the event field off the EventTeam type") + eventTeams(query: TeamPaginationQuery): EventTeamConnection + images(type: String): [Image] + """ + Leagues-level teams for leagues this team is competing in + """ + leagueTeams(query: TeamPaginationQuery): EventTeamConnection + members(status: [TeamMemberStatus]): [TeamMember] + name: String +} + +type EventTeamConnection { + pageInfo: PageInfo + nodes: [EventTeam] +} + +""" +Match-level configuration +""" +interface MatchConfig { + id: ID + bracketType: BracketType +} + +""" +Different options available for verifying player-reported match results +""" +enum MatchConfigVerificationMethod { + """ + + """ + TWITCH + """ + + """ + STREAM_ME + """ + + """ + ANY + """ + + """ + MIXER + """ + + """ + YOUTUBE +} + +""" +Race specific bracket configuration +""" +type RaceBracketConfig implements BracketConfig { + automaticEndTime: Timestamp + id: ID + automaticStartTime: Timestamp + bracketType: BracketType + goalTargetComparator: Comparator + goalTargetValue: String + limitMode: RaceLimitMode + limitValue: Int + raceType: RaceType +} + +""" +Enforces limits on the amount of allowable Race submissions +""" +enum RaceLimitMode { + """ + + """ + BEST_ALL + """ + + """ + FIRST_ALL + """ + + """ + PLAYTIME +} + +""" +Race type +""" +enum RaceType { + """ + + """ + GOALS + """ + + """ + TIMED +} + +""" +Race specific match configuration +""" +type RaceMatchConfig implements MatchConfig { + id: ID + bracketType: BracketType + """ + Can players report results? + """ + playerReportingEnabled: Boolean + """ + Accepted methods of verification that players can use + """ + verificationMethods: [MatchConfigVerificationMethod] + """ + Are players required to submit verification of their reported results? + """ + verificationRequired: Boolean +} + +""" +A set of actions available for a team to take +""" +type TeamActionSet implements ActionSet { + id: ID +} + diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..bf6dfdd --- /dev/null +++ b/src/main.rs @@ -0,0 +1,181 @@ +extern crate sdl2; +mod smashquery; +mod smashrequest; + + +use sdl2::pixels::{Color, PixelFormatEnum}; +use sdl2::event::Event; +use sdl2::keyboard::Keycode; +use sdl2::rect::Rect; +use sdl2::render::{Canvas, TextureQuery}; +use smashrequest::SmashQueue; + +use std::sync::{Arc, Mutex}; +use std::time::Duration; +use std::fs; +use serde::Deserialize; + + +#[derive(Deserialize,Clone)] +struct Config { + tournament: String, + update: Option, + fullscreen: Option, + smash_key: String, + +} + +impl Config { + fn new() -> Self { + Self { tournament: String::new(), update: Some(1),fullscreen:Some(false), smash_key: String::new() } + } +} + + +pub fn render(canvas : &mut Canvas , queues : &Vec,font : &sdl2::ttf::Font<'_, '_> ){ + + + let texture_creator = canvas.texture_creator(); + let mut backline_text = texture_creator.create_texture_streaming(PixelFormatEnum::RGB24, 1, 1).map_err(|e| e.to_string()).unwrap(); + + backline_text.with_lock(None, |buffer : &mut [u8], pitch: usize| { + buffer[1] = 5; + buffer[1] = 30; + buffer[2] = 66; + }).unwrap(); + + let mut y : u32 = 0; + let mut index = 0; + for sq in queues { + + + let surface = font.render(sq.name.as_str()).blended(Color::RGBA(255, 255, 0, 255)).map_err(|e| e.to_string()).unwrap(); + let text = texture_creator.create_texture_from_surface(&surface).unwrap(); + let textq : TextureQuery = text.query(); + let _ = canvas.copy(&text, None, Rect::new(0, y.try_into().map_err(|_| 0).unwrap(), textq.width, textq.height)); + + y += textq.height+10; + + + for current_match in &sq.matches { + + index += 1; + let switch_col : bool = index%2 == 0; + + let var_name = format!("{} vs {}", ¤t_match.player1, current_match.player2); + let surface = font.render(var_name.as_str()).blended(Color::RGBA(255, 255, 255, 255)).map_err(|e| e.to_string()).unwrap(); + let text = texture_creator.create_texture_from_surface(&surface).unwrap(); + let textq : TextureQuery = text.query(); + + if switch_col { + let _ = canvas.copy(&backline_text, None, Rect::new(0, y.try_into().map_err(|_| 0).unwrap(), canvas.viewport().width(), textq.height)); + } + + + let _ = canvas.copy(&text, None, Rect::new(0, y.try_into().map_err(|e| 0).unwrap(), textq.width, textq.height)); + y += textq.height + 5; + } + + + } + +} + + +pub fn main() -> Result<(), Box> { + println!("Read config"); + let config_file = fs::read_to_string("config.toml"); + + let config : Config = if config_file.is_ok() { + toml::from_str(&config_file.unwrap()).unwrap() + } else { + Config::new() + }; + + println!("{}",config.tournament); + if config.tournament.is_empty(){ + println!("Empty Tournament , Exiting."); + return Ok(()); + } + + let fullscreen = match config.fullscreen { + Some(v) => v, + None => false + }; + + println!("Fullscreen : {}",fullscreen); + println!("Done"); + let test = Arc::new(Mutex::new(Vec::::new())); + + let sdl_context = sdl2::init().unwrap(); + let video_subsystem = sdl_context.video().unwrap(); + + let mut build = video_subsystem.window("LaDOSE-SNCF", 1280, 720); + if fullscreen { + build.fullscreen(); + } + else { + build.position_centered(); + } + let window = build + .build() + .unwrap(); + + let mut canvas: Canvas = window.into_canvas().build().unwrap(); + let ttf_context = sdl2::ttf::init().unwrap(); + let font : sdl2::ttf::Font<'_, '_> = ttf_context.load_font("font/achemine_bold.ttf", 30).unwrap(); + + let stream_queues : Vec= smashrequest::get_matches(config.tournament.as_str(),config.smash_key.as_str()); + + let timer = sdl_context.timer()?; + + + + + + let test_clone = Arc::clone(&test); + + let _timer_cb = &timer.add_timer(1,Box::new(move || { + println!("timer"); + let data = smashrequest::get_matches(config.tournament.as_str(), config.smash_key.as_str()); + println!("{:?}", data); + let mut a = test_clone.lock().unwrap(); + if a.len()>1 { + a.clear(); + } + else{ + a.clone_from(&data); + } + println!("{:?}",a); + return config.update.ok_or(10).unwrap()*1000; + }) + ); + + + canvas.set_draw_color(Color::RGB(0, 255, 255)); + canvas.clear(); + canvas.present(); + let mut event_pump = sdl_context.event_pump().unwrap(); + 'running: loop { + canvas.set_draw_color(Color::RGB(0,136,206)); + canvas.clear(); + let test_c = Arc::clone(&test); + let a = test_c.lock().unwrap(); + render(&mut canvas,&a,&font); + //render(&mut canvas,&stream_queues,&font); + timer.ticks(); + for event in event_pump.poll_iter() { + match event { + Event::Quit {..} | + Event::KeyDown { keycode: Some(Keycode::Escape), .. } => { + break 'running Ok(()); + }, + _ => {} + } + } + // The rest of the game loop goes here... + + canvas.present(); + ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60)); + } +} diff --git a/src/smashquery.rs b/src/smashquery.rs new file mode 100644 index 0000000..b407c65 --- /dev/null +++ b/src/smashquery.rs @@ -0,0 +1,59 @@ +#[cynic::schema("startgg")] +mod schema {} + +#[derive(cynic::QueryVariables, Debug)] +pub struct MyQueryVariables<'a> { + pub slug: Option<&'a str>, +} + +#[derive(cynic::QueryFragment, Debug)] +#[cynic(graphql_type = "Query", variables = "MyQueryVariables")] +pub struct MyQuery { + #[arguments(slug: $slug)] + pub tournament: Option, +} + +#[derive(cynic::Scalar, Debug)] +#[cynic(graphql_type = "ID")] +struct IntegerId(u32); + +#[derive(cynic::QueryFragment, Debug)] +pub struct Tournament { + pub id: Option, + pub name: Option, + pub stream_queue: Option>>, +} + +#[derive(cynic::QueryFragment, Debug)] +pub struct StreamQueue { + pub sets: Option>>, + pub id: Option, + pub stream: Option, +} + +#[derive(cynic::QueryFragment, Debug)] +pub struct Set { + pub id: Option, + pub full_round_text: Option, + pub round: Option, + pub state: Option, + pub total_games: Option, + #[arguments(includeByes: false)] + pub slots: Option>>, +} + +#[derive(cynic::QueryFragment, Debug)] +pub struct SetSlot { + pub entrant: Option, +} + +#[derive(cynic::QueryFragment, Debug)] +pub struct Entrant { + pub id: Option, + pub name: Option, +} + +#[derive(cynic::QueryFragment, Debug)] +pub struct Streams { + pub stream_name: Option, +} diff --git a/src/smashrequest.rs b/src/smashrequest.rs new file mode 100644 index 0000000..6a9579c --- /dev/null +++ b/src/smashrequest.rs @@ -0,0 +1,110 @@ +use crate::smashquery::{MyQuery, MyQueryVariables, Set, SetSlot,StreamQueue}; +use cynic::{http::SurfExt, GraphQlResponse, QueryBuilder}; + +static URL_SMASH: &str = "https://api.start.gg/gql/alpha"; + +#[derive(Debug,Clone)] +pub struct Match { + pub player1 : String, + pub player2 : String, + pub station : String, + pub round : i32, + pub full_round_test: String +} + +#[derive(Debug,Clone)] +pub struct SmashQueue { + pub name : String, + pub matches : Vec +} + +impl Match { + pub fn new() -> Self { + Self { player1: String::from(""), player2: String::from("") , station: String::from("") , round: 0 , full_round_test: String::from("")} + } + +} + +impl SmashQueue{ + pub fn new() -> Self{ + Self { name:String::from(""),matches : vec![] } + } +} +fn request_stream_queue(tournament :&str, key : &str ) -> GraphQlResponse{ + + let resp = async_std::task::block_on(async { + + let query = MyQuery::build(MyQueryVariables + { + slug:Some(tournament) + } ); + + let resp = surf::post(URL_SMASH).header("Authorization", key).run_graphql(query).await.unwrap(); + return resp; + }); + + return resp; + +} + +pub fn get_matches(tournament : &str, key : &str) -> Vec { + let mut queues :Vec = Vec::new(); + let query = request_stream_queue(tournament,key); + let st :Vec = query.data.unwrap() + .tournament.unwrap() + .stream_queue.unwrap().into_iter() + .filter(|x| x.is_some()).map(|x| x.unwrap()).collect(); + + for s in st { + let mut current_queue = SmashQueue { + name : s.stream.unwrap().stream_name.unwrap_or(String::from("Stream Queue Not Named")), + matches : Vec::new() }; + + if s.sets.is_some() { + let sets : Vec = s.sets.unwrap().into_iter().filter(|x| x.is_some()).map(|x| x.unwrap()).collect(); + for set in sets { + + let slot: Vec = set.slots.unwrap().into_iter().filter(|x| x.is_some()).map(|x| x.unwrap()).collect(); + let mut iter = slot.into_iter(); + let p1 = iter.next(); + let p2 = iter.next(); + + + let p1name = match p1 { + Some(x) => match x.entrant { + Some(n) => n.name.unwrap(), + _ => String::new() + }, + _ => String::new() + }; + + + let p2name = match p2 { + Some(x) => match x.entrant { + Some(n) => n.name.unwrap(), + _ => String::new() + }, + _ => String::new() + }; + + + if !(p1name.is_empty() & p2name.is_empty()){ + + let mat = Match { full_round_test : String::from(set.full_round_text.unwrap()) , + player1: String::from(p1name), + player2: String::from(p2name), + round: set.round.unwrap(), + station: String::from("LOL") + }; + + current_queue.matches.push(mat); + } + + } + + } + queues.push(current_queue) + } + return queues; +} +