Live location tracking and playback for the game "manhunt"

Profile Picture Creation Flow

bwc9876.dev b8b70c29 d81ace17

verified
+716 -19
+616 -12
Cargo.lock
··· 70 70 ] 71 71 72 72 [[package]] 73 + name = "aligned" 74 + version = "0.4.3" 75 + source = "registry+https://github.com/rust-lang/crates.io-index" 76 + checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" 77 + dependencies = [ 78 + "as-slice", 79 + ] 80 + 81 + [[package]] 82 + name = "aligned-vec" 83 + version = "0.6.4" 84 + source = "registry+https://github.com/rust-lang/crates.io-index" 85 + checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" 86 + dependencies = [ 87 + "equator", 88 + ] 89 + 90 + [[package]] 73 91 name = "alloc-no-stdlib" 74 92 version = "2.0.4" 75 93 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 167 185 checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" 168 186 169 187 [[package]] 188 + name = "arbitrary" 189 + version = "1.4.2" 190 + source = "registry+https://github.com/rust-lang/crates.io-index" 191 + checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" 192 + 193 + [[package]] 170 194 name = "arc-swap" 171 195 version = "1.8.2" 172 196 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 176 200 ] 177 201 178 202 [[package]] 203 + name = "arg_enum_proc_macro" 204 + version = "0.3.4" 205 + source = "registry+https://github.com/rust-lang/crates.io-index" 206 + checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" 207 + dependencies = [ 208 + "proc-macro2", 209 + "quote", 210 + "syn 2.0.116", 211 + ] 212 + 213 + [[package]] 179 214 name = "arrayvec" 180 215 version = "0.7.6" 181 216 source = "registry+https://github.com/rust-lang/crates.io-index" 182 217 checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 183 218 184 219 [[package]] 220 + name = "as-slice" 221 + version = "0.2.1" 222 + source = "registry+https://github.com/rust-lang/crates.io-index" 223 + checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" 224 + dependencies = [ 225 + "stable_deref_trait", 226 + ] 227 + 228 + [[package]] 185 229 name = "asn1-rs" 186 230 version = "0.6.2" 187 231 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 190 234 "asn1-rs-derive", 191 235 "asn1-rs-impl", 192 236 "displaydoc", 193 - "nom", 237 + "nom 7.1.3", 194 238 "num-traits", 195 239 "rusticata-macros", 196 240 "thiserror 1.0.69", ··· 493 537 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 494 538 495 539 [[package]] 540 + name = "av-scenechange" 541 + version = "0.14.1" 542 + source = "registry+https://github.com/rust-lang/crates.io-index" 543 + checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" 544 + dependencies = [ 545 + "aligned", 546 + "anyhow", 547 + "arg_enum_proc_macro", 548 + "arrayvec", 549 + "log", 550 + "num-rational", 551 + "num-traits", 552 + "pastey", 553 + "rayon", 554 + "thiserror 2.0.18", 555 + "v_frame", 556 + "y4m", 557 + ] 558 + 559 + [[package]] 560 + name = "av1-grain" 561 + version = "0.2.5" 562 + source = "registry+https://github.com/rust-lang/crates.io-index" 563 + checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" 564 + dependencies = [ 565 + "anyhow", 566 + "arrayvec", 567 + "log", 568 + "nom 8.0.0", 569 + "num-rational", 570 + "v_frame", 571 + ] 572 + 573 + [[package]] 574 + name = "avif-serialize" 575 + version = "0.8.8" 576 + source = "registry+https://github.com/rust-lang/crates.io-index" 577 + checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" 578 + dependencies = [ 579 + "arrayvec", 580 + ] 581 + 582 + [[package]] 496 583 name = "aws-lc-rs" 497 584 version = "1.15.4" 498 585 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 594 681 checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" 595 682 596 683 [[package]] 684 + name = "bit_field" 685 + version = "0.10.3" 686 + source = "registry+https://github.com/rust-lang/crates.io-index" 687 + checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" 688 + 689 + [[package]] 597 690 name = "bitflags" 598 691 version = "1.3.2" 599 692 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 609 702 ] 610 703 611 704 [[package]] 705 + name = "bitstream-io" 706 + version = "4.9.0" 707 + source = "registry+https://github.com/rust-lang/crates.io-index" 708 + checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" 709 + dependencies = [ 710 + "core2", 711 + ] 712 + 713 + [[package]] 612 714 name = "bitvec" 613 715 version = "1.0.1" 614 716 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 705 807 ] 706 808 707 809 [[package]] 810 + name = "built" 811 + version = "0.8.0" 812 + source = "registry+https://github.com/rust-lang/crates.io-index" 813 + checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" 814 + 815 + [[package]] 708 816 name = "bumpalo" 709 817 version = "3.20.1" 710 818 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 778 886 version = "1.5.0" 779 887 source = "registry+https://github.com/rust-lang/crates.io-index" 780 888 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 889 + 890 + [[package]] 891 + name = "byteorder-lite" 892 + version = "0.1.0" 893 + source = "registry+https://github.com/rust-lang/crates.io-index" 894 + checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 781 895 782 896 [[package]] 783 897 name = "bytes" ··· 1048 1162 ] 1049 1163 1050 1164 [[package]] 1165 + name = "color_quant" 1166 + version = "1.1.0" 1167 + source = "registry+https://github.com/rust-lang/crates.io-index" 1168 + checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 1169 + 1170 + [[package]] 1051 1171 name = "colorchoice" 1052 1172 version = "1.0.4" 1053 1173 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1169 1289 ] 1170 1290 1171 1291 [[package]] 1292 + name = "core2" 1293 + version = "0.4.0" 1294 + source = "registry+https://github.com/rust-lang/crates.io-index" 1295 + checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 1296 + dependencies = [ 1297 + "memchr", 1298 + ] 1299 + 1300 + [[package]] 1172 1301 name = "cpufeatures" 1173 1302 version = "0.2.17" 1174 1303 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1220 1349 ] 1221 1350 1222 1351 [[package]] 1352 + name = "crossbeam-deque" 1353 + version = "0.8.6" 1354 + source = "registry+https://github.com/rust-lang/crates.io-index" 1355 + checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 1356 + dependencies = [ 1357 + "crossbeam-epoch", 1358 + "crossbeam-utils", 1359 + ] 1360 + 1361 + [[package]] 1362 + name = "crossbeam-epoch" 1363 + version = "0.9.18" 1364 + source = "registry+https://github.com/rust-lang/crates.io-index" 1365 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 1366 + dependencies = [ 1367 + "crossbeam-utils", 1368 + ] 1369 + 1370 + [[package]] 1223 1371 name = "crossbeam-utils" 1224 1372 version = "0.8.21" 1225 1373 source = "registry+https://github.com/rust-lang/crates.io-index" 1226 1374 checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 1375 + 1376 + [[package]] 1377 + name = "crunchy" 1378 + version = "0.2.4" 1379 + source = "registry+https://github.com/rust-lang/crates.io-index" 1380 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 1227 1381 1228 1382 [[package]] 1229 1383 name = "crypto-bigint" ··· 1380 1534 dependencies = [ 1381 1535 "asn1-rs", 1382 1536 "displaydoc", 1383 - "nom", 1537 + "nom 7.1.3", 1384 1538 "num-bigint", 1385 1539 "num-traits", 1386 1540 "rusticata-macros", ··· 1610 1764 ] 1611 1765 1612 1766 [[package]] 1767 + name = "either" 1768 + version = "1.15.0" 1769 + source = "registry+https://github.com/rust-lang/crates.io-index" 1770 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 1771 + 1772 + [[package]] 1613 1773 name = "elliptic-curve" 1614 1774 version = "0.13.8" 1615 1775 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1720 1880 ] 1721 1881 1722 1882 [[package]] 1883 + name = "equator" 1884 + version = "0.4.2" 1885 + source = "registry+https://github.com/rust-lang/crates.io-index" 1886 + checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" 1887 + dependencies = [ 1888 + "equator-macro", 1889 + ] 1890 + 1891 + [[package]] 1892 + name = "equator-macro" 1893 + version = "0.4.2" 1894 + source = "registry+https://github.com/rust-lang/crates.io-index" 1895 + checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" 1896 + dependencies = [ 1897 + "proc-macro2", 1898 + "quote", 1899 + "syn 2.0.116", 1900 + ] 1901 + 1902 + [[package]] 1723 1903 name = "equivalent" 1724 1904 version = "1.0.2" 1725 1905 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1774 1954 ] 1775 1955 1776 1956 [[package]] 1957 + name = "exr" 1958 + version = "1.74.0" 1959 + source = "registry+https://github.com/rust-lang/crates.io-index" 1960 + checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" 1961 + dependencies = [ 1962 + "bit_field", 1963 + "half", 1964 + "lebe", 1965 + "miniz_oxide", 1966 + "rayon-core", 1967 + "smallvec", 1968 + "zune-inflate", 1969 + ] 1970 + 1971 + [[package]] 1777 1972 name = "fastrand" 1778 1973 version = "2.3.0" 1779 1974 source = "registry+https://github.com/rust-lang/crates.io-index" 1780 1975 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1976 + 1977 + [[package]] 1978 + name = "fax" 1979 + version = "0.2.6" 1980 + source = "registry+https://github.com/rust-lang/crates.io-index" 1981 + checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" 1982 + dependencies = [ 1983 + "fax_derive", 1984 + ] 1985 + 1986 + [[package]] 1987 + name = "fax_derive" 1988 + version = "0.2.0" 1989 + source = "registry+https://github.com/rust-lang/crates.io-index" 1990 + checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" 1991 + dependencies = [ 1992 + "proc-macro2", 1993 + "quote", 1994 + "syn 2.0.116", 1995 + ] 1781 1996 1782 1997 [[package]] 1783 1998 name = "fdeflate" ··· 2202 2417 ] 2203 2418 2204 2419 [[package]] 2420 + name = "gif" 2421 + version = "0.14.1" 2422 + source = "registry+https://github.com/rust-lang/crates.io-index" 2423 + checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" 2424 + dependencies = [ 2425 + "color_quant", 2426 + "weezl", 2427 + ] 2428 + 2429 + [[package]] 2205 2430 name = "gio" 2206 2431 version = "0.18.4" 2207 2432 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2404 2629 ] 2405 2630 2406 2631 [[package]] 2632 + name = "half" 2633 + version = "2.7.1" 2634 + source = "registry+https://github.com/rust-lang/crates.io-index" 2635 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 2636 + dependencies = [ 2637 + "cfg-if", 2638 + "crunchy", 2639 + "zerocopy", 2640 + ] 2641 + 2642 + [[package]] 2407 2643 name = "hashbrown" 2408 2644 version = "0.12.3" 2409 2645 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2621 2857 checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" 2622 2858 dependencies = [ 2623 2859 "byteorder", 2624 - "png", 2860 + "png 0.17.16", 2625 2861 ] 2626 2862 2627 2863 [[package]] ··· 2739 2975 ] 2740 2976 2741 2977 [[package]] 2978 + name = "image" 2979 + version = "0.25.9" 2980 + source = "registry+https://github.com/rust-lang/crates.io-index" 2981 + checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" 2982 + dependencies = [ 2983 + "bytemuck", 2984 + "byteorder-lite", 2985 + "color_quant", 2986 + "exr", 2987 + "gif", 2988 + "image-webp", 2989 + "moxcms", 2990 + "num-traits", 2991 + "png 0.18.1", 2992 + "qoi", 2993 + "ravif", 2994 + "rayon", 2995 + "rgb", 2996 + "tiff", 2997 + "zune-core 0.5.1", 2998 + "zune-jpeg 0.5.12", 2999 + ] 3000 + 3001 + [[package]] 3002 + name = "image-webp" 3003 + version = "0.2.4" 3004 + source = "registry+https://github.com/rust-lang/crates.io-index" 3005 + checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" 3006 + dependencies = [ 3007 + "byteorder-lite", 3008 + "quick-error", 3009 + ] 3010 + 3011 + [[package]] 3012 + name = "imgref" 3013 + version = "1.12.0" 3014 + source = "registry+https://github.com/rust-lang/crates.io-index" 3015 + checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" 3016 + 3017 + [[package]] 2742 3018 name = "indexmap" 2743 3019 version = "1.9.3" 2744 3020 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2802 3078 ] 2803 3079 2804 3080 [[package]] 3081 + name = "interpolate_name" 3082 + version = "0.2.4" 3083 + source = "registry+https://github.com/rust-lang/crates.io-index" 3084 + checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" 3085 + dependencies = [ 3086 + "proc-macro2", 3087 + "quote", 3088 + "syn 2.0.116", 3089 + ] 3090 + 3091 + [[package]] 2805 3092 name = "interprocess" 2806 3093 version = "2.3.1" 2807 3094 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2858 3145 checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 2859 3146 2860 3147 [[package]] 3148 + name = "itertools" 3149 + version = "0.14.0" 3150 + source = "registry+https://github.com/rust-lang/crates.io-index" 3151 + checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 3152 + dependencies = [ 3153 + "either", 3154 + ] 3155 + 3156 + [[package]] 2861 3157 name = "itoa" 2862 3158 version = "1.0.17" 2863 3159 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3019 3315 checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 3020 3316 3021 3317 [[package]] 3318 + name = "lebe" 3319 + version = "0.5.3" 3320 + source = "registry+https://github.com/rust-lang/crates.io-index" 3321 + checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" 3322 + 3323 + [[package]] 3022 3324 name = "libappindicator" 3023 3325 version = "0.9.0" 3024 3326 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3049 3351 checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" 3050 3352 3051 3353 [[package]] 3354 + name = "libfuzzer-sys" 3355 + version = "0.4.12" 3356 + source = "registry+https://github.com/rust-lang/crates.io-index" 3357 + checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" 3358 + dependencies = [ 3359 + "arbitrary", 3360 + "cc", 3361 + ] 3362 + 3363 + [[package]] 3052 3364 name = "libloading" 3053 3365 version = "0.7.4" 3054 3366 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3099 3411 ] 3100 3412 3101 3413 [[package]] 3414 + name = "loop9" 3415 + version = "0.1.5" 3416 + source = "registry+https://github.com/rust-lang/crates.io-index" 3417 + checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" 3418 + dependencies = [ 3419 + "imgref", 3420 + ] 3421 + 3422 + [[package]] 3102 3423 name = "lru-slab" 3103 3424 version = "0.1.2" 3104 3425 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3127 3448 version = "0.1.0" 3128 3449 dependencies = [ 3129 3450 "anyhow", 3451 + "base64 0.22.1", 3130 3452 "chrono", 3453 + "image", 3131 3454 "log", 3132 3455 "manhunt-logic", 3133 3456 "manhunt-transport", ··· 3138 3461 "tauri", 3139 3462 "tauri-build", 3140 3463 "tauri-plugin-dialog", 3464 + "tauri-plugin-fs", 3141 3465 "tauri-plugin-geolocation", 3142 3466 "tauri-plugin-log", 3143 3467 "tauri-plugin-notification", ··· 3319 3643 checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 3320 3644 3321 3645 [[package]] 3646 + name = "maybe-rayon" 3647 + version = "0.1.1" 3648 + source = "registry+https://github.com/rust-lang/crates.io-index" 3649 + checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" 3650 + dependencies = [ 3651 + "cfg-if", 3652 + "rayon", 3653 + ] 3654 + 3655 + [[package]] 3322 3656 name = "md-5" 3323 3657 version = "0.10.6" 3324 3658 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3386 3720 ] 3387 3721 3388 3722 [[package]] 3723 + name = "moxcms" 3724 + version = "0.7.11" 3725 + source = "registry+https://github.com/rust-lang/crates.io-index" 3726 + checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" 3727 + dependencies = [ 3728 + "num-traits", 3729 + "pxfm", 3730 + ] 3731 + 3732 + [[package]] 3389 3733 name = "muda" 3390 3734 version = "0.17.1" 3391 3735 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3400 3744 "objc2-core-foundation", 3401 3745 "objc2-foundation", 3402 3746 "once_cell", 3403 - "png", 3747 + "png 0.17.16", 3404 3748 "serde", 3405 3749 "thiserror 2.0.18", 3406 3750 "windows-sys 0.60.2", ··· 3492 3836 ] 3493 3837 3494 3838 [[package]] 3839 + name = "nom" 3840 + version = "8.0.0" 3841 + source = "registry+https://github.com/rust-lang/crates.io-index" 3842 + checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" 3843 + dependencies = [ 3844 + "memchr", 3845 + ] 3846 + 3847 + [[package]] 3848 + name = "noop_proc_macro" 3849 + version = "0.3.0" 3850 + source = "registry+https://github.com/rust-lang/crates.io-index" 3851 + checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" 3852 + 3853 + [[package]] 3495 3854 name = "notify-rust" 3496 3855 version = "4.12.0" 3497 3856 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3522 3881 checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" 3523 3882 3524 3883 [[package]] 3884 + name = "num-derive" 3885 + version = "0.4.2" 3886 + source = "registry+https://github.com/rust-lang/crates.io-index" 3887 + checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 3888 + dependencies = [ 3889 + "proc-macro2", 3890 + "quote", 3891 + "syn 2.0.116", 3892 + ] 3893 + 3894 + [[package]] 3525 3895 name = "num-integer" 3526 3896 version = "0.1.46" 3527 3897 source = "registry+https://github.com/rust-lang/crates.io-index" 3528 3898 checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 3529 3899 dependencies = [ 3900 + "num-traits", 3901 + ] 3902 + 3903 + [[package]] 3904 + name = "num-rational" 3905 + version = "0.4.2" 3906 + source = "registry+https://github.com/rust-lang/crates.io-index" 3907 + checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 3908 + dependencies = [ 3909 + "num-bigint", 3910 + "num-integer", 3530 3911 "num-traits", 3531 3912 ] 3532 3913 ··· 3928 4309 checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 3929 4310 3930 4311 [[package]] 4312 + name = "pastey" 4313 + version = "0.1.1" 4314 + source = "registry+https://github.com/rust-lang/crates.io-index" 4315 + checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" 4316 + 4317 + [[package]] 3931 4318 name = "pathdiff" 3932 4319 version = "0.2.3" 3933 4320 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4168 4555 ] 4169 4556 4170 4557 [[package]] 4558 + name = "png" 4559 + version = "0.18.1" 4560 + source = "registry+https://github.com/rust-lang/crates.io-index" 4561 + checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" 4562 + dependencies = [ 4563 + "bitflags 2.11.0", 4564 + "crc32fast", 4565 + "fdeflate", 4566 + "flate2", 4567 + "miniz_oxide", 4568 + ] 4569 + 4570 + [[package]] 4171 4571 name = "polling" 4172 4572 version = "3.11.0" 4173 4573 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4337 4737 ] 4338 4738 4339 4739 [[package]] 4740 + name = "profiling" 4741 + version = "1.0.17" 4742 + source = "registry+https://github.com/rust-lang/crates.io-index" 4743 + checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" 4744 + dependencies = [ 4745 + "profiling-procmacros", 4746 + ] 4747 + 4748 + [[package]] 4749 + name = "profiling-procmacros" 4750 + version = "1.0.17" 4751 + source = "registry+https://github.com/rust-lang/crates.io-index" 4752 + checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" 4753 + dependencies = [ 4754 + "quote", 4755 + "syn 2.0.116", 4756 + ] 4757 + 4758 + [[package]] 4340 4759 name = "ptr_meta" 4341 4760 version = "0.1.4" 4342 4761 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4377 4796 ] 4378 4797 4379 4798 [[package]] 4799 + name = "pxfm" 4800 + version = "0.1.27" 4801 + source = "registry+https://github.com/rust-lang/crates.io-index" 4802 + checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" 4803 + dependencies = [ 4804 + "num-traits", 4805 + ] 4806 + 4807 + [[package]] 4808 + name = "qoi" 4809 + version = "0.4.1" 4810 + source = "registry+https://github.com/rust-lang/crates.io-index" 4811 + checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" 4812 + dependencies = [ 4813 + "bytemuck", 4814 + ] 4815 + 4816 + [[package]] 4817 + name = "quick-error" 4818 + version = "2.0.1" 4819 + source = "registry+https://github.com/rust-lang/crates.io-index" 4820 + checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" 4821 + 4822 + [[package]] 4380 4823 name = "quick-xml" 4381 4824 version = "0.37.5" 4382 4825 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4407 4850 "quinn-udp", 4408 4851 "rustc-hash", 4409 4852 "rustls 0.23.36", 4410 - "socket2 0.5.10", 4853 + "socket2 0.6.2", 4411 4854 "thiserror 2.0.18", 4412 4855 "tokio", 4413 4856 "tracing", ··· 4445 4888 "cfg_aliases", 4446 4889 "libc", 4447 4890 "once_cell", 4448 - "socket2 0.5.10", 4891 + "socket2 0.6.2", 4449 4892 "tracing", 4450 - "windows-sys 0.52.0", 4893 + "windows-sys 0.60.2", 4451 4894 ] 4452 4895 4453 4896 [[package]] ··· 4618 5061 ] 4619 5062 4620 5063 [[package]] 5064 + name = "rav1e" 5065 + version = "0.8.1" 5066 + source = "registry+https://github.com/rust-lang/crates.io-index" 5067 + checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" 5068 + dependencies = [ 5069 + "aligned-vec", 5070 + "arbitrary", 5071 + "arg_enum_proc_macro", 5072 + "arrayvec", 5073 + "av-scenechange", 5074 + "av1-grain", 5075 + "bitstream-io", 5076 + "built", 5077 + "cfg-if", 5078 + "interpolate_name", 5079 + "itertools", 5080 + "libc", 5081 + "libfuzzer-sys", 5082 + "log", 5083 + "maybe-rayon", 5084 + "new_debug_unreachable", 5085 + "noop_proc_macro", 5086 + "num-derive", 5087 + "num-traits", 5088 + "paste", 5089 + "profiling", 5090 + "rand 0.9.2", 5091 + "rand_chacha 0.9.0", 5092 + "simd_helpers", 5093 + "thiserror 2.0.18", 5094 + "v_frame", 5095 + "wasm-bindgen", 5096 + ] 5097 + 5098 + [[package]] 5099 + name = "ravif" 5100 + version = "0.12.0" 5101 + source = "registry+https://github.com/rust-lang/crates.io-index" 5102 + checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" 5103 + dependencies = [ 5104 + "avif-serialize", 5105 + "imgref", 5106 + "loop9", 5107 + "quick-error", 5108 + "rav1e", 5109 + "rayon", 5110 + "rgb", 5111 + ] 5112 + 5113 + [[package]] 4621 5114 name = "raw-window-handle" 4622 5115 version = "0.6.2" 4623 5116 source = "registry+https://github.com/rust-lang/crates.io-index" 4624 5117 checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" 4625 5118 4626 5119 [[package]] 5120 + name = "rayon" 5121 + version = "1.11.0" 5122 + source = "registry+https://github.com/rust-lang/crates.io-index" 5123 + checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" 5124 + dependencies = [ 5125 + "either", 5126 + "rayon-core", 5127 + ] 5128 + 5129 + [[package]] 5130 + name = "rayon-core" 5131 + version = "1.13.0" 5132 + source = "registry+https://github.com/rust-lang/crates.io-index" 5133 + checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" 5134 + dependencies = [ 5135 + "crossbeam-deque", 5136 + "crossbeam-utils", 5137 + ] 5138 + 5139 + [[package]] 4627 5140 name = "rcgen" 4628 5141 version = "0.13.2" 4629 5142 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4808 5321 ] 4809 5322 4810 5323 [[package]] 5324 + name = "rgb" 5325 + version = "0.8.52" 5326 + source = "registry+https://github.com/rust-lang/crates.io-index" 5327 + checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" 5328 + 5329 + [[package]] 4811 5330 name = "ring" 4812 5331 version = "0.17.14" 4813 5332 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4962 5481 source = "registry+https://github.com/rust-lang/crates.io-index" 4963 5482 checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" 4964 5483 dependencies = [ 4965 - "nom", 5484 + "nom 7.1.3", 4966 5485 ] 4967 5486 4968 5487 [[package]] ··· 5054 5573 "security-framework", 5055 5574 "security-framework-sys", 5056 5575 "webpki-root-certs", 5057 - "windows-sys 0.52.0", 5576 + "windows-sys 0.61.2", 5058 5577 ] 5059 5578 5060 5579 [[package]] ··· 5524 6043 checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" 5525 6044 5526 6045 [[package]] 6046 + name = "simd_helpers" 6047 + version = "0.1.0" 6048 + source = "registry+https://github.com/rust-lang/crates.io-index" 6049 + checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" 6050 + dependencies = [ 6051 + "quote", 6052 + ] 6053 + 6054 + [[package]] 5527 6055 name = "simdutf8" 5528 6056 version = "0.1.5" 5529 6057 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5993 6521 "ico", 5994 6522 "json-patch", 5995 6523 "plist", 5996 - "png", 6524 + "png 0.17.16", 5997 6525 "proc-macro2", 5998 6526 "quote", 5999 6527 "semver", ··· 6379 6907 ] 6380 6908 6381 6909 [[package]] 6910 + name = "tiff" 6911 + version = "0.10.3" 6912 + source = "registry+https://github.com/rust-lang/crates.io-index" 6913 + checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" 6914 + dependencies = [ 6915 + "fax", 6916 + "flate2", 6917 + "half", 6918 + "quick-error", 6919 + "weezl", 6920 + "zune-jpeg 0.4.21", 6921 + ] 6922 + 6923 + [[package]] 6382 6924 name = "time" 6383 6925 version = "0.3.47" 6384 6926 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 6702 7244 "objc2-core-graphics", 6703 7245 "objc2-foundation", 6704 7246 "once_cell", 6705 - "png", 7247 + "png 0.17.16", 6706 7248 "serde", 6707 7249 "thiserror 2.0.18", 6708 7250 "windows-sys 0.60.2", ··· 6918 7460 ] 6919 7461 6920 7462 [[package]] 7463 + name = "v_frame" 7464 + version = "0.3.9" 7465 + source = "registry+https://github.com/rust-lang/crates.io-index" 7466 + checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" 7467 + dependencies = [ 7468 + "aligned-vec", 7469 + "num-traits", 7470 + "wasm-bindgen", 7471 + ] 7472 + 7473 + [[package]] 6921 7474 name = "value-bag" 6922 7475 version = "1.12.0" 6923 7476 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 7415 7968 "windows", 7416 7969 "windows-core 0.61.2", 7417 7970 ] 7971 + 7972 + [[package]] 7973 + name = "weezl" 7974 + version = "0.1.12" 7975 + source = "registry+https://github.com/rust-lang/crates.io-index" 7976 + checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" 7418 7977 7419 7978 [[package]] 7420 7979 name = "widestring" ··· 8105 8664 "data-encoding", 8106 8665 "der-parser", 8107 8666 "lazy_static", 8108 - "nom", 8667 + "nom 7.1.3", 8109 8668 "oid-registry", 8110 8669 "ring", 8111 8670 "rusticata-macros", 8112 8671 "thiserror 1.0.69", 8113 8672 "time", 8114 8673 ] 8674 + 8675 + [[package]] 8676 + name = "y4m" 8677 + version = "0.8.0" 8678 + source = "registry+https://github.com/rust-lang/crates.io-index" 8679 + checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" 8115 8680 8116 8681 [[package]] 8117 8682 name = "yasna" ··· 8305 8870 version = "1.0.21" 8306 8871 source = "registry+https://github.com/rust-lang/crates.io-index" 8307 8872 checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" 8873 + 8874 + [[package]] 8875 + name = "zune-core" 8876 + version = "0.4.12" 8877 + source = "registry+https://github.com/rust-lang/crates.io-index" 8878 + checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" 8879 + 8880 + [[package]] 8881 + name = "zune-core" 8882 + version = "0.5.1" 8883 + source = "registry+https://github.com/rust-lang/crates.io-index" 8884 + checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" 8885 + 8886 + [[package]] 8887 + name = "zune-inflate" 8888 + version = "0.2.54" 8889 + source = "registry+https://github.com/rust-lang/crates.io-index" 8890 + checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" 8891 + dependencies = [ 8892 + "simd-adler32", 8893 + ] 8894 + 8895 + [[package]] 8896 + name = "zune-jpeg" 8897 + version = "0.4.21" 8898 + source = "registry+https://github.com/rust-lang/crates.io-index" 8899 + checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" 8900 + dependencies = [ 8901 + "zune-core 0.4.12", 8902 + ] 8903 + 8904 + [[package]] 8905 + name = "zune-jpeg" 8906 + version = "0.5.12" 8907 + source = "registry+https://github.com/rust-lang/crates.io-index" 8908 + checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" 8909 + dependencies = [ 8910 + "zune-core 0.5.1", 8911 + ] 8308 8912 8309 8913 [[package]] 8310 8914 name = "zvariant"
+6 -1
TODO.md
··· 1 1 # TODO 2 2 3 + ## 02-19-26 4 + 5 + - [ ] Get pictures working 6 + - [ ] Set up oxlint 7 + - [ ] treefmt 8 + 3 9 ## Ben 4 10 5 11 - [x] Transport : Packet splitting ··· 33 39 - [ ] NixOS VM tests wrapping the testing crate? 34 40 - [ ] Nix : Cheat the dependency nightmare and use crane 35 41 - [x] Nix : Fix manhunt.nix to actually build 36 - - [ ] Frontend : Rework state management, better hooks
+7
frontend/src/bindings.ts
··· 31 31 return await TAURI_INVOKE("get_current_screen"); 32 32 }, 33 33 /** 34 + * (Screen: Menu) Prompt user for a profile picture and handles converting it to base64 35 + * Returns `null` if the user cancelled the dialog 36 + */ 37 + async createProfilePicture(): Promise<string | null> { 38 + return await TAURI_INVOKE("create_profile_picture"); 39 + }, 40 + /** 34 41 * (Screen: Menu) Update the player's profile and persist it 35 42 */ 36 43 async updateProfile(newProfile: PlayerProfile): Promise<null> {
+14 -2
frontend/src/components/MenuScreen.tsx
··· 68 68 return; 69 69 } 70 70 71 - const newProfile = {...profile, display_name: newName}; 71 + const newProfile = { ...profile, display_name: newName }; 72 72 commands.updateProfile(newProfile); 73 73 setProfile(newProfile); 74 74 }; 75 75 76 + const onEditPicture = () => { 77 + commands.createProfilePicture().then(newPic => { 78 + if (!newPic) { 79 + return; 80 + } 81 + 82 + const newProfile = { ...profile, pfp_base64: newPic }; 83 + commands.updateProfile(newProfile); 84 + setProfile(newProfile); 85 + }); 86 + }; 87 + 76 88 return <> 77 89 <header> 78 - <ProfilePicture fallbackName={profile.display_name} src={profile.pfp_base64} /> 90 + <ProfilePicture onClick={onEditPicture} fallbackName={profile.display_name} src={profile.pfp_base64} /> 79 91 <span className="grow" onClick={onEditName}>Hello,&nbsp;&nbsp;{profile.display_name}</span> 80 92 </header> 81 93 <main className="menu">
+4 -3
frontend/src/components/ProfilePicture.tsx
··· 16 16 fallbackName: string; 17 17 src: string | null; 18 18 decoration?: ProfileDecor; 19 + onClick?: () => void; 19 20 }; 20 21 21 22 const hashName = (str: string, seed = 3) => { ··· 31 32 return 4294967296 * (2097151 & h2) + (h1 >>> 0); 32 33 }; 33 34 34 - export default function ProfilePicture({ fallbackName, src, decoration }: ProfilePictureProps) { 35 - const fallback = src ?? fallbackPicture; 35 + export default function ProfilePicture({ onClick, fallbackName, src, decoration }: ProfilePictureProps) { 36 + const fallback = src ? `data:image/webp;base64,${src}` : fallbackPicture; 36 37 const hueshift = hashName(fallbackName) % 360; 37 38 38 39 const style = src === null ? { ··· 45 46 46 47 const Icon = decoration !== undefined ? iconForDecor(decoration) : null; 47 48 48 - return <span data-initial={fallbackInitial} className={className}> 49 + return <span onClick={() => { onClick?.(); }} data-initial={fallbackInitial} className={className}> 49 50 <img width={256} height={256} style={style} alt="Profile Picture" src={fallback} /> 50 51 {Icon && <Icon size="1em"/>} 51 52 </span>;
+3
manhunt-app/Cargo.toml
··· 37 37 manhunt-transport = { version = "0.1.0", path = "../manhunt-transport" } 38 38 uuid = { version = "1.21.0", features = ["serde"] } 39 39 chrono = { version = "0.4.43", features = ["serde"] } 40 + image = "0.25.9" 41 + base64 = "0.22.1" 42 + tauri-plugin-fs = "2.4.5"
+11 -1
manhunt-app/src/lib.rs
··· 17 17 18 18 use crate::{ 19 19 history::AppGameHistory, 20 - profiles::{read_profile_from_store, write_profile_to_store}, 20 + profiles::{profile_picture_flow, read_profile_from_store, write_profile_to_store}, 21 21 state::{AppScreen, AppState, AppStateHandle, ChangeScreen, GameStateUpdate, LobbyStateUpdate}, 22 22 }; 23 23 ··· 94 94 /// for faster error checking. 95 95 async fn check_room_code(code: &str) -> Result<bool> { 96 96 room_exists(code).await.map_err(|err| err.to_string()) 97 + } 98 + 99 + #[tauri::command] 100 + #[specta::specta] 101 + /// (Screen: Menu) Prompt user for a profile picture and handles converting it to base64 102 + /// Returns `null` if the user cancelled the dialog 103 + async fn create_profile_picture(app: AppHandle) -> Result<Option<String>> { 104 + profile_picture_flow(&app).map_err(|e| format!("Couldn't Set Your Profile Picture:\n\n{e:?}")) 97 105 } 98 106 99 107 #[tauri::command] ··· 236 244 get_profile, 237 245 quit_to_menu, 238 246 get_current_screen, 247 + create_profile_picture, 239 248 update_profile, 240 249 get_lobby_state, 241 250 host_update_settings, ··· 267 276 let builder = mk_specta(); 268 277 269 278 tauri::Builder::default() 279 + .plugin(tauri_plugin_fs::init()) 270 280 .plugin(tauri_plugin_dialog::init()) 271 281 .plugin(tauri_plugin_notification::init()) 272 282 .plugin(
+55
manhunt-app/src/profiles.rs
··· 1 + use anyhow::Context; 2 + use base64::{Engine, prelude::BASE64_STANDARD}; 3 + use image::{ImageReader, codecs::webp::WebPEncoder, imageops::FilterType}; 4 + use log::info; 1 5 use manhunt_logic::PlayerProfile; 6 + use tauri_plugin_fs::{FsExt, OpenOptions}; 7 + use std::io::BufReader; 2 8 use tauri::AppHandle; 9 + use tauri_plugin_dialog::{DialogExt, FileAccessMode, PickerMode}; 3 10 use tauri_plugin_store::StoreExt; 4 11 12 + type Result<T = (), E = anyhow::Error> = std::result::Result<T, E>; 13 + 5 14 const STORE_NAME: &str = "profile"; 15 + 16 + const IMAGE_SIZE: u32 = 64; 17 + 18 + const SUPPORTED_EXTS: [&str; 7] = ["avif", "png", "jpg", "jpeg", "png", "tiff", "webp"]; 19 + 20 + fn create_profile_picture(file: std::fs::File) -> Result<String> { 21 + 22 + let reader = BufReader::new(file); 23 + let img = ImageReader::new(reader).with_guessed_format().context("Failed to guess format")?.decode().context("Failed to read image file")?; 24 + 25 + let img = img.resize_exact(IMAGE_SIZE, IMAGE_SIZE, FilterType::Lanczos3); 26 + 27 + let mut buf = Vec::<u8>::new(); 28 + let encoder = WebPEncoder::new_lossless(&mut buf); 29 + img.write_with_encoder(encoder) 30 + .context("Failed to encode image")?; 31 + 32 + Ok(BASE64_STANDARD.encode(buf)) 33 + } 34 + 35 + pub fn profile_picture_flow(app: &AppHandle) -> Result<Option<String>> { 36 + 37 + let exts = &SUPPORTED_EXTS.as_slice(); 38 + 39 + let dialog = app 40 + .dialog() 41 + .file() 42 + .set_title("Select a profile picture") 43 + .set_picker_mode(PickerMode::Image) 44 + .add_filter("Images", exts); 45 + 46 + let file = dialog.blocking_pick_file(); 47 + 48 + if let Some(file) = file { 49 + info!("Picked {file:?}"); 50 + let fs = app.fs(); 51 + 52 + let mut opts = OpenOptions::new(); 53 + opts.read(true); 54 + let file = fs.open(file, opts).context("Failed to open file")?; 55 + let base64 = create_profile_picture(file).context("Failed to create profile picture")?; 56 + Ok(Some(base64)) 57 + } else { 58 + Ok(None) 59 + } 60 + } 6 61 7 62 pub fn read_profile_from_store(app: &AppHandle) -> Option<PlayerProfile> { 8 63 let store = app.store(STORE_NAME).expect("Couldn't Create Store");