├── .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 |
--------------------------------------------------------------------------------