├── .github └── workflows │ ├── pre.sh │ └── release.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── sounds ├── bf1 │ ├── common.wav │ ├── common_headshot.wav │ └── info.json ├── bf1_special │ ├── common.wav │ ├── common_headshot.wav │ └── info.json ├── crossfire │ ├── 2.wav │ ├── 3.wav │ ├── 4.wav │ ├── 5.wav │ ├── 6.wav │ ├── 7.wav │ ├── 8.wav │ ├── common.wav │ ├── headshot.wav │ └── info.json ├── crossfire_v_fhd │ ├── 2.wav │ ├── 3.wav │ ├── 4.wav │ ├── 5.wav │ ├── 6.wav │ ├── 7.wav │ ├── 8.wav │ └── headshot.wav ├── crossfire_v_sex │ ├── 2.wav │ ├── 3.wav │ ├── 4.wav │ ├── 5.wav │ ├── 6.wav │ ├── 7.wav │ ├── 8.wav │ └── headshot.wav └── valorant │ ├── 1.wav │ ├── 2.wav │ ├── 3.wav │ ├── 4.wav │ ├── 5.wav │ └── info.json └── src ├── main.rs ├── soundpack.rs ├── soundpack ├── preset.rs └── sound.rs ├── util.rs └── util ├── args.rs ├── handler.rs ├── playback.rs ├── signal.rs └── state.rs /.github/workflows/pre.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ "${RUSTTARGET}" != "x86_64-unknown-linux-musl" ]]; then 4 | exit 0 5 | fi 6 | 7 | git clone https://github.com/alsa-project/alsa-lib.git --depth 1 8 | cd alsa-lib 9 | apk add --update --no-cache \ 10 | autoconf \ 11 | automake \ 12 | libtool \ 13 | make \ 14 | gcc \ 15 | g++ \ 16 | linux-headers \ 17 | pkgconf 18 | 19 | libtoolize --force --copy --automake 20 | aclocal 21 | autoheader 22 | automake --foreign --copy --add-missing 23 | autoconf 24 | ./configure --enable-shared=no --enable-static=yes 25 | make -j$(nproc) install -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # .github/workflows/release.yml 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | release: 9 | name: release ${{ matrix.target }} 10 | runs-on: ubuntu-latest 11 | permissions: 12 | contents: write 13 | pull-requests: write 14 | repository-projects: write 15 | strategy: 16 | fail-fast: false 17 | matrix: 18 | target: [x86_64-pc-windows-gnu, x86_64-unknown-linux-musl] 19 | steps: 20 | - uses: actions/checkout@master 21 | - name: Compile and release 22 | uses: rust-build/rust-build.action@v1.4.5 23 | env: 24 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 25 | with: 26 | RUSTTARGET: ${{ matrix.target }} 27 | EXTRA_FILES: "README.md LICENSE sounds/*/*" 28 | TOOLCHAIN_VERSION: "nightly" 29 | PRE_BUILD: ".github/workflows/pre.sh" 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "alsa" 31 | version = "0.9.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" 34 | dependencies = [ 35 | "alsa-sys", 36 | "bitflags 2.9.1", 37 | "cfg-if", 38 | "libc", 39 | ] 40 | 41 | [[package]] 42 | name = "alsa-sys" 43 | version = "0.3.1" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" 46 | dependencies = [ 47 | "libc", 48 | "pkg-config", 49 | ] 50 | 51 | [[package]] 52 | name = "anstream" 53 | version = "0.6.18" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 56 | dependencies = [ 57 | "anstyle", 58 | "anstyle-parse", 59 | "anstyle-query", 60 | "anstyle-wincon", 61 | "colorchoice", 62 | "is_terminal_polyfill", 63 | "utf8parse", 64 | ] 65 | 66 | [[package]] 67 | name = "anstyle" 68 | version = "1.0.10" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 71 | 72 | [[package]] 73 | name = "anstyle-parse" 74 | version = "0.2.6" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 77 | dependencies = [ 78 | "utf8parse", 79 | ] 80 | 81 | [[package]] 82 | name = "anstyle-query" 83 | version = "1.1.2" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 86 | dependencies = [ 87 | "windows-sys 0.59.0", 88 | ] 89 | 90 | [[package]] 91 | name = "anstyle-wincon" 92 | version = "3.0.8" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" 95 | dependencies = [ 96 | "anstyle", 97 | "once_cell_polyfill", 98 | "windows-sys 0.59.0", 99 | ] 100 | 101 | [[package]] 102 | name = "anyhow" 103 | version = "1.0.98" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 106 | 107 | [[package]] 108 | name = "arrayvec" 109 | version = "0.7.6" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 112 | 113 | [[package]] 114 | name = "autocfg" 115 | version = "1.4.0" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 118 | 119 | [[package]] 120 | name = "axum" 121 | version = "0.8.4" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" 124 | dependencies = [ 125 | "axum-core", 126 | "bytes", 127 | "form_urlencoded", 128 | "futures-util", 129 | "http", 130 | "http-body", 131 | "http-body-util", 132 | "hyper", 133 | "hyper-util", 134 | "itoa", 135 | "matchit", 136 | "memchr", 137 | "mime", 138 | "percent-encoding", 139 | "pin-project-lite", 140 | "rustversion", 141 | "serde", 142 | "serde_json", 143 | "serde_path_to_error", 144 | "serde_urlencoded", 145 | "sync_wrapper", 146 | "tokio", 147 | "tower", 148 | "tower-layer", 149 | "tower-service", 150 | "tracing", 151 | ] 152 | 153 | [[package]] 154 | name = "axum-core" 155 | version = "0.5.2" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" 158 | dependencies = [ 159 | "bytes", 160 | "futures-core", 161 | "http", 162 | "http-body", 163 | "http-body-util", 164 | "mime", 165 | "pin-project-lite", 166 | "rustversion", 167 | "sync_wrapper", 168 | "tower-layer", 169 | "tower-service", 170 | "tracing", 171 | ] 172 | 173 | [[package]] 174 | name = "backtrace" 175 | version = "0.3.75" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 178 | dependencies = [ 179 | "addr2line", 180 | "cfg-if", 181 | "libc", 182 | "miniz_oxide", 183 | "object", 184 | "rustc-demangle", 185 | "windows-targets 0.52.6", 186 | ] 187 | 188 | [[package]] 189 | name = "bindgen" 190 | version = "0.70.1" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" 193 | dependencies = [ 194 | "bitflags 2.9.1", 195 | "cexpr", 196 | "clang-sys", 197 | "itertools", 198 | "proc-macro2", 199 | "quote", 200 | "regex", 201 | "rustc-hash", 202 | "shlex", 203 | "syn", 204 | ] 205 | 206 | [[package]] 207 | name = "bitflags" 208 | version = "1.3.2" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 211 | 212 | [[package]] 213 | name = "bitflags" 214 | version = "2.9.1" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 217 | 218 | [[package]] 219 | name = "bumpalo" 220 | version = "3.17.0" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 223 | 224 | [[package]] 225 | name = "bytemuck" 226 | version = "1.23.0" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" 229 | 230 | [[package]] 231 | name = "byteorder" 232 | version = "1.5.0" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 235 | 236 | [[package]] 237 | name = "bytes" 238 | version = "1.10.1" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 241 | 242 | [[package]] 243 | name = "cc" 244 | version = "1.2.25" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" 247 | dependencies = [ 248 | "jobserver", 249 | "libc", 250 | "shlex", 251 | ] 252 | 253 | [[package]] 254 | name = "cesu8" 255 | version = "1.1.0" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 258 | 259 | [[package]] 260 | name = "cexpr" 261 | version = "0.6.0" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 264 | dependencies = [ 265 | "nom", 266 | ] 267 | 268 | [[package]] 269 | name = "cfg-if" 270 | version = "1.0.0" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 273 | 274 | [[package]] 275 | name = "clang-sys" 276 | version = "1.8.1" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 279 | dependencies = [ 280 | "glob", 281 | "libc", 282 | "libloading", 283 | ] 284 | 285 | [[package]] 286 | name = "clap" 287 | version = "4.5.39" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" 290 | dependencies = [ 291 | "clap_builder", 292 | "clap_derive", 293 | ] 294 | 295 | [[package]] 296 | name = "clap_builder" 297 | version = "4.5.39" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" 300 | dependencies = [ 301 | "anstream", 302 | "anstyle", 303 | "clap_lex", 304 | "strsim", 305 | ] 306 | 307 | [[package]] 308 | name = "clap_derive" 309 | version = "4.5.32" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" 312 | dependencies = [ 313 | "heck", 314 | "proc-macro2", 315 | "quote", 316 | "syn", 317 | ] 318 | 319 | [[package]] 320 | name = "clap_lex" 321 | version = "0.7.4" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 324 | 325 | [[package]] 326 | name = "claxon" 327 | version = "0.4.3" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" 330 | 331 | [[package]] 332 | name = "colorchoice" 333 | version = "1.0.3" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 336 | 337 | [[package]] 338 | name = "combine" 339 | version = "4.6.7" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 342 | dependencies = [ 343 | "bytes", 344 | "memchr", 345 | ] 346 | 347 | [[package]] 348 | name = "core-foundation-sys" 349 | version = "0.8.7" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 352 | 353 | [[package]] 354 | name = "coreaudio-rs" 355 | version = "0.11.3" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" 358 | dependencies = [ 359 | "bitflags 1.3.2", 360 | "core-foundation-sys", 361 | "coreaudio-sys", 362 | ] 363 | 364 | [[package]] 365 | name = "coreaudio-sys" 366 | version = "0.2.16" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" 369 | dependencies = [ 370 | "bindgen", 371 | ] 372 | 373 | [[package]] 374 | name = "cpal" 375 | version = "0.15.3" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" 378 | dependencies = [ 379 | "alsa", 380 | "core-foundation-sys", 381 | "coreaudio-rs", 382 | "dasp_sample", 383 | "jni", 384 | "js-sys", 385 | "libc", 386 | "mach2", 387 | "ndk", 388 | "ndk-context", 389 | "oboe", 390 | "wasm-bindgen", 391 | "wasm-bindgen-futures", 392 | "web-sys", 393 | "windows", 394 | ] 395 | 396 | [[package]] 397 | name = "cskillconfirm" 398 | version = "0.1.0" 399 | dependencies = [ 400 | "anyhow", 401 | "axum", 402 | "clap", 403 | "cpal", 404 | "gsi-cs2", 405 | "rodio", 406 | "serde", 407 | "serde_json", 408 | "thiserror 2.0.12", 409 | "tokio", 410 | "tower-http", 411 | "tracing", 412 | "tracing-subscriber", 413 | ] 414 | 415 | [[package]] 416 | name = "dasp_sample" 417 | version = "0.11.0" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" 420 | 421 | [[package]] 422 | name = "either" 423 | version = "1.15.0" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 426 | 427 | [[package]] 428 | name = "encoding_rs" 429 | version = "0.8.35" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 432 | dependencies = [ 433 | "cfg-if", 434 | ] 435 | 436 | [[package]] 437 | name = "equivalent" 438 | version = "1.0.2" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 441 | 442 | [[package]] 443 | name = "fnv" 444 | version = "1.0.7" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 447 | 448 | [[package]] 449 | name = "form_urlencoded" 450 | version = "1.2.1" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 453 | dependencies = [ 454 | "percent-encoding", 455 | ] 456 | 457 | [[package]] 458 | name = "futures-channel" 459 | version = "0.3.31" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 462 | dependencies = [ 463 | "futures-core", 464 | ] 465 | 466 | [[package]] 467 | name = "futures-core" 468 | version = "0.3.31" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 471 | 472 | [[package]] 473 | name = "futures-task" 474 | version = "0.3.31" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 477 | 478 | [[package]] 479 | name = "futures-util" 480 | version = "0.3.31" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 483 | dependencies = [ 484 | "futures-core", 485 | "futures-task", 486 | "pin-project-lite", 487 | "pin-utils", 488 | ] 489 | 490 | [[package]] 491 | name = "getrandom" 492 | version = "0.3.3" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 495 | dependencies = [ 496 | "cfg-if", 497 | "libc", 498 | "r-efi", 499 | "wasi 0.14.2+wasi-0.2.4", 500 | ] 501 | 502 | [[package]] 503 | name = "gimli" 504 | version = "0.31.1" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 507 | 508 | [[package]] 509 | name = "glob" 510 | version = "0.3.2" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 513 | 514 | [[package]] 515 | name = "gsi-cs2" 516 | version = "0.1.1" 517 | source = "git+https://github.com/st0nie/gsi-cs2-rs.git#e8c65a9dbeeffaaa3583a8b5e032c06c411005d7" 518 | dependencies = [ 519 | "serde", 520 | ] 521 | 522 | [[package]] 523 | name = "hashbrown" 524 | version = "0.15.3" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" 527 | 528 | [[package]] 529 | name = "heck" 530 | version = "0.5.0" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 533 | 534 | [[package]] 535 | name = "hound" 536 | version = "3.5.1" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" 539 | 540 | [[package]] 541 | name = "http" 542 | version = "1.3.1" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 545 | dependencies = [ 546 | "bytes", 547 | "fnv", 548 | "itoa", 549 | ] 550 | 551 | [[package]] 552 | name = "http-body" 553 | version = "1.0.1" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 556 | dependencies = [ 557 | "bytes", 558 | "http", 559 | ] 560 | 561 | [[package]] 562 | name = "http-body-util" 563 | version = "0.1.3" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 566 | dependencies = [ 567 | "bytes", 568 | "futures-core", 569 | "http", 570 | "http-body", 571 | "pin-project-lite", 572 | ] 573 | 574 | [[package]] 575 | name = "httparse" 576 | version = "1.10.1" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 579 | 580 | [[package]] 581 | name = "httpdate" 582 | version = "1.0.3" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 585 | 586 | [[package]] 587 | name = "hyper" 588 | version = "1.6.0" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 591 | dependencies = [ 592 | "bytes", 593 | "futures-channel", 594 | "futures-util", 595 | "http", 596 | "http-body", 597 | "httparse", 598 | "httpdate", 599 | "itoa", 600 | "pin-project-lite", 601 | "smallvec", 602 | "tokio", 603 | ] 604 | 605 | [[package]] 606 | name = "hyper-util" 607 | version = "0.1.13" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" 610 | dependencies = [ 611 | "bytes", 612 | "futures-core", 613 | "http", 614 | "http-body", 615 | "hyper", 616 | "pin-project-lite", 617 | "tokio", 618 | "tower-service", 619 | ] 620 | 621 | [[package]] 622 | name = "indexmap" 623 | version = "2.9.0" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 626 | dependencies = [ 627 | "equivalent", 628 | "hashbrown", 629 | ] 630 | 631 | [[package]] 632 | name = "is_terminal_polyfill" 633 | version = "1.70.1" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 636 | 637 | [[package]] 638 | name = "itertools" 639 | version = "0.13.0" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 642 | dependencies = [ 643 | "either", 644 | ] 645 | 646 | [[package]] 647 | name = "itoa" 648 | version = "1.0.15" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 651 | 652 | [[package]] 653 | name = "jni" 654 | version = "0.21.1" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 657 | dependencies = [ 658 | "cesu8", 659 | "cfg-if", 660 | "combine", 661 | "jni-sys", 662 | "log", 663 | "thiserror 1.0.69", 664 | "walkdir", 665 | "windows-sys 0.45.0", 666 | ] 667 | 668 | [[package]] 669 | name = "jni-sys" 670 | version = "0.3.0" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 673 | 674 | [[package]] 675 | name = "jobserver" 676 | version = "0.1.33" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 679 | dependencies = [ 680 | "getrandom", 681 | "libc", 682 | ] 683 | 684 | [[package]] 685 | name = "js-sys" 686 | version = "0.3.77" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 689 | dependencies = [ 690 | "once_cell", 691 | "wasm-bindgen", 692 | ] 693 | 694 | [[package]] 695 | name = "lazy_static" 696 | version = "1.5.0" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 699 | 700 | [[package]] 701 | name = "lewton" 702 | version = "0.10.2" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" 705 | dependencies = [ 706 | "byteorder", 707 | "ogg", 708 | "tinyvec", 709 | ] 710 | 711 | [[package]] 712 | name = "libc" 713 | version = "0.2.172" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 716 | 717 | [[package]] 718 | name = "libloading" 719 | version = "0.8.8" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" 722 | dependencies = [ 723 | "cfg-if", 724 | "windows-targets 0.53.0", 725 | ] 726 | 727 | [[package]] 728 | name = "lock_api" 729 | version = "0.4.13" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 732 | dependencies = [ 733 | "autocfg", 734 | "scopeguard", 735 | ] 736 | 737 | [[package]] 738 | name = "log" 739 | version = "0.4.27" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 742 | 743 | [[package]] 744 | name = "mach2" 745 | version = "0.4.2" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" 748 | dependencies = [ 749 | "libc", 750 | ] 751 | 752 | [[package]] 753 | name = "matchers" 754 | version = "0.1.0" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 757 | dependencies = [ 758 | "regex-automata 0.1.10", 759 | ] 760 | 761 | [[package]] 762 | name = "matchit" 763 | version = "0.8.4" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 766 | 767 | [[package]] 768 | name = "memchr" 769 | version = "2.7.4" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 772 | 773 | [[package]] 774 | name = "mime" 775 | version = "0.3.17" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 778 | 779 | [[package]] 780 | name = "minimal-lexical" 781 | version = "0.2.1" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 784 | 785 | [[package]] 786 | name = "miniz_oxide" 787 | version = "0.8.8" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 790 | dependencies = [ 791 | "adler2", 792 | ] 793 | 794 | [[package]] 795 | name = "mio" 796 | version = "1.0.4" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 799 | dependencies = [ 800 | "libc", 801 | "wasi 0.11.0+wasi-snapshot-preview1", 802 | "windows-sys 0.59.0", 803 | ] 804 | 805 | [[package]] 806 | name = "ndk" 807 | version = "0.8.0" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" 810 | dependencies = [ 811 | "bitflags 2.9.1", 812 | "jni-sys", 813 | "log", 814 | "ndk-sys", 815 | "num_enum", 816 | "thiserror 1.0.69", 817 | ] 818 | 819 | [[package]] 820 | name = "ndk-context" 821 | version = "0.1.1" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 824 | 825 | [[package]] 826 | name = "ndk-sys" 827 | version = "0.5.0+25.2.9519653" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 830 | dependencies = [ 831 | "jni-sys", 832 | ] 833 | 834 | [[package]] 835 | name = "nom" 836 | version = "7.1.3" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 839 | dependencies = [ 840 | "memchr", 841 | "minimal-lexical", 842 | ] 843 | 844 | [[package]] 845 | name = "nu-ansi-term" 846 | version = "0.46.0" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 849 | dependencies = [ 850 | "overload", 851 | "winapi", 852 | ] 853 | 854 | [[package]] 855 | name = "num-derive" 856 | version = "0.4.2" 857 | source = "registry+https://github.com/rust-lang/crates.io-index" 858 | checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 859 | dependencies = [ 860 | "proc-macro2", 861 | "quote", 862 | "syn", 863 | ] 864 | 865 | [[package]] 866 | name = "num-traits" 867 | version = "0.2.19" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 870 | dependencies = [ 871 | "autocfg", 872 | ] 873 | 874 | [[package]] 875 | name = "num_enum" 876 | version = "0.7.3" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 879 | dependencies = [ 880 | "num_enum_derive", 881 | ] 882 | 883 | [[package]] 884 | name = "num_enum_derive" 885 | version = "0.7.3" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 888 | dependencies = [ 889 | "proc-macro-crate", 890 | "proc-macro2", 891 | "quote", 892 | "syn", 893 | ] 894 | 895 | [[package]] 896 | name = "object" 897 | version = "0.36.7" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 900 | dependencies = [ 901 | "memchr", 902 | ] 903 | 904 | [[package]] 905 | name = "oboe" 906 | version = "0.6.1" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" 909 | dependencies = [ 910 | "jni", 911 | "ndk", 912 | "ndk-context", 913 | "num-derive", 914 | "num-traits", 915 | "oboe-sys", 916 | ] 917 | 918 | [[package]] 919 | name = "oboe-sys" 920 | version = "0.6.1" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" 923 | dependencies = [ 924 | "cc", 925 | ] 926 | 927 | [[package]] 928 | name = "ogg" 929 | version = "0.8.0" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" 932 | dependencies = [ 933 | "byteorder", 934 | ] 935 | 936 | [[package]] 937 | name = "once_cell" 938 | version = "1.21.3" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 941 | 942 | [[package]] 943 | name = "once_cell_polyfill" 944 | version = "1.70.1" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 947 | 948 | [[package]] 949 | name = "overload" 950 | version = "0.1.1" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 953 | 954 | [[package]] 955 | name = "parking_lot" 956 | version = "0.12.4" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 959 | dependencies = [ 960 | "lock_api", 961 | "parking_lot_core", 962 | ] 963 | 964 | [[package]] 965 | name = "parking_lot_core" 966 | version = "0.9.11" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 969 | dependencies = [ 970 | "cfg-if", 971 | "libc", 972 | "redox_syscall", 973 | "smallvec", 974 | "windows-targets 0.52.6", 975 | ] 976 | 977 | [[package]] 978 | name = "percent-encoding" 979 | version = "2.3.1" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 982 | 983 | [[package]] 984 | name = "pin-project-lite" 985 | version = "0.2.16" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 988 | 989 | [[package]] 990 | name = "pin-utils" 991 | version = "0.1.0" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 994 | 995 | [[package]] 996 | name = "pkg-config" 997 | version = "0.3.32" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1000 | 1001 | [[package]] 1002 | name = "proc-macro-crate" 1003 | version = "3.3.0" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 1006 | dependencies = [ 1007 | "toml_edit", 1008 | ] 1009 | 1010 | [[package]] 1011 | name = "proc-macro2" 1012 | version = "1.0.95" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1015 | dependencies = [ 1016 | "unicode-ident", 1017 | ] 1018 | 1019 | [[package]] 1020 | name = "quote" 1021 | version = "1.0.40" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1024 | dependencies = [ 1025 | "proc-macro2", 1026 | ] 1027 | 1028 | [[package]] 1029 | name = "r-efi" 1030 | version = "5.2.0" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1033 | 1034 | [[package]] 1035 | name = "redox_syscall" 1036 | version = "0.5.12" 1037 | source = "registry+https://github.com/rust-lang/crates.io-index" 1038 | checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 1039 | dependencies = [ 1040 | "bitflags 2.9.1", 1041 | ] 1042 | 1043 | [[package]] 1044 | name = "regex" 1045 | version = "1.11.1" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1048 | dependencies = [ 1049 | "aho-corasick", 1050 | "memchr", 1051 | "regex-automata 0.4.9", 1052 | "regex-syntax 0.8.5", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "regex-automata" 1057 | version = "0.1.10" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1060 | dependencies = [ 1061 | "regex-syntax 0.6.29", 1062 | ] 1063 | 1064 | [[package]] 1065 | name = "regex-automata" 1066 | version = "0.4.9" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1069 | dependencies = [ 1070 | "aho-corasick", 1071 | "memchr", 1072 | "regex-syntax 0.8.5", 1073 | ] 1074 | 1075 | [[package]] 1076 | name = "regex-syntax" 1077 | version = "0.6.29" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1080 | 1081 | [[package]] 1082 | name = "regex-syntax" 1083 | version = "0.8.5" 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" 1085 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1086 | 1087 | [[package]] 1088 | name = "rodio" 1089 | version = "0.20.1" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "e7ceb6607dd738c99bc8cb28eff249b7cd5c8ec88b9db96c0608c1480d140fb1" 1092 | dependencies = [ 1093 | "claxon", 1094 | "cpal", 1095 | "hound", 1096 | "lewton", 1097 | "symphonia", 1098 | ] 1099 | 1100 | [[package]] 1101 | name = "rustc-demangle" 1102 | version = "0.1.24" 1103 | source = "registry+https://github.com/rust-lang/crates.io-index" 1104 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1105 | 1106 | [[package]] 1107 | name = "rustc-hash" 1108 | version = "1.1.0" 1109 | source = "registry+https://github.com/rust-lang/crates.io-index" 1110 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1111 | 1112 | [[package]] 1113 | name = "rustversion" 1114 | version = "1.0.21" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 1117 | 1118 | [[package]] 1119 | name = "ryu" 1120 | version = "1.0.20" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1123 | 1124 | [[package]] 1125 | name = "same-file" 1126 | version = "1.0.6" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1129 | dependencies = [ 1130 | "winapi-util", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "scopeguard" 1135 | version = "1.2.0" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1138 | 1139 | [[package]] 1140 | name = "serde" 1141 | version = "1.0.219" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1144 | dependencies = [ 1145 | "serde_derive", 1146 | ] 1147 | 1148 | [[package]] 1149 | name = "serde_derive" 1150 | version = "1.0.219" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1153 | dependencies = [ 1154 | "proc-macro2", 1155 | "quote", 1156 | "syn", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "serde_json" 1161 | version = "1.0.140" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1164 | dependencies = [ 1165 | "itoa", 1166 | "memchr", 1167 | "ryu", 1168 | "serde", 1169 | ] 1170 | 1171 | [[package]] 1172 | name = "serde_path_to_error" 1173 | version = "0.1.17" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" 1176 | dependencies = [ 1177 | "itoa", 1178 | "serde", 1179 | ] 1180 | 1181 | [[package]] 1182 | name = "serde_urlencoded" 1183 | version = "0.7.1" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1186 | dependencies = [ 1187 | "form_urlencoded", 1188 | "itoa", 1189 | "ryu", 1190 | "serde", 1191 | ] 1192 | 1193 | [[package]] 1194 | name = "sharded-slab" 1195 | version = "0.1.7" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1198 | dependencies = [ 1199 | "lazy_static", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "shlex" 1204 | version = "1.3.0" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1207 | 1208 | [[package]] 1209 | name = "signal-hook-registry" 1210 | version = "1.4.5" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 1213 | dependencies = [ 1214 | "libc", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "smallvec" 1219 | version = "1.15.0" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 1222 | 1223 | [[package]] 1224 | name = "socket2" 1225 | version = "0.5.10" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 1228 | dependencies = [ 1229 | "libc", 1230 | "windows-sys 0.52.0", 1231 | ] 1232 | 1233 | [[package]] 1234 | name = "strsim" 1235 | version = "0.11.1" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1238 | 1239 | [[package]] 1240 | name = "symphonia" 1241 | version = "0.5.4" 1242 | source = "registry+https://github.com/rust-lang/crates.io-index" 1243 | checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" 1244 | dependencies = [ 1245 | "lazy_static", 1246 | "symphonia-bundle-mp3", 1247 | "symphonia-core", 1248 | "symphonia-metadata", 1249 | ] 1250 | 1251 | [[package]] 1252 | name = "symphonia-bundle-mp3" 1253 | version = "0.5.4" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" 1256 | dependencies = [ 1257 | "lazy_static", 1258 | "log", 1259 | "symphonia-core", 1260 | "symphonia-metadata", 1261 | ] 1262 | 1263 | [[package]] 1264 | name = "symphonia-core" 1265 | version = "0.5.4" 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" 1267 | checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" 1268 | dependencies = [ 1269 | "arrayvec", 1270 | "bitflags 1.3.2", 1271 | "bytemuck", 1272 | "lazy_static", 1273 | "log", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "symphonia-metadata" 1278 | version = "0.5.4" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" 1281 | dependencies = [ 1282 | "encoding_rs", 1283 | "lazy_static", 1284 | "log", 1285 | "symphonia-core", 1286 | ] 1287 | 1288 | [[package]] 1289 | name = "syn" 1290 | version = "2.0.101" 1291 | source = "registry+https://github.com/rust-lang/crates.io-index" 1292 | checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 1293 | dependencies = [ 1294 | "proc-macro2", 1295 | "quote", 1296 | "unicode-ident", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "sync_wrapper" 1301 | version = "1.0.2" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1304 | 1305 | [[package]] 1306 | name = "thiserror" 1307 | version = "1.0.69" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1310 | dependencies = [ 1311 | "thiserror-impl 1.0.69", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "thiserror" 1316 | version = "2.0.12" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 1319 | dependencies = [ 1320 | "thiserror-impl 2.0.12", 1321 | ] 1322 | 1323 | [[package]] 1324 | name = "thiserror-impl" 1325 | version = "1.0.69" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1328 | dependencies = [ 1329 | "proc-macro2", 1330 | "quote", 1331 | "syn", 1332 | ] 1333 | 1334 | [[package]] 1335 | name = "thiserror-impl" 1336 | version = "2.0.12" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 1339 | dependencies = [ 1340 | "proc-macro2", 1341 | "quote", 1342 | "syn", 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "thread_local" 1347 | version = "1.1.8" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1350 | dependencies = [ 1351 | "cfg-if", 1352 | "once_cell", 1353 | ] 1354 | 1355 | [[package]] 1356 | name = "tinyvec" 1357 | version = "1.9.0" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 1360 | dependencies = [ 1361 | "tinyvec_macros", 1362 | ] 1363 | 1364 | [[package]] 1365 | name = "tinyvec_macros" 1366 | version = "0.1.1" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1369 | 1370 | [[package]] 1371 | name = "tokio" 1372 | version = "1.45.1" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" 1375 | dependencies = [ 1376 | "backtrace", 1377 | "bytes", 1378 | "libc", 1379 | "mio", 1380 | "parking_lot", 1381 | "pin-project-lite", 1382 | "signal-hook-registry", 1383 | "socket2", 1384 | "tokio-macros", 1385 | "windows-sys 0.52.0", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "tokio-macros" 1390 | version = "2.5.0" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1393 | dependencies = [ 1394 | "proc-macro2", 1395 | "quote", 1396 | "syn", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "toml_datetime" 1401 | version = "0.6.9" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" 1404 | 1405 | [[package]] 1406 | name = "toml_edit" 1407 | version = "0.22.26" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" 1410 | dependencies = [ 1411 | "indexmap", 1412 | "toml_datetime", 1413 | "winnow", 1414 | ] 1415 | 1416 | [[package]] 1417 | name = "tower" 1418 | version = "0.5.2" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1421 | dependencies = [ 1422 | "futures-core", 1423 | "futures-util", 1424 | "pin-project-lite", 1425 | "sync_wrapper", 1426 | "tokio", 1427 | "tower-layer", 1428 | "tower-service", 1429 | "tracing", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "tower-http" 1434 | version = "0.6.6" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 1437 | dependencies = [ 1438 | "bitflags 2.9.1", 1439 | "bytes", 1440 | "http", 1441 | "http-body", 1442 | "pin-project-lite", 1443 | "tokio", 1444 | "tower-layer", 1445 | "tower-service", 1446 | "tracing", 1447 | ] 1448 | 1449 | [[package]] 1450 | name = "tower-layer" 1451 | version = "0.3.3" 1452 | source = "registry+https://github.com/rust-lang/crates.io-index" 1453 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1454 | 1455 | [[package]] 1456 | name = "tower-service" 1457 | version = "0.3.3" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1460 | 1461 | [[package]] 1462 | name = "tracing" 1463 | version = "0.1.41" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1466 | dependencies = [ 1467 | "log", 1468 | "pin-project-lite", 1469 | "tracing-attributes", 1470 | "tracing-core", 1471 | ] 1472 | 1473 | [[package]] 1474 | name = "tracing-attributes" 1475 | version = "0.1.28" 1476 | source = "registry+https://github.com/rust-lang/crates.io-index" 1477 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 1478 | dependencies = [ 1479 | "proc-macro2", 1480 | "quote", 1481 | "syn", 1482 | ] 1483 | 1484 | [[package]] 1485 | name = "tracing-core" 1486 | version = "0.1.33" 1487 | source = "registry+https://github.com/rust-lang/crates.io-index" 1488 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1489 | dependencies = [ 1490 | "once_cell", 1491 | "valuable", 1492 | ] 1493 | 1494 | [[package]] 1495 | name = "tracing-log" 1496 | version = "0.2.0" 1497 | source = "registry+https://github.com/rust-lang/crates.io-index" 1498 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1499 | dependencies = [ 1500 | "log", 1501 | "once_cell", 1502 | "tracing-core", 1503 | ] 1504 | 1505 | [[package]] 1506 | name = "tracing-subscriber" 1507 | version = "0.3.19" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 1510 | dependencies = [ 1511 | "matchers", 1512 | "nu-ansi-term", 1513 | "once_cell", 1514 | "regex", 1515 | "sharded-slab", 1516 | "smallvec", 1517 | "thread_local", 1518 | "tracing", 1519 | "tracing-core", 1520 | "tracing-log", 1521 | ] 1522 | 1523 | [[package]] 1524 | name = "unicode-ident" 1525 | version = "1.0.18" 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" 1527 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1528 | 1529 | [[package]] 1530 | name = "utf8parse" 1531 | version = "0.2.2" 1532 | source = "registry+https://github.com/rust-lang/crates.io-index" 1533 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1534 | 1535 | [[package]] 1536 | name = "valuable" 1537 | version = "0.1.1" 1538 | source = "registry+https://github.com/rust-lang/crates.io-index" 1539 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 1540 | 1541 | [[package]] 1542 | name = "walkdir" 1543 | version = "2.5.0" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 1546 | dependencies = [ 1547 | "same-file", 1548 | "winapi-util", 1549 | ] 1550 | 1551 | [[package]] 1552 | name = "wasi" 1553 | version = "0.11.0+wasi-snapshot-preview1" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1556 | 1557 | [[package]] 1558 | name = "wasi" 1559 | version = "0.14.2+wasi-0.2.4" 1560 | source = "registry+https://github.com/rust-lang/crates.io-index" 1561 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 1562 | dependencies = [ 1563 | "wit-bindgen-rt", 1564 | ] 1565 | 1566 | [[package]] 1567 | name = "wasm-bindgen" 1568 | version = "0.2.100" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1571 | dependencies = [ 1572 | "cfg-if", 1573 | "once_cell", 1574 | "rustversion", 1575 | "wasm-bindgen-macro", 1576 | ] 1577 | 1578 | [[package]] 1579 | name = "wasm-bindgen-backend" 1580 | version = "0.2.100" 1581 | source = "registry+https://github.com/rust-lang/crates.io-index" 1582 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1583 | dependencies = [ 1584 | "bumpalo", 1585 | "log", 1586 | "proc-macro2", 1587 | "quote", 1588 | "syn", 1589 | "wasm-bindgen-shared", 1590 | ] 1591 | 1592 | [[package]] 1593 | name = "wasm-bindgen-futures" 1594 | version = "0.4.50" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 1597 | dependencies = [ 1598 | "cfg-if", 1599 | "js-sys", 1600 | "once_cell", 1601 | "wasm-bindgen", 1602 | "web-sys", 1603 | ] 1604 | 1605 | [[package]] 1606 | name = "wasm-bindgen-macro" 1607 | version = "0.2.100" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1610 | dependencies = [ 1611 | "quote", 1612 | "wasm-bindgen-macro-support", 1613 | ] 1614 | 1615 | [[package]] 1616 | name = "wasm-bindgen-macro-support" 1617 | version = "0.2.100" 1618 | source = "registry+https://github.com/rust-lang/crates.io-index" 1619 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1620 | dependencies = [ 1621 | "proc-macro2", 1622 | "quote", 1623 | "syn", 1624 | "wasm-bindgen-backend", 1625 | "wasm-bindgen-shared", 1626 | ] 1627 | 1628 | [[package]] 1629 | name = "wasm-bindgen-shared" 1630 | version = "0.2.100" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1633 | dependencies = [ 1634 | "unicode-ident", 1635 | ] 1636 | 1637 | [[package]] 1638 | name = "web-sys" 1639 | version = "0.3.77" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1642 | dependencies = [ 1643 | "js-sys", 1644 | "wasm-bindgen", 1645 | ] 1646 | 1647 | [[package]] 1648 | name = "winapi" 1649 | version = "0.3.9" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1652 | dependencies = [ 1653 | "winapi-i686-pc-windows-gnu", 1654 | "winapi-x86_64-pc-windows-gnu", 1655 | ] 1656 | 1657 | [[package]] 1658 | name = "winapi-i686-pc-windows-gnu" 1659 | version = "0.4.0" 1660 | source = "registry+https://github.com/rust-lang/crates.io-index" 1661 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1662 | 1663 | [[package]] 1664 | name = "winapi-util" 1665 | version = "0.1.9" 1666 | source = "registry+https://github.com/rust-lang/crates.io-index" 1667 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 1668 | dependencies = [ 1669 | "windows-sys 0.59.0", 1670 | ] 1671 | 1672 | [[package]] 1673 | name = "winapi-x86_64-pc-windows-gnu" 1674 | version = "0.4.0" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1677 | 1678 | [[package]] 1679 | name = "windows" 1680 | version = "0.54.0" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" 1683 | dependencies = [ 1684 | "windows-core", 1685 | "windows-targets 0.52.6", 1686 | ] 1687 | 1688 | [[package]] 1689 | name = "windows-core" 1690 | version = "0.54.0" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" 1693 | dependencies = [ 1694 | "windows-result", 1695 | "windows-targets 0.52.6", 1696 | ] 1697 | 1698 | [[package]] 1699 | name = "windows-result" 1700 | version = "0.1.2" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" 1703 | dependencies = [ 1704 | "windows-targets 0.52.6", 1705 | ] 1706 | 1707 | [[package]] 1708 | name = "windows-sys" 1709 | version = "0.45.0" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 1712 | dependencies = [ 1713 | "windows-targets 0.42.2", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "windows-sys" 1718 | version = "0.52.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1721 | dependencies = [ 1722 | "windows-targets 0.52.6", 1723 | ] 1724 | 1725 | [[package]] 1726 | name = "windows-sys" 1727 | version = "0.59.0" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1730 | dependencies = [ 1731 | "windows-targets 0.52.6", 1732 | ] 1733 | 1734 | [[package]] 1735 | name = "windows-targets" 1736 | version = "0.42.2" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 1739 | dependencies = [ 1740 | "windows_aarch64_gnullvm 0.42.2", 1741 | "windows_aarch64_msvc 0.42.2", 1742 | "windows_i686_gnu 0.42.2", 1743 | "windows_i686_msvc 0.42.2", 1744 | "windows_x86_64_gnu 0.42.2", 1745 | "windows_x86_64_gnullvm 0.42.2", 1746 | "windows_x86_64_msvc 0.42.2", 1747 | ] 1748 | 1749 | [[package]] 1750 | name = "windows-targets" 1751 | version = "0.52.6" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1754 | dependencies = [ 1755 | "windows_aarch64_gnullvm 0.52.6", 1756 | "windows_aarch64_msvc 0.52.6", 1757 | "windows_i686_gnu 0.52.6", 1758 | "windows_i686_gnullvm 0.52.6", 1759 | "windows_i686_msvc 0.52.6", 1760 | "windows_x86_64_gnu 0.52.6", 1761 | "windows_x86_64_gnullvm 0.52.6", 1762 | "windows_x86_64_msvc 0.52.6", 1763 | ] 1764 | 1765 | [[package]] 1766 | name = "windows-targets" 1767 | version = "0.53.0" 1768 | source = "registry+https://github.com/rust-lang/crates.io-index" 1769 | checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" 1770 | dependencies = [ 1771 | "windows_aarch64_gnullvm 0.53.0", 1772 | "windows_aarch64_msvc 0.53.0", 1773 | "windows_i686_gnu 0.53.0", 1774 | "windows_i686_gnullvm 0.53.0", 1775 | "windows_i686_msvc 0.53.0", 1776 | "windows_x86_64_gnu 0.53.0", 1777 | "windows_x86_64_gnullvm 0.53.0", 1778 | "windows_x86_64_msvc 0.53.0", 1779 | ] 1780 | 1781 | [[package]] 1782 | name = "windows_aarch64_gnullvm" 1783 | version = "0.42.2" 1784 | source = "registry+https://github.com/rust-lang/crates.io-index" 1785 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 1786 | 1787 | [[package]] 1788 | name = "windows_aarch64_gnullvm" 1789 | version = "0.52.6" 1790 | source = "registry+https://github.com/rust-lang/crates.io-index" 1791 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1792 | 1793 | [[package]] 1794 | name = "windows_aarch64_gnullvm" 1795 | version = "0.53.0" 1796 | source = "registry+https://github.com/rust-lang/crates.io-index" 1797 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 1798 | 1799 | [[package]] 1800 | name = "windows_aarch64_msvc" 1801 | version = "0.42.2" 1802 | source = "registry+https://github.com/rust-lang/crates.io-index" 1803 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 1804 | 1805 | [[package]] 1806 | name = "windows_aarch64_msvc" 1807 | version = "0.52.6" 1808 | source = "registry+https://github.com/rust-lang/crates.io-index" 1809 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1810 | 1811 | [[package]] 1812 | name = "windows_aarch64_msvc" 1813 | version = "0.53.0" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 1816 | 1817 | [[package]] 1818 | name = "windows_i686_gnu" 1819 | version = "0.42.2" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 1822 | 1823 | [[package]] 1824 | name = "windows_i686_gnu" 1825 | version = "0.52.6" 1826 | source = "registry+https://github.com/rust-lang/crates.io-index" 1827 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1828 | 1829 | [[package]] 1830 | name = "windows_i686_gnu" 1831 | version = "0.53.0" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 1834 | 1835 | [[package]] 1836 | name = "windows_i686_gnullvm" 1837 | version = "0.52.6" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1840 | 1841 | [[package]] 1842 | name = "windows_i686_gnullvm" 1843 | version = "0.53.0" 1844 | source = "registry+https://github.com/rust-lang/crates.io-index" 1845 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 1846 | 1847 | [[package]] 1848 | name = "windows_i686_msvc" 1849 | version = "0.42.2" 1850 | source = "registry+https://github.com/rust-lang/crates.io-index" 1851 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 1852 | 1853 | [[package]] 1854 | name = "windows_i686_msvc" 1855 | version = "0.52.6" 1856 | source = "registry+https://github.com/rust-lang/crates.io-index" 1857 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1858 | 1859 | [[package]] 1860 | name = "windows_i686_msvc" 1861 | version = "0.53.0" 1862 | source = "registry+https://github.com/rust-lang/crates.io-index" 1863 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 1864 | 1865 | [[package]] 1866 | name = "windows_x86_64_gnu" 1867 | version = "0.42.2" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 1870 | 1871 | [[package]] 1872 | name = "windows_x86_64_gnu" 1873 | version = "0.52.6" 1874 | source = "registry+https://github.com/rust-lang/crates.io-index" 1875 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1876 | 1877 | [[package]] 1878 | name = "windows_x86_64_gnu" 1879 | version = "0.53.0" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 1882 | 1883 | [[package]] 1884 | name = "windows_x86_64_gnullvm" 1885 | version = "0.42.2" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 1888 | 1889 | [[package]] 1890 | name = "windows_x86_64_gnullvm" 1891 | version = "0.52.6" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1894 | 1895 | [[package]] 1896 | name = "windows_x86_64_gnullvm" 1897 | version = "0.53.0" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 1900 | 1901 | [[package]] 1902 | name = "windows_x86_64_msvc" 1903 | version = "0.42.2" 1904 | source = "registry+https://github.com/rust-lang/crates.io-index" 1905 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 1906 | 1907 | [[package]] 1908 | name = "windows_x86_64_msvc" 1909 | version = "0.52.6" 1910 | source = "registry+https://github.com/rust-lang/crates.io-index" 1911 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1912 | 1913 | [[package]] 1914 | name = "windows_x86_64_msvc" 1915 | version = "0.53.0" 1916 | source = "registry+https://github.com/rust-lang/crates.io-index" 1917 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 1918 | 1919 | [[package]] 1920 | name = "winnow" 1921 | version = "0.7.10" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" 1924 | dependencies = [ 1925 | "memchr", 1926 | ] 1927 | 1928 | [[package]] 1929 | name = "wit-bindgen-rt" 1930 | version = "0.39.0" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 1933 | dependencies = [ 1934 | "bitflags 2.9.1", 1935 | ] 1936 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "cskillconfirm" 3 | version = "0.1.0" 4 | edition = "2024" 5 | 6 | [profile.release] 7 | opt-level = 3 8 | debug = false 9 | debug-assertions = false 10 | overflow-checks = false 11 | strip = true 12 | lto = true 13 | codegen-units = 1 14 | panic = 'abort' 15 | incremental = false 16 | rpath = false 17 | 18 | [dependencies] 19 | anyhow = "1.0.97" 20 | axum = "0.8.1" 21 | clap = { version = "4.5.32", features = ["derive"] } 22 | cpal = "0.15.3" 23 | gsi-cs2 = { git = "https://github.com/st0nie/gsi-cs2-rs.git" } 24 | rodio = "0.20.1" 25 | serde = { version = "1.0.219", features = ["derive"] } 26 | serde_json = "1.0.87" 27 | thiserror = "2.0.12" 28 | tokio = { version = "1.21.2", features = ["rt-multi-thread", "macros", "full"] } 29 | tower-http = { version = "0.6.2", features = ["timeout", "trace"] } 30 | tracing = "0.1.41" 31 | tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU AFFERO GENERAL PUBLIC LICENSE 2 | Version 3, 19 November 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU Affero General Public License is a free, copyleft license for 11 | software and other kinds of works, specifically designed to ensure 12 | cooperation with the community in the case of network server software. 13 | 14 | The licenses for most software and other practical works are designed 15 | to take away your freedom to share and change the works. By contrast, 16 | our General Public Licenses are intended to guarantee your freedom to 17 | share and change all versions of a program--to make sure it remains free 18 | software for all its users. 19 | 20 | When we speak of free software, we are referring to freedom, not 21 | price. Our General Public Licenses are designed to make sure that you 22 | have the freedom to distribute copies of free software (and charge for 23 | them if you wish), that you receive source code or can get it if you 24 | want it, that you can change the software or use pieces of it in new 25 | free programs, and that you know you can do these things. 26 | 27 | Developers that use our General Public Licenses protect your rights 28 | with two steps: (1) assert copyright on the software, and (2) offer 29 | you this License which gives you legal permission to copy, distribute 30 | and/or modify the software. 31 | 32 | A secondary benefit of defending all users' freedom is that 33 | improvements made in alternate versions of the program, if they 34 | receive widespread use, become available for other developers to 35 | incorporate. Many developers of free software are heartened and 36 | encouraged by the resulting cooperation. However, in the case of 37 | software used on network servers, this result may fail to come about. 38 | The GNU General Public License permits making a modified version and 39 | letting the public access it on a server without ever releasing its 40 | source code to the public. 41 | 42 | The GNU Affero General Public License is designed specifically to 43 | ensure that, in such cases, the modified source code becomes available 44 | to the community. It requires the operator of a network server to 45 | provide the source code of the modified version running there to the 46 | users of that server. Therefore, public use of a modified version, on 47 | a publicly accessible server, gives the public access to the source 48 | code of the modified version. 49 | 50 | An older license, called the Affero General Public License and 51 | published by Affero, was designed to accomplish similar goals. This is 52 | a different license, not a version of the Affero GPL, but Affero has 53 | released a new version of the Affero GPL which permits relicensing under 54 | this license. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | TERMS AND CONDITIONS 60 | 61 | 0. Definitions. 62 | 63 | "This License" refers to version 3 of the GNU Affero General Public License. 64 | 65 | "Copyright" also means copyright-like laws that apply to other kinds of 66 | works, such as semiconductor masks. 67 | 68 | "The Program" refers to any copyrightable work licensed under this 69 | License. Each licensee is addressed as "you". "Licensees" and 70 | "recipients" may be individuals or organizations. 71 | 72 | To "modify" a work means to copy from or adapt all or part of the work 73 | in a fashion requiring copyright permission, other than the making of an 74 | exact copy. The resulting work is called a "modified version" of the 75 | earlier work or a work "based on" the earlier work. 76 | 77 | A "covered work" means either the unmodified Program or a work based 78 | on the Program. 79 | 80 | To "propagate" a work means to do anything with it that, without 81 | permission, would make you directly or secondarily liable for 82 | infringement under applicable copyright law, except executing it on a 83 | computer or modifying a private copy. Propagation includes copying, 84 | distribution (with or without modification), making available to the 85 | public, and in some countries other activities as well. 86 | 87 | To "convey" a work means any kind of propagation that enables other 88 | parties to make or receive copies. Mere interaction with a user through 89 | a computer network, with no transfer of a copy, is not conveying. 90 | 91 | An interactive user interface displays "Appropriate Legal Notices" 92 | to the extent that it includes a convenient and prominently visible 93 | feature that (1) displays an appropriate copyright notice, and (2) 94 | tells the user that there is no warranty for the work (except to the 95 | extent that warranties are provided), that licensees may convey the 96 | work under this License, and how to view a copy of this License. If 97 | the interface presents a list of user commands or options, such as a 98 | menu, a prominent item in the list meets this criterion. 99 | 100 | 1. Source Code. 101 | 102 | The "source code" for a work means the preferred form of the work 103 | for making modifications to it. "Object code" means any non-source 104 | form of a work. 105 | 106 | A "Standard Interface" means an interface that either is an official 107 | standard defined by a recognized standards body, or, in the case of 108 | interfaces specified for a particular programming language, one that 109 | is widely used among developers working in that language. 110 | 111 | The "System Libraries" of an executable work include anything, other 112 | than the work as a whole, that (a) is included in the normal form of 113 | packaging a Major Component, but which is not part of that Major 114 | Component, and (b) serves only to enable use of the work with that 115 | Major Component, or to implement a Standard Interface for which an 116 | implementation is available to the public in source code form. A 117 | "Major Component", in this context, means a major essential component 118 | (kernel, window system, and so on) of the specific operating system 119 | (if any) on which the executable work runs, or a compiler used to 120 | produce the work, or an object code interpreter used to run it. 121 | 122 | The "Corresponding Source" for a work in object code form means all 123 | the source code needed to generate, install, and (for an executable 124 | work) run the object code and to modify the work, including scripts to 125 | control those activities. However, it does not include the work's 126 | System Libraries, or general-purpose tools or generally available free 127 | programs which are used unmodified in performing those activities but 128 | which are not part of the work. For example, Corresponding Source 129 | includes interface definition files associated with source files for 130 | the work, and the source code for shared libraries and dynamically 131 | linked subprograms that the work is specifically designed to require, 132 | such as by intimate data communication or control flow between those 133 | subprograms and other parts of the work. 134 | 135 | The Corresponding Source need not include anything that users 136 | can regenerate automatically from other parts of the Corresponding 137 | Source. 138 | 139 | The Corresponding Source for a work in source code form is that 140 | same work. 141 | 142 | 2. Basic Permissions. 143 | 144 | All rights granted under this License are granted for the term of 145 | copyright on the Program, and are irrevocable provided the stated 146 | conditions are met. This License explicitly affirms your unlimited 147 | permission to run the unmodified Program. The output from running a 148 | covered work is covered by this License only if the output, given its 149 | content, constitutes a covered work. This License acknowledges your 150 | rights of fair use or other equivalent, as provided by copyright law. 151 | 152 | You may make, run and propagate covered works that you do not 153 | convey, without conditions so long as your license otherwise remains 154 | in force. You may convey covered works to others for the sole purpose 155 | of having them make modifications exclusively for you, or provide you 156 | with facilities for running those works, provided that you comply with 157 | the terms of this License in conveying all material for which you do 158 | not control copyright. Those thus making or running the covered works 159 | for you must do so exclusively on your behalf, under your direction 160 | and control, on terms that prohibit them from making any copies of 161 | your copyrighted material outside their relationship with you. 162 | 163 | Conveying under any other circumstances is permitted solely under 164 | the conditions stated below. Sublicensing is not allowed; section 10 165 | makes it unnecessary. 166 | 167 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 168 | 169 | No covered work shall be deemed part of an effective technological 170 | measure under any applicable law fulfilling obligations under article 171 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 172 | similar laws prohibiting or restricting circumvention of such 173 | measures. 174 | 175 | When you convey a covered work, you waive any legal power to forbid 176 | circumvention of technological measures to the extent such circumvention 177 | is effected by exercising rights under this License with respect to 178 | the covered work, and you disclaim any intention to limit operation or 179 | modification of the work as a means of enforcing, against the work's 180 | users, your or third parties' legal rights to forbid circumvention of 181 | technological measures. 182 | 183 | 4. Conveying Verbatim Copies. 184 | 185 | You may convey verbatim copies of the Program's source code as you 186 | receive it, in any medium, provided that you conspicuously and 187 | appropriately publish on each copy an appropriate copyright notice; 188 | keep intact all notices stating that this License and any 189 | non-permissive terms added in accord with section 7 apply to the code; 190 | keep intact all notices of the absence of any warranty; and give all 191 | recipients a copy of this License along with the Program. 192 | 193 | You may charge any price or no price for each copy that you convey, 194 | and you may offer support or warranty protection for a fee. 195 | 196 | 5. Conveying Modified Source Versions. 197 | 198 | You may convey a work based on the Program, or the modifications to 199 | produce it from the Program, in the form of source code under the 200 | terms of section 4, provided that you also meet all of these conditions: 201 | 202 | a) The work must carry prominent notices stating that you modified 203 | it, and giving a relevant date. 204 | 205 | b) The work must carry prominent notices stating that it is 206 | released under this License and any conditions added under section 207 | 7. This requirement modifies the requirement in section 4 to 208 | "keep intact all notices". 209 | 210 | c) You must license the entire work, as a whole, under this 211 | License to anyone who comes into possession of a copy. This 212 | License will therefore apply, along with any applicable section 7 213 | additional terms, to the whole of the work, and all its parts, 214 | regardless of how they are packaged. This License gives no 215 | permission to license the work in any other way, but it does not 216 | invalidate such permission if you have separately received it. 217 | 218 | d) If the work has interactive user interfaces, each must display 219 | Appropriate Legal Notices; however, if the Program has interactive 220 | interfaces that do not display Appropriate Legal Notices, your 221 | work need not make them do so. 222 | 223 | A compilation of a covered work with other separate and independent 224 | works, which are not by their nature extensions of the covered work, 225 | and which are not combined with it such as to form a larger program, 226 | in or on a volume of a storage or distribution medium, is called an 227 | "aggregate" if the compilation and its resulting copyright are not 228 | used to limit the access or legal rights of the compilation's users 229 | beyond what the individual works permit. Inclusion of a covered work 230 | in an aggregate does not cause this License to apply to the other 231 | parts of the aggregate. 232 | 233 | 6. Conveying Non-Source Forms. 234 | 235 | You may convey a covered work in object code form under the terms 236 | of sections 4 and 5, provided that you also convey the 237 | machine-readable Corresponding Source under the terms of this License, 238 | in one of these ways: 239 | 240 | a) Convey the object code in, or embodied in, a physical product 241 | (including a physical distribution medium), accompanied by the 242 | Corresponding Source fixed on a durable physical medium 243 | customarily used for software interchange. 244 | 245 | b) Convey the object code in, or embodied in, a physical product 246 | (including a physical distribution medium), accompanied by a 247 | written offer, valid for at least three years and valid for as 248 | long as you offer spare parts or customer support for that product 249 | model, to give anyone who possesses the object code either (1) a 250 | copy of the Corresponding Source for all the software in the 251 | product that is covered by this License, on a durable physical 252 | medium customarily used for software interchange, for a price no 253 | more than your reasonable cost of physically performing this 254 | conveying of source, or (2) access to copy the 255 | Corresponding Source from a network server at no charge. 256 | 257 | c) Convey individual copies of the object code with a copy of the 258 | written offer to provide the Corresponding Source. This 259 | alternative is allowed only occasionally and noncommercially, and 260 | only if you received the object code with such an offer, in accord 261 | with subsection 6b. 262 | 263 | d) Convey the object code by offering access from a designated 264 | place (gratis or for a charge), and offer equivalent access to the 265 | Corresponding Source in the same way through the same place at no 266 | further charge. You need not require recipients to copy the 267 | Corresponding Source along with the object code. If the place to 268 | copy the object code is a network server, the Corresponding Source 269 | may be on a different server (operated by you or a third party) 270 | that supports equivalent copying facilities, provided you maintain 271 | clear directions next to the object code saying where to find the 272 | Corresponding Source. Regardless of what server hosts the 273 | Corresponding Source, you remain obligated to ensure that it is 274 | available for as long as needed to satisfy these requirements. 275 | 276 | e) Convey the object code using peer-to-peer transmission, provided 277 | you inform other peers where the object code and Corresponding 278 | Source of the work are being offered to the general public at no 279 | charge under subsection 6d. 280 | 281 | A separable portion of the object code, whose source code is excluded 282 | from the Corresponding Source as a System Library, need not be 283 | included in conveying the object code work. 284 | 285 | A "User Product" is either (1) a "consumer product", which means any 286 | tangible personal property which is normally used for personal, family, 287 | or household purposes, or (2) anything designed or sold for incorporation 288 | into a dwelling. In determining whether a product is a consumer product, 289 | doubtful cases shall be resolved in favor of coverage. For a particular 290 | product received by a particular user, "normally used" refers to a 291 | typical or common use of that class of product, regardless of the status 292 | of the particular user or of the way in which the particular user 293 | actually uses, or expects or is expected to use, the product. A product 294 | is a consumer product regardless of whether the product has substantial 295 | commercial, industrial or non-consumer uses, unless such uses represent 296 | the only significant mode of use of the product. 297 | 298 | "Installation Information" for a User Product means any methods, 299 | procedures, authorization keys, or other information required to install 300 | and execute modified versions of a covered work in that User Product from 301 | a modified version of its Corresponding Source. The information must 302 | suffice to ensure that the continued functioning of the modified object 303 | code is in no case prevented or interfered with solely because 304 | modification has been made. 305 | 306 | If you convey an object code work under this section in, or with, or 307 | specifically for use in, a User Product, and the conveying occurs as 308 | part of a transaction in which the right of possession and use of the 309 | User Product is transferred to the recipient in perpetuity or for a 310 | fixed term (regardless of how the transaction is characterized), the 311 | Corresponding Source conveyed under this section must be accompanied 312 | by the Installation Information. But this requirement does not apply 313 | if neither you nor any third party retains the ability to install 314 | modified object code on the User Product (for example, the work has 315 | been installed in ROM). 316 | 317 | The requirement to provide Installation Information does not include a 318 | requirement to continue to provide support service, warranty, or updates 319 | for a work that has been modified or installed by the recipient, or for 320 | the User Product in which it has been modified or installed. Access to a 321 | network may be denied when the modification itself materially and 322 | adversely affects the operation of the network or violates the rules and 323 | protocols for communication across the network. 324 | 325 | Corresponding Source conveyed, and Installation Information provided, 326 | in accord with this section must be in a format that is publicly 327 | documented (and with an implementation available to the public in 328 | source code form), and must require no special password or key for 329 | unpacking, reading or copying. 330 | 331 | 7. Additional Terms. 332 | 333 | "Additional permissions" are terms that supplement the terms of this 334 | License by making exceptions from one or more of its conditions. 335 | Additional permissions that are applicable to the entire Program shall 336 | be treated as though they were included in this License, to the extent 337 | that they are valid under applicable law. If additional permissions 338 | apply only to part of the Program, that part may be used separately 339 | under those permissions, but the entire Program remains governed by 340 | this License without regard to the additional permissions. 341 | 342 | When you convey a copy of a covered work, you may at your option 343 | remove any additional permissions from that copy, or from any part of 344 | it. (Additional permissions may be written to require their own 345 | removal in certain cases when you modify the work.) You may place 346 | additional permissions on material, added by you to a covered work, 347 | for which you have or can give appropriate copyright permission. 348 | 349 | Notwithstanding any other provision of this License, for material you 350 | add to a covered work, you may (if authorized by the copyright holders of 351 | that material) supplement the terms of this License with terms: 352 | 353 | a) Disclaiming warranty or limiting liability differently from the 354 | terms of sections 15 and 16 of this License; or 355 | 356 | b) Requiring preservation of specified reasonable legal notices or 357 | author attributions in that material or in the Appropriate Legal 358 | Notices displayed by works containing it; or 359 | 360 | c) Prohibiting misrepresentation of the origin of that material, or 361 | requiring that modified versions of such material be marked in 362 | reasonable ways as different from the original version; or 363 | 364 | d) Limiting the use for publicity purposes of names of licensors or 365 | authors of the material; or 366 | 367 | e) Declining to grant rights under trademark law for use of some 368 | trade names, trademarks, or service marks; or 369 | 370 | f) Requiring indemnification of licensors and authors of that 371 | material by anyone who conveys the material (or modified versions of 372 | it) with contractual assumptions of liability to the recipient, for 373 | any liability that these contractual assumptions directly impose on 374 | those licensors and authors. 375 | 376 | All other non-permissive additional terms are considered "further 377 | restrictions" within the meaning of section 10. If the Program as you 378 | received it, or any part of it, contains a notice stating that it is 379 | governed by this License along with a term that is a further 380 | restriction, you may remove that term. If a license document contains 381 | a further restriction but permits relicensing or conveying under this 382 | License, you may add to a covered work material governed by the terms 383 | of that license document, provided that the further restriction does 384 | not survive such relicensing or conveying. 385 | 386 | If you add terms to a covered work in accord with this section, you 387 | must place, in the relevant source files, a statement of the 388 | additional terms that apply to those files, or a notice indicating 389 | where to find the applicable terms. 390 | 391 | Additional terms, permissive or non-permissive, may be stated in the 392 | form of a separately written license, or stated as exceptions; 393 | the above requirements apply either way. 394 | 395 | 8. Termination. 396 | 397 | You may not propagate or modify a covered work except as expressly 398 | provided under this License. Any attempt otherwise to propagate or 399 | modify it is void, and will automatically terminate your rights under 400 | this License (including any patent licenses granted under the third 401 | paragraph of section 11). 402 | 403 | However, if you cease all violation of this License, then your 404 | license from a particular copyright holder is reinstated (a) 405 | provisionally, unless and until the copyright holder explicitly and 406 | finally terminates your license, and (b) permanently, if the copyright 407 | holder fails to notify you of the violation by some reasonable means 408 | prior to 60 days after the cessation. 409 | 410 | Moreover, your license from a particular copyright holder is 411 | reinstated permanently if the copyright holder notifies you of the 412 | violation by some reasonable means, this is the first time you have 413 | received notice of violation of this License (for any work) from that 414 | copyright holder, and you cure the violation prior to 30 days after 415 | your receipt of the notice. 416 | 417 | Termination of your rights under this section does not terminate the 418 | licenses of parties who have received copies or rights from you under 419 | this License. If your rights have been terminated and not permanently 420 | reinstated, you do not qualify to receive new licenses for the same 421 | material under section 10. 422 | 423 | 9. Acceptance Not Required for Having Copies. 424 | 425 | You are not required to accept this License in order to receive or 426 | run a copy of the Program. Ancillary propagation of a covered work 427 | occurring solely as a consequence of using peer-to-peer transmission 428 | to receive a copy likewise does not require acceptance. However, 429 | nothing other than this License grants you permission to propagate or 430 | modify any covered work. These actions infringe copyright if you do 431 | not accept this License. Therefore, by modifying or propagating a 432 | covered work, you indicate your acceptance of this License to do so. 433 | 434 | 10. Automatic Licensing of Downstream Recipients. 435 | 436 | Each time you convey a covered work, the recipient automatically 437 | receives a license from the original licensors, to run, modify and 438 | propagate that work, subject to this License. You are not responsible 439 | for enforcing compliance by third parties with this License. 440 | 441 | An "entity transaction" is a transaction transferring control of an 442 | organization, or substantially all assets of one, or subdividing an 443 | organization, or merging organizations. If propagation of a covered 444 | work results from an entity transaction, each party to that 445 | transaction who receives a copy of the work also receives whatever 446 | licenses to the work the party's predecessor in interest had or could 447 | give under the previous paragraph, plus a right to possession of the 448 | Corresponding Source of the work from the predecessor in interest, if 449 | the predecessor has it or can get it with reasonable efforts. 450 | 451 | You may not impose any further restrictions on the exercise of the 452 | rights granted or affirmed under this License. For example, you may 453 | not impose a license fee, royalty, or other charge for exercise of 454 | rights granted under this License, and you may not initiate litigation 455 | (including a cross-claim or counterclaim in a lawsuit) alleging that 456 | any patent claim is infringed by making, using, selling, offering for 457 | sale, or importing the Program or any portion of it. 458 | 459 | 11. Patents. 460 | 461 | A "contributor" is a copyright holder who authorizes use under this 462 | License of the Program or a work on which the Program is based. The 463 | work thus licensed is called the contributor's "contributor version". 464 | 465 | A contributor's "essential patent claims" are all patent claims 466 | owned or controlled by the contributor, whether already acquired or 467 | hereafter acquired, that would be infringed by some manner, permitted 468 | by this License, of making, using, or selling its contributor version, 469 | but do not include claims that would be infringed only as a 470 | consequence of further modification of the contributor version. For 471 | purposes of this definition, "control" includes the right to grant 472 | patent sublicenses in a manner consistent with the requirements of 473 | this License. 474 | 475 | Each contributor grants you a non-exclusive, worldwide, royalty-free 476 | patent license under the contributor's essential patent claims, to 477 | make, use, sell, offer for sale, import and otherwise run, modify and 478 | propagate the contents of its contributor version. 479 | 480 | In the following three paragraphs, a "patent license" is any express 481 | agreement or commitment, however denominated, not to enforce a patent 482 | (such as an express permission to practice a patent or covenant not to 483 | sue for patent infringement). To "grant" such a patent license to a 484 | party means to make such an agreement or commitment not to enforce a 485 | patent against the party. 486 | 487 | If you convey a covered work, knowingly relying on a patent license, 488 | and the Corresponding Source of the work is not available for anyone 489 | to copy, free of charge and under the terms of this License, through a 490 | publicly available network server or other readily accessible means, 491 | then you must either (1) cause the Corresponding Source to be so 492 | available, or (2) arrange to deprive yourself of the benefit of the 493 | patent license for this particular work, or (3) arrange, in a manner 494 | consistent with the requirements of this License, to extend the patent 495 | license to downstream recipients. "Knowingly relying" means you have 496 | actual knowledge that, but for the patent license, your conveying the 497 | covered work in a country, or your recipient's use of the covered work 498 | in a country, would infringe one or more identifiable patents in that 499 | country that you have reason to believe are valid. 500 | 501 | If, pursuant to or in connection with a single transaction or 502 | arrangement, you convey, or propagate by procuring conveyance of, a 503 | covered work, and grant a patent license to some of the parties 504 | receiving the covered work authorizing them to use, propagate, modify 505 | or convey a specific copy of the covered work, then the patent license 506 | you grant is automatically extended to all recipients of the covered 507 | work and works based on it. 508 | 509 | A patent license is "discriminatory" if it does not include within 510 | the scope of its coverage, prohibits the exercise of, or is 511 | conditioned on the non-exercise of one or more of the rights that are 512 | specifically granted under this License. You may not convey a covered 513 | work if you are a party to an arrangement with a third party that is 514 | in the business of distributing software, under which you make payment 515 | to the third party based on the extent of your activity of conveying 516 | the work, and under which the third party grants, to any of the 517 | parties who would receive the covered work from you, a discriminatory 518 | patent license (a) in connection with copies of the covered work 519 | conveyed by you (or copies made from those copies), or (b) primarily 520 | for and in connection with specific products or compilations that 521 | contain the covered work, unless you entered into that arrangement, 522 | or that patent license was granted, prior to 28 March 2007. 523 | 524 | Nothing in this License shall be construed as excluding or limiting 525 | any implied license or other defenses to infringement that may 526 | otherwise be available to you under applicable patent law. 527 | 528 | 12. No Surrender of Others' Freedom. 529 | 530 | If conditions are imposed on you (whether by court order, agreement or 531 | otherwise) that contradict the conditions of this License, they do not 532 | excuse you from the conditions of this License. If you cannot convey a 533 | covered work so as to satisfy simultaneously your obligations under this 534 | License and any other pertinent obligations, then as a consequence you may 535 | not convey it at all. For example, if you agree to terms that obligate you 536 | to collect a royalty for further conveying from those to whom you convey 537 | the Program, the only way you could satisfy both those terms and this 538 | License would be to refrain entirely from conveying the Program. 539 | 540 | 13. Remote Network Interaction; Use with the GNU General Public License. 541 | 542 | Notwithstanding any other provision of this License, if you modify the 543 | Program, your modified version must prominently offer all users 544 | interacting with it remotely through a computer network (if your version 545 | supports such interaction) an opportunity to receive the Corresponding 546 | Source of your version by providing access to the Corresponding Source 547 | from a network server at no charge, through some standard or customary 548 | means of facilitating copying of software. This Corresponding Source 549 | shall include the Corresponding Source for any work covered by version 3 550 | of the GNU General Public License that is incorporated pursuant to the 551 | following paragraph. 552 | 553 | Notwithstanding any other provision of this License, you have 554 | permission to link or combine any covered work with a work licensed 555 | under version 3 of the GNU General Public License into a single 556 | combined work, and to convey the resulting work. The terms of this 557 | License will continue to apply to the part which is the covered work, 558 | but the work with which it is combined will remain governed by version 559 | 3 of the GNU General Public License. 560 | 561 | 14. Revised Versions of this License. 562 | 563 | The Free Software Foundation may publish revised and/or new versions of 564 | the GNU Affero General Public License from time to time. Such new versions 565 | will be similar in spirit to the present version, but may differ in detail to 566 | address new problems or concerns. 567 | 568 | Each version is given a distinguishing version number. If the 569 | Program specifies that a certain numbered version of the GNU Affero General 570 | Public License "or any later version" applies to it, you have the 571 | option of following the terms and conditions either of that numbered 572 | version or of any later version published by the Free Software 573 | Foundation. If the Program does not specify a version number of the 574 | GNU Affero General Public License, you may choose any version ever published 575 | by the Free Software Foundation. 576 | 577 | If the Program specifies that a proxy can decide which future 578 | versions of the GNU Affero General Public License can be used, that proxy's 579 | public statement of acceptance of a version permanently authorizes you 580 | to choose that version for the Program. 581 | 582 | Later license versions may give you additional or different 583 | permissions. However, no additional obligations are imposed on any 584 | author or copyright holder as a result of your choosing to follow a 585 | later version. 586 | 587 | 15. Disclaimer of Warranty. 588 | 589 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 590 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 591 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 592 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 593 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 594 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 595 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 596 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 597 | 598 | 16. Limitation of Liability. 599 | 600 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 601 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 602 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 603 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 604 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 605 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 606 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 607 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 608 | SUCH DAMAGES. 609 | 610 | 17. Interpretation of Sections 15 and 16. 611 | 612 | If the disclaimer of warranty and limitation of liability provided 613 | above cannot be given local legal effect according to their terms, 614 | reviewing courts shall apply local law that most closely approximates 615 | an absolute waiver of all civil liability in connection with the 616 | Program, unless a warranty or assumption of liability accompanies a 617 | copy of the Program in return for a fee. 618 | 619 | END OF TERMS AND CONDITIONS 620 | 621 | How to Apply These Terms to Your New Programs 622 | 623 | If you develop a new program, and you want it to be of the greatest 624 | possible use to the public, the best way to achieve this is to make it 625 | free software which everyone can redistribute and change under these terms. 626 | 627 | To do so, attach the following notices to the program. It is safest 628 | to attach them to the start of each source file to most effectively 629 | state the exclusion of warranty; and each file should have at least 630 | the "copyright" line and a pointer to where the full notice is found. 631 | 632 | 633 | Copyright (C) 634 | 635 | This program is free software: you can redistribute it and/or modify 636 | it under the terms of the GNU Affero General Public License as published by 637 | the Free Software Foundation, either version 3 of the License, or 638 | (at your option) any later version. 639 | 640 | This program is distributed in the hope that it will be useful, 641 | but WITHOUT ANY WARRANTY; without even the implied warranty of 642 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 643 | GNU Affero General Public License for more details. 644 | 645 | You should have received a copy of the GNU Affero General Public License 646 | along with this program. If not, see . 647 | 648 | Also add information on how to contact you by electronic and paper mail. 649 | 650 | If your software can interact with users remotely through a computer 651 | network, you should also make sure that it provides a way for users to 652 | get its source. For example, if your program is a web application, its 653 | interface could display a "Source" link that leads users to an archive 654 | of the code. There are many ways you could offer source, and different 655 | solutions will be better for different programs; see section 13 for the 656 | specific requirements. 657 | 658 | You should also get your employer (if you work as a programmer) or school, 659 | if any, to sign a "copyright disclaimer" for the program, if necessary. 660 | For more information on this, and how to apply and follow the GNU AGPL, see 661 | . -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CS Kill Confirm 2 | 3 | This tool helps you confirm your Counter-Strike 2 kills. 4 | 5 | ## Installation 6 | 7 | 1. Download the latest binary release from the [Releases](https://github.com/st0nie/cskillconfirm/releases) page. 8 | 9 | 2. Extract the downloaded file. 10 | 11 | 3. Make sure to place the `sounds` directory in the same folder as the executable. 12 | 13 | ## Game State Integration Setup 14 | 15 | 1. Download the GSI configuration file from [here](https://github.com/sam-ai56/gsi-cs2-rs/blob/main/gsi_cfg/gamestate_integration_fast.cfg). 16 | 17 | 2. Place this file in your CS2 configuration directory: 18 | - Windows: `C:\Program Files (x86)\Steam\steamapps\common\Counter-Strike Global Offensive\game\csgo\cfg\` 19 | - Linux: `~/.steam/steam/steamapps/common/Counter-Strike Global Offensive/game/csgo/cfg/` 20 | - Mac: `~/Library/Application Support/Steam/steamapps/common/Counter-Strike Global Offensive/game/csgo/cfg/` 21 | 22 | ## Usage 23 | 24 | 1. Start the application by running the executable. 25 | 26 | 2. Launch CS2 with the GSI configuration in place. 27 | 28 | 3. The tool will now provide crossfire-like kill confirmations while you play. 29 | 30 | ## Troubleshooting 31 | 32 | If you're experiencing issues: 33 | - Verify that the `sounds` directory is in the same folder as the executable 34 | - Check that the GSI configuration file is in the correct CS2 cfg directory 35 | -------------------------------------------------------------------------------- /sounds/bf1/common.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/bf1/common.wav -------------------------------------------------------------------------------- /sounds/bf1/common_headshot.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/bf1/common_headshot.wav -------------------------------------------------------------------------------- /sounds/bf1/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "has_variant": false, 3 | "has_voice": false, 4 | "has_common": true, 5 | "has_headshot": false, 6 | "has_common_headshot": true, 7 | "start": 0, 8 | "end": 0 9 | } -------------------------------------------------------------------------------- /sounds/bf1_special/common.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/bf1_special/common.wav -------------------------------------------------------------------------------- /sounds/bf1_special/common_headshot.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/bf1_special/common_headshot.wav -------------------------------------------------------------------------------- /sounds/bf1_special/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "has_variant": false, 3 | "has_voice": false, 4 | "has_common": true, 5 | "has_headshot": false, 6 | "has_common_headshot": true, 7 | "start": 0, 8 | "end": 0 9 | } -------------------------------------------------------------------------------- /sounds/crossfire/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire/2.wav -------------------------------------------------------------------------------- /sounds/crossfire/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire/3.wav -------------------------------------------------------------------------------- /sounds/crossfire/4.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire/4.wav -------------------------------------------------------------------------------- /sounds/crossfire/5.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire/5.wav -------------------------------------------------------------------------------- /sounds/crossfire/6.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire/6.wav -------------------------------------------------------------------------------- /sounds/crossfire/7.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire/7.wav -------------------------------------------------------------------------------- /sounds/crossfire/8.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire/8.wav -------------------------------------------------------------------------------- /sounds/crossfire/common.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire/common.wav -------------------------------------------------------------------------------- /sounds/crossfire/headshot.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire/headshot.wav -------------------------------------------------------------------------------- /sounds/crossfire/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "has_variant": true, 3 | "has_voice": true, 4 | "has_common": true, 5 | "has_headshot": true, 6 | "has_common_headshot": false, 7 | "start": 2, 8 | "end": 8 9 | } -------------------------------------------------------------------------------- /sounds/crossfire_v_fhd/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_fhd/2.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_fhd/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_fhd/3.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_fhd/4.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_fhd/4.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_fhd/5.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_fhd/5.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_fhd/6.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_fhd/6.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_fhd/7.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_fhd/7.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_fhd/8.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_fhd/8.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_fhd/headshot.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_fhd/headshot.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_sex/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_sex/2.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_sex/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_sex/3.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_sex/4.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_sex/4.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_sex/5.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_sex/5.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_sex/6.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_sex/6.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_sex/7.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_sex/7.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_sex/8.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_sex/8.wav -------------------------------------------------------------------------------- /sounds/crossfire_v_sex/headshot.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/crossfire_v_sex/headshot.wav -------------------------------------------------------------------------------- /sounds/valorant/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/valorant/1.wav -------------------------------------------------------------------------------- /sounds/valorant/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/valorant/2.wav -------------------------------------------------------------------------------- /sounds/valorant/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/valorant/3.wav -------------------------------------------------------------------------------- /sounds/valorant/4.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/valorant/4.wav -------------------------------------------------------------------------------- /sounds/valorant/5.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/st0nie/cskillconfirm/92ab42d01750f425c6dd4a22ce567c644ec6e9de/sounds/valorant/5.wav -------------------------------------------------------------------------------- /sounds/valorant/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "has_variant": true, 3 | "has_voice": false, 4 | "has_common": false, 5 | "has_headshot": false, 6 | "has_common_headshot": false, 7 | "start": 1, 8 | "end": 5 9 | } -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod soundpack; 2 | mod util; 3 | 4 | use axum::{Router, routing::post}; 5 | use clap::Parser; 6 | use std::{sync::Arc, time::Duration}; 7 | use tokio::sync::RwLock; 8 | use tower_http::{timeout::TimeoutLayer, trace::TraceLayer}; 9 | use tracing::info; 10 | use tracing::level_filters::LevelFilter; 11 | use tracing_subscriber::EnvFilter; 12 | use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; 13 | use util::signal::shutdown_signal; 14 | use util::state::{AppState, Mutable}; 15 | 16 | use util::Args; 17 | use util::playback::{get_output_stream, list_host_devices}; 18 | 19 | use anyhow::{Context, Result}; 20 | use soundpack::Preset; 21 | use util::handler::update; 22 | 23 | const DEFAULT_LOG_LEVEL: LevelFilter = if cfg!(debug_assertions) { 24 | LevelFilter::DEBUG 25 | } else { 26 | LevelFilter::INFO 27 | }; 28 | 29 | #[tokio::main] 30 | async fn main() -> Result<()> { 31 | tracing_subscriber::registry() 32 | .with( 33 | EnvFilter::builder() 34 | .with_default_directive(DEFAULT_LOG_LEVEL.into()) 35 | .from_env_lossy(), 36 | ) 37 | .with(tracing_subscriber::fmt::layer().without_time()) 38 | .init(); 39 | 40 | let args = Args::parse(); 41 | 42 | if args.list_devices { 43 | list_host_devices()?; 44 | return Ok(()); 45 | } 46 | 47 | if args.list_presets { 48 | soundpack::list()?; 49 | return Ok(()); 50 | } 51 | 52 | // initialize the specified audio device 53 | let output_stream = get_output_stream(&args.device).context("failed to get output stream")?; 54 | let preset = Preset::try_from(args.preset.as_ref()) 55 | .with_context(|| format!("failed to parse preset '{}'", &args.preset))?; 56 | info!("preset '{}' loaded successfully", &args.preset); 57 | info!("variant: {}", args.variant.as_deref().unwrap_or("none")); 58 | 59 | let app_state = Arc::new(AppState { 60 | mutable: RwLock::new(Mutable { 61 | steamid: "".into(), 62 | ply_kills: 0, 63 | ply_hs_kills: 0, 64 | }), 65 | stream_handle: output_stream.1, 66 | args, 67 | preset, 68 | }); 69 | 70 | let app = Router::new() 71 | .route("/", post(update)) 72 | .with_state(app_state) 73 | .layer(( 74 | TraceLayer::new_for_http(), 75 | // Graceful shutdown will wait for outstanding requests to complete. Add a timeout so 76 | // requests don't hang forever. 77 | TimeoutLayer::new(Duration::from_secs(10)), 78 | )); 79 | 80 | // run our app with hyper, listening globally on port 3000 81 | let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await?; 82 | axum::serve(listener, app) 83 | .with_graceful_shutdown(shutdown_signal()) 84 | .await?; 85 | 86 | Ok(()) 87 | } 88 | -------------------------------------------------------------------------------- /src/soundpack.rs: -------------------------------------------------------------------------------- 1 | pub mod sound; 2 | mod preset; 3 | pub use preset::Preset; 4 | pub use preset::list; 5 | -------------------------------------------------------------------------------- /src/soundpack/preset.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use serde::{Deserialize, Serialize}; 3 | use std::collections::HashMap; 4 | use std::convert::TryFrom; 5 | use std::fs; 6 | 7 | #[derive(Serialize, Deserialize, Clone, Debug)] 8 | pub struct Preset { 9 | pub has_variant: bool, 10 | pub has_voice: bool, 11 | pub has_common: bool, 12 | pub has_headshot: bool, 13 | pub has_common_headshot: bool, 14 | pub start: u16, 15 | pub end: u16, 16 | } 17 | 18 | impl TryFrom<&str> for Preset { 19 | type Error = anyhow::Error; 20 | 21 | fn try_from(preset_name: &str) -> Result { 22 | let content = fs::read_to_string(format!("sounds/{}/info.json", preset_name))?; 23 | let preset: Preset = serde_json::from_str(&content)?; 24 | Ok(preset) 25 | } 26 | } 27 | 28 | pub fn list() -> Result<()> { 29 | let path = fs::read_dir("sounds")?; 30 | 31 | let mut mp: HashMap> = HashMap::new(); 32 | 33 | for path in path { 34 | let path = path?; 35 | let file_name = path.file_name().to_string_lossy().to_string(); 36 | 37 | let preset: Vec<&str> = file_name.split("_v_").collect(); 38 | 39 | let preset_name = preset[0].to_string(); 40 | let variant = preset.get(1); 41 | 42 | if mp.contains_key(preset_name.as_str()) == false { 43 | mp.insert(preset_name.clone(), vec![]); 44 | } 45 | 46 | if let Some(variant) = variant { 47 | mp.get_mut(preset_name.as_str()) 48 | .unwrap() 49 | .push(variant.to_string()); 50 | } 51 | } 52 | 53 | let mut keys: Vec<&String> = mp.keys().collect(); 54 | keys.sort(); 55 | 56 | for key in keys { 57 | let variants = mp.get(key).unwrap(); 58 | if variants.is_empty() { 59 | println!("{}", key); 60 | continue; 61 | } 62 | 63 | println!("{}: [{}]", key, variants.join(", ")); 64 | } 65 | 66 | Ok(()) 67 | } 68 | -------------------------------------------------------------------------------- /src/soundpack/sound.rs: -------------------------------------------------------------------------------- 1 | use std::{fs::File, io::BufReader, sync::Arc}; 2 | 3 | use anyhow::{Context, Result}; 4 | use tokio::task::JoinSet; 5 | use tracing::error; 6 | 7 | use crate::util::state::AppState; 8 | 9 | async fn add_file_to_mixer( 10 | file_name: &str, 11 | controller: &rodio::dynamic_mixer::DynamicMixerController, 12 | ) -> Result<()> { 13 | let file = 14 | File::open(file_name).with_context(|| format!("failed to open file: {}", file_name))?; 15 | let source = rodio::Decoder::new(BufReader::new(file)) 16 | .with_context(|| format!("failed to decode file: {:?}", file_name))?; 17 | controller.add(source); 18 | Ok(()) 19 | } 20 | 21 | pub async fn play_audio( 22 | app_state_clone: Arc, 23 | sound_num: u16, 24 | current_kills: u16, 25 | origin_hs_kills: u64, 26 | current_hs_kills: u64, 27 | sound_num_max: u16, 28 | ) -> Result<()> { 29 | let args = &app_state_clone.args; 30 | let preset = &app_state_clone.preset; 31 | let stream_handle = &app_state_clone.stream_handle; 32 | let preset_name = Arc::new(args.preset.to_string()); 33 | let volume = args.volume; 34 | 35 | let (controller, mixer) = rodio::dynamic_mixer::mixer::(2, 44100); 36 | let sink = rodio::Sink::try_new(stream_handle)?; 37 | 38 | let mut tasks = JoinSet::new(); 39 | 40 | let preset_name_clone = preset_name.clone(); 41 | let controller_clone = controller.clone(); 42 | if preset.has_common_headshot && current_hs_kills > origin_hs_kills { 43 | tasks.spawn(async move { 44 | add_file_to_mixer( 45 | &format!("sounds/{}/common_headshot.wav", preset_name_clone), 46 | &controller_clone, 47 | ) 48 | .await 49 | }); 50 | } else if preset.has_common { 51 | tasks.spawn(async move { 52 | add_file_to_mixer( 53 | &format!("sounds/{}/common.wav", preset_name_clone), 54 | &controller_clone, 55 | ) 56 | .await 57 | }); 58 | } 59 | 60 | let controller_clone = controller.clone(); 61 | if preset.has_headshot && !args.no_voice && current_hs_kills == 1 && current_kills == 1 { 62 | let file_path = if preset.has_variant && args.variant.is_some() { 63 | format!( 64 | "sounds/{}_v_{}/headshot.wav", 65 | preset_name, 66 | args.variant.as_ref().unwrap() 67 | ) 68 | } else { 69 | format!("sounds/{}/headshot.wav", preset_name) 70 | }; 71 | tasks.spawn(async move { add_file_to_mixer(&file_path, &controller_clone).await }); 72 | } 73 | 74 | if preset.has_voice 75 | && !args.no_voice 76 | && (current_kills >= preset.start || !preset.has_headshot) 77 | && current_kills <= sound_num_max 78 | || !preset.has_common 79 | { 80 | let file_path = if preset.has_variant && args.variant.is_some() { 81 | format!( 82 | "sounds/{}_v_{}/{}.wav", 83 | preset_name, 84 | args.variant.as_ref().unwrap(), 85 | sound_num 86 | ) 87 | } else { 88 | format!("sounds/{}/{}.wav", preset_name, sound_num) 89 | }; 90 | tasks.spawn(async move { add_file_to_mixer(&file_path, &controller).await }); 91 | } 92 | 93 | let results = tasks.join_all().await; 94 | 95 | sink.append(mixer); 96 | sink.set_volume(volume); 97 | sink.play(); 98 | 99 | results.iter().for_each(|result| { 100 | if let Err(e) = result { 101 | error!("Failed to add file to mixer: {}", e); 102 | } 103 | }); 104 | 105 | sink.sleep_until_end(); 106 | Ok(()) 107 | } 108 | -------------------------------------------------------------------------------- /src/util.rs: -------------------------------------------------------------------------------- 1 | mod args; 2 | pub use args::Args; 3 | pub mod handler; 4 | pub mod playback; 5 | pub mod signal; 6 | pub mod state; 7 | -------------------------------------------------------------------------------- /src/util/args.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | #[derive(Parser, Debug, Clone)] 3 | #[command(version, about, long_about = None)] 4 | pub struct Args { 5 | /// select output device 6 | #[arg(short, long, default_value = "default")] 7 | pub device: String, 8 | /// list all available audio devices 9 | #[arg(short, long, default_value = "false")] 10 | pub list_devices: bool, 11 | /// disable voice for some presets 12 | #[arg(short, long, default_value = "false")] 13 | pub no_voice: bool, 14 | /// sound preset to use 15 | #[arg(short, long, default_value = "crossfire")] 16 | pub preset: String, 17 | /// play sound only for a specific steamid 18 | #[arg(long)] 19 | pub steamid: Option, 20 | /// use variant of sound preset 21 | #[arg(long)] 22 | pub variant: Option, 23 | /// 24 | #[arg(short, long, default_value = "1.0")] 25 | pub volume: f32, 26 | /// list all sound presets 27 | #[arg(short = 'L', long, default_value = "false")] 28 | pub list_presets: bool, 29 | } 30 | -------------------------------------------------------------------------------- /src/util/handler.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use std::sync::Arc; 3 | 4 | use axum::{Json, extract::State, http::StatusCode, response::IntoResponse}; 5 | use gsi_cs2::Body; 6 | use thiserror::Error; 7 | use tracing::{error, info, warn}; 8 | 9 | use crate::soundpack::sound::play_audio; 10 | 11 | use super::state::AppState; 12 | 13 | #[derive(Error, Debug)] 14 | pub enum ApiError {} 15 | 16 | impl IntoResponse for ApiError { 17 | fn into_response(self) -> axum::response::Response { 18 | StatusCode::INTERNAL_SERVER_ERROR.into_response() 19 | } 20 | } 21 | 22 | pub async fn update( 23 | State(app_state): State>, 24 | data: Json, 25 | ) -> Result { 26 | let map = data.map.as_ref(); 27 | let player_data = data.player.as_ref(); 28 | 29 | if map.is_none() || player_data.is_none() { 30 | warn!("map or player data is missing"); 31 | return Ok(StatusCode::OK); 32 | } 33 | 34 | if let Some(whitelist) = &app_state.args.steamid { 35 | let steamid = player_data 36 | .as_ref() 37 | .unwrap() 38 | .steam_id 39 | .as_deref() 40 | .unwrap_or(""); 41 | if steamid != whitelist { 42 | return Ok(StatusCode::OK); 43 | } 44 | } 45 | 46 | let ply = player_data.unwrap(); 47 | let ply_state = ply.state.as_ref().unwrap(); 48 | 49 | let binding = app_state.mutable.read().await; 50 | let current_kills = ply_state.round_kills; 51 | let original_kills = binding.ply_kills; 52 | 53 | let current_hs_kills = ply_state.round_killhs; 54 | let origin_hs_kills = binding.ply_hs_kills; 55 | 56 | let original_steamid = binding.steamid.clone(); 57 | drop(binding); 58 | 59 | let steamid = ply.steam_id.as_deref().unwrap_or(""); 60 | 61 | if current_kills > original_kills && (steamid == original_steamid || original_steamid == "") { 62 | let app_state_clone = app_state.clone(); 63 | // Note: args access moved inside tokio::spawn 64 | let sound_num_max; 65 | 66 | sound_num_max = app_state.preset.end; 67 | 68 | let sound_num = if current_kills > sound_num_max { 69 | sound_num_max 70 | } else { 71 | current_kills 72 | }; 73 | 74 | tokio::spawn(async move { 75 | let result = play_audio( 76 | app_state_clone, 77 | sound_num, 78 | current_kills, 79 | origin_hs_kills, 80 | current_hs_kills, 81 | sound_num_max, 82 | ) 83 | .await; 84 | 85 | if result.is_err() { 86 | error!("Failed to play audio: {}", result.unwrap_err()); 87 | } 88 | }); 89 | info!( 90 | "player: {}, kills: {}", 91 | ply.name.as_deref().unwrap_or(""), 92 | current_kills 93 | ); 94 | } 95 | 96 | let mut binding = app_state.mutable.write().await; 97 | 98 | binding.ply_kills = current_kills; 99 | binding.ply_hs_kills = current_hs_kills; 100 | binding.steamid = steamid.to_string(); 101 | 102 | Ok(StatusCode::OK) 103 | } 104 | -------------------------------------------------------------------------------- /src/util/playback.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{Context, Result}; 2 | use cpal::traits::{DeviceTrait, HostTrait}; 3 | use rodio::{OutputStream, OutputStreamHandle}; 4 | use tracing::{self, info, warn}; 5 | 6 | // Function to list available host devices 7 | pub fn list_host_devices() -> Result<()> { 8 | let host = cpal::default_host(); 9 | let devices = host 10 | .output_devices() 11 | .context("unable to get output devices")?; 12 | 13 | for device in devices { 14 | let dev: rodio::Device = device.into(); 15 | let dev_name = dev.name().unwrap_or_default(); 16 | println!("{}", dev_name); 17 | } 18 | 19 | Ok(()) 20 | } 21 | 22 | // Get an `OutputStream` and `OutputStreamHandle` for a specific device 23 | pub fn get_output_stream(device_name: &str) -> Result<(OutputStream, OutputStreamHandle)> { 24 | if device_name == "default" { 25 | return Ok(OutputStream::try_default()?); 26 | } 27 | let host = cpal::default_host(); 28 | let devices = host.output_devices()?; 29 | for device in devices { 30 | let dev: rodio::Device = device.into(); 31 | let dev_name: String = dev.name()?; 32 | if dev_name == device_name { 33 | info!("Using device: {}", dev_name); 34 | return Ok(OutputStream::try_from_device(&dev)?); 35 | } 36 | } 37 | // If the specified device is not found, fall back to the default 38 | warn!( 39 | "Specified device {} not found, using default output device.", 40 | device_name 41 | ); 42 | Ok(OutputStream::try_default()?) 43 | } 44 | -------------------------------------------------------------------------------- /src/util/signal.rs: -------------------------------------------------------------------------------- 1 | use tokio::signal; 2 | 3 | pub async fn shutdown_signal() { 4 | let ctrl_c = async { 5 | signal::ctrl_c() 6 | .await 7 | .expect("failed to install Ctrl+C handler"); 8 | }; 9 | 10 | #[cfg(unix)] 11 | let terminate = async { 12 | signal::unix::signal(signal::unix::SignalKind::terminate()) 13 | .expect("failed to install signal handler") 14 | .recv() 15 | .await; 16 | }; 17 | 18 | #[cfg(not(unix))] 19 | let terminate = std::future::pending::<()>(); 20 | 21 | tokio::select! { 22 | _ = ctrl_c => {}, 23 | _ = terminate => {}, 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/util/state.rs: -------------------------------------------------------------------------------- 1 | use rodio::OutputStreamHandle; 2 | use tokio::sync::RwLock; 3 | 4 | use crate::soundpack::Preset; 5 | 6 | use super::Args; 7 | 8 | pub struct Mutable { 9 | pub steamid: String, 10 | pub ply_kills: u16, 11 | pub ply_hs_kills: u64, 12 | } 13 | 14 | pub struct AppState { 15 | pub mutable: RwLock, 16 | pub stream_handle: OutputStreamHandle, 17 | pub args: Args, 18 | pub preset: Preset, 19 | } 20 | --------------------------------------------------------------------------------