├── .github └── workflows │ └── release.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── rustfmt.toml └── src └── main.rs /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | release: 3 | types: [created] 4 | 5 | jobs: 6 | release: 7 | env: 8 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 9 | CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }} 10 | 11 | strategy: 12 | fail-fast: false 13 | matrix: 14 | include: 15 | - name: Linux-x86_64 16 | target: x86_64-unknown-linux-gnu 17 | runner: ubuntu-latest 18 | 19 | - name: macOS-Apple 20 | target: aarch64-apple-darwin 21 | runner: macos-latest 22 | 23 | - name: macOS-Intel 24 | target: x86_64-apple-darwin 25 | runner: macos-latest 26 | 27 | - name: Windows 28 | target: i686-pc-windows-msvc 29 | runner: windows-latest 30 | 31 | name: ${{ matrix.name }} 32 | runs-on: ${{ matrix.runner }} 33 | steps: 34 | - name: Fetch Repository 35 | uses: actions/checkout@v3 36 | 37 | - name: Update Rust Toolchain 38 | run: rustup update stable 39 | 40 | - name: Add Rust Target 41 | run: rustup target add ${{ matrix.target }} 42 | 43 | - name: Build Release (Windows) 44 | if: ${{ matrix.runner == 'windows-latest' }} 45 | run: cargo build --release --target ${{ matrix.target }} 46 | 47 | - name: Bundle Release (Other) 48 | if: ${{ matrix.runner != 'windows-latest' }} 49 | run: | 50 | cargo install --git https://github.com/burtonageo/cargo-bundle.git --rev 1f4b526 51 | cargo bundle --release --target ${{ matrix.target }} 52 | 53 | - name: Create Zip Archive (Windows) 54 | if: ${{ matrix.runner == 'windows-latest' }} 55 | run: bash -c '7z a ${{ matrix.name }}.zip ./target/${{ matrix.target }}/release/*.exe' 56 | 57 | - name: Create Zip Archive (macOS) 58 | if: ${{ matrix.runner == 'macos-latest' }} 59 | run: cd target/${{ matrix.target }}/release/bundle/osx && zip -r ../../../../../${{ matrix.name }}.zip * 60 | 61 | - name: Create Zip Archive (Linux) 62 | if: ${{ matrix.runner == 'ubuntu-latest' }} 63 | run: zip -j ${{ matrix.name }}.zip target/${{ matrix.target }}/release/bundle/deb/* 64 | 65 | - name: Upload Zip Archive 66 | run: gh release upload ${{ github.ref_name }} ${{ matrix.name }}.zip --clobber 67 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vscode/ 3 | target/ 4 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "android-tzdata" 22 | version = "0.1.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 25 | 26 | [[package]] 27 | name = "android_system_properties" 28 | version = "0.1.5" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 31 | dependencies = [ 32 | "libc", 33 | ] 34 | 35 | [[package]] 36 | name = "anyhow" 37 | version = "1.0.75" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" 40 | 41 | [[package]] 42 | name = "autocfg" 43 | version = "1.1.0" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 46 | 47 | [[package]] 48 | name = "backtrace" 49 | version = "0.3.69" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 52 | dependencies = [ 53 | "addr2line", 54 | "cc", 55 | "cfg-if", 56 | "libc", 57 | "miniz_oxide", 58 | "object", 59 | "rustc-demangle", 60 | ] 61 | 62 | [[package]] 63 | name = "base64" 64 | version = "0.21.3" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" 67 | 68 | [[package]] 69 | name = "bumpalo" 70 | version = "3.13.0" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" 73 | 74 | [[package]] 75 | name = "bytes" 76 | version = "1.4.0" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" 79 | 80 | [[package]] 81 | name = "cc" 82 | version = "1.0.83" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 85 | dependencies = [ 86 | "libc", 87 | ] 88 | 89 | [[package]] 90 | name = "cfg-if" 91 | version = "1.0.0" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 94 | 95 | [[package]] 96 | name = "chrono" 97 | version = "0.4.28" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "95ed24df0632f708f5f6d8082675bef2596f7084dee3dd55f632290bf35bfe0f" 100 | dependencies = [ 101 | "android-tzdata", 102 | "iana-time-zone", 103 | "js-sys", 104 | "num-traits", 105 | "serde", 106 | "time", 107 | "wasm-bindgen", 108 | "windows-targets", 109 | ] 110 | 111 | [[package]] 112 | name = "core-foundation-sys" 113 | version = "0.8.4" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" 116 | 117 | [[package]] 118 | name = "crossbeam-channel" 119 | version = "0.5.8" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" 122 | dependencies = [ 123 | "cfg-if", 124 | "crossbeam-utils", 125 | ] 126 | 127 | [[package]] 128 | name = "crossbeam-deque" 129 | version = "0.8.3" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" 132 | dependencies = [ 133 | "cfg-if", 134 | "crossbeam-epoch", 135 | "crossbeam-utils", 136 | ] 137 | 138 | [[package]] 139 | name = "crossbeam-epoch" 140 | version = "0.9.15" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" 143 | dependencies = [ 144 | "autocfg", 145 | "cfg-if", 146 | "crossbeam-utils", 147 | "memoffset", 148 | "scopeguard", 149 | ] 150 | 151 | [[package]] 152 | name = "crossbeam-utils" 153 | version = "0.8.16" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" 156 | dependencies = [ 157 | "cfg-if", 158 | ] 159 | 160 | [[package]] 161 | name = "either" 162 | version = "1.9.0" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 165 | 166 | [[package]] 167 | name = "encoding_rs" 168 | version = "0.8.33" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" 171 | dependencies = [ 172 | "cfg-if", 173 | ] 174 | 175 | [[package]] 176 | name = "fnv" 177 | version = "1.0.7" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 180 | 181 | [[package]] 182 | name = "form_urlencoded" 183 | version = "1.2.0" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" 186 | dependencies = [ 187 | "percent-encoding", 188 | ] 189 | 190 | [[package]] 191 | name = "furse" 192 | version = "1.5.12" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "d0b578269baf3f219894d4cda006ce51dc08d07cc74d3210aaf9a02a41524b2f" 195 | dependencies = [ 196 | "chrono", 197 | "murmur2", 198 | "once_cell", 199 | "reqwest", 200 | "serde", 201 | "serde_repr", 202 | "thiserror", 203 | "url", 204 | ] 205 | 206 | [[package]] 207 | name = "futures-channel" 208 | version = "0.3.28" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" 211 | dependencies = [ 212 | "futures-core", 213 | ] 214 | 215 | [[package]] 216 | name = "futures-core" 217 | version = "0.3.28" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" 220 | 221 | [[package]] 222 | name = "futures-macro" 223 | version = "0.3.28" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" 226 | dependencies = [ 227 | "proc-macro2", 228 | "quote", 229 | "syn", 230 | ] 231 | 232 | [[package]] 233 | name = "futures-sink" 234 | version = "0.3.28" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" 237 | 238 | [[package]] 239 | name = "futures-task" 240 | version = "0.3.28" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" 243 | 244 | [[package]] 245 | name = "futures-util" 246 | version = "0.3.28" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" 249 | dependencies = [ 250 | "futures-core", 251 | "futures-macro", 252 | "futures-task", 253 | "pin-project-lite", 254 | "pin-utils", 255 | "slab", 256 | ] 257 | 258 | [[package]] 259 | name = "gimli" 260 | version = "0.28.0" 261 | source = "registry+https://github.com/rust-lang/crates.io-index" 262 | checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" 263 | 264 | [[package]] 265 | name = "h2" 266 | version = "0.3.21" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" 269 | dependencies = [ 270 | "bytes", 271 | "fnv", 272 | "futures-core", 273 | "futures-sink", 274 | "futures-util", 275 | "http", 276 | "indexmap", 277 | "slab", 278 | "tokio", 279 | "tokio-util", 280 | "tracing", 281 | ] 282 | 283 | [[package]] 284 | name = "hashbrown" 285 | version = "0.12.3" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 288 | 289 | [[package]] 290 | name = "hermit-abi" 291 | version = "0.3.2" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" 294 | 295 | [[package]] 296 | name = "http" 297 | version = "0.2.9" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" 300 | dependencies = [ 301 | "bytes", 302 | "fnv", 303 | "itoa", 304 | ] 305 | 306 | [[package]] 307 | name = "http-body" 308 | version = "0.4.5" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 311 | dependencies = [ 312 | "bytes", 313 | "http", 314 | "pin-project-lite", 315 | ] 316 | 317 | [[package]] 318 | name = "httparse" 319 | version = "1.8.0" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 322 | 323 | [[package]] 324 | name = "httpdate" 325 | version = "1.0.3" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 328 | 329 | [[package]] 330 | name = "hyper" 331 | version = "0.14.27" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" 334 | dependencies = [ 335 | "bytes", 336 | "futures-channel", 337 | "futures-core", 338 | "futures-util", 339 | "h2", 340 | "http", 341 | "http-body", 342 | "httparse", 343 | "httpdate", 344 | "itoa", 345 | "pin-project-lite", 346 | "socket2 0.4.9", 347 | "tokio", 348 | "tower-service", 349 | "tracing", 350 | "want", 351 | ] 352 | 353 | [[package]] 354 | name = "hyper-rustls" 355 | version = "0.24.1" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" 358 | dependencies = [ 359 | "futures-util", 360 | "http", 361 | "hyper", 362 | "rustls", 363 | "tokio", 364 | "tokio-rustls", 365 | ] 366 | 367 | [[package]] 368 | name = "iana-time-zone" 369 | version = "0.1.57" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" 372 | dependencies = [ 373 | "android_system_properties", 374 | "core-foundation-sys", 375 | "iana-time-zone-haiku", 376 | "js-sys", 377 | "wasm-bindgen", 378 | "windows", 379 | ] 380 | 381 | [[package]] 382 | name = "iana-time-zone-haiku" 383 | version = "0.1.2" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 386 | dependencies = [ 387 | "cc", 388 | ] 389 | 390 | [[package]] 391 | name = "idna" 392 | version = "0.4.0" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" 395 | dependencies = [ 396 | "unicode-bidi", 397 | "unicode-normalization", 398 | ] 399 | 400 | [[package]] 401 | name = "indexmap" 402 | version = "1.9.3" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 405 | dependencies = [ 406 | "autocfg", 407 | "hashbrown", 408 | ] 409 | 410 | [[package]] 411 | name = "ipnet" 412 | version = "2.8.0" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" 415 | 416 | [[package]] 417 | name = "is_elevated" 418 | version = "0.1.2" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "5299060ff5db63e788015dcb9525ad9b84f4fd9717ed2cbdeba5018cbf42f9b5" 421 | dependencies = [ 422 | "winapi", 423 | ] 424 | 425 | [[package]] 426 | name = "itoa" 427 | version = "1.0.9" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 430 | 431 | [[package]] 432 | name = "js-sys" 433 | version = "0.3.64" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" 436 | dependencies = [ 437 | "wasm-bindgen", 438 | ] 439 | 440 | [[package]] 441 | name = "launcher-curseforge" 442 | version = "2.1.2" 443 | dependencies = [ 444 | "anyhow", 445 | "furse", 446 | "is_elevated", 447 | "rayon", 448 | "tokio", 449 | "url", 450 | "winreg 0.51.0", 451 | ] 452 | 453 | [[package]] 454 | name = "libc" 455 | version = "0.2.147" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" 458 | 459 | [[package]] 460 | name = "log" 461 | version = "0.4.20" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 464 | 465 | [[package]] 466 | name = "memchr" 467 | version = "2.6.2" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e" 470 | 471 | [[package]] 472 | name = "memoffset" 473 | version = "0.9.0" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" 476 | dependencies = [ 477 | "autocfg", 478 | ] 479 | 480 | [[package]] 481 | name = "mime" 482 | version = "0.3.17" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 485 | 486 | [[package]] 487 | name = "miniz_oxide" 488 | version = "0.7.1" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 491 | dependencies = [ 492 | "adler", 493 | ] 494 | 495 | [[package]] 496 | name = "mio" 497 | version = "0.8.8" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" 500 | dependencies = [ 501 | "libc", 502 | "wasi 0.11.0+wasi-snapshot-preview1", 503 | "windows-sys", 504 | ] 505 | 506 | [[package]] 507 | name = "murmur2" 508 | version = "0.1.0" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "fb585ade2549a017db2e35978b77c319214fa4b37cede841e27954dd6e8f3ca8" 511 | 512 | [[package]] 513 | name = "num-traits" 514 | version = "0.2.16" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" 517 | dependencies = [ 518 | "autocfg", 519 | ] 520 | 521 | [[package]] 522 | name = "num_cpus" 523 | version = "1.16.0" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 526 | dependencies = [ 527 | "hermit-abi", 528 | "libc", 529 | ] 530 | 531 | [[package]] 532 | name = "object" 533 | version = "0.32.0" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" 536 | dependencies = [ 537 | "memchr", 538 | ] 539 | 540 | [[package]] 541 | name = "once_cell" 542 | version = "1.18.0" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" 545 | 546 | [[package]] 547 | name = "percent-encoding" 548 | version = "2.3.0" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" 551 | 552 | [[package]] 553 | name = "pin-project-lite" 554 | version = "0.2.13" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 557 | 558 | [[package]] 559 | name = "pin-utils" 560 | version = "0.1.0" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 563 | 564 | [[package]] 565 | name = "proc-macro2" 566 | version = "1.0.66" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" 569 | dependencies = [ 570 | "unicode-ident", 571 | ] 572 | 573 | [[package]] 574 | name = "quote" 575 | version = "1.0.33" 576 | source = "registry+https://github.com/rust-lang/crates.io-index" 577 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 578 | dependencies = [ 579 | "proc-macro2", 580 | ] 581 | 582 | [[package]] 583 | name = "rayon" 584 | version = "1.7.0" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" 587 | dependencies = [ 588 | "either", 589 | "rayon-core", 590 | ] 591 | 592 | [[package]] 593 | name = "rayon-core" 594 | version = "1.11.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" 597 | dependencies = [ 598 | "crossbeam-channel", 599 | "crossbeam-deque", 600 | "crossbeam-utils", 601 | "num_cpus", 602 | ] 603 | 604 | [[package]] 605 | name = "reqwest" 606 | version = "0.11.20" 607 | source = "registry+https://github.com/rust-lang/crates.io-index" 608 | checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" 609 | dependencies = [ 610 | "base64", 611 | "bytes", 612 | "encoding_rs", 613 | "futures-core", 614 | "futures-util", 615 | "h2", 616 | "http", 617 | "http-body", 618 | "hyper", 619 | "hyper-rustls", 620 | "ipnet", 621 | "js-sys", 622 | "log", 623 | "mime", 624 | "once_cell", 625 | "percent-encoding", 626 | "pin-project-lite", 627 | "rustls", 628 | "rustls-pemfile", 629 | "serde", 630 | "serde_json", 631 | "serde_urlencoded", 632 | "tokio", 633 | "tokio-rustls", 634 | "tower-service", 635 | "url", 636 | "wasm-bindgen", 637 | "wasm-bindgen-futures", 638 | "web-sys", 639 | "webpki-roots", 640 | "winreg 0.50.0", 641 | ] 642 | 643 | [[package]] 644 | name = "ring" 645 | version = "0.16.20" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 648 | dependencies = [ 649 | "cc", 650 | "libc", 651 | "once_cell", 652 | "spin", 653 | "untrusted", 654 | "web-sys", 655 | "winapi", 656 | ] 657 | 658 | [[package]] 659 | name = "rustc-demangle" 660 | version = "0.1.23" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 663 | 664 | [[package]] 665 | name = "rustls" 666 | version = "0.21.7" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" 669 | dependencies = [ 670 | "log", 671 | "ring", 672 | "rustls-webpki", 673 | "sct", 674 | ] 675 | 676 | [[package]] 677 | name = "rustls-pemfile" 678 | version = "1.0.3" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" 681 | dependencies = [ 682 | "base64", 683 | ] 684 | 685 | [[package]] 686 | name = "rustls-webpki" 687 | version = "0.101.4" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" 690 | dependencies = [ 691 | "ring", 692 | "untrusted", 693 | ] 694 | 695 | [[package]] 696 | name = "ryu" 697 | version = "1.0.15" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" 700 | 701 | [[package]] 702 | name = "scopeguard" 703 | version = "1.2.0" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 706 | 707 | [[package]] 708 | name = "sct" 709 | version = "0.7.0" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 712 | dependencies = [ 713 | "ring", 714 | "untrusted", 715 | ] 716 | 717 | [[package]] 718 | name = "serde" 719 | version = "1.0.188" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" 722 | dependencies = [ 723 | "serde_derive", 724 | ] 725 | 726 | [[package]] 727 | name = "serde_derive" 728 | version = "1.0.188" 729 | source = "registry+https://github.com/rust-lang/crates.io-index" 730 | checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" 731 | dependencies = [ 732 | "proc-macro2", 733 | "quote", 734 | "syn", 735 | ] 736 | 737 | [[package]] 738 | name = "serde_json" 739 | version = "1.0.105" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" 742 | dependencies = [ 743 | "itoa", 744 | "ryu", 745 | "serde", 746 | ] 747 | 748 | [[package]] 749 | name = "serde_repr" 750 | version = "0.1.16" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" 753 | dependencies = [ 754 | "proc-macro2", 755 | "quote", 756 | "syn", 757 | ] 758 | 759 | [[package]] 760 | name = "serde_urlencoded" 761 | version = "0.7.1" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 764 | dependencies = [ 765 | "form_urlencoded", 766 | "itoa", 767 | "ryu", 768 | "serde", 769 | ] 770 | 771 | [[package]] 772 | name = "slab" 773 | version = "0.4.9" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 776 | dependencies = [ 777 | "autocfg", 778 | ] 779 | 780 | [[package]] 781 | name = "socket2" 782 | version = "0.4.9" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" 785 | dependencies = [ 786 | "libc", 787 | "winapi", 788 | ] 789 | 790 | [[package]] 791 | name = "socket2" 792 | version = "0.5.3" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" 795 | dependencies = [ 796 | "libc", 797 | "windows-sys", 798 | ] 799 | 800 | [[package]] 801 | name = "spin" 802 | version = "0.5.2" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 805 | 806 | [[package]] 807 | name = "syn" 808 | version = "2.0.29" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" 811 | dependencies = [ 812 | "proc-macro2", 813 | "quote", 814 | "unicode-ident", 815 | ] 816 | 817 | [[package]] 818 | name = "thiserror" 819 | version = "1.0.47" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" 822 | dependencies = [ 823 | "thiserror-impl", 824 | ] 825 | 826 | [[package]] 827 | name = "thiserror-impl" 828 | version = "1.0.47" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" 831 | dependencies = [ 832 | "proc-macro2", 833 | "quote", 834 | "syn", 835 | ] 836 | 837 | [[package]] 838 | name = "time" 839 | version = "0.1.45" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" 842 | dependencies = [ 843 | "libc", 844 | "wasi 0.10.0+wasi-snapshot-preview1", 845 | "winapi", 846 | ] 847 | 848 | [[package]] 849 | name = "tinyvec" 850 | version = "1.6.0" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 853 | dependencies = [ 854 | "tinyvec_macros", 855 | ] 856 | 857 | [[package]] 858 | name = "tinyvec_macros" 859 | version = "0.1.1" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 862 | 863 | [[package]] 864 | name = "tokio" 865 | version = "1.32.0" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" 868 | dependencies = [ 869 | "backtrace", 870 | "bytes", 871 | "libc", 872 | "mio", 873 | "num_cpus", 874 | "pin-project-lite", 875 | "socket2 0.5.3", 876 | "tokio-macros", 877 | "windows-sys", 878 | ] 879 | 880 | [[package]] 881 | name = "tokio-macros" 882 | version = "2.1.0" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" 885 | dependencies = [ 886 | "proc-macro2", 887 | "quote", 888 | "syn", 889 | ] 890 | 891 | [[package]] 892 | name = "tokio-rustls" 893 | version = "0.24.1" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 896 | dependencies = [ 897 | "rustls", 898 | "tokio", 899 | ] 900 | 901 | [[package]] 902 | name = "tokio-util" 903 | version = "0.7.8" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" 906 | dependencies = [ 907 | "bytes", 908 | "futures-core", 909 | "futures-sink", 910 | "pin-project-lite", 911 | "tokio", 912 | "tracing", 913 | ] 914 | 915 | [[package]] 916 | name = "tower-service" 917 | version = "0.3.2" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 920 | 921 | [[package]] 922 | name = "tracing" 923 | version = "0.1.37" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 926 | dependencies = [ 927 | "cfg-if", 928 | "pin-project-lite", 929 | "tracing-core", 930 | ] 931 | 932 | [[package]] 933 | name = "tracing-core" 934 | version = "0.1.31" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" 937 | dependencies = [ 938 | "once_cell", 939 | ] 940 | 941 | [[package]] 942 | name = "try-lock" 943 | version = "0.2.4" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 946 | 947 | [[package]] 948 | name = "unicode-bidi" 949 | version = "0.3.13" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 952 | 953 | [[package]] 954 | name = "unicode-ident" 955 | version = "1.0.11" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" 958 | 959 | [[package]] 960 | name = "unicode-normalization" 961 | version = "0.1.22" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 964 | dependencies = [ 965 | "tinyvec", 966 | ] 967 | 968 | [[package]] 969 | name = "untrusted" 970 | version = "0.7.1" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 973 | 974 | [[package]] 975 | name = "url" 976 | version = "2.4.1" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" 979 | dependencies = [ 980 | "form_urlencoded", 981 | "idna", 982 | "percent-encoding", 983 | "serde", 984 | ] 985 | 986 | [[package]] 987 | name = "want" 988 | version = "0.3.1" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 991 | dependencies = [ 992 | "try-lock", 993 | ] 994 | 995 | [[package]] 996 | name = "wasi" 997 | version = "0.10.0+wasi-snapshot-preview1" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 1000 | 1001 | [[package]] 1002 | name = "wasi" 1003 | version = "0.11.0+wasi-snapshot-preview1" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1006 | 1007 | [[package]] 1008 | name = "wasm-bindgen" 1009 | version = "0.2.87" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" 1012 | dependencies = [ 1013 | "cfg-if", 1014 | "wasm-bindgen-macro", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "wasm-bindgen-backend" 1019 | version = "0.2.87" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" 1022 | dependencies = [ 1023 | "bumpalo", 1024 | "log", 1025 | "once_cell", 1026 | "proc-macro2", 1027 | "quote", 1028 | "syn", 1029 | "wasm-bindgen-shared", 1030 | ] 1031 | 1032 | [[package]] 1033 | name = "wasm-bindgen-futures" 1034 | version = "0.4.37" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" 1037 | dependencies = [ 1038 | "cfg-if", 1039 | "js-sys", 1040 | "wasm-bindgen", 1041 | "web-sys", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "wasm-bindgen-macro" 1046 | version = "0.2.87" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" 1049 | dependencies = [ 1050 | "quote", 1051 | "wasm-bindgen-macro-support", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "wasm-bindgen-macro-support" 1056 | version = "0.2.87" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" 1059 | dependencies = [ 1060 | "proc-macro2", 1061 | "quote", 1062 | "syn", 1063 | "wasm-bindgen-backend", 1064 | "wasm-bindgen-shared", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "wasm-bindgen-shared" 1069 | version = "0.2.87" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" 1072 | 1073 | [[package]] 1074 | name = "web-sys" 1075 | version = "0.3.64" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" 1078 | dependencies = [ 1079 | "js-sys", 1080 | "wasm-bindgen", 1081 | ] 1082 | 1083 | [[package]] 1084 | name = "webpki-roots" 1085 | version = "0.25.2" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" 1088 | 1089 | [[package]] 1090 | name = "winapi" 1091 | version = "0.3.9" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1094 | dependencies = [ 1095 | "winapi-i686-pc-windows-gnu", 1096 | "winapi-x86_64-pc-windows-gnu", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "winapi-i686-pc-windows-gnu" 1101 | version = "0.4.0" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1104 | 1105 | [[package]] 1106 | name = "winapi-x86_64-pc-windows-gnu" 1107 | version = "0.4.0" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1110 | 1111 | [[package]] 1112 | name = "windows" 1113 | version = "0.48.0" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" 1116 | dependencies = [ 1117 | "windows-targets", 1118 | ] 1119 | 1120 | [[package]] 1121 | name = "windows-sys" 1122 | version = "0.48.0" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1125 | dependencies = [ 1126 | "windows-targets", 1127 | ] 1128 | 1129 | [[package]] 1130 | name = "windows-targets" 1131 | version = "0.48.5" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1134 | dependencies = [ 1135 | "windows_aarch64_gnullvm", 1136 | "windows_aarch64_msvc", 1137 | "windows_i686_gnu", 1138 | "windows_i686_msvc", 1139 | "windows_x86_64_gnu", 1140 | "windows_x86_64_gnullvm", 1141 | "windows_x86_64_msvc", 1142 | ] 1143 | 1144 | [[package]] 1145 | name = "windows_aarch64_gnullvm" 1146 | version = "0.48.5" 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" 1148 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1149 | 1150 | [[package]] 1151 | name = "windows_aarch64_msvc" 1152 | version = "0.48.5" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1155 | 1156 | [[package]] 1157 | name = "windows_i686_gnu" 1158 | version = "0.48.5" 1159 | source = "registry+https://github.com/rust-lang/crates.io-index" 1160 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1161 | 1162 | [[package]] 1163 | name = "windows_i686_msvc" 1164 | version = "0.48.5" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1167 | 1168 | [[package]] 1169 | name = "windows_x86_64_gnu" 1170 | version = "0.48.5" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1173 | 1174 | [[package]] 1175 | name = "windows_x86_64_gnullvm" 1176 | version = "0.48.5" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1179 | 1180 | [[package]] 1181 | name = "windows_x86_64_msvc" 1182 | version = "0.48.5" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1185 | 1186 | [[package]] 1187 | name = "winreg" 1188 | version = "0.50.0" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 1191 | dependencies = [ 1192 | "cfg-if", 1193 | "windows-sys", 1194 | ] 1195 | 1196 | [[package]] 1197 | name = "winreg" 1198 | version = "0.51.0" 1199 | source = "registry+https://github.com/rust-lang/crates.io-index" 1200 | checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc" 1201 | dependencies = [ 1202 | "cfg-if", 1203 | "windows-sys", 1204 | ] 1205 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "launcher-curseforge" 3 | version = "2.1.2" 4 | authors = ["Shayne Hartford "] 5 | edition = "2021" 6 | description = "Integrates the Curseforge Modpack installation button to any MultiMC based launcher" 7 | readme = "README.md" 8 | repository = "https://github.com/shaybox/launcher-curseforge" 9 | license = "MIT" 10 | 11 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 12 | 13 | [dependencies] 14 | anyhow = "1" 15 | furse = "1" 16 | rayon = "1" 17 | tokio = { version = "1", features = ["rt-multi-thread", "macros"] } 18 | url = "2" 19 | 20 | [target.'cfg(windows)'.dependencies] 21 | is_elevated = "0.1" 22 | winreg = "0.51" 23 | 24 | # https://github.com/johnthagen/min-sized-rust 25 | [profile.release] 26 | strip = true # Automatically strip symbols from the binary. 27 | opt-level = "z" # Optimize for size. 28 | lto = true 29 | codegen-units = 1 30 | 31 | [package.metadata.bundle] 32 | identifier = "com.shaybox.launcher-curseforge" 33 | linux_mime_types = ["x-scheme-handler/curseforge"] 34 | linux_exec_args = "%u" 35 | osx_url_schemes = ["curseforge"] 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Shayne Hartford 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | Discord 4 | 5 | 6 | Downloads 7 | 8 |
9 | 10 | # Launcher-Curseforge 11 | 12 | Integrates the [Curseforge] [Minecraft] Modpack installation button to any [MultiMC] based [Minecraft] launcher. 13 | Handles the `curseforge://` custom protocol and executes the launcher with the `--import` argument. 14 | 15 | ## Supported Launchers: 16 | - [PrismLauncher] [^1] 17 | - [PolyMC] 18 | - [MultiMC] 19 | 20 | ## Installation: 21 | 22 | ### Windows: 23 | - [Download] and Extract the latest release 24 | - Move the `.exe` into the same directory as the launcher 25 | - Run as **Administrator** once to update registry values 26 | 27 | ### macOS: 28 | - [Download] the latest release 29 | - Move the `.app` into the `Applications` directory 30 | 31 | ### Linux: 32 | 33 | #### Archlinux: [AUR] 34 | 35 | #### Debian/Ubuntu: 36 | - [Download] and Extract the latest release 37 | - Run `sudo dpkg -i launcher-curseforge_X.X.X_amd64.deb` 38 | 39 | #### Other: 40 | - [Download] and Extract the latest release 41 | - Extract the `.deb` package and the `data.tar.gz` inside 42 | - Manually move the files to `~/.local` 43 | - Run `xdg-mime default launcher-curseforge.desktop x-scheme-handler/curseforge` 44 | 45 | [^1]: The last supported version of PrismLauncher is version 6, version 7 broke the `--import` flag, and version 8 integrated Launcher-Curseforge functionality 46 | 47 | [PrismLauncher]: https://prismlauncher.org 48 | [PolyMC]: https://polymc.org 49 | [MultiMC]: https://multimc.org 50 | 51 | [Curseforge]: https://curseforge.com 52 | [Minecraft]: https://minecraft.net 53 | [MultiMC]: https://multimc.org 54 | [Download]: https://github.com/ShayBox/Launcher-Curseforge/releases/latest 55 | [AUR]: https://aur.archlinux.org/packages/launcher-curseforge-bin 56 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | enum_discrim_align_threshold = 10 2 | group_imports = "StdExternalCrate" 3 | imports_granularity = "Crate" 4 | imports_layout = "HorizontalVertical" 5 | struct_field_align_threshold = 10 6 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | // Prevents additional console window on Windows in release, DO NOT REMOVE!! 2 | #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] 3 | 4 | use std::{ 5 | collections::HashMap, 6 | env, 7 | io::{self, ErrorKind}, 8 | process::{Command, Output}, 9 | }; 10 | 11 | use anyhow::{bail, Result}; 12 | use furse::{structures::ID, Furse}; 13 | use url::Url; 14 | 15 | const CURSEFORGE_API_KEY: &str = env!("CURSEFORGE_API_KEY"); 16 | 17 | #[tokio::main] 18 | async fn main() -> Result<()> { 19 | #[cfg(target_os = "windows")] 20 | try_update_registry()?; 21 | 22 | let mut args: Vec = env::args().collect(); 23 | args.drain(0..1); 24 | if args.is_empty() { 25 | bail!("Missing arguments") 26 | } 27 | 28 | let url = Url::parse(&args.join(" "))?; 29 | let query = url.query_pairs().collect::>(); 30 | let Some(addon_id) = query.get("addonId").and_then(|id| id.parse::().ok()) else { 31 | bail!("Missing or Malformed query parameter: addonId") 32 | }; 33 | let Some(mod_id) = query.get("fileId").and_then(|id| id.parse::().ok()) else { 34 | bail!("Missing or Malformed query parameter: fileId") 35 | }; 36 | 37 | let api_key = env::var("CURSEFORGE_API_KEY").unwrap_or_else(|_| CURSEFORGE_API_KEY.into()); 38 | let curseforge = Furse::new(&api_key); 39 | let download_url = curseforge.file_download_url(addon_id, mod_id).await?; 40 | 41 | // You may declare your MultiMC based launcher variant here 42 | // Please make sure the capitalization matches the filename 43 | // Windows and Linux are case sensitive, macOS is not 44 | #[allow(unused_mut)] 45 | let mut launchers = vec!["MultiMC", "multimc", "polymc", "prismlauncher"]; 46 | 47 | // Why does Petr Mrázek (Peterix) die on the stupidest hills 48 | #[cfg(target_os = "linux")] 49 | launchers.insert(0, "/opt/multimc/run.sh"); 50 | 51 | #[cfg(target_os = "linux")] 52 | match try_flatpaks(download_url.as_ref()) { 53 | Ok(true) => return Ok(()), 54 | Ok(false) => {} 55 | Err(e) => { 56 | // NotFound indicates flatpak is not installed 57 | if ErrorKind::NotFound != e.kind() { 58 | bail!(e) 59 | } 60 | } 61 | }; 62 | 63 | for launcher in launchers { 64 | match try_launcher(launcher, download_url.as_ref()) { 65 | Ok(_) => return Ok(()), 66 | Err(error) => { 67 | if let ErrorKind::NotFound = error.kind() { 68 | continue; 69 | } else { 70 | bail!(error) 71 | } 72 | } 73 | } 74 | } 75 | 76 | bail!("Failed to find launcher") 77 | } 78 | 79 | #[cfg(target_os = "windows")] 80 | fn try_update_registry() -> Result<()> { 81 | use std::path::Path; 82 | 83 | use is_elevated::is_elevated; 84 | use winreg::{enums::HKEY_CLASSES_ROOT, RegKey}; 85 | 86 | if is_elevated() { 87 | let exe = env::current_exe()?; 88 | let value = format!("\"{}\" \"%1\"", exe.to_string_lossy()); 89 | 90 | let hkcr = RegKey::predef(HKEY_CLASSES_ROOT); 91 | 92 | let root_path = Path::new("curseforge"); 93 | let (root_key, _) = hkcr.create_subkey(root_path)?; 94 | root_key.set_value("URL Protocol", &"")?; 95 | 96 | let sub_path = root_path.join("shell\\open\\command"); 97 | let (sub_key, _) = hkcr.create_subkey(sub_path)?; 98 | sub_key.set_value("", &value)?; 99 | 100 | println!("Registry Updated"); 101 | } 102 | 103 | Ok(()) 104 | } 105 | 106 | #[cfg(target_os = "linux")] 107 | fn try_flatpaks(download_url: &str) -> Result { 108 | let packages = vec!["org.polymc.PolyMC", "org.prismlauncher.PrismLauncher"]; 109 | for package in packages { 110 | let output = Command::new("flatpak") 111 | .args(["run", package, "--import", download_url]) 112 | .output()?; 113 | let Some(code) = output.status.code() else { 114 | continue; 115 | }; 116 | if code == 0 { 117 | return Ok(true); 118 | } 119 | } 120 | 121 | Ok(false) 122 | } 123 | 124 | #[cfg(target_os = "windows")] 125 | fn try_launcher(launcher: &str, download_url: &str) -> Result { 126 | Command::new(launcher.to_owned() + ".exe") 127 | .args(["--import", download_url]) 128 | .output() 129 | } 130 | 131 | #[cfg(target_os = "macos")] 132 | fn try_launcher(launcher: &str, download_url: &str) -> Result { 133 | Command::new("open") 134 | .args(["-a", launcher, "--args", "--import", download_url]) 135 | .output() 136 | } 137 | 138 | #[cfg(target_os = "linux")] 139 | fn try_launcher(launcher: &str, download_url: &str) -> Result { 140 | Command::new(launcher) 141 | .args(["--import", download_url]) 142 | .output() 143 | } 144 | --------------------------------------------------------------------------------