1979 Commits
Author SHA1 Message Date
asterisk727 4a0254ec19 chore: update readme for ongeki 2026-09-25 12:58:18 -05:00
crxmsxnandRaymond c3661d3c94 feat: ongeki 1.60 support (#240)
Co-authored-by: Raymond <101374892+raymonable@users.noreply.github.com>
2026-09-24 23:17:01 -04:00
topty bcbc770ca7 feat(mai2): stub MAGiCAL API responses (#246) 2026-09-22 16:54:23 -04:00
RandomEwok 55b47a3c02 fix: various bug fixes for wacca (#245) 2026-09-20 15:55:59 -04:00
Azalea 97743f55ef [+] Add pagination to maimai photo gallery (#244) 2026-09-16 09:35:07 +08:00
Azalea 11c5617abc [F] Fix 101% appearing as 100.9% (#243) 2026-09-11 01:55:59 +08:00
Raymond cf89e59af8 fix: don't set a timer on email confirmation tokens 2026-09-09 21:44:57 -04:00
TechnicalVessel 587557177e fix: assign ap+ lamp correctly for batch manual export 2026-09-09 21:06:01 -04:00
Azalea 6285bd3fd4 [-] Remove SDGA 1.65 nonce dedup 2026-08-12 05:43:59 +00:00
Raymond 7ba95f0b90 fix: do it correctly and not like a bum 2026-08-06 13:55:21 -04:00
Raymond 13aa48982f fix: shift ini down to lowercase for compat
i don't care anymore
2026-08-06 13:54:41 -04:00
Raymond 0a5c97d985 fix: shit 2026-08-05 20:28:32 -04:00
Raymond c1b6c3e414 fix: add trim 2026-08-05 19:03:52 -04:00
Azalea 5e6aaace8c [F] Fix SDGA 1.65 / SDGB 1.53 playlog, add nonce to UpsertUserAll (#238) 2026-08-06 04:44:41 +08:00
Azalea 3be81520ce [F] Fix import/export disparity, fix jackson3 export isSomething serialization bug, add tests (#237) 2026-08-06 03:21:20 +08:00
Azalea 30139cae8d [F] Fix export import missing fields and database errors (#236) 2026-08-04 12:29:03 +08:00
Azalea 96570a97ff [O] Ranking optimizations (#235) 2026-08-04 11:45:47 +08:00
Raymond 7eab79e48d fix: return fc+ on batch manual correctly 2026-08-03 16:08:38 -04:00
Azalea 05e613d667 [+] Delete account (#234) 2026-08-02 22:16:42 +08:00
Azalea d34aab37b2 [U] Java 21 -> Java 25 (#232) 2026-08-02 04:57:41 +00:00
Raymond 4aba8d8642 chore: 🐈‍⬛ 2026-07-28 23:24:15 -04:00
Raymond 0d70471bd6 revert: generate keychip on /keychip api
fixes regression causing 3,000+ users to not be assigned a keychip
2026-07-08 19:42:49 -04:00
Raymond 7ea5add407 fix: import/export fixes for chu3 & mai2 2026-07-08 12:00:02 -04:00
Raymond 41edddcaec fix: username insensitivity 2026-07-07 23:25:41 -04:00
Teio 1d36998967 [+] Mate (#231) 2026-07-07 01:58:52 -04:00
Raymond 3178c4c957 chore: revamp CONTRIBUTING.md 2026-07-04 19:59:18 -04:00
Raymond 48eb8a9c07 chore: update game-specific notes
Updated notes for Chunithm, Maimai DX, O.N.G.E.K.I, and Card Maker, including required patches and additional notes.
2026-07-04 19:36:38 -04:00
Raymond fcee9fb278 feat: chusan bs 2026-06-28 19:43:50 -04:00
Raymond 853abc8867 feat: use mai/chuni/ongeki-encoding when available (#230) 2026-06-20 15:57:20 -04:00
Raymond c099a8954e chore: 🐈‍⬛ 2026-06-18 14:06:39 -04:00
Raymond 96a894aa70 fix: add tls config prop (#228) 2026-06-16 19:54:56 -04:00
Raymond 0b3d52d31d fix: 60fps label 2026-06-15 22:10:07 -04:00
Azalea 27685087be Reapply "[F] Fix aimedb memory leak"
This reverts commit fec3480963.
2026-06-16 01:08:58 +00:00
Azalea fec3480963 Revert "[F] Fix aimedb memory leak"
This reverts commit 536734746b.
2026-06-16 00:38:25 +00:00
Azalea 536734746b [F] Fix aimedb memory leak 2026-06-15 21:15:25 +00:00
Raymond b352576358 fix: sort by correct rating value 2026-06-13 23:44:04 -04:00
Raymond f2ea015ef3 fix: don't not show non-aquanet users 2026-06-13 23:37:28 -04:00
Raymond 253c7a73d6 fix: don't show rank section at all if not available 2026-06-13 23:22:09 -04:00
Raymond e62115e6ac fix: improve ongeki ux, improve ranking backend (#227) 2026-06-14 11:12:37 +08:00
Raymond 08bf69c723 fix: display S+ and SS+ for chu3 on AquaNet 2026-06-13 21:20:31 -04:00
Raymond 3e2c198204 feat: reject invalid icf / v0.00 2026-06-11 22:54:44 -04:00
Raymond c3f75e6428 chore; UPDATE THE README 2026-06-08 22:46:56 -04:00
Raymond 4a6003ded3 chore: update chinese tls (ML) 2026-06-08 12:30:24 -04:00
Raymond b114adf940 fix: mistake in import 2026-06-08 12:15:40 -04:00
Raymond 7c31dfd4ab feat: add candidate display option to global game options 2026-06-08 12:11:30 -04:00
Raymond faabd45b7a fix: use correct class for exports 2026-06-08 12:07:35 -04:00
Raymond d7254913cd fix: [ongeki] use decimal instead of comma 2026-06-08 11:39:22 -04:00
RaymondandAzalea 237ba1464a feat: display ongeki refresh data on web ui
Co-authored-by: Azalea <noreply@aza.moe>
2026-06-07 21:05:09 -04:00
Raymond d5d50d687c feat: add general data list to chu3 2026-06-07 19:23:17 -04:00
crxmsxn 2c28758ae0 fix: allow more rfc5322 special characters in email (#225) 2026-06-07 00:29:05 -04:00
Raymond f025465f40 fix: mistake 2026-06-07 00:21:34 -04:00
Raymond 4b5eeadc2b feat: hide country toggle 2026-06-07 00:18:20 -04:00
Raymond 898939485c fix: enforce fullwidth 2026-06-07 00:00:11 -04:00
Raymond 593783866a fix: [ongeki] update constraints to cascade 2026-06-06 23:40:39 -04:00
Raymond 9b3871706f fix: [ongeki] more fixes, should work now 2026-06-06 23:30:19 -04:00
Raymond 5be6d8c80b fix: [ongeki] fix field matching in importer 2026-06-06 23:07:27 -04:00
Raymond f750cc6596 fix: [ongeki] mistake in importer 2026-06-06 22:54:06 -04:00
Raymond f67bbb822d fix: settings tab shouldn't show unplayed games 2026-06-06 22:49:26 -04:00
Raymond 819c058517 feat: [ongeki] username setting from webui 2026-06-06 22:43:41 -04:00
Raymond b2feb9a130 feat: [ongeki] data export/import 2026-06-06 22:19:12 -04:00
crxmsxn 6a10570fa6 feat: add chusan force unlock 2967 2999 ultima option (#224) 2026-05-31 14:23:49 -04:00
Yonle 6243ee7205 chore: [AquaNet] update README, move userbox config to .env, and add check before build (#223)
Signed-off-by: Yonle <yonle@proton.me>
2026-05-31 12:15:10 -04:00
Raymond 72c1f48bdb fix: rounding issue breaking encryption 2026-05-31 00:11:51 -04:00
raymonable 06eec89dfe fix: make minor rom versions always use the major rom key 2026-05-28 14:51:41 -04:00
Yonle 367a26c109 fix: adjust path example to avoid confusion (#222) 2026-05-28 14:43:12 -04:00
Yonle 2552568ac1 feat: improved announcement management, custom qr access code handler, fixes 2026-05-22 21:01:50 -04:00
Raymond 512a791aa4 chore: [🐈‍⬛] meow 2026-05-17 20:52:30 -04:00
Raymond 9bdc84418a fix: [mai2] change hash from md5 to sha256 2026-05-16 14:02:14 -04:00
Raymond 243a9b2ddc fix: 🛡️ don't leak extid & token in mai photos 2026-05-16 00:30:42 -04:00
Raymond f313f090f8 fix: default to user's last played game for rankings in navbar 2026-05-15 23:57:36 -04:00
Raymond 2e55247de0 fix: [chu3] import functional, improve error response for importing 2026-05-15 23:47:09 -04:00
Yonle 4895456bb0 fix: display error in a friendlier way on rankings
migrate from status overlays to displaying within container
2026-05-15 22:39:54 -04:00
Raymond aec0fdac8b fix: add new option for lv and bump correctly 2026-05-12 18:27:59 -04:00
Azalea eb600f1715 [F] Fix kaledx 2026-05-12 03:59:09 +00:00
Raymond bd6a641336 chore: bump data 2026-05-11 19:28:52 -04:00
Raymond aeebf069c2 fix: 🚑 fix CM title servers 2026-05-04 17:08:52 -04:00
Azalea a77111b2ad [F] Fix diva null? 2026-04-28 18:47:11 -04:00
Azalea 031f9e4663 Merge branch 'v1-dev' of https://github.com/MewoLab/AquaDX into v1-dev 2026-04-28 18:46:56 -04:00
Azalea 1181707b43 [WTF] Fix firefox favicon wtf 2026-04-24 12:36:44 +08:00
Azalea 927fa56862 [F] Fix svelte warnings & errors (#218) 2026-04-24 12:27:23 +08:00
Raymond d17073297c fix: 🚑 typo 2026-04-23 19:47:15 -04:00
Raymond 34a3de1209 fix: add new lv 2026-04-23 19:00:45 -04:00
raymonable 3a42435dc5 fix: increase maximum linked verses 2026-04-23 14:15:30 -04:00
Azalea 7865f7cfa7 [F] Fix svelte warnings & errors 2026-04-21 03:49:04 -04:00
Raymond e711921725 fix: 🚑 make data version fallback to v0 instead of v1 2026-04-16 21:29:49 -04:00
asterisk727 d0110d7f47 fix: 🚑 bad migration 2026-04-15 23:06:16 +09:00
asterisk727 26748719a0 chore: remove duplicate migration 2026-04-14 22:31:03 -04:00
asterisk727 b20fe6fa62 Merge branch 'v1-dev' of https://github.com/MewoLab/AquaDX into v1-dev 2026-04-14 22:28:03 -04:00
asterisk727 9aec50d901 chore: update chusan event db 2026-04-14 22:27:56 -04:00
asterisk727 c31c1a0524 chore: update chusan event db 2026-04-14 22:20:23 -04:00
Azalea c989c273c4 [F] Fix wacca: Path variable 2026-04-14 02:34:41 -04:00
Azalea c4c550b239 [F] Fix wacca: Should not compress 2026-04-14 02:27:41 -04:00
Azalea 22334de8a7 [F] Fix wacca trailing slash 2026-04-14 01:59:11 -04:00
Raymond 50cb970828 fix: logging typo 2026-04-13 20:56:53 -04:00
Azalea 80c088626e fix: 🚑 ketchup pattern 2026-04-13 20:42:22 -04:00
Raymond 2d5fb11dc0 fix: 🚑 illiteracy at it's finest 2026-04-13 18:45:49 -04:00
Raymond 708532d18b fix: 🚑 chusan json fix 2026-04-13 18:42:02 -04:00
Raymond dad66401cc fix: 🚑 aimedb hotfix 2026-04-13 17:33:57 -04:00
Raymond 1bc89c46f1 chore: make readme a little prettier 2026-04-13 14:56:35 -04:00
Raymond 1d3ddfc06c feat: Title Server Encryption (#216)
i still have a few things i'd like to do but i want to get this merged in and deployed asap
2026-04-13 14:54:07 -04:00
34cfa279dc feat: support multiple keychips per user (#215)
Co-authored-by: hykilpikonna <22280294+hykilpikonna@users.noreply.github.com>
Co-authored-by: asterisk727 <59166650+asterisk727@users.noreply.github.com>
Co-authored-by: Raymond <101374892+raymonable@users.noreply.github.com>
2026-04-13 00:21:50 -04:00
Raymond 2e21926189 User Options Web UI (#214) 2026-04-06 10:04:03 +08:00
Azalea 7a946708c3 [F] Fix data 2026-03-31 17:16:24 +00:00
Azalea fcf7c46cad [F] 2099 > 2029??? 2026-03-29 19:30:16 -04:00
Azalea 28063912ce Reapply "Remove events from db (#213)"
This reverts commit beacca12c3.
2026-03-29 19:29:12 -04:00
Azalea beacca12c3 Revert "Remove events from db (#213)"
This reverts commit fe0a2e738d.
2026-03-29 19:16:38 -04:00
Azalea fe0a2e738d Remove events from db (#213) 2026-03-30 05:01:09 +08:00
Raymond bc880bca8d chore: add new information 2026-03-29 15:28:55 -04:00
Raymond f546e40318 chore: bump version 2026-03-24 22:39:58 -04:00
Menci 08c861b32e feat: maimai DX CiRCLE PLUS (#210) 2026-03-25 03:23:43 +08:00
Raymond 00d7d7345f chore: fix maimai formatting 2026-03-11 21:29:50 -04:00
Raymond f6afb824a4 chore: upgrade data
ty anon
2026-03-06 23:42:15 -05:00
May b487a756b2 feat: ✨ Infinite scrolling on rankings page (#209) 2026-03-04 16:41:36 -05:00
Raymond fcdfeb25ea chore: add new migration 2026-02-28 02:13:22 -05:00
Paiton Bertschy e1c9bc7285 Update CardMakerController.kt (#207) 2026-02-25 14:57:08 -06:00
Paiton Bertschy b89f123d1b Update CardMakerController.kt 2026-02-25 13:55:06 -06:00
Paiton Bertschy 707ce3715b Update CardMakerController.kt 2026-02-25 01:35:01 -06:00
Raymond 1e132c6784 chore: bump listed version 2026-02-22 18:30:31 -05:00
Raymond ebb2e2e4a4 [chu3] X-VERSE & LINKED VERSE (#204) 2026-02-22 15:23:21 -05:00
Raymond e755bc9380 feat: xversex a001 migration (#203) 2026-02-21 15:41:18 -05:00
raymonable c2ac01d940 feat: add github support, remove easter egg and declutter 2026-02-16 20:10:19 -05:00
raymonable 1b5601db45 fix: improve titlebar consistency 2026-02-15 12:27:54 -05:00
raymonable ff1ed2d9ec fix: 🚑 incorrect routing, class fixes, update readme 2026-02-15 12:20:19 -05:00
raymonable 8a78bb2c6f fix: add browser check 2026-02-14 23:45:24 -05:00
raymonable ca5d33a1cc feat: automatic keychip installation, improved onboarding ux, tweak styles, bomb israel 2026-02-14 23:41:22 -05:00
Raymond 6ddb72e28e chore: reword readme 2026-02-14 15:21:02 -05:00
Paiton Bertschy 25dbd5c874 Update version and codename for MaiMai DX games 2026-02-14 13:24:15 -06:00
AzaleaandRaymond 50a9a2bdd0 [-] Drop the codebase (#187)
Co-authored-by: Raymond <protogenraymond@gmail.com>
2026-02-09 05:44:42 +08:00
Paiton Bertschy 6c4c9337e7 fix: Fix issue tracker link in README.md 2026-02-05 17:32:58 -06:00
Pinapelz 6776353556 feat: batch manual export for mai2 (#199) 2025-12-30 14:20:53 -05:00
Raymond 3b19257ab1 feat: ✨ option APIs for chu3, mai2 & ongeki (#194) 2025-12-21 18:19:09 -05:00
Raymond a0cd7456ee fix: clean up settings page to match settings layout 2025-12-21 12:23:27 -05:00
Azalea aeafa6a396 [M] Rename to avoid migration conflict 2025-12-14 05:27:17 +09:00
Paiton Bertschy 448426a96d chore: remove a300 events (dummy events) 2025-12-14 05:27:17 +09:00
thewiilover dfa6176689 chore: ad chusan xverse a071 to a300 event ids 2025-12-14 05:27:17 +09:00
Menci d996fba291 [+] Fedy for AquaGameOptions 2025-12-13 10:21:42 +09:00
Menci 0cb2a95ff3 [F] Fix inheritance in KClass<T>.vars() 2025-12-13 10:21:42 +09:00
Menci be5220fd51 [O] Use Iterable<T>.mapApply() 2025-12-13 10:21:42 +09:00
Menci f23c0d6fe1 [RF] Re-organize game options 2025-12-13 10:21:42 +09:00
Menci 5aca650602 [F] CardTimestamp relationship definition 2025-12-10 14:03:51 +09:00
Menci 7c72348016 [+] Card Timestamp 2025-12-10 14:03:51 +09:00
radiumerst 5eee6505f9 Fix: KALEIDXSCOPE crashing on final phase
Add gates 7-10 to prevent crashing when entered

Set Gates 1-9 to LIFE999 BASIC
Set Gate 10 to LIFE999/999 BASIC
2025-12-10 14:03:27 +09:00
Azalea 43b7ea65a5 [-] Replace login blocking with an @ AquaDX prefix 2025-11-23 23:43:23 +08:00
Paiton Bertschyand凌莞~ 85149dcd03 Update src/main/resources/db/80/V1000_61__ongeki_refresh_a017_to_a032.sql
Co-authored-by: 凌莞~(=^▽^=) <opensource@c5y.moe>
2025-11-19 13:33:23 +08:00
Paiton Bertschyand凌莞~ a767c8949c Update src/main/resources/db/80/V1000_61__ongeki_refresh_a017_to_a032.sql
Co-authored-by: 凌莞~(=^▽^=) <opensource@c5y.moe>
2025-11-19 13:33:23 +08:00
Paiton Bertschyand凌莞~ bbeb476a62 Update src/main/resources/db/80/V1000_61__ongeki_refresh_a017_to_a032.sql
Co-authored-by: 凌莞~(=^▽^=) <opensource@c5y.moe>
2025-11-19 13:33:23 +08:00
Paiton Bertschy c444350cef Remove duplicate entries from SQL data
Removed duplicate entries for '7mai' and 'HiTECH NINJA' in the SQL file.
2025-11-19 13:33:23 +08:00
thewiilover 13a318d519 chroe: adds all the new content ids for ongeki 2025-11-19 13:33:23 +08:00
thewiilover e744d96c96 chore: add ongeki ReFresh event ids from a017-a032 to new migration 2025-11-19 13:33:23 +08:00
Clansty 491044d37a [-] remove munet migration notice 2025-11-14 22:11:21 +08:00
Azalea 9d30cf1e7d [+] Pagination 2025-11-14 18:52:46 +08:00
凌莞~(=^▽^=) d2608472d8 fix: total_point null (#185) 2025-10-25 03:46:05 +08:00
Menci 34aae0c87a [F] Player name validation (#186) 2025-10-21 03:46:43 +09:00
Clansty 69bd35a579 [O] Change tip 2025-10-11 04:05:56 +08:00
Menci 3e6c0b4159 feat: user management APIs (#184) 2025-10-07 13:21:01 -07:00
Menci a33ec8b11c feat: crop pfp to at most 1024px (#183) 2025-10-07 13:20:49 -07:00
Azalea dd03ca38a1 [F] Fix memory leak 2025-10-07 03:40:49 +08:00
Menci 1cac5e451a refactor: user registrar (#182) 2025-10-06 12:32:52 -07:00
Azalea 010d4592e4 hot fix 2025-10-07 00:30:48 +08:00
Menci b0d0f8ef7d feat: some data management APIs (#176) 2025-10-06 09:27:39 -07:00
Raymondandasterisk727 967d311ee4 chusan x-v a001 (#180)
Co-authored-by: asterisk727 <59166650+asterisk727@users.noreply.github.com>
2025-10-04 10:59:02 -07:00
crxmsxn d5b777d720 fix: mobile styling for favorites (#181) 2025-10-04 10:57:31 -07:00
Raymond 2ab2666ad0 Feat: Favorites (for all supported games) (#174) 2025-09-29 22:56:26 -07:00
alexay7 4971f2be78 [+] Add support for geki cm and fix chusan cm implementation (#175) 2025-09-29 22:47:31 -07:00
Menci b0a49d6626 [+] Add APIs (#177) 2025-09-29 21:54:58 -07:00
凌莞~(=^▽^=) d830854eaa fix: X-Verse Username (#179) 2025-09-29 22:35:56 -04:00
凌莞~(=^▽^=) 68820d5a86 chore: Bump versions 2025-09-13 21:49:46 +08:00
Raymond 8b079bc40b fix: nvm looks like shit 2025-09-12 11:34:25 -04:00
Raymond b0dd9b845f chore: bump versions 2025-09-12 11:33:23 -04:00
Azalea b3d0670e1d [F] FUCK JS 2025-09-11 09:51:14 +09:00
Clansty e4734924f3 [O] Change Migrated display 2025-08-26 20:08:13 +08:00
Raymondandalexay7 6ca419dd5b fix: un-revert prefectures :BocchiSobSmile: (#173)
Co-authored-by: alexay7 <43906716+alexay7@users.noreply.github.com>
2025-08-22 05:24:48 -07:00
Raymond fc3f2171ee revert: prefectures (temporary) 2025-08-22 06:02:22 -04:00
alexay7 3d95a84739 feat: Add prefecture modification support (#170) 2025-08-21 16:19:25 -04:00
crxmsxn 15412911a9 fix: batch manual bugfixes (#168) 2025-08-14 12:32:55 -04:00
Raymond 9dc7a790cc Session Token Revitalization (#167) 2025-08-13 05:15:16 -04:00
Keeboy99 d0b67c37f6 fix: 🚑 fix ongeki re:fresh support by @Keeboy99 2025-08-11 23:51:49 -04:00
Clansty f6aa7d1fe3 [+] register notice 2025-08-07 17:52:31 +08:00
Clansty 2dc53cfbd7 [+] Migrate button 2025-08-07 17:52:31 +08:00
Raymond db43e18b16 fix: 🚑 increase expiration time
this is a temporary fix until i implement token revitalization where i might turn it back down to 7 days
2025-08-04 07:03:37 -04:00
云 1a54527428 [+] Gradle packageThin task for separated jar and libs 2025-08-03 08:22:09 -04:00
Azalea 73026911da [F] Properly fix v41 2025-08-01 15:32:05 +09:00
Azalea 86558cd07e [+] Longer log retention 2025-08-01 00:49:43 +09:00
Azalea 218d2788e8 [F] Fix migration collision 2025-08-01 00:22:21 +09:00
Azalea 0a37c2a854 Delete src/main/resources/db/40/V1000_41__add_aquanet_user_fedy.sql 2025-07-31 11:19:14 -04:00
asterisk727 7eda890473 feat: cn translation for password reset 2025-07-31 17:56:47 +09:00
Raymond 2431bd09af fix: clear code after used 2025-07-31 17:56:47 +09:00
Raymond 7b21a38e17 fix: typo in error 2025-07-31 17:56:47 +09:00
Raymond bf51f48961 fix: clear sessions upon password reset 2025-07-31 17:56:47 +09:00
Raymond 92868201a3 fix: typos, sql, some strings were odd 2025-07-31 17:56:47 +09:00
asterisk727 c01c40fe45 fix: bug fixes to password reset (INCOMPLETE) 2025-07-31 17:56:47 +09:00
Raymond 39ed8af840 feat: ✨ swap auId in JWT for individual token
note: has not been tested to ensure there are no collisions, todo
2025-07-31 17:56:47 +09:00
asterisk727 82adf5c138 feature: password reset 2025-07-31 17:56:47 +09:00
凌莞~(=^▽^=) e0d12acf61 [+] Chusan event A181 to A191 (#157) 2025-07-31 04:55:15 -04:00
Paiton Bertschyand凌莞~ 955743aecd chore: add a172 event ids (#156)
Co-authored-by: 凌莞~(=^▽^=) <i@gao4.pw>
2025-07-31 04:54:44 -04:00
Raymond 4fb815a184 fix: correct filename 2025-07-26 23:51:00 -04:00
云 13ffe45dc6 [+] CardMaker maimai event (#159) 2025-07-25 03:29:54 -04:00
crxmsxn 5b699a2c3c feature: Batch-Manual export for CHUNITHM (#161) 2025-07-24 23:04:16 -04:00
Raymond bd32677e9e fix: subtrophies on userbox not showing up correctly 2025-07-20 12:03:21 -04:00
Adelyn Flowers a98db63bec Add missing chusan opts from bad migration (#155) 2025-07-09 02:56:39 -04:00
Clansty 2430b8c448 [+] Auto redirect when migrated 2025-07-06 16:29:36 +08:00
Menci e3486042a5 [F] Data import fix (#153) 2025-07-04 12:45:09 -04:00
Menci d79a4e5499 [+] Data support APIs (#151) 2025-07-04 00:01:32 -04:00
Menci 068b6179e5 fixup (#152) 2025-06-27 02:03:47 -04:00
Menci 3b90ac3c77 add stubs 2025-06-25 19:29:39 +09:00
Menci 42b8eabb3a revert 2025-06-25 19:29:39 +09:00
Menci 11dbe849cf add mai2 fields 2025-06-25 19:29:39 +09:00
Menci ac6cbb9dd3 add mai2 fields 2025-06-25 19:29:39 +09:00
Menci 5c1f659437 export options 2025-06-25 19:29:39 +09:00
Clansty 155202dab9 chore: hide migrated cards in ranking 2025-06-23 09:41:49 +08:00
Raymond 71512bdad4 fix: typo 2025-06-18 11:43:53 -04:00
Raymond 88d4a3d298 style: move from "confirm" to "verify" by May's request 2025-06-18 13:52:31 +09:00
Raymond 2563a31d15 fix: 🎨 migrate from / to /confirm for email confirmation 2025-06-18 13:52:31 +09:00
Raymond 9c91d730b4 fix: remove unnecessary check 2025-06-01 15:09:29 -04:00
Teud 3aaeebae96 [+] Chusan Verse: Add events from A161 to A171 2025-06-01 02:59:39 +09:00
noarchwastaken 63a5f4441f [+] Chusan Verse: Add events from A152, A153, A161 2025-05-27 23:21:13 +09:00
Paiton Bertschy 47a171b1a4 Raymond was mad 2025-05-19 23:06:52 -05:00
Clansty a3b3b3dd93 [F] Mai2 unable to register new user 2025-05-03 16:06:27 +08:00
AzaleaandCopilot 98f128ae07 Update src/main/java/icu/samnyan/aqua/net/UserRegistrar.kt
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-02 16:28:09 -04:00
Clansty 7fd20c3d9a [F] Should not display migrated user in ranking 2025-05-02 16:28:09 -04:00
Clansty d7b45e4ce7 [+] clearMigrateFlag 2025-05-02 16:28:09 -04:00
Clansty 2e1eb2c879 [+] Login Alert for chusan, ongeki and wacca 2025-05-02 16:28:09 -04:00
Clansty 21142a53df [+] Login Alert for net and mai2 2025-05-02 16:28:09 -04:00
Azalea 1f847439a7 [F] Fix ghost card handling 2025-05-02 16:28:09 -04:00
Azalea 236266cd7a [F] Fix migration ID collision 2025-05-02 16:28:09 -04:00
Azalea 611f6dbffc [F] Fix updated usage 2025-05-02 16:28:09 -04:00
Azalea 1d4bb9b534 [+] Minato migration 2025-05-02 16:28:09 -04:00
Azalea 110a2144fa [F] Fix tablename 2025-05-01 21:02:57 -04:00
Azalea c87889ba41 [+] Music popularity api 2025-05-01 20:54:27 -04:00
Raymond 88ea5c83b5 fix: Harmonization
i hope you're happy sourcery
2025-04-18 23:47:31 -04:00
Raymond e962ac7ca7 fix: chinese trans 2025-04-18 23:47:31 -04:00
Raymond 7f4ee0784e fix: add options on website 2025-04-18 23:47:31 -04:00
Raymond f222632dfb feat: ✨ symbol chat 2025-04-18 23:47:31 -04:00
Paiton Bertschy 8d65952e40 Verse plus isn't a thing (yet( 2025-04-18 14:53:34 -05:00
Azalea 6b99ab9e43 [+] Blacklist 2025-04-07 23:57:03 -04:00
Azalea 646136e6ea [+] Restore QQ invite 2025-04-02 14:45:38 -04:00
Raymond 3f2a337497 fix: egg not wokring 2025-04-02 12:25:21 -04:00
Azalea 2798e81f49 [-] Remove qq invite for now... 2025-04-02 12:16:56 -04:00
Azalea d2983253bb [O] Communities 2025-04-02 12:10:58 -04:00
Raymond fa0ebd20c3 [+] Chusan Userbox Egg 2025-04-02 12:03:19 -04:00
Raymond dc8482b884 fix: mobile improvements 2025-04-02 12:03:19 -04:00
Raymond 64fe4b682a fuck me 2025-04-02 12:03:19 -04:00
Raymond 636bea080a fix: userbox fix 2025-04-02 12:03:19 -04:00
Raymond 24a6efa2c7 [+] Chusan Userbox Upgrade 3 2025-04-02 12:03:19 -04:00
Azalea 07e5d0e983 [U] Update readme 2025-03-31 12:18:24 -04:00
Azalea f67879a847 [+] Chusan Verse+: Unlock event 2025-03-31 12:18:24 -04:00
Azalea ce7f35bada [+] Chusan Verse+: New apis 2025-03-31 12:18:24 -04:00
Azalea 76145bc354 [U] Maimai Prism+: Update readme 2025-03-31 12:18:24 -04:00
Azalea 677b84b13c [+] Maimai Prism+: SQL for new ext field 2025-03-31 12:18:24 -04:00
Azalea f336408951 [+] Maimai Prism+: New ext field 2025-03-31 12:18:24 -04:00
Azalea 1abd176616 [+] Maimai Prism+: New no-op api 2025-03-31 12:18:24 -04:00
Azalea 18d09f4184 [F] Fix ongeki user music detail 2025-03-29 13:37:58 -04:00
Azalea 756f274155 Ongeki Refactor (#134) 2025-03-29 13:21:09 -04:00
Azalea 25340075d5 [-] Remove temp file 2025-03-29 12:54:19 -04:00
Azalea a9c0fe5ff8 [F] Ongeki: Field inconsistencies 2025-03-29 12:50:19 -04:00
Azalea 348b2e17f0 [F] Wacca and ongeki lastRomVersion fields 2025-03-29 11:53:34 -04:00
Raymond a6837f4555 logout button (#137)
* feat: log out button

* fix: use i18n
2025-03-27 16:27:48 -04:00
Azalea 7e4b4991fd [M] Move file to the correct place 2025-03-27 11:08:22 -04:00
Azalea f774d33966 Merge branch 'v1-dev' into ongeki 2025-03-27 11:04:18 -04:00
云 f61ca2d647 [+] Ongeki Re:Fresh A016 (#135) 2025-03-27 10:57:24 -04:00
Azalea 3c1d3013ce [-] Ongeki: Remove unused models 2025-03-27 05:22:35 -04:00
Azalea 685129fede [O] Optimize logging 2025-03-27 05:16:24 -04:00
Azalea c32d334aab [M] Move sql 2025-03-27 05:01:42 -04:00
Azalea 577b758c99 [F] Ongeki: Fix path vars 2025-03-27 05:00:47 -04:00
Azalea 8b9797595a [O] Better logging 2025-03-27 04:58:43 -04:00
Azalea 0e6c55c56e [F] Ongeki: Fix key mismatch 2025-03-27 03:20:31 -04:00
Azalea e65269ad29 [F] Ongeki: Fix unique constraints 2025-03-27 00:37:27 -04:00
Azalea e00bbeadde [O] Ongeki: Upsert user all 2025-03-27 00:17:02 -04:00
Azalea 1193192e81 [O] Ongeki: Refactor other endpoints 2025-03-27 00:16:25 -04:00
Azalea 95286bae1c [O] Ongeki: Transform user list endpoints 2025-03-26 22:19:49 -04:00
Azalea 654cda736d [O] Ongeki: User unpaged apis 2025-03-26 21:45:13 -04:00
Azalea a2b27090db [+] Ongeki: Solve Re:Fresh conflicts 2025-03-26 20:56:21 -04:00
Azalea 278b0205fc Merge branch 'v1-dev' into ongeki 2025-03-26 20:24:23 -04:00
Azalea 90f8cd8c65 [O] Ongeki: Static and game handlers 2025-03-26 20:23:24 -04:00
Azalea 05b8eda84a [U] Update readme 2025-03-26 20:00:45 -04:00
忍野ペンギン 2ea3a2a8e4 [+] Support for Ongeki Re:Fresh (#133)
* [+] Minimum working support for Ongeki Re:Fresh

* [+] Re:Fresh: Add user event map and missing fields

* [+] Re:Fresh: Extract user skin
2025-03-26 19:54:46 -04:00
Azalea e58e84da35 [O] Ongeki: Response models 2025-03-26 19:23:30 -04:00
Azalea 8a35cf002f [F] Ongeki: AllArgsConstructor 2025-03-26 19:10:30 -04:00
Azalea c98e73883b [O] Ongeki: Make game entities constructor consistent 2025-03-26 19:06:53 -04:00
Azalea f3e83193d6 [O] Ongeki: Merge game entities 2025-03-26 19:02:45 -04:00
Azalea c0604bc989 [M] Ongeki: Move model 2025-03-26 18:56:33 -04:00
Azalea 9af383af88 [O] Ongeki: Merge response pojo 2025-03-26 18:51:58 -04:00
Azalea 9c295f6012 [-] Ongeki: Remove unnecessary JsonProperty 2025-03-26 18:48:25 -04:00
Azalea 57d83439f3 [F] Ongeki: Fix constructor inconsistencies 2025-03-26 18:36:30 -04:00
Azalea 7320a982f6 [O] Ongeki: Generalize user entity 2025-03-26 18:25:25 -04:00
Azalea 42ffea41ab [F] Ongeki: Fix field names 2025-03-26 18:15:15 -04:00
Azalea 1c1350d84b [O] Ongeki: Transform user entities 2025-03-26 18:09:54 -04:00
Azalea 8be5dc20a9 [+] Ongeki: Serialization consistency test 2025-03-26 18:09:11 -04:00
Azalea 0429cb060c [+] Ongeki: All repos component 2025-03-26 17:49:22 -04:00
Azalea 13aabda72a [O] Ongeki: Rename repos 2025-03-26 17:45:52 -04:00
Azalea 73281d1316 [O] Ongeki: Generalize user repos 2025-03-26 17:40:36 -04:00
Azalea fdfdf66fa3 [O] Ongeki: Remove unused repo functions 2025-03-26 17:33:46 -04:00
Azalea d43a0dd862 [O] Ongeki: Merge repos file 2025-03-26 17:32:25 -04:00
Azalea cbf1e2709a [F] Fix namespace 2025-03-26 17:29:46 -04:00
Azalea fb75cd1add [O] Ongeki: Refactor User repos 2025-03-26 17:28:59 -04:00
Azalea d34b34b5bd [F] Fix export 2025-03-26 17:20:50 -04:00
Azalea 1df5b4e8ba [-] Remove old aqua apis 2025-03-26 17:18:08 -04:00
Azalea ff9ee24894 [O] Ongeki: Refactor Game repos 2025-03-26 17:16:34 -04:00
Azalea b4b70f7efe [+] Expose sdk to window 2025-03-26 16:40:45 -04:00
Azalea 20ca84e5ab [+] Add country override field 2025-03-26 16:23:49 -04:00
Azalea 90b259b609 [+] Add endpoint to change rom version 2025-03-26 16:23:30 -04:00
Azalea f463aea3ef [+] discord LLM prompt 2025-03-25 18:39:03 -04:00
RaymondandAzalea 064f674b14 userbox import improvements (#132)
* fix: scan for option data correctly

* fix: i18n update for aquabox

i used google translate

* fix: remove log

* [F] fix chinese

---------

Co-authored-by: Azalea <22280294+hykilpikonna@users.noreply.github.com>
2025-03-25 12:46:18 -04:00
Azalea d94a011413 [F] Fix ip 2025-03-23 18:26:53 -04:00
Raymond 8549a5caae docs: remove ARRR 2025-03-22 02:17:38 -04:00
Azalea 3ea63a5ccf [-] Omit stack trace for decompress failure 2025-03-21 21:04:40 -04:00
Azalea 23ddb2c6e1 [F] Fix ongeki rating 2025-03-21 21:01:19 -04:00
Azalea c524950e35 [O] Longer timeout 2025-03-21 20:57:05 -04:00
Azalea 4434b6ca2a [-] Omit stack trace for session last use time error 2025-03-21 20:56:34 -04:00
Azalea e29a0eff17 [F] Fix missless export 2025-03-21 20:39:47 -04:00
Azalea bac33c66d9 [F] Fix merge conflict 2025-03-21 19:53:39 -04:00
Azalea 3c790134ee Merge branch 'broker' into v1-dev 2025-03-21 19:47:35 -04:00
Azalea c1196042bf [F] Fix sql 2025-03-21 19:08:04 -04:00
Azalea 8649a74612 [F] 不太聪明喵 2025-03-21 18:47:34 -04:00
Kanon 7ab58c6495 Modify the Chu3 rating return accuracy (#127)
* Modify the Chu3 rating return accuracy

* [F] Fix aquabox-url doc
2025-03-21 18:35:41 -04:00
Azalea 7fb46441f4 AquaTrans and stuff (#131) 2025-03-21 18:35:01 -04:00
Azalea Gui f72ee54ff4 Merge branch 'v1-dev' into verse 2025-03-21 18:32:37 -04:00
Azalea 8578f6e048 [+] i18n 2025-03-21 18:30:18 -04:00
Azalea bfdcdc30d6 [F] Fix dns 2025-03-21 16:58:00 -04:00
Azaleaandsourcery-ai[bot] 2def7a8861 Update src/main/java/icu/samnyan/aqua/net/transfer/AllNetClient.kt
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
2025-03-21 16:53:35 -04:00
Azaleaandsourcery-ai[bot] 166fd9e6b7 Update src/main/java/ext/Http.kt
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
2025-03-21 16:52:54 -04:00
Azalea 8efb3d7554 Merge branch 'v1-dev' into broker 2025-03-21 16:48:58 -04:00
Azalea 02b4a70dd2 [+] HTTP timeout 2025-03-21 16:47:43 -04:00
Azalea cb039df33e [+] Devnotes 2025-03-21 16:47:19 -04:00
Azalea da648190db [F] Fix error display 2025-03-21 16:46:35 -04:00
Azalea 2b26304d92 [+] More events 2025-03-21 16:41:33 -04:00
Azalea 33f97fe21f [M] Move sql migrations 2025-03-21 16:41:26 -04:00
Azalea 5fe20906d9 [F] Fix artemis response reading 2025-03-21 07:59:31 -04:00
Azalea 2f319e661b [F] Fix artemis "Store ID cannot be 0!" 2025-03-20 11:07:47 -04:00
Azalea 35e7d796ab [F] Fix port with aimedb 2025-03-20 10:33:27 -04:00
Azalea 3d93cc300a [O] Read everything from aimedb 2025-03-20 10:33:13 -04:00
Azalea e7085f7602 [F] Fix DFI response compat 2025-03-20 09:50:23 -04:00
Azalea 4f3a6cba45 [F] Fix regex 2025-03-20 07:10:17 -04:00
Azalea 05dea088df [O] Replace alert with confirm window 2025-03-20 06:29:59 -04:00
Azalea edf5dd133b [O] Make confirm callback nullable 2025-03-20 06:28:28 -04:00
Azalea 917f8476b9 [F] Fix promise 2025-03-20 06:26:02 -04:00
Azalea b2f10e31f7 [F] Fix confirm overlay bind 2025-03-20 06:24:41 -04:00
Azalea 22fffcc422 [O] Replace confirm alert with ui 2025-03-20 06:13:27 -04:00
Azalea c93f47744b [+] Complete transfer logic 2025-03-20 06:06:35 -04:00
Azalea c6af5b7d87 [O] Disable on tested 2025-03-20 06:05:46 -04:00
Azalea 182c3ba393 [+] selectJsonFile 2025-03-20 06:05:03 -04:00
Azalea 4e249601fe [M] Move download function to libs/ui 2025-03-20 06:04:35 -04:00
Azalea 2f966d4fa9 [+] Add expected error type 2025-03-20 06:04:03 -04:00
Azalea 2ef950ae26 [+] Streaming post in frontend 2025-03-19 04:59:18 -04:00
Azalea 219705d2f3 [F] Fix error messages 2025-03-19 04:58:42 -04:00
Azalea aa6730b9da [F] Fix apis 2025-03-19 04:58:32 -04:00
Azalea b519537b69 [O] Proper null handling for http 2025-03-19 04:58:22 -04:00
Azalea 1a0e70636a [O] Proper null handling for json 2025-03-19 04:57:44 -04:00
Azalea da8337a681 [F] Fix wording 2025-03-19 04:57:10 -04:00
Azalea ac8e2981a9 [+] SQLite sucks 2025-03-19 04:42:29 -04:00
Azalea 444595406b Update application.properties 2025-03-18 09:03:27 -04:00
Azalea b31e450c4b Update docker-compose.yml 2025-03-18 09:02:54 -04:00
Azalea 77e94595d8 Fix default port binding 2025-03-17 19:49:18 -04:00
Azalea 7fd02976cb [F] Fix PowerOn header 2025-03-17 14:04:51 -04:00
Azalea 8d3613201e [F] Fix toString calling lazy implicitly 2025-03-17 14:04:44 -04:00
Azalea 7320f0ca7f [F] Fix types 2025-03-17 14:02:50 -04:00
MoeGrid f57f2dd585 修复开启allnet.server.check-keychip时SDED检查游戏网络BAD的问题 2025-03-17 12:49:21 -04:00
MoeGrid 3ac6d79644 将config.ts中的部分配置移动到.env中,方便私有部署。
将public中的psd文件移出,防止被打包到dist。
判断TURNSTILE_SITE_KEY为空时不开启此功能。
2025-03-17 01:28:02 -04:00
Azalea a076d50cb3 Update gradle.yml 2025-03-15 20:40:10 -04:00
Azalea 072e3519bb [+] Allow overriding PowerOn addr 2025-03-15 19:18:25 -04:00
Raymond 6fe9fbb6cc feat: add sub trophies for VERSE!!!!! 2025-03-15 02:58:22 -04:00
Azalea f7e5cd1a05 [-] Remove unused sdk 2025-03-12 01:44:11 -04:00
Azalea 519f4fc74c [+] Types 2025-03-12 01:43:56 -04:00
Azalea 66e5395a60 [O] no 200 error :((((( 2025-03-12 01:36:25 -04:00
Azalea e54619da46 [U] Update doc 2025-03-12 01:32:38 -04:00
Azalea 9b8a76349f [U] Update FAQ 2025-03-12 01:29:01 -04:00
Azalea 5bf017395c [+] Return the trophy sub 1 2 for userbox 2025-03-11 23:33:23 -04:00
Azalea eb45075414 [+] Input validation 2025-03-11 18:32:00 -04:00
Azalea c4e0717317 [+] Skeleton ui for transfer 2025-03-11 18:20:49 -04:00
Azalea 67d2e52fbc [+] Ongeki export 2025-03-11 16:51:46 -04:00
Azalea d5b4e1ca14 [+] Push and pull apis 2025-03-11 10:22:28 -04:00
Azalea 72181e7ef7 [+] AimeDB register when not found 2025-03-11 09:53:22 -04:00
Azalea d4d3a2b36c [O] Better encapsulation 2025-03-11 09:04:39 -04:00
Azalea 1dcaddb4c4 [+] New20 2025-03-11 08:15:19 -04:00
Azalea 0c891218b2 [+] new rating list 2025-03-11 08:03:10 -04:00
Azalea 8fd378852f [+] Mai2 broker 2025-03-11 05:11:10 -04:00
Azalea aecb5572cd [O] Finish mai2 refactor 2025-03-11 03:45:54 -04:00
Azalea 6ffee3466f [U] Add comment 2025-03-11 02:49:35 -04:00
Azalea 9b7f50aebb [+] Maimai data broker 2025-03-11 02:48:56 -04:00
Azalea 5375c3c1fa [F] Fix json 2025-03-11 02:48:31 -04:00
Azalea c2cd281efe [U] Automatic deploy docker every week 2025-03-11 01:51:22 -04:00
Azalea 6252cbbefe [+] Data broker api 2025-03-10 18:11:47 -04:00
Azalea 3b2199127b [+] Http extensions 2025-03-10 16:46:39 -04:00
Azalea d903a2bc69 [F] Fix convert 2025-03-10 16:44:29 -04:00
Azalea c53b3967cd [+] Chusan export tool 2025-03-10 16:41:33 -04:00
Azalea b811432e7e [+] Different commands 2025-03-10 16:41:05 -04:00
Azalea 23c83fed8b [+] Application entry 2025-03-10 16:40:50 -04:00
Azalea fe6d95786b [U] Upgrade kt 2025-03-10 16:40:31 -04:00
Azalea c3963e7fe2 [+] AimeDB client 2025-03-10 12:57:23 -04:00
Azalea 9d8a3c5132 Update README.md 2025-03-10 02:41:30 -04:00
Azalea af734b7814 [+] Send AllNet and obtain poweron url 2025-03-10 01:46:33 -04:00
Azalea 4be340c723 [+] HTTP extensions 2025-03-10 01:45:47 -04:00
Azalea 5816f5dffb [-] Verse: Give up on rec rating 2025-03-09 11:42:51 -04:00
Azalea 44f62e8f54 [F] Verse: Fix list empty case 2025-03-09 11:42:51 -04:00
Azalea 6bdfab6cba [F] Verse: FIx recommendation return format 2025-03-09 11:42:51 -04:00
Azalea e1d33691b4 [+] Verse: Model inference progress bar 2025-03-09 11:42:51 -04:00
Azalea 47a508e8a9 [F] Verse: Fix id mismatch in recommend music 2025-03-09 11:42:51 -04:00
Azalea d983d7a5f5 [+] Verse: Return recommended music 2025-03-09 11:42:51 -04:00
Azalea 226ba475aa [+] Verse: Generalize AI recommender 2025-03-09 11:42:51 -04:00
Azalea 8bbde9e7e3 [F] Verse: Fix userid null 2025-03-09 11:42:51 -04:00
Azalea 9ac4b56ef7 [+] Verse: Return user challenge 2025-03-09 11:42:51 -04:00
Azalea cc5ffdf644 [+] Verse: Add user data fields 2025-03-09 11:42:51 -04:00
Azalea 6d02c53eb3 [+] Verse: Save unlock challenge 2025-03-09 11:42:51 -04:00
Azalea 6e6adb8caa [+] Verse: Save rating 2025-03-09 11:42:51 -04:00
Azalea b0392cd3e6 [+] Unlock challenge? 2025-03-09 11:42:51 -04:00
Azalea 43a54be20e [-] Verse: Give up on rec rating 2025-03-09 11:37:14 -04:00
Azalea dc7f8e990b [F] Verse: Fix list empty case 2025-03-09 11:36:37 -04:00
Azalea ff3d6da461 [F] Verse: FIx recommendation return format 2025-03-09 11:25:24 -04:00
Azalea 30600a5b9c [+] Verse: Model inference progress bar 2025-03-09 10:57:49 -04:00
Azalea 54eada1a66 [F] Verse: Fix id mismatch in recommend music 2025-03-09 10:54:46 -04:00
Azalea c74c0456de [+] Verse: Return recommended music 2025-03-09 10:27:15 -04:00
Azalea e3db8a1fdf [+] Verse: Generalize AI recommender 2025-03-09 10:19:39 -04:00
Azalea b40dcf85bd [F] Verse: Fix userid null 2025-03-09 10:07:00 -04:00
Azalea 9c76286660 [+] Verse: Return user challenge 2025-03-09 10:00:37 -04:00
Azalea a099d8bdf3 [+] Verse: Add user data fields 2025-03-09 09:58:42 -04:00
Azalea b2f680da4e [+] Verse: Save unlock challenge 2025-03-09 09:57:46 -04:00
Azalea 18ecbe0f44 [+] Verse: Save rating 2025-03-09 09:57:09 -04:00
Azalea bef38ce45f [+] Unlock challenge? 2025-03-09 07:10:15 -04:00
Azalea 70a90d9a92 [O] 0-index page 2025-03-05 00:51:49 -05:00
Azalea 7ce4b0058e [+] Paged ranking 2025-03-05 00:48:08 -05:00
Azalea a105871a98 [+] User info endpoint 2025-03-03 18:08:21 -05:00
Azalea d5be354a84 [+] KanadeDX card number notice 2025-03-01 23:26:20 -05:00
凌莞~(=^▽^=) 3da92de951 [F] Card access time is not correctly set (#120) 2025-03-01 16:31:39 -05:00
Azalea Gui 5caeaccec8 [M] Merge local branch bun.lockb 2025-03-01 01:39:28 -05:00
alixandAzalea eef40e39d1 implement memorial photo viewer (#119)
* commit current progress\

will prob work on my mac ltr

* more transferring to different device

* grammar

* [F] Fix warning inconsistency

* [O] Split status overlays

* [S] Better styling

* [+] i18n

* [+] Display photos tab conditionally

---------

Co-authored-by: Azalea <22280294+hykilpikonna@users.noreply.github.com>
2025-03-01 01:35:49 -05:00
Azalea 6c21afaa57 [F] Fix settings colliding with userbox? 2025-02-28 23:51:00 -05:00
Raymond ca09e0e3f7 fix: formatting of bio 2025-02-28 23:51:00 -05:00
Raymond fb9ef65346 fix: error in notice text 2025-02-28 23:51:00 -05:00
Raymond 344f62c275 refactor: don't add unnecessary game types 2025-02-28 23:51:00 -05:00
Raymond d28b9bf5a8 feat: preferred game
this needs more testing
2025-02-28 23:51:00 -05:00
Raymond b23385ba28 fix: add navigation to i18n, tooltip for profile 2025-02-28 23:51:00 -05:00
Raymond 586d108d32 feat: add announcement 2025-02-28 23:51:00 -05:00
Raymond df395a613f fix: use rating numbers from dds, swap userplate font again
changed font to Gothic A1, added new DDS to userbox (all users wishing to benefit MUST update aquabox), added rating numbers
2025-02-28 23:51:00 -05:00
Raymond 45e3f23dc9 fix: change font on userplate from Arial to Choco Cooky
i lied about cfvhoco cooky but it's so funny we really needt o do that at some point
2025-02-28 23:51:00 -05:00
Raymond 113769643a feat: add additional information on user home
adds display name (if available), moves game name (if display name is visible) and shows username (if available)
2025-02-28 23:51:00 -05:00
Raymond ecf12175f4 fix: remove unnecessary check 2025-02-28 23:51:00 -05:00
Raymond 0a0f350a1d fix: textarea instead of input for bio 2025-02-28 23:51:00 -05:00
Raymond ff7abf4c41 fix: remove div around box 2025-02-28 23:51:00 -05:00
Raymond 7fc328b60a feat: add bio to profile 2025-02-28 23:51:00 -05:00
Azalea 5adbcc0aff [O] Protect against path traversal 2025-02-26 21:20:54 -05:00
Azalea 6bdfc69668 [+] Net photo APIs 2025-02-26 19:42:39 -05:00
Azalea 547ad4d0f8 [+] Second kaleidx area 2025-02-25 19:35:34 -05:00
Clansty 122a6776a2 [O] Mai2 set isCurrent = false for userLoginBonus on saving to enable select login bonus every time 2025-02-26 04:08:48 +08:00
Azalea b840f6709b Merge branch 'v1-dev' of https://github.com/MewoLab/AquaDX into v1-dev 2025-02-24 18:15:55 -05:00
Azalea ab6f6cd990 [U] Update readme 2025-02-24 18:15:53 -05:00
Azalea 97a56bbbfd [F] Fix rival 2025-02-24 03:40:47 -05:00
Azalea a2b127cf4f [F] Fix duplicate 2025-02-23 19:03:46 -05:00
Azalea a4524a7182 [+] Verse events 2025-02-23 18:56:36 -05:00
Azalea 0133f85800 [+] Ongeki settings on Web UI 2025-02-23 06:12:15 -05:00
Azalea 9745e65eed [+] Ongeki infinite kaika 2025-02-23 05:58:03 -05:00
Azalea 43e5f93a37 Update self-hosting.md 2025-02-22 22:53:23 -05:00
Azalea 07607a489c Update self-hosting.md 2025-02-22 22:52:47 -05:00
Azalea 46e82eae3c [U] Add note about verse 2025-02-22 19:19:13 -05:00
Azalea 3f0d1e345b [U] Verse is supported 2025-02-22 19:12:33 -05:00
Clansty d2a2bad111 [+] Mai2 add query for owned items 2025-02-18 12:22:19 +08:00
Clansty 7427609bee [+] Mai2 add endpoints to get and set login bonus 2025-02-16 22:37:04 +08:00
Clansty 7431e58f70 [+] Mai2 add nameplate fields to settableFields 2025-02-13 13:43:41 +08:00
Clansty 519f67071d [+] Add lookup by net username for debug-user-profile 2025-02-12 00:39:54 +08:00
Porta 56fe553870 [+] Add Dockerfile and devcontainer configuration for AquaDX development environment 2025-02-09 10:15:28 -05:00
Porta c69570147a BUG: Fix gradlew not being executable during docker build. 2025-02-09 06:38:05 -05:00
Azalea d031602789 [+] Display country 2025-02-09 00:22:17 -05:00
Azalea b26a5a566b [+] Country code to emoji 2025-02-09 00:22:00 -05:00
Azalea 93d28db11a [+] Twemoji country flag font 2025-02-09 00:21:39 -05:00
Azalea 5a06ae52a9 [+] Country code names 2025-02-08 23:43:03 -05:00
Menci 81743b22e9 [+] Know game version from user-name-plate query 2025-02-03 06:42:56 -05:00
Menci 2ef4b7241d [+] MaiMile and UserIntimate (partner closeness) 2025-02-01 05:28:25 -05:00
Menci 9d19c99abe [F] "Felica" -> "FeliCa" 2025-01-28 05:00:54 +08:00
Menci db7be134c7 [O] LinkCard UX improvements and i18n fixes 2025-01-28 04:57:58 +08:00
Azalea 99e1d130f0 [F] Fix infinite loop 2025-01-19 13:34:42 -05:00
Azalea f33e1a0ae0 [F] Fix dates and timezones 2025-01-18 22:03:28 -05:00
split / May 5fb5e52e54 fix: 🐛 use accept= property correctly, use exclusively the correct mimetype for jpeg 2025-01-18 21:53:28 -05:00
Raymond 16112d4f1d feat: ➕ pfp cropper + enhancements 2025-01-18 21:53:28 -05:00
Raymond 7d214ba214 feat: add export to chu3 2025-01-18 21:53:28 -05:00
Raymond 2a6f3745c3 feat: add warning to general settings 2025-01-18 21:53:28 -05:00
凌莞~(=^▽^=) 151535139f [+] Allow disable music rank for own machine (#110)
* [+] Allow disable music rank for own machine

* fix
2025-01-19 01:43:58 +08:00
Azalea dfee2cd71f [+] Better kaleidx 2025-01-18 00:28:32 -05:00
Azalea b178d7fd8d [O] Let's assume everyone found their keys 2025-01-17 20:44:51 -05:00
Azalea 43582f0528 [F] Fix kaleidx parsing 2025-01-17 18:48:47 -05:00
Azalea 202df27f88 [F] Fix server return type 2025-01-17 13:02:55 -05:00
Azalea 93518aa1f4 [+] Log on dup 2025-01-17 10:40:45 -05:00
Azalea 1421d55a56 [F] Fix duplicate uploads 2025-01-17 10:25:04 -05:00
Azalea 762f0ef445 [O] Limit activity count 2025-01-17 10:18:22 -05:00
Azalea deb923fcfd [-] User activity should not be unique 2025-01-17 10:16:31 -05:00
Azalea 9210582a4b Revert "[-] Remove unique update for now"
This reverts commit df2f05a914.
2025-01-17 10:15:37 -05:00
Azalea 24c83f9596 [F] Fix unique in upsert 2025-01-17 10:10:41 -05:00
Azalea 7a18b4499d [F] Fix userid 2025-01-17 10:06:17 -05:00
Azalea c6bd6e862d [+] 150 2025-01-17 09:58:14 -05:00
Azalea df2f05a914 [-] Remove unique update for now 2025-01-17 09:45:21 -05:00
Azalea d79af91a8d [F] Fix 2025-01-17 09:40:56 -05:00
Azalea f43eaa4577 [F] Fix key conflicts 2025-01-17 09:32:31 -05:00
Azalea f6cd0edbc2 [F] Fix mai unique 2025-01-17 09:27:52 -05:00
Azalea 709419bc2d [U] Bump readme 2025-01-17 09:22:22 -05:00
Azalea 95460ca98f [U] Bump readme 2025-01-17 08:29:43 -05:00
Azalea 277f103535 [F] Fix primary key 2025-01-17 08:27:15 -05:00
Azalea 34ed1af242 [+] Implement GetUserKaleidxScope 2025-01-17 08:20:36 -05:00
Azalea 4328ca3280 [+] Insert Kaleidx on upsert 2025-01-17 08:19:04 -05:00
Azalea 1075256f21 [+] disableArea for events 2025-01-17 08:07:39 -05:00
Azalea 69ec608212 [+] db model for kaleidx 2025-01-17 08:07:24 -05:00
Azalea 3a4651adcd [+] ExtBool2 2025-01-17 08:06:48 -05:00
Azalea 1801c25fdc [+] New upsert field 2025-01-17 07:54:19 -05:00
Azalea dc7e7b2c20 [F] Use datetime 2025-01-17 07:54:09 -05:00
Azalea f654e12546 [+] Mai2UserKaleidx 2025-01-17 07:48:28 -05:00
Azalea 3c1dbeab15 [+] UploadUserPlaylogListApi 2025-01-17 07:41:23 -05:00
Azalea f6f17dd328 [+] New item types 2025-01-17 07:39:56 -05:00
Azalea 2b6c283cd1 [-] Revert aeab453e 2025-01-17 06:17:32 -05:00
Azalea a374f7a44b [O] Security: keychip check on remove 2025-01-16 19:01:51 -05:00
Azalea 10933046d6 [O] Reduce recruit TTL 2025-01-16 18:55:22 -05:00
Azalea d7abb343a7 [F] Remove TCP Ack of ack 2025-01-16 17:50:59 -05:00
Azalea aeab453e8b [-] Remove broadcast to reduce abuse 2025-01-16 17:47:55 -05:00
Azalea c5dbe778ea [M] FutariServer > FutariRelay 2025-01-16 17:04:36 -05:00
Azalea b17d784d80 [O] Hash user ids 2025-01-16 15:49:16 -05:00
Azalea 146e4bac0f [+] Recruit lobby 2025-01-16 15:19:50 -05:00
Clansty 8f7f422b28 [+] AquaMai GetServerAnnouncementApi placeholder 2025-01-16 15:50:53 +08:00
Azalea 2d35d41779 [F] Thread close 2025-01-15 19:27:34 -05:00
Azalea 3114a9b8c6 [O] No leaks 2025-01-15 19:27:20 -05:00
Azalea 830b10878e [F] Fix other people disconnecting causing broadcast to crash 2025-01-15 12:57:04 -05:00
Azalea 7363bb307d [F] Fix destination processing order 2025-01-15 10:56:37 -05:00
Azalea 2e0c567158 [F] Fix broadcast fail 2025-01-14 10:11:49 -05:00
Azalea 1a82fa27a9 [U] Update usages 2025-01-13 21:17:14 -05:00
Azalea 146f171cbc [+] Str.some 2025-01-13 21:16:30 -05:00
Azalea 8a04bb014a [M] Split code 2025-01-13 21:16:19 -05:00
Azalea 5290597b2b [O] Futari serailization 2025-01-13 21:14:44 -05:00
Azalea 661af76ed6 [+] TCP 2025-01-13 05:21:23 -05:00
Azalea 18d95a1ccd [F] Fix udp sendclass and recv 2025-01-12 22:27:01 -05:00
Azalea 0f87ed82e3 [F] Fix ranking type 2025-01-12 06:56:18 -05:00
Azalea bb9bce67d8 [F] Fix recommend select music 2025-01-12 06:47:26 -05:00
Azalea 208fb8cf73 [+] Game music popularity for chusan 2025-01-12 05:54:15 -05:00
Azalea ef8cb7e0ee [+] Game music popularity handler 2025-01-12 05:54:07 -05:00
Azalea 52ef582be6 [+] Implement GetUserRecommendSelectMusic 2025-01-12 05:52:53 -05:00
Azalea Gui 5dd06ba501 [+] requirements.txt 2025-01-12 04:40:08 -05:00
Azalea Gui f6a5a03346 [+] Log recommendations 2025-01-12 04:38:43 -05:00
Azalea Gui 767d396171 [U] Update application properties 2025-01-12 04:29:20 -05:00
Azalea da159b715c [+] Recommender ALS model 2025-01-12 04:28:36 -05:00
Azalea 79fa5448a0 [+] Recommender integration 2025-01-12 04:22:07 -05:00
Azalea Gui b5f41cdab9 [M] Reorganize migrations 2025-01-12 02:41:15 -05:00
MenciandAzalea 99507c7c6d [F] Mai2 music ranking fix (#108)
* Revert "[O] No blocking tasks on startup"

This reverts commit 9d05ef6808.

* Revert "[O] Let json lib do its magic"

This reverts commit 5923987c7f.

* Reapply "[O] No blocking tasks on startup"

This reverts commit e06e8b4cf0.

---------

Co-authored-by: Azalea <22280294+hykilpikonna@users.noreply.github.com>
2025-01-12 15:19:43 +08:00
Azalea d7db45d700 [F] Fix list 2025-01-11 21:26:39 -05:00
Azalea 111304481f [F] Fix key mismatch 2025-01-11 21:23:12 -05:00
Azalea 64827ec0fc [O] Merge more apis 2025-01-11 21:15:16 -05:00
Azalea c5b40f64e4 [O] Mai2 migrate 2025-01-11 20:53:59 -05:00
Azalea 401d182fc6 [O] Use logger alias 2025-01-11 19:16:46 -05:00
Azalea 3878103eaa [+] Todo notice 2025-01-11 19:12:11 -05:00
Azalea 5f6cd43b35 [+] Show More option 2025-01-11 19:06:28 -05:00
Menci 03b452e426 [+] Mai2 music ranking 2025-01-11 18:50:01 -05:00
Azalea 528960940c [U] Update ktor 2025-01-11 18:52:29 -05:00
Azalea 9063fbc13d [O] Return more ratings from backend 2025-01-11 12:52:50 -05:00
Azalea d14998565b [O] Correctly compute rating change 2025-01-11 12:39:14 -05:00
AzaleaandRaymond 4a71e15fd5 [O] Split chuni userbox display
Co-Authored-By: Raymond <101374892+raymonable@users.noreply.github.com>
2025-01-11 12:35:17 -05:00
Azalea 94a0086fdd [O] Reformat GetUserMusic 2025-01-11 02:19:45 -05:00
Azalea 65cc3095e2 [F] Fix no image icon on missing texture 2025-01-08 01:27:00 -05:00
Azalea cd90f2745a [F] Fix chusan cascade 2025-01-08 01:08:05 -05:00
Azalea 69a0e60fee [+] 20101 server 2025-01-07 12:04:32 -05:00
Azalea aad43c9f9c [F] Fix matching start & end time? 2025-01-07 10:59:03 -05:00
Azalea f033496d20 Merge branch 'v1-dev' of https://github.com/MewoLab/AquaDX into v1-dev 2025-01-07 10:38:36 -05:00
Azalea b6757434b7 [+] Note about duolinguo 2025-01-07 10:38:29 -05:00
Azalea 3e9abda042 Update chu3-national-matching.md (#104) 2025-01-06 20:08:38 -05:00
Clansty cf1e745c14 [O] Support option folder in root 2025-01-07 06:08:25 +08:00
Paiton Bertschy eb1745d179 Update chu3-national-matching.md
Correct my shitty spelling
2025-01-06 07:16:32 -06:00
Paiton Bertschy 2b88713315 Update chu3-national-matching.md 2025-01-06 07:10:55 -06:00
Azalea ef435130ee fix: penguin appearance fixes (#103) 2025-01-06 04:43:50 -05:00
Azalea 17df365b2c [+] more docs 2025-01-05 23:32:40 -05:00
Azalea 852617975b [+] More docs 2025-01-05 23:31:16 -05:00
Raymond 90bed4413e fix: penguin appearance fixes 2025-01-05 23:04:06 -05:00
Azalea ba59649946 [U] docs formatting 2025-01-05 21:21:39 -05:00
Azalea e90e79ebf4 [M] docs move self hosting to separate document 2025-01-05 21:17:56 -05:00
Azalea 18c84ae310 [U] docs update game notes 2025-01-05 21:15:28 -05:00
Azalea f06031f753 [U] docs update faq 2025-01-05 21:15:16 -05:00
Azalea 1d605ebb94 [-] Remove outdated changelog 2025-01-05 20:46:39 -05:00
Azalea e3145bbdd6 [+] Scam notice 2025-01-05 20:41:45 -05:00
Azalea 130129c9bd [U] Docs formatting 2025-01-05 20:27:14 -05:00
Azalea 6d5a61fe04 [U] Docs formatting 2025-01-05 20:22:18 -05:00
Azalea ee4f923a2d [U] docs 2025-01-05 20:19:02 -05:00
Azalea 500e469ee0 [F] Fix cmission 2025-01-05 19:34:11 -05:00
Azalea cf7af0ff34 Merge branch 'v1-dev' of https://github.com/MewoLab/AquaDX into v1-dev 2025-01-05 07:57:42 -05:00
Azalea e92c962c14 [+] Allow set username 2025-01-05 07:57:31 -05:00
Azalea e37ca4a18e [O] Split input field 2025-01-05 07:57:19 -05:00
Clansty 8efc1a96ea [+] userRating api for chu3 2025-01-05 20:49:01 +08:00
Azalea 16de6ec208 [+] i18n 2025-01-05 07:48:46 -05:00
Azalea 7824ab907b [RF] move userMusicFromList to GameApiController and add GenericUserM… (#102) 2025-01-05 07:26:31 -05:00
Azalea 574e885da3 aquabox improvements (#99) 2025-01-05 07:23:16 -05:00
Clansty ccd88a10ab [RF] move userMusicFromList to GameApiController and add GenericUserMusicRepo 2025-01-05 19:54:15 +08:00
Azalea 3a69717a9d Merge branch 'v1-dev' into pr/99 2025-01-05 06:54:15 -05:00
Azalea 8b1fe940d2 Update README.md 2025-01-05 19:32:59 +08:00
Azalea 7083e1a117 [F] Fix duolinguo integration 2025-01-05 05:59:54 -05:00
Azalea 51af357c5a [F] Fix username check 2025-01-05 05:21:47 -05:00
Azalea 7ad4bc2ba5 [F] Fix favorite 2025-01-05 05:02:25 -05:00
Azalea 6cfd0a91fc [F] Fix username mismatch 2025-01-05 04:39:11 -05:00
Azalea a70e9130f5 [F] Fix duplicate key 2025-01-05 04:25:11 -05:00
Azalea 01cb0c4b90 [+] Add playlog info to battle log when upsert 2025-01-05 04:23:41 -05:00
Azalea 4c3ed1d0da [F] Fix recentNBMusicList return 2025-01-05 04:13:38 -05:00
Azalea 250d92d225 [+] toDict 2025-01-05 04:13:27 -05:00
Azalea e16bb5a34f [+] Add playlog fields to net battle log table 2025-01-05 04:13:20 -05:00
Azalea 9ff07f9f2b [F] Fix fav item list/ 2025-01-05 03:29:42 -05:00
Azalea 7e2cc100e6 [+] More docs 2025-01-05 03:17:42 -05:00
Azalea 4820c38bce [+] Implement GetUserNetBattleData 2025-01-05 02:20:15 -05:00
Azalea 89e682df3d [+] Store userMisc at upsert 2025-01-05 02:14:30 -05:00
Azalea d25678d7b4 [+] UserMisc 2025-01-05 02:14:16 -05:00
Azalea 56e424c29b [+] Mut 2025-01-05 02:13:55 -05:00
Azalea 96fb815bd8 [F] Fix username encoding in net battle log 2025-01-05 01:20:09 -05:00
Azalea 41636b09db [+] ARRR 2025-01-05 01:14:50 -05:00
Azalea 8b2518a25d [+] More docs on matching 2025-01-05 00:38:54 -05:00
Raymond 9db091a2d2 fix: fix typo 2025-01-04 22:31:26 -05:00
Raymond d220f369e9 fix: 🐛 aquabox 2025-01-04 22:30:40 -05:00
Azalea 73792e4294 [+] Store net battle log at upsert 2025-01-04 22:12:41 -05:00
Raymond 8b9236ae43 feat: 🎨 finalize server url mode 2025-01-04 22:04:09 -05:00
Azalea 877c23b9d7 [+] Fav music fix 2025-01-04 21:55:13 -05:00
Azalea aed5c20700 [F] Fix event return data type mismatch 2025-01-04 21:48:11 -05:00
Raymond f6efd392b9 refactor: fix merge conflicts #1 2025-01-04 20:17:33 -05:00
Azalea 9197b3ca93 [O] Todo :( 2025-01-04 20:14:38 -05:00
Azalea 01a064f1ab [O] Game entities 2025-01-04 20:07:16 -05:00
Azalea af9cd81220 [O] Complete kt rewrite 2025-01-04 19:59:46 -05:00
Azalea 8203a70b60 [O] Rewrite CM chusan apis 2025-01-04 19:49:36 -05:00
Azalea f290e6e576 [+] Auto redirect to /home when already logged in 2025-01-04 19:32:02 -05:00
Raymond dbe3f3393c style: 🎨 small sass change 2025-01-04 19:22:22 -05:00
Raymond a87dec0d64 fix: 🐛 disable click cursor on userplates that aren't yorus 2025-01-04 19:21:02 -05:00
Raymond 14bca470bb fix: 🐛 fix items not appearing as intended 2025-01-04 19:14:36 -05:00
Azalea df3deee316 [-] Remove unused services 2025-01-04 18:53:36 -05:00
Azalea 62a55a40c2 [O] Rewrite the rest of chusan in kotlin 2025-01-04 18:47:23 -05:00
Raymond 42a4a11c49 fix: ✨ fixes / extra documentation texts 2025-01-04 18:18:37 -05:00
Azalea 3ef7f40e37 [-] Chusan drops database 2025-01-04 18:05:44 -05:00
Raymond 82a0473287 feat: add url support (wip) 2025-01-04 18:00:08 -05:00
Azalea 41e746a70e [-] Remove user-box-all-items api 2025-01-04 17:54:40 -05:00
Azalea e2d6e29d7b [+] Add net battle log sql table 2025-01-04 17:52:46 -05:00
Azalea 5445fbed6c Merge branch 'v1-dev' of https://github.com/MewoLab/AquaDX into v1-dev 2025-01-04 17:13:44 -05:00
Azalea e9e9e0a621 [F] Fix types 2025-01-04 17:13:41 -05:00
Azalea 891dffce8d Update chu3-national-matching.md (#101) 2025-01-04 16:49:38 -05:00
Paiton Bertschy 4ad66fa4dc Update chu3-national-matching.md
Fix spelling mistake lol
2025-01-04 14:58:46 -06:00
Azalea 5570aa79f7 [+] NAT and firewall 2025-01-04 12:09:32 -05:00
Azalea 288d336fb6 Merge branch 'v1-dev' of https://github.com/MewoLab/AquaDX into v1-dev 2025-01-04 08:49:13 -05:00
Azalea d7b7d617bd [F] Fix user activity saving 2025-01-04 08:48:56 -05:00
Azalea c0f7d11828 [+] Net battle log class 2025-01-04 08:48:48 -05:00
Azalea 1bd4f4f423 [-] Remove unused user id 2025-01-04 08:48:29 -05:00
Azalea ce130c1e15 [+] More chusan upsert data types 2025-01-04 08:48:21 -05:00
Clansty e69a201e97 [+] Drag and drop to link card 2025-01-04 21:17:30 +08:00
Clansty 143b36ab66 [O] Card binding optimize 2025-01-04 20:40:35 +08:00
Azalea 90900446ee Update README.md (#100) 2025-01-03 19:07:58 -05:00
Azaleaandsourcery-ai[bot] 29d34fb52c Update README.md
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
2025-01-04 08:07:50 +08:00
Paiton Bertschy 241dbc8238 Update README.md
Update Readme to reflect that the Japan version of buddies plus is supported
2025-01-03 17:42:21 -06:00
Azalea aea202bcf2 [+] More collab servers 2025-01-03 18:10:28 -05:00
Azalea 0bc4f14845 [S] fit color scheme 2025-01-03 17:29:29 -05:00
Azalea 7539d75ddb [+] i18n for matching 2025-01-03 17:24:40 -05:00
Azalea 9ea0dcb5a7 [U] Docs 2025-01-03 17:19:09 -05:00
Azalea 40707b7d23 [U] Docs indentation 2025-01-03 17:16:29 -05:00
Azalea d146ed9a7d [U] Docs 2025-01-03 17:13:37 -05:00
Azalea a09329eb82 [+] Docs 2025-01-03 17:12:52 -05:00
Azalea 0bda8406c3 [+] Submit matching settings 2025-01-03 16:51:03 -05:00
Azalea 9489151bc1 [+] UI Matching settings 2025-01-03 16:33:38 -05:00
Azalea 80fc8417dc [-] Remove proxied matching prop 2025-01-03 16:33:03 -05:00
Azalea cb0f46c5db [F] Fix logging? 2025-01-03 16:32:26 -05:00
Azalea 85b5910ea9 [-] Remove proxied matching, not very useful 2025-01-03 16:32:13 -05:00
Azalea d5a1a26091 [+] Return matching api 2025-01-03 16:31:58 -05:00
Azalea 256b48a0ad [+] Matching server in game option table 2025-01-03 16:31:42 -05:00
Azalea bfb269b378 [+] option i18n 2025-01-03 16:31:25 -05:00
Azalea 54bed879a5 [+] Matching server options 2025-01-03 16:30:06 -05:00
Azalea 4ded3d9752 [+] TODO 2025-01-03 16:10:01 -05:00
Raymond f68bd54ccd fix: add tooltip to trophy
(helpful for when it's longer than the box has)
2025-01-03 14:07:59 -05:00
Azalea 2edad4efdb [F] Fix rank 2025-01-03 10:17:21 -05:00
Raymond 08af00da29 feat: 💄 aquabox on profiles + avatar fixes 2025-01-03 09:21:43 -05:00
Azalea 21e023e609 Revert "[U] Upgrade dependencies"
This reverts commit 332eacd2cc.
2025-01-03 03:09:53 -05:00
Azalea f6489d5ac0 [+] Add token to logging 2025-01-03 02:19:11 -05:00
Azalea 256aac8faf [+] Add error logging 2025-01-03 01:45:42 -05:00
Azalea a1be699ec5 [+] characterId 2025-01-02 10:51:45 -05:00
Azalea d71af941b0 [+] Add some get-only fields 2025-01-02 10:44:06 -05:00
Azalea a1b56f6e0b [O] Do not log GetUserPortraitApi 2025-01-02 07:13:06 -05:00
Azalea d8022cc1a4 [F] Fix userbox file logic #97 2025-01-02 07:12:46 -05:00
Azalea 9ba7f5022e [+] Add userbox.new chinese i18n #97 2025-01-01 19:05:45 -05:00
Azalea 437ed2ee60 [+] Chuni Userbox with Assets (#97) 2025-01-01 18:59:55 -05:00
Raymondandsplit / May 4d4335004f refactor: move DDS cache
moved the DDS cache from dds.ts to ddsCache.ts and added caching for scaled images

Co-authored-by: split / May <split@split.pet>
2025-01-01 16:30:48 -05:00
Raymond ce95f2165d style: make nameplates fit better 2025-01-01 15:06:52 -05:00
split / May 931e611cf7 revert: ⏪ Reverse decision to remove the classic UserBox preview
Adds back the classic UserBox preview when AquaBox is disabled / unavailable
2025-01-01 06:21:12 -08:00
split / May 81ef029bf6 docs: 📝 add TSDoc comments to functions in the DDS class 2025-01-01 05:21:29 -08:00
split / May 223de57b65 style: linebreaks 2025-01-01 05:13:13 -08:00
split / May f1d1b81456 refactor: ♻️ replace "CHUNITHM" string with "AquaDX"
recommendation from @raymonable
2025-01-01 04:23:04 -08:00
Raymondandsplit / May 8aa829ab02 [+] Chuni Userbox with Assets
Co-authored-by: split / May  <split@split.pet>
2025-01-01 06:27:38 -05:00
Azalea 8fb443d41d Update docker-image.yml 2024-12-31 05:25:01 +08:00
Azalea edc62b3cfc Update docker-image.yml 2024-12-31 04:27:25 +08:00
Azalea 644cdef95f Update docker-image.yml 2024-12-31 04:19:50 +08:00
Azalea dc54473669 [U] Upgrade gradle 2024-12-29 20:31:16 -05:00
Azalea 332eacd2cc [U] Upgrade dependencies 2024-12-29 20:23:21 -05:00
Azalea c26a670b05 [U] Upgrade kt only 2024-12-29 09:36:30 -05:00
Azalea 1ccb8694d8 Revert "[U] Upgrade deps"
This reverts commit d3c25e6b12.
2024-12-29 09:24:15 -05:00
Azalea 91db21067c [+] Use options in GetGameSettings 2024-12-29 07:16:19 -05:00
Azalea 834546e3ba [+] TODO: Proxy matching 2024-12-29 07:16:00 -05:00
Azalea 6518fe6946 [+] Proxied matching option 2024-12-29 07:10:32 -05:00
Azalea 9b21193be2 [+] Props for matching 2024-12-29 07:07:47 -05:00
Azalea 99983b1eb1 [+] Repo 2024-12-29 07:02:00 -05:00
Azalea 712e2c9d02 [M] Combine other pojos 2024-12-29 07:01:47 -05:00
Azalea f963e6aa03 [O] Turn MatchingMember into db table 2024-12-29 06:58:01 -05:00
Azalea d3c25e6b12 [U] Upgrade deps 2024-12-29 06:57:42 -05:00
Azalea 667abf2131 [O] Split matching apis 2024-12-29 05:16:09 -05:00
Azalea 8a1e17ecd3 Merge branch 'v1-dev' into matching 2024-12-29 05:11:58 -05:00
Azalea 809004e16b [O] Rewrite BooleanIntDeserializer 2024-12-29 05:11:51 -05:00
Azalea e35df8a029 [U] Update userbox apis 2024-12-29 04:50:03 -05:00
Azalea d9081563c2 [U] Update userbox SDK 2024-12-29 04:49:43 -05:00
Azalea 29e757ba75 [U] Update i18n for userbox 2024-12-29 04:49:31 -05:00
Azalea 48724bae8b [-] Remove unused types 2024-12-29 04:49:15 -05:00
Azalea b1de430f0b [O] Rewrite userbox 2024-12-29 04:48:36 -05:00
Azalea 6cd18ba7f7 [M] Move settings components 2024-12-29 04:48:24 -05:00
Azalea 07d167d961 [F] Put chusan settings in chusan tab 2024-12-29 02:31:48 -05:00
Azalea dadedbe129 [+] i18n for game option 2024-12-29 02:31:33 -05:00
Azalea 6d8948cdf1 [+] Implement infinite penguins 2024-12-29 01:42:00 -05:00
Azalea 27ca67b6f9 [+] Infinite penguins option 2024-12-29 01:41:44 -05:00
Azalea 7e27bf0785 [+] Card.sensitiveInfo 2024-12-29 00:44:04 -05:00
Azalea a4e8cbe9e1 [+] debug-user-profile 2024-12-29 00:41:08 -05:00
Azalea 3d58a15b10 [+] Implement matching? 2024-12-28 08:49:29 -05:00
Azalea 5c80aec50b [F] Fix timezones 2024-12-28 07:30:49 -05:00
Azalea b52916e62c [F] Fix chusan user creation 2024-12-28 03:11:23 -05:00
Azalea 91ea0c9c8e [O] Better logging 2024-12-28 02:36:17 -05:00
Azalea 2a80a10eec [+] Add worlds end 2024-12-28 01:55:01 -05:00
Azalea 7b8fb02398 [+] Add chusan unique constraints 2024-12-28 01:06:25 -05:00
Azalea 74aa319f41 [F] Fix nextIndex -1 2024-12-28 01:06:00 -05:00
Azalea 0de4856247 [F] Fix item 2024-12-28 00:19:51 -05:00
Azalea da61b1a3e7 [+] Paged post process 2024-12-28 00:18:15 -05:00
Azalea 0632213c8b [F] Fix cache key 2024-12-27 23:52:49 -05:00
Azalea daa8de203b [-] Remove unnecessary assignment 2024-12-27 23:34:52 -05:00
Azalea 537558e3d5 [+] Rewrite using paging 2024-12-27 23:31:58 -05:00
Azalea 8d23b262c7 [O] Better pagination 2024-12-27 23:31:22 -05:00
Azalea 04a178eda6 [+] Free paging 2024-12-27 22:05:46 -05:00
Azalea 977f353f9c [O] Replace CM 2024-12-27 22:04:20 -05:00
Azalea ae6ff97b62 [O] Make handlers abstract 2024-12-27 16:03:02 -05:00
Azalea fa45891af4 [F] Fix paging 2024-12-27 06:10:12 -05:00
Azalea 159b36607a [F] Fix corner case when only one song is pressent 2024-12-27 03:26:09 -05:00
Azalea a731687607 [F] Fix favorite saving 2024-12-27 03:24:20 -05:00
Azalea a77a74ba61 [+] Save favorite music 2024-12-27 02:15:05 -05:00
Azalea fc35381e1b [F] oops 2024-12-27 01:13:55 -05:00
Azalea 6f837830ab [+] SEO meta 2024-12-27 01:13:15 -05:00
Azalea 8197361fb0 [F] Fix 2024-12-27 00:36:16 -05:00
Azalea c7d12fbdf8 [F] Fix user recent rating 2024-12-27 00:19:40 -05:00
Azalea 0cb3fd3134 [O] Better diffing 2024-12-27 00:19:16 -05:00
Azalea 77a791e5da [+] Top 10 out of recent 40 2024-12-26 23:15:14 -05:00
Azalea 42d94b43b1 [F] Fix score display 2024-12-26 23:08:12 -05:00
Azalea cb6bf00236 [+] Allow saving chuni team name 2024-12-26 22:52:16 -05:00
Azalea 4f6bd11a70 [O] Rewrite login handler 2024-12-26 22:11:14 -05:00
Azalea 0f14326449 [F] Fix CM 2024-12-26 21:50:07 -05:00
Azalea b421b4476b [+] Abstract mapper 2024-12-26 21:49:51 -05:00
Azalea 18554ec439 [-] Remove unused 2024-12-26 21:36:39 -05:00
Azalea 806e24b9f1 [O] Rewrite GetUserMusic 2024-12-26 21:30:34 -05:00
Azalea fa1d69f1f9 [O] Rewrite GetUserRecentRating 2024-12-26 20:58:18 -05:00
Azalea 33aebc42b3 [O] Rewrite GetUserLoginBonus 2024-12-26 20:52:36 -05:00
Azalea ffcb94674e [+] Rewrite More CM 2024-12-26 20:47:46 -05:00
Azalea c1323a6ba1 [-] Remove duplicates 2024-12-26 20:38:49 -05:00
Azalea ea70da8fbf [O] Split 2024-12-26 20:26:22 -05:00
Azalea 1bdb17f073 [F] Fix team name encoding 2024-12-26 20:24:50 -05:00
Azalea 506031b5cb [F] Fix team name null 2024-12-26 20:15:41 -05:00
Azalea 4a981900aa [O] Rewrite CM user data 2024-12-26 20:11:39 -05:00
Azalea 6fa052bfcf [+] Team name 2024-12-26 20:09:35 -05:00
Azalea 19ac32d328 [+] Add chusan team name option 2024-12-26 20:08:17 -05:00
Azalea 44eab78935 [+] Add todo 2024-12-26 19:51:18 -05:00
Azalea a2413f3635 [F] Fix item kind 2024-12-26 19:46:20 -05:00
Azalea 13b1d8fc34 [F] Fix 2024-12-26 19:38:06 -05:00
Azalea 8b90449970 [+] Chusan rating calculation 2024-12-26 19:37:55 -05:00
Azalea 038e76ed94 [-] Remove comment 2024-12-26 19:24:26 -05:00
Azalea 390c80c46c [F] Fix StringMapper 2024-12-26 19:24:05 -05:00
Azalea dffae008cd [F] Fix dates 2024-12-26 19:06:18 -05:00
Azalea bcf9af71e2 [O] Rewrite roll gacha 2024-12-26 18:53:08 -05:00
Azalea 5787d32c1a [O] Rewrite user preview 2024-12-26 18:52:49 -05:00
Azalea 39b5032303 [O] Rewrite list getters 2024-12-26 18:52:16 -05:00
Azalea 5f871b1945 [O] Rewrite map area condition 2024-12-26 18:51:26 -05:00
Azalea 346f1c991a [O] Rewrite upsert chargelog 2024-12-26 18:51:07 -05:00
Azalea b14a56bb6c [O] Rewrite Begin matching 2024-12-26 18:50:20 -05:00
Azalea f75d0acb1c [-] Remove more unused 2024-12-26 17:41:54 -05:00
Azalea b2d1fd916d [+] Add lazy uid to context 2024-12-26 17:41:33 -05:00
Azalea b7f1e30708 [-] Remove unused 2024-12-26 17:41:26 -05:00
Azalea 88863d8d01 [O] Everything can be special 2024-12-26 17:41:05 -05:00
Azalea c275c54fca [O] Rename composition 2024-12-26 12:25:23 -05:00
Azalea b97ace2c6e [+] Chusan b40? 2024-12-26 12:22:43 -05:00
Azalea c78c4689f1 [F] Fix sql syntax error 2024-12-26 12:19:19 -05:00
Azalea f39ccf7629 [O] Better logging in json 2024-12-26 11:57:40 -05:00
Azalea 885dfb5bea [+] Repo query 2024-12-26 11:57:31 -05:00
Azalea 8037273672 [+] Update data version in upsert all 2024-12-26 11:57:19 -05:00
Azalea 2e9c0656de [+] Return correct data version in get game settings 2024-12-26 11:57:02 -05:00
Azalea e85d294d12 [+] Version cache 2024-12-26 11:56:23 -05:00
Azalea 24bf6cffc3 [M] Rename 2024-12-26 11:55:31 -05:00
Azalea 16762d1a46 [F] Fix url passing 2024-12-26 08:30:21 -05:00
Azalea 6a54005472 [F] Fix matching url 2024-12-26 08:08:22 -05:00
Azalea 812d910212 [F] Fix safety :( 2024-12-26 07:55:54 -05:00
Azalea b7c8fba464 [F] Fix safety 2024-12-26 07:53:36 -05:00
Azalea 89424f6466 [O] remove unnecessary toString 2024-12-26 07:24:52 -05:00
Azalea 0411505341 [O] riik GetGameSetting 2024-12-26 07:24:32 -05:00
Azalea 6938083463 [+] Special handler 2024-12-26 07:16:29 -05:00
Azalea 054b286388 [F] Fix build 2024-12-26 06:45:27 -05:00
Azalea add1e02d2f [O] riik Chuni upsert all 2024-12-26 06:44:27 -05:00
Azalea fd44744029 [O] riik Get cmission handler 2024-12-26 06:43:41 -05:00
Azalea 6844e1b435 [O] riik UpsertUserAll model 2024-12-26 06:42:27 -05:00
Azalea 8140380673 [O] riik 2024-12-26 06:41:58 -05:00
Azalea 66ad9e8856 [O] Remove coderesp 2024-12-26 06:41:28 -05:00
Azalea da467ec8ee [M] riik CMission repos 2024-12-26 06:38:45 -05:00
Azalea f0923c51e6 [F] Fix trailing } 2024-12-26 02:43:25 -05:00
Azalea d1953e792a [+] Show fc, ap 2024-12-26 02:42:19 -05:00
Azalea b3294eed68 [+] Recreated assets 2024-12-26 02:30:51 -05:00
Azalea 37946c5aba [+] Helpful message for unsupported games 2024-12-25 16:31:01 -05:00
Azalea ce80f65e9f [F] Fix avatar saving 2024-12-23 20:16:59 -05:00
Azalea 4dce42b85f [M] Migrate to svelte 5 routing 2024-12-23 19:51:34 -05:00
Azalea 88702085bb [-] Remove unnecessary showOpenFilePicker library 2024-12-23 19:49:31 -05:00
Azalea 2719522e07 [-] Remove unused rating page 2024-12-23 19:23:47 -05:00
Azalea dd573945ed [F] Fix build warnings 2024-12-23 18:56:44 -05:00
Azalea 9cffb19332 [M] Migrate usage 2024-12-23 18:32:20 -05:00
Azalea 6631bb593c [U] Migrate to svelte 5, switch to bun 2024-12-23 18:32:02 -05:00
Azalea f5959925aa [O] Handle ranking with binary search 2024-12-23 18:00:06 -05:00
Azalea 5b20cb316b [O] Pre-compute ranking cache 2024-12-23 15:58:02 -05:00
Azalea 8cb7ff8ed4 [+] Diff tool 2024-12-23 15:57:06 -05:00
Azalea 4bcf1f2d9e [F] Fix inconsistencies 2024-12-20 11:18:03 -05:00
Azalea 452b077822 [F] Fix nullable 2024-12-20 10:04:48 -05:00
Azalea f37a32ceab [-] Remove unused functions 2024-12-20 09:32:16 -05:00
Azalea 7182514a64 [M] Rename var 2024-12-20 09:29:48 -05:00
Azalea da60131051 [O] Refactor 2024-12-20 09:27:50 -05:00
Azalea aa9804d2df [+] User data handlers 2024-12-20 09:00:13 -05:00
Azalea 10c1b9bc29 [M] Static endpoints 2024-12-20 08:42:43 -05:00
Azalea 698422a41e [-] Collapse more 2024-12-20 07:29:39 -05:00
Azalea ac16f40303 [O] Collapse boring handlers 2024-12-20 07:14:14 -05:00
Azalea e41bdecd5b [O] Better chusan handling 2024-12-20 07:01:19 -05:00
Azalea c9a0a8d2b5 [F] Fix matching bad for real for real 2024-12-20 07:00:32 -05:00
Azalea c308940c4b [F] Fix matching bad for real 2024-12-20 06:57:48 -05:00
Azalea 99770ccd2f [F] Fix matching bad??? 2024-12-20 06:54:40 -05:00
Azalea 2d4bb90acc [F] Fix chusan duplicate key 2024-12-20 06:25:41 -05:00
Azalea e78d80b99d [-] Remove json property order? 2024-12-20 05:21:08 -05:00
Azalea 9f5cd6dc88 [M] Migrate chusan user data (NEED TESTING) 2024-12-20 05:12:44 -05:00
Azalea 85c0b670da [F] Fix lastClientId null 2024-12-20 04:53:48 -05:00
Azalea 813ec7d294 [O] Migrate sass import 2024-12-20 04:37:51 -05:00
Azalea d66eb239fa [F] Fix table 2024-12-20 04:25:39 -05:00
Azaleaand凌莞~ 9fcc46b5d5 [O] Common superclass for chusan user entities
Co-Authored-By: 凌莞~(=^▽^=) <opensource@c5y.moe>
2024-12-20 03:34:04 -05:00
Azaleaand云 3ebf8a2061 [F] 263 should be 264
Co-Authored-By: 云 <i@muir.fun>

#96
2024-12-20 01:29:01 -05:00
Azalea de98085e84 [U] Update readme 2024-12-20 14:07:45 +08:00
云 2557b55817 [+] Chusan Luminous Plus A072-A112 (#96) 2024-12-20 14:03:21 +08:00
Azalea 128706e8a1 [O] Switch to bun 2024-12-17 21:46:34 -05:00
Azalea d854d8ae0b [F] Fix userbox 2024-12-17 20:36:01 -05:00
Azalea 637191836a [F} Fix dropdown white on white 2024-12-17 20:35:44 -05:00
Azalea 69ab9d96f7 [F] Fix userbox 2024-12-17 20:09:48 -05:00
Azalea 073febe24a [+] Remove classes, migration guide 2024-12-17 20:09:26 -05:00
Azalea f01a4fcfac [+] UserBox endpoints 2024-12-17 15:28:28 -05:00
Azalea 4f81a4e9b4 Merge branch 'metrics' into v1-dev 2024-12-12 17:07:55 -05:00
Azalea 1a06033964 [+] Hide allnet port 2024-12-12 17:06:32 -05:00
MenciandAzalea c5dad11e5e [+] Metrics (#95)
* Add actuator and micrometer

* update

* [-] Remove unused import

* [O] Make code less verbose

* format

* refactor

---------

Co-authored-by: Azalea <22280294+hykilpikonna@users.noreply.github.com>
2024-12-13 05:47:31 +08:00
Menci 5ed89754b3 refactor 2024-12-12 02:33:14 +08:00
Menci ee88be613c format 2024-12-11 11:11:17 +08:00
Azalea ebafb4c05e [O] Make code less verbose 2024-12-10 21:56:15 -05:00
Azalea 70466d0c94 [-] Remove unused import 2024-12-10 19:13:40 -05:00
Menci 340003c568 update 2024-12-10 23:30:30 +08:00
Menci db5343fba3 Add actuator and micrometer 2024-12-07 02:32:48 +08:00
akatki 8434842c65 [F] AimeDB Felica Lookup v2 rename package parameter (#94)
* [F] AimeDB Felica Lookup v2 rename package parameter

* [F] AimeDB Felica Lookup v2 rename package parameter
2024-12-01 11:39:51 +08:00
Clansty 2482881117 [RF] AquaMai moved to new repo 2024-11-30 15:18:08 +08:00
Clansty 4afe2160e1 [F] CI after moving assets 2024-11-30 14:45:47 +08:00
MenciandClansty 6225390b7f [F] Set ForceAsSserver to default ON (#92)
* Set ForceAsSserver to default ON

* work as origin

---------

Co-authored-by: Clansty <i@gao4.pw>
2024-11-30 14:43:25 +08:00
凌莞~(=^▽^=)andMenci d5a9c98ff9 [O] ResetTouchAfterTrack -> ResetTouch, add press key to reset (#93)
* [O] ResetTouchAfterTrack -> ResetTouch, add press key to reset

* fix

* update

* fix: Remove not work

---------

Co-authored-by: Menci <mencici@msn.com>
2024-11-30 05:29:30 +08:00
Clansty bed1b85319 [+] LogUnity 2024-11-29 11:58:50 +08:00
Clansty 8a728ad28a [F] JudgeAccuracyInfo crashes demo 2024-11-29 05:43:41 +08:00
Clansty c42f17c96e [+] Bump version 2024-11-27 03:49:27 +08:00
Clansty 054352356b [O] Locale 2024-11-27 03:35:01 +08:00
Menci 2646f642b5 [+] AquaMai.Config.ApiVersion (#91)
* Add ApiVersion

* Fix SectionNameOrder
2024-11-27 00:19:37 +08:00
Clansty 436bdde60a [O] Do not reset touch panel when quick retry 2024-11-26 21:22:18 +08:00
Clansty 07210a23b7 [F] unused lockCredits 2024-11-26 05:53:20 +08:00
Clansty da36ef4002 [O] enforce type for SetEntryValue and some comment and type chore 2024-11-26 05:14:58 +08:00
Menci e3b06b110f [+] LogNetworkRequests (#90)
* It doesn't work...

* Implement

* rename
2024-11-26 00:03:50 +08:00
Clansty 792dce6843 [+] Add some interfaces for attributes 2024-11-26 00:03:35 +08:00
Clansty 0ec048ceba [F] LoadFromPacked Occupying file 2024-11-25 22:32:50 +08:00
Menci 07631e9b02 [F] AquaMai upload task shouldn't run on PR builds 2024-11-25 18:32:48 +08:00
Clansty 4834363fb5 [+] Add LatestVersion to interface 2024-11-25 04:04:04 +08:00
Menci 734dbfb761 [F] Fix AquaMai CI after config refactor (#89)
Message from previous commit:

[RF] AquaMai configuration refactor (#82)

更新了配置文件格式,原有的配置文件将被自动无缝迁移,详情请见新的配置文件中的注释(例外:`SlideJudgeTweak` 不再默认启用)
旧配置文件将被重命名备份,如果更新到此版本遇到 Bug 请联系我们

Updated configuration file schema. The old config file will be migrated automatically and seamlessly. See the comments in the new configuration file for details. (Except for `SlideJudgeTweak` is no longer enabled by default)
Your old configuration file will be renamed as a backup. If you encounter any bug with this version, please contact us.
2024-11-25 02:15:04 +08:00
Menci 37044dae01 [RF] AquaMai configuration refactor (#82)
更新了配置文件格式,原有的配置文件将被自动无缝迁移,详情请见新的配置文件中的注释(例外:`SlideJudgeTweak` 不再默认启用)
旧配置文件将被重命名备份,如果更新到此版本遇到 Bug 请联系我们

Updated configuration file schema. The old config file will be migrated automatically and seamlessly. See the comments in the new configuration file for details. (Except for `SlideJudgeTweak` is no longer enabled by default)
Your old configuration file will be renamed as a backup. If you encounter any bug with this version, please contact us.
2024-11-25 01:25:19 +08:00
Clansty e9ee31b22a [F] 0.10000000149011612 2024-11-22 18:18:48 +08:00
Azalea cf0e3ce989 [F] Should be card id, not game user id 2024-11-21 12:41:24 -05:00
Azalea 27664164fa [F] Fix ranking reindex 2024-11-21 12:34:59 -05:00
Azalea b7360c426b [F] Fix encountMapNpcList runtime error 2024-11-21 12:28:09 -05:00
Azalea 0e176d5608 [F] Fix warnings 2024-11-21 12:26:36 -05:00
Azalea a947a81772 [F] oops forgor 2024-11-21 12:16:17 -05:00
Azalea bbb4185fac Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-11-21 12:12:09 -05:00
Azalea e34f0587fe [O] Optimize ranking 2024-11-21 12:10:44 -05:00
Clansty 0e02dd660c [F] IconLoader 2024-11-22 00:59:25 +08:00
Azalea 2376e511ac [+] DB migration for ranking optimization 2024-11-21 11:39:36 -05:00
Azalea 56bf447cdb [M] Move opt out leaderboard to correct place 2024-11-21 11:39:23 -05:00
Azalea 5ebb1718d6 [-] Remove SQLite migrations 2024-11-21 10:49:21 -05:00
Clansty 9143b92932 [F] BasicFix 2024-11-21 18:47:56 +08:00
Azalea fbff4a8cb1 [O] Optimize chu3 user data 2024-11-21 01:51:29 -05:00
Azalea b02371e4c3 [O] Optimize auto-ban 2024-11-21 01:49:45 -05:00
Azalea e32a2bbe81 [F] Fix hibernate enhance compilation 2024-11-20 22:29:45 -05:00
Azalea 10ebd61519 [+] Kotlin Hibernate enhance 2024-11-20 22:25:48 -05:00
Clansty 7ac90891ca [F] should hook getter 2024-11-21 01:53:12 +08:00
Clansty 711c18a7f1 [+] ForceIgnoreError 2024-11-20 04:06:15 +08:00
Clansty b3cb08316a [+] ForceNonTarget 2024-11-20 02:46:41 +08:00
Clansty 42b8b9ce4a [O] RemoveEncryption should default true 2024-11-20 02:25:16 +08:00
村場 榞彦 fc4834ebd6 [+] Support More Custom Png Assets (#85)
素材放置于AssetBundleImages,支持姓名框背景板旅行伙伴,Icon仍在修,navichara和PartnerResult在写
2024-11-20 02:16:22 +08:00
Clansty 24ab79a09a [O] Comments 2024-11-20 02:08:47 +08:00
Clansty 786a8832d3 [+] Make it configurable 2024-11-19 01:38:29 +08:00
Minepig 4d25b6a43c Accuracy info and other features (#84)
* tweaks slide fade in

* judge accuracy info

* Update SlideArrowAnimation.cs
2024-11-19 01:32:18 +08:00
Clansty 29bb54d2cc [O] Show quick skip after 1sec 2024-11-16 18:42:10 +08:00
Clansty cd075a3559 [F] RatingUpWhenSSSp Algo 2024-11-16 01:47:07 +08:00
Clansty 0455a83ef1 [+] Play Count in SelectionDetail 2024-11-16 00:53:22 +08:00
Clansty 6c5791b1fe [F] UpsertUserAll Crash with usernames longer than 8 chars 2024-11-14 22:58:20 +08:00
Clansty 705b6cc03d [F] Maybe fixed some PractiseMode problems 2024-11-14 22:52:40 +08:00
Clansty b190e54285 [+] TouchResetAfterTrack 2024-11-14 22:52:21 +08:00
Clansty 478db15211 [F] Practice mode crash on AdvDemoProcess 2024-11-06 13:58:07 +08:00
Clansty 1542f3811d [F] Skip button background 2024-11-06 12:10:20 +08:00
Minepig 85dd8029af [+] Slide related visual feature (#81)
New Features:
1. Invert the Slide hierarchy
2. Slide Track shrinking animation

Changes:
1. Improve the visual effect of Break-Slide judge blink
2. `DisableTrackStartTabs` now also hide user's best achievement
2024-11-06 11:54:53 +08:00
Clansty 11beb6676e [+] Show alert in CI builds 2024-11-06 11:40:20 +08:00
Clansty 99d7fe5ca2 [F] SQL 2024-11-04 20:42:37 +08:00
Clansty 248c1ce189 [+] optOutOfLeaderboard 2024-11-04 20:32:50 +08:00
云 bf972681d5 [+] CardMaker 1.39 support (#79) 2024-11-04 19:18:56 +08:00
Clansty 996632ac73 [O] Allow change maimai name to chinese characters in settings 2024-11-04 19:09:48 +08:00
Clansty b28a1986c9 [O] Disallow using card/summary to query others' card 2024-11-04 19:00:44 +08:00
Clansty fb96e93184 [+] Configurable mod key map manager 2024-11-01 17:03:57 +08:00
Clansty ac4db91df4 [F] userActivityList not unique error 2024-10-31 01:30:18 +08:00
Clansty 408845878b [+] Increase version code 2024-10-30 07:27:54 +08:00
Clansty 7933d49bb2 [RF] Move some patches to visual 2024-10-28 06:09:42 +08:00
Clansty 6945032077 [RF] Move sub-config classes to their own directory 2024-10-28 05:56:54 +08:00
Clansty 0af137ba8c [+] Add config entries for new patches (#77) 2024-10-28 05:43:55 +08:00
Clansty de3d376063 [F] SinglePlayer compatibility with 1.09.00 2024-10-28 00:04:43 +08:00
Clansty 36da872932 [O] Locale 2024-10-27 23:56:26 +08:00
Clansty ff2ed50dea [+] Mark supported game versions with attributes 2024-10-27 23:34:41 +08:00
Clansty 6bb2685e03 [+] Generate example config via attributes 2024-10-27 22:44:12 +08:00
Clansty 5eb0424ee7 [F] Bot renderer crash when b35 or b15 is empty 2024-10-27 04:32:02 +08:00
Menci 80536ef4fb [+] New APIs 2024-10-26 02:24:42 +08:00
Clansty f3bebc6fa2 [F] Fody should merge System.Numerics 2024-10-25 22:16:08 +08:00
Minepig d0bb3cc75c [+] Slide code support & split multiple patches (#77)
* 功能拆分

将不同的功能分拆到不同文件

* Slide code notation support

This is part of Maimai DX 2077 patch set.
New MA2 commands: NMSSS, BRSSS, EXSSS, BXSSS, CNSSS
2024-10-25 20:42:08 +08:00
WYH2004 98213cff67 [+] ShowErrorLog (#74)
* [+] ShowErrorLog

* [O] Fixed spelling errors in method names
2024-10-25 20:20:26 +08:00
Clansty c074de5876 [+] SinglePlayer support legacy game versions 2024-10-25 00:45:12 +08:00
Clansty 906bdfa15e [+] GUI style 2024-10-24 02:12:36 +08:00
Clansty e844164cf6 [+] Splash+ support 2024-10-24 01:15:55 +08:00
Clansty 1b47bfa2f1 [F] Unable to save in lower versions 2024-10-24 00:27:04 +08:00
Azalea 33997c9a82 Merge pull request #69 from Becods/v1-dev
[+] Maimai DX Buddies Plus I011
2024-10-22 06:21:55 -07:00
Azalea 4713a44573 [F] Fix #68 2024-10-22 09:20:33 -04:00
Clansty be7b0945e9 [+] Increase version code 2024-10-22 00:19:43 +08:00
Clansty 0f1bfc5a17 [+] TouchPanelBaudRate 2024-10-22 00:19:12 +08:00
Clansty 3bc9f1382c [O] Hide skip button after click 2024-10-19 19:56:47 +08:00
Menci a08e93d975 [F] Refactor CustomCameraId and remove hard-coded enums / IDs (#71)
* refactor

* Add PrintCameraList check

* Separate PrintCameraList to a class

* cleanup
2024-10-19 01:34:53 +08:00
Clansty 91a120599f [F] Repeat resets speed 2024-10-17 16:52:46 +08:00
Becods 5d399b2497 [+] Maimai DX Buddies Plus I011 2024-10-17 11:11:27 +08:00
WYH2004 0cab18b9b5 [+] CustomCameraId (#66)
* [+] CustomCameraId

* [F] Map CameraType to the correct Camera IDs using enum

* [+] GameInfo Utils

* [+] CustomCameraId Add ChimeCamera Support

* [+] Decide whether to print a CameraList based on the Config
2024-10-17 02:26:44 +08:00
Clansty 903da8732d [+] keep note speed when changed speed 2024-10-16 19:23:32 +08:00
Clansty 6857ae5182 [F] CurrentPlayMsec conflict with speed settings 2024-10-16 18:59:31 +08:00
Clansty 5bcbffcdf0 [F] Notes shift after set speed 2024-10-16 18:41:07 +08:00
Clansty 953083a0bf [F] Seek resets speed 2024-10-16 18:11:17 +08:00
Clansty 1810bbe2d5 [+] QuickEndPlay button when notes play end 2024-10-16 01:05:04 +08:00
Azalea f716ab0c1b Merge pull request #67 from Becods/v1-dev
[+] Chusan Luminous Plus Events
2024-10-15 06:05:39 -04:00
Clansty e04e5596a3 [+] IgnoreAimeServerError 2024-10-15 17:05:55 +08:00
Becods f239d498ad [+] Chusan Luminous Plus A071 2024-10-15 10:35:05 +08:00
Becods 7b768b5b5b [+] Chusan Luminous Plus A000 to A001 2024-10-15 10:06:45 +08:00
Azalea 60813274dc [F] Forgor to login :( 2024-10-14 15:27:01 +08:00
Azalea ad5bc4fc0d [+] Add ghcr.io repo as well 2024-10-14 15:26:02 +08:00
Azalea c1c6949175 [+] ARM support? 2024-10-14 15:20:02 +08:00
Azalea 26840700ee [-] Revert docker-compose to using pre-built image 2024-10-14 15:11:52 +08:00
Azalea ec610de266 [PR] #52 from istareatscreens/add-arm-support
Change docker-compose to support ARM
2024-10-14 03:10:49 -04:00
Azalea f4129ff5c2 [+] Docker image action 2024-10-14 15:08:48 +08:00
Menci b8cc6d9809 CI (#62) 2024-10-14 02:05:23 +08:00
Menci 9384d1d96f [+] Bypass Cake.dll hash check and SSL pinning (#63)
* Bypass Cake.dll hash check and SSL pinning

* Move to BasicFix
2024-10-14 02:04:26 +08:00
Menci 854b6b76a0 Fix headphone volume not set with SkipToMusicSelection (#65) 2024-10-14 02:02:58 +08:00
Menci bc836e973c [F] Fix reflect invoking arguments in Shim (#64) 2024-10-14 01:06:15 +08:00
Clansty bf9855abd1 [O] better _isPlaying detection 2024-10-13 23:54:53 +08:00
WYH2004andClansty 4006438d93 [+] TouchToButtonInput On Aquamai (#58)
Co-authored-by: Clansty <i@gao4.pw>
2024-10-13 23:36:28 +08:00
Menci cdfb86e021 [+] Support official quick retry (3456) in UX/QuickSkip
Merge pull request #60

* Official quick retry
2024-10-13 21:45:14 +08:00
MenciandClansty 81e0232712 [O] Support SDGA and other game version in one binary
Merge pull request #61

* Merge targets

* Merge branch 'v1-dev' into fork/Menci/merge-targets

* [O] Move Shim to AquaMai.Helpers

---------

Co-authored-by: Clansty <i@gao4.pw>
2024-10-13 21:38:28 +08:00
MenciandClansty e67b68aa20 [O] Refactor AquaMai.csproj to SDK style (#59)
* SDK style

* Update CI

* remove extra code

* [F] CI build and add CI for PR

* [F] Assembly version info

* [F] Do not generate satellite assembly for locale

---------

Co-authored-by: Clansty <i@gao4.pw>
2024-10-13 20:25:25 +08:00
Clansty a075de4711 [+] Increase version code 2024-10-08 17:02:25 +08:00
Clansty 6d782352f7 [F] Compatibility for modified package 2024-10-07 23:29:59 +08:00
凌莞~(=^▽^=) 587993c957 Merge pull request #56 from shirokosunaookami/patch-1
Fix QuickRetry when use io4 firmware
2024-10-06 20:59:54 +08:00
shirokosunaookami aaca3e65ce Fix QuickRetry when use io4 firmware 2024-10-06 20:57:49 +08:00
Azalea ce53acdacf [F] Fix bound must be greater than origin 2024-10-05 05:51:55 -04:00
Azalea a449bac130 [U] Update usage 2024-10-05 05:36:53 -04:00
Azalea 060bd32417 [F] Fix docstring 2024-10-05 05:36:28 -04:00
Azalea 08a1595d3e Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-10-05 05:35:53 -04:00
Azalea b88c56b67a [F] Fix migrate card setting null for non-null field 2024-10-05 05:35:48 -04:00
Clansty 7deb395fd9 [+] Fix level display everywhere 2024-10-05 00:20:07 +08:00
Clansty 2ef104224b [O] make image same in two monitors 2024-10-04 23:07:44 +08:00
Clansty d84b2f3870 [+] CustomLogo 2024-10-04 22:45:48 +08:00
Clansty 7e5467935b [+] HanabiFix + HideHanabi 2024-10-04 20:48:06 +08:00
Clansty f7c1714cb8 [+] config file entry 2024-10-04 20:19:51 +08:00
Clansty 12724cea56 [+] Add options 2024-10-04 19:38:02 +08:00
凌莞~(=^▽^=) 2cea66cba5 Merge pull request #55
Customize note skin (just like MajdataView) &  several patches
2024-10-04 19:23:55 +08:00
凌莞~(=^▽^=) ac01469eac Merge branch 'v1-dev' into v1-dev 2024-10-04 19:23:16 +08:00
Clansty cb4cc4e7d9 [F] PractiseMode 2024-10-04 16:12:14 +08:00
Minepig c648493a9e 自定义皮肤功能 2024-10-04 13:47:07 +08:00
Minepig a36da6ebde 修复了闲置播放紫谱忘记改touch速度的问题 2024-10-04 13:45:50 +08:00
Minepig 4fd2fc7e00 个人录制谱面确认时用得到的patch 2024-10-04 13:44:51 +08:00
Minepig 39646732b6 增加了BreakSlide判定闪烁、圆弧Slide判定对齐、Wifi判定区分上下 2024-10-04 13:44:20 +08:00
Minepig 8791507aca 修正了Slide在AutoPlay时的轨迹箭头显示 2024-10-04 13:42:53 +08:00
Minepig c173b2a230 修复连锁Slide的读取逻辑(刹那旅程爆机bug) 2024-10-04 13:41:48 +08:00
Clansty 05d2df623e [O] update config example 2024-10-04 00:26:54 +08:00
Clansty e75a1fcd12 [+] PracticeMode config entry 2024-10-03 20:51:42 +08:00
Clansty 529165f2b5 [F] Fix text shadow a little bit 2024-10-03 20:02:10 +08:00
Clansty 9a5743a27e [+] Show play time on PractiseModeUI 2024-10-03 17:05:00 +08:00
Clansty 271ef9bf00 [F] SinglePlayer without remove mask 2024-10-03 16:40:51 +08:00
Clansty 3a97f7645e [O] Check object with maybeUserMusicList 2024-10-03 16:06:32 +08:00
Clansty a84bf9efef [+] Import from a userMusicDetailList Json 2024-10-03 15:51:18 +08:00
Azalea daa5129f65 [O] Make a non-callback version of cardByName 2024-10-03 02:47:20 -04:00
Clansty ac375abf5e [+] Some font features 2024-10-02 23:28:33 +08:00
Clansty bae5a7c838 [O] Make HideMask separate component 2024-10-02 19:03:30 +08:00
Clansty 1bcb7210c6 [+] Custom Keymap 2024-10-02 14:41:20 +08:00
Clansty c15dcf6b98 [+] FrameRate lock + display 2024-10-02 00:52:37 +08:00
Clansty 9ead7a413e [+] able to switch off WindowState 2024-10-01 15:50:00 +08:00
Clansty 07817b04fb [F] SelectionDetail window size 2024-10-01 01:10:16 +08:00
Clansty e65d67f12e [+] Network error reason 2024-10-01 01:00:32 +08:00
Clansty e39f013808 [+] Show tip when saving is done 2024-10-01 00:15:55 +08:00
Clansty c34affc215 [F] Maybe fix practise mode 2024-09-30 14:21:10 +08:00
Clansty 07b8cc04be [+] i18n 2024-09-30 01:26:54 +08:00
Clansty 78a396ce4b [F] SelectionDetail Font size
[RF] Move SelectionDetail to Utils
[RF] Remove UrGui
[RF] Refactor SelectionDetail
2024-09-29 23:12:22 +08:00
Clansty 43997f2215 [+] Increase version code 2024-09-29 13:05:51 +08:00
Clansty e9bac0a737 [O] Disable MipMap 2024-09-29 13:03:54 +08:00
Clansty e7c69d2a6b [+] PractiseModeUI 2024-09-28 23:06:06 +08:00
Clansty 8c3400ee41 [O] better get player 2024-09-28 19:42:42 +08:00
Clansty 3d79c939e9 [+] Speed change 2024-09-28 17:35:59 +08:00
Clansty 27b8e6bd21 [+] PractiseMode Debugging 2024-09-28 16:30:19 +08:00
Clansty 24ecaab570 [O] better polyfill load 2024-09-28 15:31:58 +08:00
Clansty 74e39c437d [+] Window Magic! 2024-09-27 21:50:27 +08:00
Clansty c1c7788cd3 [O] Auto detect if DebugFeature is need to be patched 2024-09-27 20:18:53 +08:00
Clansty a2db465825 [+] Skip track start screen 2024-09-27 19:33:37 +08:00
Clansty 9605264b9a [RF] Move some settings to TimeSavingConfig 2024-09-27 19:19:42 +08:00
Clansty 24e6808984 [+] seeking in DebugFeature 2024-09-27 18:59:27 +08:00
Clansty 0d9c7a4cc2 [F] Default string value 2024-09-24 20:18:10 +08:00
Azalea 3c6ecf1563 [+] Add cat 🐱 2024-09-23 15:57:55 -04:00
Clansty 5c634d6ff9 [+] Telegram and QQ join link 2024-09-22 19:41:47 +08:00
Clansty 6b51155bac [F] Remove debug log 2024-09-20 02:36:48 +08:00
Clansty 1873ad8355 [+] Increase version code 2024-09-17 11:21:11 +08:00
Clansty 8087396188 [+] TouchSensitivity 2024-09-17 06:25:52 +08:00
Clansty 5128db9f6c [+] Global judge adjust 2024-09-17 04:13:51 +08:00
Clansty ef832461c0 [O] Change target name 2024-09-17 03:26:33 +08:00
Clansty 85493cdfd8 [+] Write example config when config not found 2024-09-17 03:24:35 +08:00
Clansty e557f1361d [+] Error notice 2024-09-17 02:58:37 +08:00
Clansty 9598ac5a50 [F] Crash with the new modified SDEZ145 DLL with deleted methods 2024-09-17 02:48:07 +08:00
Clansty 5ee7add355 [+] Force Paid play 2024-09-17 02:34:38 +08:00
Clansty 81c1e6e887 [+] Increase version code 2024-09-12 21:56:23 +08:00
Clansty b7004b3866 [+] Extend notes pool to support some odd charts 2024-09-12 21:54:37 +08:00
Clansty 5341326811 [O] Coming soon! -> Coming soon™ 2024-09-11 01:57:17 +08:00
Clansty 776c08e605 [F] RemoveEncryption error with SDEZ 2024-09-11 01:35:17 +08:00
Clansty b7c5d18df1 [+] Log user ID on login 2024-09-11 00:56:15 +08:00
Clansty 39dc6c576a [F] Nested types patches without enable 2024-09-11 00:38:13 +08:00
Clansty d9fc262003 [F] Nested types patches without enable 2024-09-11 00:26:45 +08:00
Clansty 9b7f2b3a79 fix: Level display shift when level number not match display level 2024-09-08 17:09:38 +08:00
Clansty 1ad4ac2d63 [+] SelfMadeChartsWhiteListUsers 2024-09-07 22:17:01 +08:00
Clansty 9ca7949bf0 [+] Globally disable self made charts 2024-09-07 22:11:01 +08:00
Clansty d2174364b2 [F] reset HideSelfMadeCharts when enter login screen 2024-09-07 21:27:48 +08:00
Clansty 91238c3a9c [+] Increase version code 2024-09-07 00:22:43 +08:00
Clansty d32c8c999b [O] more accurate genreName and versionName for SelectionDetail 2024-09-06 23:24:44 +08:00
Clansty 6580b78485 [+] Load png TabTitle 2024-09-06 23:15:53 +08:00
Clansty 0eec8dea05 [+] Support 2p SelectionDetail 2024-09-06 17:34:43 +08:00
Clansty 8fa356242e [+] Port SelectionDetail 2024-09-06 16:41:29 +08:00
istareatscreens a13611f601 Change docker-compose to support ARM 2024-09-05 08:33:38 -04:00
Clansty e8307cdcd9 [+] toggle the display of self-made charts 2024-09-05 02:31:07 +08:00
Clansty ca425cf949 [+] Increase version code 2024-09-04 18:54:27 +08:00
Clansty 9f57d393bf [F] LoadJacketPng and RandomBgm crash when LocalAssets not exists 2024-09-04 15:32:11 +08:00
Clansty 84c59e2c8b [+] Support all Melonloader versions 2024-09-04 15:12:32 +08:00
Clansty 212f60db60 [+] Increase version code 2024-09-03 01:11:01 +08:00
Clansty fbbdb056d7 [O] Retry attempts of action 2024-09-02 23:50:05 +08:00
Clansty e3c0fe5e78 [+] Also enable shop name display in SDGA when CustomPlaceName is set 2024-09-02 23:15:25 +08:00
Clansty a3afb1a2b8 [+] Custom shop name in photo 2024-09-02 23:02:47 +08:00
Clansty ac94b6d917 [F] Uppercase extension 2024-09-02 21:45:47 +08:00
Clansty 8db9580ff5 [+] Restore AutoPlay(Home) and Pause(Enter) for SDGA 2024-09-02 17:35:31 +08:00
Clansty 489c00ebb0 [+] Load Jacket from A???\AssetBundleImages\jacket\*.png 2024-09-02 17:06:34 +08:00
Clansty d58fe84439 [+] Make ForceAsServer and ForceFreePlay individual components 2024-08-22 20:17:26 +08:00
Clansty ffe3843747 [i18n] Add zh version of config toml 2024-08-22 02:16:38 +08:00
Clansty b370af3c19 [F] Remove debug logs 2024-08-22 01:49:41 +08:00
Clansty cdd3c81bdc [+] Prevent accidental touch of the Test button 2024-08-20 00:36:41 +08:00
Clansty eb72839e2b [+] trigger QuickSkip with service key 2024-08-20 00:00:00 +08:00
Clansty 6457cedd9b [+] CI build for AquaMai 2024-08-16 19:23:12 +08:00
凌莞~(=^▽^=) be72ea0c98 Merge pull request #50 from Becods/v1-dev
The play count should be the PC count not the TRACK count.
2024-08-12 14:50:43 +08:00
云 bf5691bdb6 [F] The play count should be the PC count not the TRACK count. 2024-08-12 12:45:20 +08:00
Clansty a6a8734599 [+] Setting of score rounding and fix bugs 2024-08-08 14:49:20 +08:00
Clansty d0aecc76ed [O] Move general game settings to general tab 2024-08-08 13:50:14 +08:00
Azalea 3b80b8d7f1 [F] Fix wrong implementation in GetUserMapAreaApi
Thanks rinsama for the patch
2024-08-08 00:31:18 -04:00
Clansty c11bb3be59 [F] Rival may lead to unable to login the game 2024-08-07 19:46:35 +08:00
Clansty 7ee4c14fae [+] API for bot to ban user from ranking board 2024-08-06 15:13:54 +08:00
Clansty 17a0209c8c [F] Chuni rating display 2024-08-05 23:34:02 +08:00
Clansty fc10c05731 [F] export api and game api leaking lastClientId 2024-08-05 21:36:20 +08:00
Clansty 9ef0d0edfb [F] mai2: Error when rival list empty 2024-08-05 21:15:32 +08:00
Clansty 473f4a4295 [+] mai2: support adding rival 2024-08-05 20:37:18 +08:00
Clansty 94ba1f0b09 [+] AquaMai: Add CalcSpecialNum 2024-08-05 20:37:07 +08:00
Clansty 8903fa268a [+] CheckServerHash 2024-08-04 12:27:19 +08:00
Clansty 6ad980d471 [F] Encrypt and Decrypt hook run without enabled in config 2024-08-04 12:26:48 +08:00
Clansty 9a6e9c4660 [+] Some API endpoints for bot query 2024-08-02 08:51:24 +08:00
Clansty f7c842774b [+] Return AquaNet profile photo as maimai userPortrait 2024-08-01 13:34:54 +08:00
Clansty fde952fcd9 [+] Add option to disable the legacy aquaviewer api 2024-08-01 09:38:36 +08:00
Clansty a71c2bd8ec [+] Import player data, tested with maimai 2024-08-01 08:41:11 +08:00
Clansty 7c4f887ef4 [+] Export maimai userdata 2024-08-01 06:56:31 +08:00
Clansty b32b0e970c [+] Add change name for maimai and refactor settings page 2024-07-31 09:03:26 +08:00
Clansty 836f789fc9 [+] Only show UserBox if user played chuni 2024-07-31 07:06:16 +08:00
凌莞~(=^▽^=) 6b71e2f22a Merge pull request #42 from alexay7/usebox
Added UserBox page (Chunithm)
2024-07-31 05:20:43 +08:00
凌莞~(=^▽^=) 1fa83d3f8f [+] Add SDGA 1.45 support in README 2024-07-30 01:00:33 +08:00
Clansty 247f8f132b [F] Some compatability for 2p mode 2024-07-30 00:39:58 +08:00
Clansty 3fcdf38d4a [F] Game crash on ResultProcess when login as guest 2024-07-29 23:59:30 +08:00
Clansty 0626d1c466 [F] Crash when playing tutorial 2024-07-29 23:38:47 +08:00
Clansty f0da7c6300 [F] Wrong SQL syntax 2024-07-29 23:08:10 +08:00
Azalea 2554478a38 Merge pull request #47 from Becods/v1-dev
[+] Chusan Luminous A151 to A181
2024-07-29 07:22:28 -07:00
Clansty d7f24759d8 [+] Allow use any characters in maimai name 2024-07-29 10:25:15 +08:00
Clansty df3bd6fbec [+] Allow register-card via http 2024-07-29 06:18:53 +08:00
Clansty 11ab81a484 [F] Upsert error when isNewFavoritemusicList is Null 2024-07-29 06:15:55 +08:00
Becods 91e7a092c4 [+] Chusan Luminous A151 to A181 2024-07-29 05:07:23 +08:00
alexay7 bca5130020 Modify way to get user luid 2024-07-28 03:45:22 +02:00
Clansty 153029abdd [+] Add Character all unlock 2024-07-28 06:02:19 +08:00
Clansty 03ed3f13f4 [+] Support setting favourite music 2024-07-28 00:56:18 +08:00
Clansty 8c7fd78bd4 [+] Support setting favourite items 2024-07-27 23:58:12 +08:00
Clansty a813535e3f [+] Fix DebugInput (MouseTouchPanel) 2024-07-27 05:47:45 +08:00
Clansty 7cae5f8f10 [+] Add 6 new APIs 2024-07-27 00:37:47 +08:00
Clansty 070c19d784 [+] GetGameWeeklyDataApi 2024-07-26 23:59:01 +08:00
Clansty 0833cd8a9b [+] Basic fix 2024-07-26 23:24:42 +08:00
Clansty 64f3a2db58 [F] Build for SDGA1.45 2024-07-26 22:55:53 +08:00
Azalea ad8a425d30 Merge pull request #46 from Becods/v1-dev
Player names should allow the use of hiragana and katakana.
2024-07-20 17:29:30 +08:00
云 40d5c8d79f [F] Player names should allow the use of hiragana and katakana 2024-07-18 20:16:03 +08:00
Clansty c6e471323f [+] Fixes required to run SDGA 2024-07-09 18:11:06 +08:00
Clansty 60a0c8726e [O] Move SkipVersionCheck to Fix 2024-07-09 16:30:30 +08:00
Clansty 5772ff78e6 [+] Allow login with higher data version 2024-07-09 16:18:54 +08:00
Clansty 222ed29b6c [F] SDGA Support 2024-07-09 16:18:22 +08:00
Azalea 23870523fb Merge pull request #45 from yuuz233/patch-1
Update game_specific_notes.md
2024-06-27 16:02:08 +08:00
yuzusoft b1a1d36b66 Update game_specific_notes.md
Latest doc for latest tested working support of game
2024-06-27 10:24:02 +08:00
Clansty 2946c51774 [+] Use the png jacket as bga 2024-06-26 03:11:56 +08:00
Clansty 8b72214780 [+] Load jacket with higher resolution 2024-06-19 21:12:29 +08:00
Clansty 0f701ad2d3 [+] Unlock Utage 2024-06-19 20:57:32 +08:00
Clansty d686c48a0b [+] Save immediate after playing a song 2024-06-16 17:58:20 +08:00
Clansty 80555f9c96 [F] B50 algorithm 2024-06-15 01:47:18 +08:00
alexay7 ec1155b1ba Merge branch 'hykilpikonna:v1-dev' into usebox 2024-06-06 23:54:35 +02:00
alexay7 7377386ee2 Fix layout breaks when options are large 2024-06-05 19:43:40 +02:00
alexay7 f4bb1101bf Added UserBox page 2024-06-05 18:57:48 +02:00
Azalea e44188b830 Merge pull request #40 from alexay7/v1-dev
Filter days with no plays from heatmap
2024-06-05 12:28:00 +08:00
alexay7 c5d81afdf6 Filter days with no plays from heatmap 2024-06-05 02:46:29 +02:00
Clansty f6d55fec35 [+] Skip "Discovered new area" 2024-05-26 13:36:56 +08:00
Clansty 2ef8219f15 [F] Skip Event Info 2024-05-26 13:21:03 +08:00
Clansty bf9197b3e4 [F] Game crash after one track with new AIME with SkipToMusicSelection 2024-05-26 12:59:16 +08:00
Clansty 27b1a31436 [+] Quick end game with "select" key 2024-05-26 11:58:04 +08:00
Clansty 9b51c8cab4 [+] Totally disable and hide timer + fix side effects when ExtendTimer is on 2024-05-26 11:28:06 +08:00
Clansty 114a452609 [+] Skip "Dont tap or slide vigorously" and "Bye" when QuickSkip is on 2024-05-26 10:33:29 +08:00
Clansty ef85156bae [F] Need to press skip multiple time to exit photo edit while ExtendTimer is on 2024-05-26 10:11:29 +08:00
Clansty e55d17fd08 [+] Skip the wait progress after one player login in 1p mode 2024-05-26 09:40:24 +08:00
Clansty 8b83205b0a [F] Mouse input with 1P mode 2024-05-22 12:04:36 +08:00
Clansty 2251350a4e [+] Change every timer to 200 seconds 2024-05-21 21:17:30 +08:00
Clansty f106a31990 [+] Unlock maps that are not in this version 2024-05-21 03:49:19 +08:00
Clansty c9f222583a [+] Play "Master" difficulty on Demo screen 2024-05-20 23:36:52 +08:00
Clansty 13fc51a8a5 [F] May fix sometime custom command not triggered 2024-05-20 22:40:02 +08:00
Clansty 21309cddf0 [+] Execute some command on game idle or on game start 2024-05-20 22:31:27 +08:00
Azalea 86164ba518 [F] Fix link card null 2024-05-17 21:22:13 +08:00
Azalea 8173003144 [F] Fix rating composition null elements, generalize
#35
2024-05-16 11:25:22 +08:00
Azalea f9c8b00587 [PR] #35 from Becods: i18n and rating page fixes
I18n update and rating page fixes
2024-05-16 11:04:15 +08:00
Becods b77da0f143 [+] More i18n 2024-05-16 10:48:48 +08:00
Becods ed955150df [F] If id is 0, skip 2024-05-16 10:43:02 +08:00
Azalea f282197611 Merge pull request #34 from Becods/v1-dev
[+] Add ongeki b55
2024-05-16 01:53:20 +08:00
Clansty 93ce932d28 [F] Unable to load music Acb 2024-05-15 23:57:55 +08:00
Clansty 29505fa4a3 [F] Disable 2P music 2024-05-15 23:29:42 +08:00
Clansty 991442d5c0 [+] Random old version maimai BGM 2024-05-15 21:01:19 +08:00
Becods e7b5991dbf [+] Add ongeki b55 2024-05-13 10:13:17 +08:00
Azalea fb72317c6f [+] AquaMai: Skip event and info screen for new users 2024-05-08 21:47:36 +08:00
Azalea 7992568c0f Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-05-08 21:43:40 +08:00
Azalea 38666b7c99 [O] Try to fix reboot (again) 2024-05-08 21:43:19 +08:00
Azalea 1f3f143ffb Merge pull request #32 from Becods/v1-dev
[+] Add ongeki 1.45 and supplement missing events
2024-05-06 11:31:52 +08:00
Becods 156ece4bb5 [+] Add ongeki 1.45 and supplement missing events 2024-05-06 11:29:25 +08:00
Clansty 770d1ae689 [F] Modify ImproveLoadSpeed to only skip delays to reduce bugs 2024-05-05 19:54:50 +08:00
Azalea d7287c48cf Merge pull request #30 from Becods/v1-dev
[+] Add nginx configuration template
2024-05-01 07:35:10 -04:00
Azalea b4c329f2f9 Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-05-01 19:23:40 +08:00
Azalea cb2219e2cd [O] Clarify something in the readme 2024-05-01 19:23:36 +08:00
云 65f0bfa8a4 [+] Add nginx configuration template 2024-05-01 01:26:08 +08:00
Clansty 7090e0a47b [F] Play Activity maybe missing last several days of current month 2024-04-30 23:43:04 +08:00
Azalea fbb4d61194 [U] Update readme features 2024-04-28 09:38:17 -04:00
Azalea 634b0b50ff [F] Fix disable reboot patch 2024-04-28 09:13:22 -04:00
Azalea 7ff66e9277 [+] AquaMai: Disable reboot 2024-04-28 09:04:46 -04:00
Azalea b93cc3ab20 [F] Fix migration 2024-04-28 08:17:59 -04:00
Azalea 55e7052189 [+] Migrate: Remove signed IDs 2024-04-28 08:15:13 -04:00
Azalea 5a9808de59 [F] Narrow id range to avoid the signed bit in uint32 2024-04-28 07:48:44 -04:00
Azalea a30b34df70 [F] Fix mai reboot? 2024-04-26 11:19:45 -04:00
Azalea 482b19dd5a [F] Fix mai reboot? 2024-04-26 11:15:07 -04:00
Azalea 7895ed89f1 [+] Add SDGA and SDGB to AllNet 2024-04-26 00:13:24 -04:00
Azalea 8449853076 [F] Fix maimai reboot time setting 2024-04-26 00:11:50 -04:00
Azalea affec8d3c1 Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-04-25 17:38:43 -04:00
Azalea 362b69d921 [F] Fix maimai2 reboot window? 2024-04-25 17:38:36 -04:00
Azalea 9d463c7b4a [U] Updating instructions 2024-04-25 14:35:49 -07:00
Azalea cd7da64794 [O] Pre-build docker image 2024-04-25 17:25:14 -04:00
Azalea 5c95f2971f [F] Fix CRLF 2024-04-25 17:16:20 -04:00
Azalea ab3f3f0633 [F] Fix windows WSL2 volume bug 2024-04-25 16:57:12 -04:00
Azalea ba61ac46d1 Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-04-25 16:48:45 -04:00
Azalea 48205d8a6c [U] Update running instructions 2024-04-25 16:48:43 -04:00
Clansty b4cbb1fd14 [+] Load AssetBundle without manifest 2024-04-23 18:51:49 +08:00
Clansty c8db3ec762 [+] Skip to next step or restart current song 2024-04-23 17:34:50 +08:00
Azalea f6cf157930 [+] Last played host 2024-04-22 11:17:16 -04:00
Azalea 4a84a9ed8e [F] Fix tooltip pos 2024-04-22 10:57:51 -04:00
Azalea dbb41ba249 [O] Hide loading 2024-04-22 10:43:55 -04:00
Azalea d3adec5a23 [+] Leaderboard hover 2024-04-22 10:30:34 -04:00
Azalea 1fd030f909 [+] User card 2024-04-22 10:29:55 -04:00
Azalea b6dfeb475d [+] Slot tooltip 2024-04-22 10:29:45 -04:00
Azalea 39050c6de6 [-] Remove logging 2024-04-22 09:17:30 -04:00
Azalea c36926c915 Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-04-22 09:16:04 -04:00
Azalea 3bf3241bd7 [O] Advanced achievement rounding 2024-04-22 09:15:57 -04:00
Clansty df863e879f [+] Feature for load self-made charts jacket from file 2024-04-22 20:59:08 +08:00
Azalea b13af00061 [O] B50 tooltip & hide unknown song level 2024-04-22 08:58:47 -04:00
Azalea 1c2215a8a2 [O] Reduce displayed digits 2024-04-22 08:48:32 -04:00
Azalea 555ae35bb9 [F] Fix mai2 rating calculation 2024-04-22 08:46:22 -04:00
Azalea 8337a1698e [U] Upgrade yarn 1 -> 4, update dependencies 2024-04-21 22:40:36 -04:00
Azalea f0bfa96937 [F] Fix AquaNet ghost card detection 2024-04-21 14:53:50 -04:00
Azalea 7b143dd38f [+] More logging 2024-04-21 14:45:56 -04:00
Clansty 5201c5933c [+] B15 in user detail 2024-04-22 01:55:15 +08:00
Azalea 4c1d501856 [F] Fix b50 NPE 2024-04-21 13:43:44 -04:00
Azalea e001533f33 [F] Fix diva migration sql 2024-04-20 14:20:09 +09:00
Azalea c854dd9a45 [F] Fix ranking username conflict 2024-04-20 11:25:37 +09:00
Azalea 4215b39539 [F] Try to fix wacca uint overflow 2024-04-20 09:37:34 +09:00
Azalea 8e882aafa1 [F] Fix register error not displaying 2024-04-19 16:05:57 +09:00
Azalea 25edbf06c7 [F] Fix account card linking 2024-04-18 21:47:13 +09:00
Azalea 4f05365da3 [F] Fix results not saved 2024-04-18 12:30:36 +09:00
Azalea bf7de99524 [+] NFKC Normalization before processing 2024-04-18 11:37:40 +09:00
Azalea 08c27b6c58 [+] Automatically ban people with unacceptable names 2024-04-18 11:30:18 +09:00
Azalea 60661757c6 [+] Safety moderation 2024-04-18 11:29:02 +09:00
Azalea 5ba64483fb [+] OpenAI Settings in application properties 2024-04-18 09:12:34 +09:00
Azalea a30c9391eb [F] Fix null pointer 2024-04-17 00:06:32 +09:00
Azalea 7023e726bd Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-04-17 00:03:47 +09:00
Azalea c616ea81c6 [S] Make b35 look better 2024-04-17 00:03:35 +09:00
Azalea 65f8b587af [S] Fix tooltip startup glitch 2024-04-16 23:48:41 +09:00
Azalea 14f6b9c759 Merge branch 'b50-dev' of https://github.com/colasama/AquaDX into v1-dev 2024-04-16 23:44:30 +09:00
Clansty c83e0f8cff [F] Fix Chime scanning and (maybe) DX Pass crash 2024-04-12 00:40:29 +08:00
Azalea 2bf86423c9 [PR] #28 from clansty: CustomVersionString
Feature: Custom version display string
2024-04-10 15:36:51 -04:00
凌莞~(=^▽^=) 8dc3035b66 Merge branch 'v1-dev' into feat/CustomVersionString 2024-04-11 03:20:12 +08:00
Azalea 0aff0330e7 [U] Update config description 2024-04-10 07:13:54 -07:00
Azalea 41852f2467 [PR] #29 from clansty: ImproveLoadSpeed
Feature: Option to disable some useless checks and delays to speedup the game boot process
2024-04-10 02:10:35 -04:00
Clansty 442ec76828 [+] Option to disable some useless checks and delays to speedup the game boot process 2024-04-08 17:02:14 +08:00
Clansty d8fc14e71b [+] Custom version string feature 2024-04-08 15:03:43 +08:00
Azalea 2630d32764 [F] Fix card controller after pdid change 2024-04-07 04:06:17 -04:00
Azalea 74d7eff577 [F] Fix DIVA pd_id overflow 2024-04-06 23:36:00 -04:00
Azalea 355c9e2a3d [+] Counter measure 2024-04-03 08:08:02 -04:00
Azalea 501bf06ada [S] Better mobile alignment 2024-04-02 20:34:20 -04:00
Azalea 4574bc0b2f [F] Fix responsive 2024-04-02 20:25:23 -04:00
Azalea c6c91b84fe [F] Fix wacca rating calculation 2024-04-02 06:26:18 -04:00
Azalea 066b33e3e8 [F] Fix wacca invalid music 2024-04-02 02:33:32 -04:00
Azalea 15002c45d6 [O] Rewrite chusan item handler 2024-04-02 02:13:20 -04:00
Azalea b41f3b9370 [F] Fix jvm name clash 2024-04-02 02:07:39 -04:00
Azalea 02e2700e96 [O] Make always vip configurable 2024-04-02 02:04:42 -04:00
Azalea 6441dfd219 [+] Wacca item unlocks 2024-04-02 01:56:42 -04:00
Azalea 1e229c12cc [+] Wacca cheat options 2024-04-02 01:56:31 -04:00
Azalea 4219f2db5b [+] Wacca items 2024-04-02 01:44:12 -04:00
Azalea 36ce636093 [-] Don't display AAA 2024-04-02 01:27:07 -04:00
Azalea 47f09f81ff [U] Correct wacca scoring 2024-04-02 01:26:24 -04:00
Azalea bfa6df904d [O] Proper ticket unlock for wacca 2024-04-02 00:56:59 -04:00
Azalea 99d4f55c50 [+] Chinese i18n for user settings 2024-04-02 00:28:35 -04:00
Azalea 7728b4b1ab [M] Move setting descriptions to i18n 2024-04-02 00:16:34 -04:00
Azalea 6a475434ad [F] Fix typo 2024-04-02 00:09:14 -04:00
Azalea 876a0bd108 [+] Implement game options 2024-04-02 00:07:50 -04:00
Azalea ba13bfd9ad [+] SDK for settings/get settings/set 2024-04-01 23:51:13 -04:00
Azalea 44bab8c0c7 [+] Add "type" field to settings/get 2024-04-01 23:51:00 -04:00
Azalea 2d229b82c3 [+] Game settings tab 2024-04-01 23:38:15 -04:00
Azalea c6cce7aa9a [S] Fix css label box overflow 2024-04-01 23:37:45 -04:00
Azalea 5cbf09f24e [F] Fix splash 2024-04-01 23:27:19 -04:00
Azalea 3ca7d3d615 [U] Update i18n interface 2024-04-01 23:18:50 -04:00
Azalea 25840be694 [U] Update readme jdk version 2024-04-01 19:58:15 -07:00
Azalea 34ab608425 [U] Readme: Add license details 2024-04-01 19:49:50 -07:00
Azalea b498160b3a [+] CC BY-NC-SA License 2024-04-01 19:37:18 -07:00
Azalea 23aae3b5b9 [F] Fix test build 2024-04-01 22:30:49 -04:00
Azalea 97fdd096a8 [F] Fix music info parsing 2024-04-01 22:19:29 -04:00
Azalea 0d21a02da9 [F] Fix wacca music unlock 2024-04-01 22:17:11 -04:00
Azalea ab94250b05 [+] Wacca: Unlock all music 2024-04-01 22:12:14 -04:00
Azalea 42ca6f79dc [F] Force color output 2024-04-01 21:59:47 -04:00
Azalea 646795b753 [+] Wacca username character constraint 2024-04-01 21:54:54 -04:00
Azalea de649915e2 [U] Upgrade to JDK 21 2024-04-01 21:48:08 -04:00
Azalea 0093f5a0de Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-04-01 21:05:04 -04:00
Azalea 686b50eeda [F] Fix chusan export 2024-04-01 21:04:49 -04:00
Azalea 0c93b85024 [F] Fix docker build
Closes #24
2024-04-01 14:04:19 -04:00
Azalea 49d4e88022 [F] Fix chusan import reflection 2024-03-31 11:53:36 -04:00
Azalea 3a8616e225 [+] Generalize data import for chusan 2024-03-30 23:52:29 -04:00
Azalea d4178c85a9 [F] Fix wacca song unlock (!) 2024-03-30 20:49:40 -04:00
Azalea de46790bdf [F] Fix wacca song unlock (?) 2024-03-30 20:31:56 -04:00
Azalea c27070ae28 [F] Fix ongeki userId overflow 2024-03-30 19:40:47 -04:00
Azalea bb4c9477da [F] Fix wacca logging 2024-03-29 21:11:28 -04:00
Colanns 95e78e4f93 [+] Add a B50 / rating page to frontend 2024-03-29 23:49:08 +08:00
Azalea d3d7b5a5c7 [O] Don't translate game name 2024-03-29 09:15:48 -04:00
Azalea 45a3d74284 [F] Fix wacca query 2024-03-29 09:02:30 -04:00
Azalea cd972b5c61 [+] Add wacca to frontend 2024-03-29 08:20:37 -04:00
Azalea 341be8bdc1 [+] Add wacca to card controller 2024-03-29 08:20:21 -04:00
Azalea 101c24edc5 [+] Add wacca support to readme 2024-03-29 05:58:27 -04:00
Azalea be34915cdf [+] Wacca: Calculate player rating server side 2024-03-29 05:53:00 -04:00
Azalea 70aed1d5db [+] Wacca endpoints 2024-03-29 05:45:41 -04:00
Azalea d8c1144881 [-] Remove spring devtools 2024-03-29 05:13:43 -04:00
Azalea 68ec7f504a [+] Wacca NET controller (incomplete) 2024-03-29 05:13:22 -04:00
Azalea 3ab2b16042 [+] Chusan 216 events 2024-03-29 05:12:54 -04:00
Azalea d7fc6f9f49 [F] Fix music difficulty unlock conflict 2024-03-29 02:58:25 -04:00
Azalea 26a72244c0 [M] Rename database fields 2024-03-29 00:47:54 -04:00
Azalea abc21badb1 [+] Wacca: More database fields 2024-03-29 00:24:02 -04:00
Azalea aa1caacfd6 [F] Fix AllNet Wacca path 2024-03-29 00:09:40 -04:00
Azalea 3663eb63e7 [F] Fix maimai2 UpsertUserChargelogApi (TODO) 2024-03-29 00:09:27 -04:00
Azalea e885700680 [+] wacca user/goods/purchase 2024-03-28 23:34:38 -04:00
Azalea d6170d602a [+] wacca user/trial/update 2024-03-28 23:34:26 -04:00
Azalea 4dbb287e11 [-] Remove version 2024-03-28 23:34:05 -04:00
Azalea e537e0f115 [U] Update migration 2024-03-28 23:19:51 -04:00
Azalea 3613d7a37b [+] user/trial/get, user/vip/get, user/vip/start 2024-03-28 23:19:05 -04:00
Azalea b5e98f505f [O] Code cleanup 2024-03-28 22:45:34 -04:00
Azalea 3dc9ca6822 [+] Wacca api progress 2024-03-28 22:36:50 -04:00
Azalea e13ddeaaad [+] user/music/unlock 2024-03-28 22:07:03 -04:00
Azalea 56ce7f9696 [F] Wacca fix impl details 2024-03-28 20:17:33 -04:00
Azalea 4ebddf78ed [F] Wacca: Fix handle 2024-03-28 19:08:59 -04:00
Azalea 2682165da8 [+] Wacca: user/info/update 2024-03-28 19:05:54 -04:00
Azalea 373e7dc8ad [+] Wacca: user/status/update 2024-03-28 19:05:46 -04:00
Azalea 0551f8bff1 [+] Wacca: user/rating/update 2024-03-28 19:05:35 -04:00
Azalea b4454cc812 [+] Wacca: Fix test inconsistency, error handling 2024-03-28 19:05:19 -04:00
Azalea 40fb1c8868 [O] Wacca: Simplify data storage, re-init database 2024-03-28 19:04:16 -04:00
Azalea f97cb4a1bb [F] Fix integer list converter behavior on empty lists 2024-03-28 19:02:21 -04:00
Azalea 56d0786702 [+] Wacca more tests 2024-03-28 11:09:29 -04:00
Azalea d880ecd709 [+] Wacca user/music/update 2024-03-28 11:09:12 -04:00
Azalea 1bee9e19e6 [+] Wacca user/mission/update 2024-03-28 11:09:01 -04:00
Azalea c5879ae5a7 [+] Wacca user/sugoroku/update 2024-03-28 11:08:48 -04:00
Azalea 64f458e15a [F] Fix consecutive login 2024-03-28 11:08:33 -04:00
Azalea 2fa5d09fc9 [O] Redesign wacca score model 2024-03-28 11:08:09 -04:00
Azalea d6fc60e02b [F] Wacca user/status/getDetail 2024-03-28 07:05:32 -04:00
Azalea bb9bfd6396 [+] Wacca user/status/GetDetail 2024-03-28 05:57:07 -04:00
Azalea 0fbe139e8d [F] Fix wacca db constraints 2024-03-28 05:56:52 -04:00
Azalea 571591f021 [O] Unify item interface 2024-03-28 05:24:05 -04:00
Azalea 8a1d2383b8 [+] Wacca user/status/login tests 2024-03-28 03:37:26 -04:00
Azalea 00c5edcea7 [+] Wacca user/status/login 2024-03-28 03:37:14 -04:00
Azalea 39d62099df [F] Fix status return 2024-03-28 02:51:41 -04:00
Azalea c5d6f6f5b9 [+] Wacca user/status/create 2024-03-28 02:50:44 -04:00
Azalea 13f3cf1e90 [+] Test constants 2024-03-28 02:10:39 -04:00
Azalea 93f6bf8ba3 [+] Wacca user/status/get 2024-03-28 02:10:25 -04:00
Azalea 1cdbed51cd [F] Fix long casting 2024-03-28 01:56:23 -04:00
Azalea 50ae04bb4e [+] Wacca test (incomplete) 2024-03-28 01:22:16 -04:00
Azalea a55d503faa [F] Fix allnet compression 2024-03-28 01:14:29 -04:00
Azalea 7fc4f83eb5 [F] Fix test build 2024-03-28 01:05:13 -04:00
Azalea bc831b4d30 [F] Fix filter 2024-03-28 01:00:59 -04:00
Azalea c6190146aa [F] Fix zlib compression happening after response commit 2024-03-28 00:58:55 -04:00
Azalea 3f01152a4a [+] More extensions 2024-03-27 23:11:05 -04:00
Azalea ad5c652a8f [+] Return wacca url for AllNet 2024-03-27 23:10:52 -04:00
Azalea 9609db941b [+] Wacca server handler (incomplete) 2024-03-27 23:10:41 -04:00
Azalea bbb8447f5c [+] Wacca constants & repos 2024-03-27 23:09:13 -04:00
Azalea 22ca06af3e [+] Wacca request model 2024-03-27 23:08:58 -04:00
Azalea af11758190 [+] Exclude wacca in compression filter 2024-03-27 23:08:22 -04:00
Azalea 32fcc25ea4 [F] mai2 error response 2024-03-27 23:07:27 -04:00
Azalea b3fcf8dd5e [F] Fix mai2 error response 2024-03-27 23:05:46 -04:00
Azalea b7d2a97f05 [O] Separate register function 2024-03-27 22:42:05 -04:00
Azalea ad13875137 [O] Separate common functions for tests 2024-03-27 22:39:27 -04:00
Azalea e14a131480 [F] Fix wacca db migration for MariaDB 11.3.2 2024-03-27 04:48:04 -04:00
Azalea 64ba0db228 [F] Fix memory leak 2024-03-27 00:52:21 -04:00
Azalea c99d8e7e75 [O] More cleanup, return 400 for bad requests 2024-03-26 23:03:40 -04:00
Azalea 305d1cea94 [O] Disable integration tests on build 2024-03-26 22:31:49 -04:00
Azalea f314b3982e [F] Fix mai event id 2024-03-26 22:27:12 -04:00
Azalea 5ea2615b93 [O] Collapse basic handlers 2024-03-26 22:26:29 -04:00
Azalea 17123fec35 [F] Remove redundant fields in GetUserMap, LoginBonus, UserExtend, UserData 2024-03-26 20:52:40 -04:00
Azalea 73d05e7cbf [F] Fix bearer discrepency 2024-03-26 20:51:10 -04:00
Azalea 3380ea3609 [F] Fix mai2 username encoding check 2024-03-26 20:50:57 -04:00
Azalea 101527d3e1 [U] Update testing properties 2024-03-26 20:50:30 -04:00
Azalea df9ab3250c [+] Maimai2 play simulation testing 2024-03-26 20:49:40 -04:00
Azalea d533df52de [F] Fix maimai2 user item 2024-03-26 20:22:38 -04:00
Azalea d2cf16d046 [F] Fix username decoding 2024-03-26 18:51:17 -04:00
Azalea 40a65b5e13 [+] gzip & deflate 2024-03-26 18:09:27 -04:00
Azalea fa33cb680e [PR] #23 from Teud/v1-dev
Add maimai 1.40 H061 events
2024-03-25 22:50:48 -04:00
Teud 2757eb91ce fix 2024-03-25 23:12:00 +01:00
Teud 2842429ced Add maimai 1.40 H061 events 2024-03-25 23:04:16 +01:00
Azalea fb2a26c5b7 [F] Fix dependencies 2024-03-25 14:21:14 -04:00
Azalea cab1dc8838 [O] Set all items to valid 2024-03-25 14:18:04 -04:00
Azalea 0ec76dcde3 [F] JsonIgnore ID 2024-03-25 14:15:49 -04:00
Azalea c41046953e [F] Fix user item isValid field 2024-03-25 14:15:03 -04:00
Azalea 30f740a430 [-] Remove old code 2024-03-25 13:56:49 -04:00
Azalea 1e8c0ce99b [O] Optimize mai2 GetUserMusic 2024-03-25 13:56:30 -04:00
Azalea aa3a3d9181 [F] Fix chusan playlog integer overflow 2024-03-25 13:40:41 -04:00
Azalea 6d0f528201 [F] Fix ongeki upsert all: UserData might be empty list 2024-03-25 13:39:00 -04:00
Azalea 131cd5915c [F] Fix chusan user cmission saving bug 2024-03-25 13:29:49 -04:00
Azalea f5512fa162 [F] Fix db: Make user_id non-null 2024-03-25 03:07:28 -04:00
Azalea 484bb758ae [+] Wacca database models 2024-03-25 03:06:28 -04:00
Azalea 89461893a4 [+] Allow ftk as an auth token 2024-03-23 12:22:32 -04:00
Azalea 54e865feb2 [O] Optimize GetUserItemApi loading speed 2024-03-23 07:19:58 -04:00
Azalea 015fa3dc9f [F] Fix maimai2 events 2024-03-23 07:01:00 -04:00
Azalea cf015be49f [F] Fix maimai get rating crash for some users 2024-03-23 05:53:56 -04:00
Azalea b6c8993f7e [F] Fix total achievement overflowing int32 max 2024-03-23 02:24:10 -04:00
Azalea 1ef37d91e8 Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-03-22 16:59:47 -04:00
Azalea 7fc81cf363 [+] Add chusan 220 events 2024-03-22 16:59:42 -04:00
Azalea 123bf9de34 [U] Update README.md 2024-03-22 13:11:06 -07:00
Azalea d3f6b75d34 [F] Fix reflection 2024-03-22 15:17:27 -04:00
Azalea a5fe5f53e2 [+] chusan: Luminous 2024-03-22 15:09:29 -04:00
Azalea e91029f66e [F] Fix merge conflicts 2024-03-22 15:06:31 -04:00
Azalea 2a7ce54c28 Merge dev.s-ul.net:rinsama/aqua into v1-dev 2024-03-22 14:58:41 -04:00
HoshimiRIN f3b2d4dc57 [chusan]fix build issue 2024-03-22 14:51:52 +08:00
HoshimiRIN 95b9871f7f [chusan]add support for luminous 2024-03-22 14:29:43 +08:00
Azalea 533af83749 [O] Don't jsonignore id 2024-03-21 22:28:42 -04:00
Azalea e4330fee92 [F] Fix artemis conversion 2024-03-21 04:09:48 -04:00
Azalea 5fec57e8e3 [+] Add artemis import endpoint 2024-03-21 04:04:23 -04:00
Azalea 95a06d572b [F] Fix mai2 import 2024-03-21 03:59:35 -04:00
Azalea cc8c125934 [F] Fix deleting data on import 2024-03-21 01:07:25 -04:00
Azalea 91c605ee4b [F] Fix unique constraints on user detail 2024-03-21 01:00:52 -04:00
Azalea f44fe4def1 [+] Mai2 Import feature done! 2024-03-21 00:36:23 -04:00
Azalea 7c0a1ea089 [F] Fix mai2 entity nullability 2024-03-21 00:36:00 -04:00
Azalea ce5c4d1111 [F] Fix userid nullability 2024-03-21 00:35:57 -04:00
Azalea 98952972a0 [+] Add cascade relationship to user-mapped fks 2024-03-21 00:05:58 -04:00
Azalea f728b6ab1b [O] Check username 2024-03-20 22:43:03 -04:00
Azalea e799b48877 [O] Huge refactor 2024-03-20 21:27:29 -04:00
Azalea fc8ecb7470 [+] More work on import feature (TODO) 2024-03-20 18:52:11 -04:00
Azalea ac18234e29 [+] Spring devtools dependency 2024-03-20 17:57:34 -04:00
Azalea 59b17aa47e [+] Check sqlite before application start 2024-03-20 17:54:16 -04:00
Azalea 9155bfb886 [+] SDGS support 2024-03-20 13:01:57 -04:00
Azalea cbe683d25e [F] Fix matching server 2024-03-20 12:57:01 -04:00
Azalea 64f057a415 [F] Fix build 2024-03-20 12:46:08 -04:00
Azalea 3da308346e [O] Unify even more BaseHandlers 2024-03-20 12:45:46 -04:00
Azalea 313dd681de [+] Import (TODO) 2024-03-20 12:33:33 -04:00
Azalea aaf7e1e3e5 [+] Chusan export version support 2024-03-20 12:32:34 -04:00
Azalea 9f831fd8b5 [O] Refactor chusan controller 2024-03-20 12:32:14 -04:00
Azalea 450397481e [M] Unify BaseHandler 2024-03-20 12:24:31 -04:00
Azalea 6fb8978f48 [+] Chusan playlog sunplus fields 2024-03-20 05:13:47 -04:00
Azalea 4a7bf4b31e [+] Chusan artemis import 2024-03-20 05:09:42 -04:00
Azalea 38e94210e4 [+] Jackson datetime parsing 2024-03-20 05:08:57 -04:00
Azalea d338809750 [M] Generalize artemis import code 2024-03-20 04:17:35 -04:00
Azalea 7fd7e17d1d [+] mai2 artemis import script 2024-03-20 02:00:28 -04:00
Azalea a5a5bd80c4 [+] Helper to read sql file 2024-03-20 01:59:21 -04:00
Azalea d264ca1ed4 [+] Custom json deserializers 2024-03-20 01:59:08 -04:00
Azalea 85dd19509c [M] Move class 2024-03-19 21:04:07 -04:00
Azalea faf1945933 [M] Move packages 2024-03-19 21:02:24 -04:00
Azalea 3c6d6ff702 [-] Ignore log files 2024-03-19 20:52:20 -04:00
Azalea c6ecc89ad3 [+] user-detail endpoint 2024-03-19 20:52:04 -04:00
Azalea abed79441d [U] Upgrade to kotlin 2.0.0-Beta4 2024-03-19 20:22:28 -04:00
Azalea 906199a517 [+] Change in-game settings 2024-03-19 19:58:00 -04:00
Azalea 6f34c21d94 [O] Optimize startup speed 2024-03-18 18:56:44 -04:00
Azalea 9ba1a68b51 [F] Fix setting api 2024-03-18 18:56:16 -04:00
Azalea 073c72fd63 [F] Fix error response 2024-03-18 09:34:37 -04:00
Azalea 3ac4af1558 [F] Fix typo 2024-03-18 09:33:33 -04:00
Azalea 5057f6848f [+] Settings api 2024-03-18 09:32:14 -04:00
Azalea b3955731c2 [+] Maimai item unlock 2024-03-18 05:31:55 -04:00
Azalea af83cf552e [S] Coming soon message 2024-03-18 04:03:26 -04:00
Azalea a0426044e8 [+] i18n for home page 2024-03-18 03:57:58 -04:00
Azalea 432635d567 [F] Fix entrypoint 2024-03-18 03:06:27 -04:00
Azalea 02b78320ec [+] Better logging 2024-03-18 03:06:05 -04:00
Azalea f1461f905d [+] i18n for status messages 2024-03-18 01:55:22 -04:00
Azalea e1cdb3ab65 [F] More detailed error handling 2024-03-18 01:37:57 -04:00
Azalea 6218424be3 [O] Better error handling 2024-03-18 01:32:57 -04:00
Azalea 5a9b7e296f [O] Reduce loc 2024-03-18 01:32:38 -04:00
Azalea f4cc9c7734 [F] Fix maimai music unlock 2024-03-18 01:32:00 -04:00
Azalea e0c7998448 [+] DB cleanup 2024-03-18 01:31:39 -04:00
Azalea 752d65557f [+] Unlock option database model 2024-03-18 01:31:28 -04:00
Azalea a952674df7 [+] Maimai music unlock 2024-03-17 02:03:58 -04:00
Azalea 25f5f6e1f7 [+] Maimai export 2024-03-17 00:12:02 -04:00
Azalea 0f1d6c0984 [O] Remove unnecessarily long constructors 2024-03-16 22:50:08 -04:00
Azalea 8dd4bb9d61 [M] Rename 2024-03-16 22:14:18 -04:00
Azalea 98275ade59 [O] Refactor chusan repos 2024-03-16 22:09:21 -04:00
Azalea 95cc9f0e21 [M] Rename 2024-03-16 21:41:17 -04:00
Azalea 742ea50c2c [O] More simplification 2024-03-16 21:35:17 -04:00
Azalea 54b1174e1b [O] Refactor maimai2 repositories 2024-03-16 19:50:05 -04:00
Azalea e07de72fa4 [O] Generalize ranking and find by card 2024-03-16 19:22:08 -04:00
Azalea 13b4af3734 [M] Move files 2024-03-16 19:10:22 -04:00
Azalea 29566a6c93 [O] Make unclickable when no data is available 2024-03-15 01:33:07 -04:00
Azalea 7669f7d9a0 [O] Refactor 2024-03-15 01:26:52 -04:00
Azalea 5913d5b585 [F] Fix script 2024-03-15 01:13:18 -04:00
Azalea d9a332de44 [+] Display rating details 2024-03-15 01:10:15 -04:00
Azalea e85533686e [F] Fix detailed ranks 2024-03-15 00:37:30 -04:00
Azalea 0100140dc0 Revert "[+] Detailed ranks"
This reverts commit a9893379f4.
2024-03-14 23:21:30 -04:00
Azalea 8def9e8931 [F] Fix link 2024-03-14 22:59:26 -04:00
Azalea 6fc2f26983 [O] Optimize fonts 2024-03-14 22:55:11 -04:00
Azalea ed1ed6cbe9 [+] Leaderboard i18n 2024-03-14 22:41:23 -04:00
Azalea 10d19a5392 [+] Switching games in leaderboard 2024-03-14 22:35:36 -04:00
Azalea 7bbd90ab91 [+] Emphasize registered users 2024-03-14 22:23:48 -04:00
Azalea 9565d48b04 [F] Fix "no-data" 2024-03-14 22:15:19 -04:00
Azalea 284d366b44 [+] Ranking for different games 2024-03-14 22:15:10 -04:00
Azalea a9893379f4 [+] Detailed ranks 2024-03-14 22:11:04 -04:00
Azalea 50677ad81d [F] Fix no data when a user hasn't played maimai 2024-03-14 21:47:39 -04:00
Azalea 71d7fcbe65 [+] Get user games endpoint 2024-03-14 21:47:14 -04:00
Azalea 8342acbd49 [F] Fix heatmap displaying even when plays is 0 2024-03-06 17:04:51 -05:00
Azalea d5296763ad [O] Do not overwrite println in gendocs 2024-03-06 10:49:02 -05:00
Azalea 73efa4fe91 [U] Update docs 2024-03-06 10:46:11 -05:00
Azalea 82f573e1a1 [O] More information to frontier endpoint 2024-03-06 10:42:31 -05:00
Azalea 4ef0ac3fee [F] Fix typo 2024-03-06 10:37:06 -05:00
Azalea bc246f39d2 [+] Frontier endpoint 2024-03-06 10:34:12 -05:00
Azalea f9af23dbca [+] More i18n 2024-03-06 10:33:31 -05:00
Azalea 68f8ef0b24 [O] More i18n 2024-03-06 10:17:04 -05:00
Azalea 16f6acf8fc [+] More i18n 2024-03-06 10:13:08 -05:00
Azalea 3faa5b2f52 [F] Fix typo 2024-03-06 09:57:05 -05:00
Azalea 04a7c068f4 [M] Fix typos 2024-03-06 09:52:37 -05:00
Azalea 92dee27634 [F] Fix i18n typing 2024-03-06 09:51:03 -05:00
Azalea 7dda25f96b Merge pull request #22 from chiba233/v1-dev
[U] update i18n.ts type and more intuitive
2024-03-06 09:32:49 -05:00
chiba 40f700910a Update UseHome.svelte I18n support 2024-03-06 21:18:27 +08:00
chiba aa90b34511 [F] FIX i18n.ts type 2024-03-06 17:19:51 +08:00
chiba 45cf082bb9 [F] FIX i18n.ts type 2024-03-06 16:23:45 +08:00
chiba 0ab78983d4 [U] update i18n.ts type and more intuitive 2024-03-06 16:17:06 +08:00
Azalea e137210cbc [S] Better title 2024-03-06 01:33:47 -05:00
Azalea 3093755c9e [S] Better heading style 2024-03-06 01:31:16 -05:00
Azalea 94c4950d23 [O] i18n placeholders 2024-03-06 01:25:08 -05:00
Azalea fa0a624b7c [O] Infer language 2024-03-06 01:21:11 -05:00
Azalea f3fabe1708 [+] i18n 2024-03-06 01:20:28 -05:00
Azalea 52ec890e2c [+] Show aqua net pfp instead of in-game pfp 2024-03-06 00:37:35 -05:00
Azalea 2a10471e0b [O] Don't expose all fields 2024-03-06 00:35:44 -05:00
Azalea 94c1974d2f [O] Just pass through aquanetuser instead. 2024-03-06 00:26:34 -05:00
Azalea f0a8014efb [+] Add profile picture in game summary 2024-03-06 00:25:02 -05:00
Azalea 96cac6ca68 [O] Optimize imports 2024-03-06 00:21:27 -05:00
Azalea 0da50bc693 [F] Fix profile path 2024-03-06 00:20:04 -05:00
Azalea 1169ac44b4 [-] Remove path concat 2024-03-06 00:18:28 -05:00
Azalea 38367279ff [F] Fix upload paths 2024-03-06 00:16:53 -05:00
Azalea ef00cfbddd [+] Serve uploads directory 2024-03-06 00:07:57 -05:00
Azalea e514e4b64e [+] Wrapper for pfp path 2024-03-05 23:35:49 -05:00
Azalea f1af07e921 [+] UI for uploading profile picture 2024-03-05 23:27:08 -05:00
Azalea 44cf022e70 [F] Fix profile file name extension 2024-03-05 23:26:11 -05:00
Azalea 7e68de5a17 [F] Fix profile picture upload api 2024-03-05 23:24:41 -05:00
Azalea 51f73d77bf [F] Fix felica lookup v2 2024-03-05 22:34:53 -05:00
Azalea fa4ccf07b8 [+] Implement user settings 2024-03-05 22:18:38 -05:00
Azalea 49da7aafd0 [O] Show edit profile button only if it's me 2024-03-05 19:36:23 -05:00
Azalea 58ca71baaa [+] Tooltip 2024-03-05 19:32:36 -05:00
Azalea 2c550a0874 [S] Unify border radius 2024-03-05 19:19:05 -05:00
Azalea dcb671acd8 [+] Profile setting button in home 2024-03-05 19:09:43 -05:00
Azalea 56600d3f27 [O] Change default hosts 2024-03-05 18:22:20 -05:00
Azalea 6913f7bdf5 [F] Fix types
#21
2024-03-05 18:21:32 -05:00
Azalea bcc2d286ed [+] Display profile picture
#21
2024-03-05 18:21:05 -05:00
Azalea aed6c2123f [F] Fix type nullability 2024-03-05 18:20:03 -05:00
Azalea 68626fecd7 [+] Add profile picture field to aqua net user 2024-03-05 17:59:44 -05:00
Azalea 441d7376cb [+] Upload pfp endpoint 2024-03-05 17:56:33 -05:00
Azalea c9ac38de01 [+] Optimize upload photo 2024-03-05 17:56:16 -05:00
Azalea b9c063c41e [O] Reject unauthenticated aimedb requests 2024-03-05 14:47:02 -05:00
Azalea 55804be70e [F] Fix code suggestions
Closes #20
2024-03-05 14:25:11 -05:00
Azalea 2b749af917 [+] Filter dates on frontend 2024-03-05 03:44:16 -05:00
Azalea 9378dfdd04 [F] Fix graph logic 2024-03-05 03:41:23 -05:00
Azalea 46768c77b7 [S] Hide heatmap scrollbar and automatically scroll to right 2024-03-05 03:32:55 -05:00
Azalea ff9358b986 [F] Fix index out of bounds 2024-03-05 03:22:53 -05:00
Azalea f3090870be [O] Don't filter on backend 2024-03-05 03:22:07 -05:00
Azalea 666fbe8ce7 [+] Display no data 2024-03-05 03:21:49 -05:00
Azalea 67b29851ea [F] Fix utage song info 2024-03-05 02:53:04 -05:00
Azalea 1a2cd201a7 Merge pull request #18 from chiba233/v1-dev
improve UserHome.svelte song level and music name
2024-03-05 02:51:40 -05:00
Azalea 5041bf67a5 Merge branch 'v1-dev' into v1-dev 2024-03-05 02:51:33 -05:00
Azalea 1a2f3bf80e [F] Fix user page css text overflow 2024-03-05 02:50:00 -05:00
chiba d7a231eb18 improve UserHome.svelte song level and music name 2024-03-05 15:41:01 +08:00
Azalea 21c9c190aa Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-03-04 21:18:26 -05:00
Azalea a781c2d665 [-] Delete unused files 2024-03-04 21:18:17 -05:00
Azalea 09c3ce3164 [PR] #17 from chiba233/v1-dev
improve LinkCard.svelte more intuitive
2024-03-04 21:08:16 -05:00
Azalea a7888a63fa [F] Fix typing 2024-03-04 21:05:32 -05:00
chiba 79dd56d017 improve LinkCard.svelte when click button clean input 2024-03-04 23:37:56 +08:00
chiba 882d04f50c add .editorconfig to improve multiple developers working 2024-03-04 23:30:47 +08:00
chiba a7fd414ce6 improve LinkCard.svelte more intuitive 2024-03-04 22:26:48 +08:00
Azalea eb30451cfa [O] Aimedb: ignore invalid requests 2024-03-03 18:01:27 -05:00
Azalea a48f2b1f17 [-] Remove jsonignore for playlog id 2024-03-03 17:48:13 -05:00
Azalea d3665d64a6 [+] Default game endpoint 2024-03-03 17:46:40 -05:00
Azalea a4bbc9c3c6 [+] Recent endpoint 2024-03-03 17:46:22 -05:00
Azalea b0ffda42bc [+] User profile game switching 2024-03-03 17:10:13 -05:00
Azalea b333045d41 [F] Fix out of bounds 2024-03-03 17:09:55 -05:00
Azalea ef5d0a81eb [O] Display relative time in rating chart 2024-03-03 15:31:59 -05:00
Azalea 48819c10a9 [O] Better trend graph 2024-03-03 14:53:18 -05:00
Azalea 9ae23e4395 [F] Fix import 2024-03-03 14:46:55 -05:00
Azalea 4d36efebb7 [U] Update app version 2024-03-03 14:45:24 -05:00
Azalea e842a37654 [+] Display splash and app version in frontend 2024-03-03 14:45:15 -05:00
Azalea c821626dc1 [+] Remake self test 2024-03-03 14:32:21 -05:00
Azalea 16aba9ff96 [O] Render gradient splash text using HyLogger 2024-03-03 14:26:27 -05:00
Azalea a11bfdb13b [F] Reset turnstile after login error 2024-03-03 12:30:52 -05:00
Azalea c0437e55eb [F] Fix token invalidation 2024-03-03 12:24:20 -05:00
Azalea 279bcbfeab [+] More instructions 2024-03-03 02:00:32 -05:00
Azalea 6555263496 [F] Fix discord page link 2024-03-03 01:05:23 -05:00
Azalea 8db4e17a8a [F] Fix login redirect logic 2024-03-03 01:00:36 -05:00
Azalea 4a5bd3135f [O] More logging 2024-03-03 00:47:57 -05:00
Azalea 32eb98361a [+] Redirect option 2024-03-03 00:29:48 -05:00
Azalea 2ba5073d55 [M] Rename project & prepare for 1.0.0 2024-03-03 00:00:33 -05:00
Azalea 9ea5e2cd90 [-] Disable plain jar 2024-03-02 23:59:03 -05:00
Azalea 284a1f0b57 [S] Better hover transition 2024-03-02 23:32:32 -05:00
Azalea 7b97f3d535 [S] Blur for loading 2024-03-02 23:19:25 -05:00
Azalea fb431fcc7b [+] Add discord link in setup instructions 2024-03-02 23:15:28 -05:00
Azalea b16100e627 [S] Minor text inconsistency 2024-03-02 23:08:50 -05:00
Azalea fde6b5df9b [S] Minor adjustments 2024-03-02 23:07:01 -05:00
Azalea dc1ac106c0 [-] Remove unused code 2024-03-02 23:04:29 -05:00
Azalea 0d4a26c05e [+] Action card 2024-03-02 23:03:55 -05:00
Azalea ffe7a9294b [+] Home action cards 2024-03-02 23:03:46 -05:00
Azalea 15004b6ba2 [S] Better home page tab styling 2024-03-02 20:22:11 -05:00
Azalea dfd8d1b0c9 [-] Remove the unnecessary clz shorthand 2024-03-02 19:55:52 -05:00
Azalea c2fef3fa25 [+] Home page tabs 2024-03-02 19:48:29 -05:00
Azalea d33c892303 [+] Better fading 2024-03-02 19:47:45 -05:00
Azalea e4ce97cf5d [+] Add UI constants 2024-03-02 19:45:08 -05:00
Azalea f331916bd5 [O] Use better error and loading 2024-03-02 19:32:16 -05:00
Azalea 5d3194dd41 [O] Better loading and error display 2024-03-02 19:29:35 -05:00
Azalea f2574b516e [F] Fix: Automatically redirect users if not logged in 2024-03-02 19:27:13 -05:00
Azalea 9ee3e973c1 [+] Add discord invite url 2024-03-02 19:26:55 -05:00
Azalea eb9e797017 Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-03-02 11:53:21 -05:00
Azalea d0c305b3eb [+] Playlog api 2024-03-02 11:53:19 -05:00
Galexion db2a7208da AquaNet: got typescript to stop yelling at me, it was driving me up a wall 2024-03-01 23:16:14 -05:00
Galexion e8958f5e53 AquaNet: Added Loading Circle 2024-03-01 01:37:59 -05:00
Azalea 8acee1251f [+] Return card id in ranking 2024-03-01 00:45:57 -05:00
Azalea acf117e43b [O] Use user{id} instead 2024-03-01 00:42:39 -05:00
Azalea ed1b7f477b [F] Not extId 2024-03-01 00:40:57 -05:00
Azalea 63cf1f5fa1 [+] Allow querying card user ids 2024-03-01 00:38:33 -05:00
Azalea fa9b738cba Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-03-01 00:30:38 -05:00
Azalea 3efbefe4c5 [+] Limit user creation 2024-03-01 00:30:37 -05:00
Galexion dcb797db38 AquaNet: Make Registered users on Ranking Page link back to their user profile 2024-03-01 00:16:58 -05:00
Azalea 8f9f9e9e82 [F] Fix code overflow on mobile 2024-02-29 23:59:49 -05:00
Azalea 642754a46b Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-02-29 23:57:52 -05:00
Galexion a5578335d3 AquaNet: Append to make Error Message h2 not use margin-top 2024-02-29 22:50:58 -05:00
Galexion c4309aa14c AquaNet: Added an Error Message trigger to pages that didn't telegraph to the user that there was an error before. 2024-02-29 22:48:41 -05:00
Azalea af3eb10034 [+] Cache ranking 2024-02-29 19:31:38 -05:00
Azalea 88b7804123 [O] Simplify userlogin 2024-02-29 18:31:05 -05:00
Azalea 4a383521d7 [+] Properly update last access time for card 2024-02-29 18:30:20 -05:00
Azalea 279b65cfa0 [+] Return username in ranking 2024-02-29 18:29:37 -05:00
Azalea 6ce644ea18 [F] Fix NPE when no play data is found 2024-02-29 16:57:23 -05:00
Azalea 9ef5e8d037 [F] Fix user id being null 2024-02-29 16:53:02 -05:00
Azalea a9e14a93dd [F] Fix mai2 playlog by introducing a backlog 2024-02-29 16:24:56 -05:00
Azalea 8e2c0d8653 [F] Fix transition 2024-02-29 11:21:29 -05:00
Azalea 39a19fd9e6 [F] Fix accuracy calculation 2024-02-29 11:14:13 -05:00
Azalea 68e1a0489f [S] Style ranking 2024-02-29 11:07:44 -05:00
Azalea ece64c3f4a [F] Fix ranking typing 2024-02-29 10:42:22 -05:00
Azalea 37f67469a6 [F] Fix keychip flow
q
2024-02-29 10:38:12 -05:00
Azalea a1b546152b [-] Remove unnecessary tests 2024-02-29 10:30:48 -05:00
Azalea 3ae1f6c556 Merge branch 'v1-dev' of https://github.com/hykilpikonna/AquaDX into v1-dev 2024-02-29 10:30:00 -05:00
Azalea 14757e2a35 [F] Fix gradle build 2024-02-29 10:29:55 -05:00
Galexion d20a762dd8 AquaNet Ranking Page: Dived and classed instead 2024-02-29 01:05:07 -05:00
Galexion 5ff79f5ee1 Leaderboard Rough Draft 2024-02-29 00:59:05 -05:00
Azalea afe28733db [+] Setup instructions: Segatools configruation 2024-02-29 00:50:29 -05:00
Azalea 5e5fe6013d [+] Install shiki dependnecy 2024-02-29 00:49:53 -05:00
Azalea 3f0196c8f8 [+] Keychip sdk 2024-02-29 00:49:24 -05:00
Azalea 4e38cf9d40 [+] Keychip endpoint 2024-02-29 00:48:55 -05:00
Azalea 6026f6aebd [+] Export aqua connection host 2024-02-29 00:25:57 -05:00
Azalea 856bcf1647 [+] Aqua connection host in config 2024-02-29 00:25:06 -05:00
Azalea 8e7196181c [F] Fix accuracy 2024-02-29 00:08:48 -05:00
Azalea beb6697507 [F] Fix all perfect count 2024-02-28 23:37:27 -05:00
Azalea fd482d32a7 [+] Ranking endpoint 2024-02-28 22:09:53 -05:00
Azalea 10169b03ce [+] API Doc generator 2024-02-28 20:52:23 -05:00
Azalea 5f4a7cd7c9 [+] API documentation 2024-02-28 20:45:38 -05:00
Azalea 59b52b8a47 [F] Fix delete transaction 2024-02-28 20:08:45 -05:00
Azalea 02bffab38f [F] Fix #16 2024-02-28 20:07:31 -05:00
Azalea 256f08396f [+] Setup instrcutions page 2024-02-28 17:55:52 -05:00
Azalea 988a280111 [S] Blockquote styling 2024-02-28 17:55:44 -05:00
Azalea 7a44a457d5 [F] Fix another DIVA endpoint 2024-02-28 17:21:08 -05:00
Azalea 2fa153e569 [F] Fix diva request mapping 2024-02-27 23:47:05 -05:00
Azalea b589c78cfc [+] More logging for Diva compression 2024-02-27 23:16:45 -05:00
Azalea 293acbcc03 [O] Hide unnecessarily long EOF error for Diva compression 2024-02-27 22:55:43 -05:00
Azalea be0a841926 [F] Fix downloadOrder typo 2024-02-27 22:52:31 -05:00
Azalea 763cbfa656 [F] Fix full combo count 2024-02-27 22:46:49 -05:00
Azalea d149b02c06 Merge pull request #14 from Sensokaku/patch-1
Fix playtime
2024-02-27 19:38:21 -05:00
Sensokaku b83773dfa6 Fix playtime
Playtime wasn't being showing up correctly till I removed one of the 60's
2024-02-28 05:36:39 +08:00
Azalea c992701387 [S] Fix level color 2024-02-27 13:34:06 -05:00
Azalea bf43944c27 [S] Fix level color 2024-02-27 13:33:41 -05:00
Azalea 6dbed875e1 [F] Fix interface treated as repository 2024-02-27 13:21:16 -05:00
Azalea 5166387f34 [O] Generalize card migration 2024-02-27 13:17:27 -05:00
Azalea b44121597f [F] Fix apis 2024-02-26 23:19:10 -05:00
Azalea f086b8abe9 [+] Image on error 2024-02-26 23:18:03 -05:00
Azalea 795da9557b [O] Better url scheme 2024-02-26 20:17:39 -05:00
Azalea 76249cb8f7 [+] Chunithm adaptation 2024-02-26 20:17:30 -05:00
Azalea f4c4162e4b [+] Add game api in sdk 2024-02-26 20:17:06 -05:00
Azalea 902cc9009e [M] Move scoring to separate file 2024-02-26 20:16:49 -05:00
Azalea d93c2ee267 [+] More types 2024-02-26 20:16:31 -05:00
Azalea e5b864f07e [+] No profile profile image 2024-02-26 20:16:17 -05:00
Azalea 8df4cd3dd6 [+] No cover cover image 2024-02-26 20:16:10 -05:00
Azalea 2fdb6f15cb Merge branch 'master' into v1-dev 2024-02-26 17:06:35 -05:00
Azalea c7e493d7f5 [F] Fix null 2024-02-26 17:05:32 -05:00
Azalea 043537a7b4 [F] Fix null 2024-02-26 16:38:54 -05:00
Azalea e7643f3894 [F] Fix beans 2024-02-26 15:14:11 -05:00
Azalea bb2c8ae8e5 [+] Ongeki adaptor 2024-02-26 15:08:45 -05:00
Azalea 1c8860c596 [F] fix shown ranks 2024-02-26 15:08:22 -05:00
Azalea 66e65fcd14 [+] chu3 rating composition 2024-02-26 12:09:17 -05:00
Azalea 7cef8f24db [-] Remove mysql 2024-02-26 11:59:53 -05:00
Azalea a82f3a7b07 [U] Add maimai 140 fields 2024-02-26 11:59:30 -05:00
Azalea 4f41068c99 Merge branch 'master' into v1-dev 2024-02-26 11:58:49 -05:00
Azalea 50dfb95c48 [+] Chusan user summary 2024-02-26 11:55:43 -05:00
Azalea 0b29ac00a7 [+] Generalize game trend & summary apis 2024-02-26 11:54:31 -05:00
Azalea 759519d374 [PR] #13 from Becods: Extra fields from bud
[+] Extra fields from bud
2024-02-26 10:40:14 -05:00
Becod 3d713b13da [+] Extra fields from bud 2024-02-26 21:42:00 +08:00
Azalea fcbe52539a [F] Fix extra slash in url 2024-02-26 00:42:29 -05:00
Azalea bcd64286cd [U] Update migration 2024-02-26 00:38:14 -05:00
Azalea b89147120c [+] Find session when validating request 2024-02-26 00:32:38 -05:00
Azalea c9ffd3cd11 [F] Fix overlapping filter 2024-02-26 00:29:15 -05:00
Azalea cd62f31c17 [+] Add authentication token at poweron 2024-02-26 00:29:00 -05:00
Azalea 98d63b880b [U] Update default config 2024-02-26 00:28:30 -05:00
Azalea 04e11b0fea [+] Keychip session 2024-02-26 00:23:51 -05:00
Azalea a873b28d9b [O] Reject unauthenticated requests 2024-02-25 23:21:34 -05:00
Azalea b1b2ff6b8c [+] Securing allnet requests 2024-02-25 23:09:56 -05:00
Azalea cb96b5fa8f [M] Move game URLs 2024-02-25 21:42:58 -05:00
Azalea eb960209bf [+] Rewrite billing 2024-02-25 21:11:52 -05:00
Azalea 51a0e46f8c [+] Rewrite allnet 2024-02-25 20:23:06 -05:00
Azalea 1251205fdd [+] Map extensions 2024-02-25 20:22:09 -05:00
Azalea 9a05629144 [O] Reduce duplicate code 2024-02-25 17:58:04 -05:00
Azalea e0c71006d5 [O] Remake maimai2 user summary api 2024-02-25 17:22:12 -05:00
Azalea 3d716a516a [M] Rename field 2024-02-25 17:21:50 -05:00
Azalea 096648b2d7 [O] Simplify class name for logging 2024-02-23 02:14:33 -05:00
Azalea 02e57707de Merge branch 'master' into v1-dev 2024-02-23 00:12:08 -05:00
Azalea 20468e612d Merge branch 'master' of https://github.com/hykilpikonna/AquaDX 2024-02-23 00:11:05 -05:00
Azalea af3aa497d1 [O] Better understanding of the data type of different games 2024-02-22 23:51:22 -05:00
Azalea bb53d1448b [O] Better logging 2024-02-22 23:50:58 -05:00
Azalea eccdd73908 [+] Backend card linking 2024-02-22 22:45:24 -05:00
Azalea 1d4e1a8be2 [O] Better logging 2024-02-22 22:45:08 -05:00
Azalea 8dc0f299a9 [-] Remove global logger field 2024-02-22 22:38:21 -05:00
Azalea db1ffd5091 [-] Remove unnecessary beans 2024-02-22 22:37:07 -05:00
Azalea 64a27e5708 [O] Speed up bootup by making email init async 2024-02-22 22:36:48 -05:00
Azalea 214a356135 [O] Better logging 2024-02-22 22:19:21 -05:00
Azalea 84f7953f21 [F] Fix encryption 2024-02-22 22:19:12 -05:00
Azalea a9a947203d [O] Reduce code 2024-02-22 21:22:08 -05:00
Azalea 8f250e755e [O] Refactor AimeDB 2024-02-22 20:55:13 -05:00
Azalea 30a7fa7ead [O] Convert more stuff to kotlin 2024-02-22 19:47:35 -05:00
Azalea 4324d655d2 [M] Refactor relevant stuff to kotlin 2024-02-22 19:33:51 -05:00
Azalea da1be9226a [S] Bottom padding 2024-02-22 19:11:25 -05:00
Azalea 5597bf5d1e [O] Show confirm dialog when unlinking a card 2024-02-22 19:06:18 -05:00
Azalea 50029fbb24 [F] Fix TS errors 2024-02-22 19:00:14 -05:00
Azalea f5c2dc747d [+] Unlink frontend 2024-02-22 18:31:59 -05:00
Azalea dd55e336e4 [+] API for unlinking 2024-02-22 18:20:54 -05:00
Azalea a001a45cc4 [M] Rename: Bind -> Link 2024-02-22 18:19:55 -05:00
Azalea 49320ff623 [M] Move LinkCard component 2024-02-22 18:17:23 -05:00
Azalea 8e898c50b4 [O] Ghost cards should not be guessed 2024-02-22 18:14:58 -05:00
Azalea 5fa93e2a2a [F] Fix lateinit issue 2024-02-22 18:11:22 -05:00
Azalea 178cca1611 [O] Reduce bits for DIVA 2024-02-22 17:31:10 -05:00
Azalea 9e543e2c5a [+] Add isGhost to card 2024-02-22 17:29:28 -05:00
Azalea 6a16e5534d [+] Sanitize card id when creating card 2024-02-22 17:29:13 -05:00
Azalea 2d1cad870b [S] Always put ghost card at the top 2024-02-22 17:07:01 -05:00
Azalea 3fdf255ca5 [F] Use bigint 2024-02-22 17:06:50 -05:00
Azalea ec9225dbf2 [+] Iconify tools 2024-02-22 17:06:40 -05:00
Azalea b469fe92dd [+] Link card when not found 2024-02-22 16:39:00 -05:00
Azalea dbc54b016c [O] Check if already linked 2024-02-22 12:30:28 -05:00
Azalea 2cbad36f80 [+] Check card is linked 2024-02-22 12:26:27 -05:00
Azalea 8b21f33eb6 [-] Remove sensitive info 2024-02-22 10:52:09 -05:00
Azalea 1e8ff7dbc0 [+] Create new card if not exists 2024-02-22 10:51:49 -05:00
Azalea 0937915839 [+] Link card limit on the backend 2024-02-22 10:51:22 -05:00
Azalea a128546954 [+] Add field isBound to Card 2024-02-22 10:31:13 -05:00
Azalea 806953d107 [S] Unify transition style 2024-02-22 10:30:43 -05:00
Azalea afa39b29ed [+] Implement link conflict resolution 2024-02-22 10:30:28 -05:00
Azalea 4c899555dd [S] Style overlay 2024-02-22 10:00:28 -05:00
Azalea 3e8395b0c6 [+] Show card conflicts 2024-02-22 10:00:18 -05:00
Azalea a620f02d57 [-] Remove test dialect 2024-02-21 17:43:03 -05:00
Azalea 79a078fb70 [+] Automatically invalidate token on expiry 2024-02-21 17:42:42 -05:00
Azalea cac2f49b06 [+] Card summary sdk 2024-02-21 17:42:15 -05:00
Azalea 06993b9d66 [S] Style existing cards, display card type 2024-02-21 15:03:49 -05:00
Azalea fce5ca592a [S] Style existing cards 2024-02-21 14:26:12 -05:00
Azalea e7058cf3c8 [+] Show existing cards 2024-02-21 14:14:38 -05:00
Azalea a2eeac786e [+] /user/me sdk 2024-02-21 14:14:28 -05:00
Azalea ff7873313b [+] Check while typing 2024-02-21 13:59:40 -05:00
Azalea f3b06ac0a6 [+] Input validation for card SN 2024-02-21 13:47:58 -05:00
Azalea 00e57fc17d [+] Bind card element 2024-02-21 13:37:13 -05:00
Azalea c8cc59aaca [S] Adjust input visibility 2024-02-21 13:37:01 -05:00
Azalea 54057922f6 [O] Better clazz 2024-02-21 13:36:21 -05:00
Azalea c175173821 Merge pull request #12 from Zaphkito/master
Add maimai 140 h041 event data
2024-02-21 05:46:55 -05:00
zaphkito 52e9285551 Add maimai 140 h041 event data 2024-02-21 18:39:39 +08:00
Azalea 823eea1f0a [F] Fix card detection 2024-02-21 04:28:38 -05:00
Azalea ae03a700de [S} Fix mobile view 2024-02-21 01:23:44 -05:00
Azalea a089eade6e [S] Make letter spacing reponsive to font size 2024-02-21 01:15:52 -05:00
Azalea f8fb3d8a70 [+] Router logo 2024-02-21 01:15:30 -05:00
Azalea 00a75f154e [F] Fix asking for email confirmation when email feature is disabled 2024-02-21 01:14:58 -05:00
Azalea 8d2313d799 [-] Remove comments in build.gradle 2024-02-21 00:44:44 -05:00
Azalea 0b8384fc3b [+] Home page 2024-02-21 00:42:04 -05:00
Azalea 73ab9efdb4 [S] Globalize content css 2024-02-21 00:15:31 -05:00
Azalea 705f69510b [F] Fix import, clear query param 2024-02-21 00:15:17 -05:00
Azalea f7e0a33935 [+] Verify email workflow 2024-02-21 00:11:45 -05:00
Azalea 729015d719 [+] SDK confirmEmail 2024-02-21 00:11:31 -05:00
Azalea d83127a265 [+] Check email confirmation on login 2024-02-21 00:02:58 -05:00
Azalea 6e8f7ae698 [F] Fix one-to-one relationship in email confirmation 2024-02-21 00:02:04 -05:00
Azalea 17ee24286c [+] Add a verify email state, state switching animation 2024-02-20 23:19:17 -05:00
Azalea 133140bf71 [O] Rename home to welcome 2024-02-20 18:46:15 -05:00
Azalea 5fafbf9ee8 [+] Login form 2024-02-20 18:44:15 -05:00
Azalea 6085da15a4 [S] Style input 2024-02-20 18:43:56 -05:00
Azalea b93caf1839 [U] yarn upgrade 2024-02-20 18:43:42 -05:00
Azalea c9787a521b [+] SDK 2024-02-20 18:41:59 -05:00
Azalea 26cabef74c [F] Export turnstile site key 2024-02-20 18:32:42 -05:00
Azalea 8d2474768b [S] More color variables 2024-02-20 18:32:25 -05:00
Azalea a87146a401 [+] Svelte turnstile 2024-02-20 18:29:59 -05:00
Azalea bbf5ee5395 [+] Add mariadb migration 2024-02-20 17:43:35 -05:00
Azalea 103ae607be [F] Forgot to save ;-; 2024-02-20 16:26:10 -05:00
Azalea 6f63998000 [O] Ignore serial id 2024-02-20 16:19:06 -05:00
Azalea a94952babc [O] Reduce code 2024-02-20 16:18:43 -05:00
Azalea 4b8385419e [O] Limit exposure of fields 2024-02-20 16:16:11 -05:00
Azalea 878a543818 [F] Fix infinite recursion on serializing user card 2024-02-20 16:12:08 -05:00
Azalea e7337777cd [F] Set last login time in login 2024-02-20 16:11:50 -05:00
Azalea fa1ed52c32 [+] Bind card 2024-02-20 16:06:46 -05:00
Azalea eda3fccb51 [F] Fix RNG 2024-02-20 16:01:07 -05:00
Azalea ec55fae1ec [+] Settings API 2024-02-20 15:47:25 -05:00
Azalea c88a98e355 [+] Separate user validator 2024-02-20 15:47:17 -05:00
Azalea 0567e0f251 [+] Add @ API macro 2024-02-20 15:46:48 -05:00
Azalea befa7d0e8e [+] Extend jwt auth block 2024-02-20 15:45:25 -05:00
Azalea 91913da205 [+] Card summary 2024-02-20 02:01:15 -05:00
Azalea cd8677a26d [+] Try lookup id function 2024-02-19 21:49:55 -05:00
Azalea adf091e300 [O] Use randExtId 2024-02-19 21:49:09 -05:00
Azalea aa3b831a68 [O] Separate randExtId 2024-02-19 21:48:42 -05:00
Azalea ab075c0554 [F] Fix ghost card column 2024-02-19 21:46:43 -05:00
Azalea 4202012bbd [+] Confirm email 2024-02-19 21:05:24 -05:00
Azalea 739854935d [+] Create ghost card on registration 2024-02-19 21:05:17 -05:00
Azalea 3d88e734df [+] Add ghostCard for user 2024-02-19 21:04:57 -05:00
Azalea a716a69b8b [F] Fix tests 2024-02-19 21:03:38 -05:00
Azalea 7ac7aacb6c [O] Refactor code 2024-02-19 20:58:16 -05:00
Azalea 7368001e3b [+] Send confirmation email on register 2024-02-19 06:59:32 -05:00
Azalea 574e0b4074 [+] Generate email 2024-02-19 06:59:13 -05:00
Azalea 5d258eb8e1 [+] Computed name for user 2024-02-19 06:59:00 -05:00
Azalea 5715fa97f7 [+] Email confirmation table 2024-02-19 06:58:51 -05:00
Azalea 7fe869b98b [+] Email template 2024-02-19 06:58:40 -05:00
Azalea 37aaa30387 [+] Add email web host option 2024-02-19 06:58:26 -05:00
Azalea c3b2d7653f [+] Add email border 2024-02-19 06:34:59 -05:00
Azalea cb22161156 [+] Add email confirmation field 2024-02-19 05:09:36 -05:00
Azalea 6ad06c2d75 [F] Fix json parsing 2024-02-19 05:09:23 -05:00
Azalea b291dd0ad7 [-] Remove dialect 2024-02-19 04:54:44 -05:00
Azalea 3039a32f29 [F] Fix CORS 2024-02-19 04:51:01 -05:00
Azalea a8f5380070 [-] Remove unnecessary mariadb dialect 2024-02-19 04:48:14 -05:00
Azalea e37867b9db [O] Disable whitelabel error page 2024-02-19 04:43:09 -05:00
Azalea 110d6c81ee [+] Add /me endpoint 2024-02-19 04:42:50 -05:00
Azalea 3da44ce604 [-] Remove duplicate email self test 2024-02-19 04:42:11 -05:00
Azalea 9770c15188 [+] JWT.auth 2024-02-19 04:39:40 -05:00
Azalea cc568d9569 [F] Fix token too short 2024-02-19 04:39:28 -05:00
Azalea 500a4b0b7e [M] Move security config 2024-02-19 04:35:08 -05:00
Azalea 55cfb7b358 [+] Login 2024-02-19 03:21:49 -05:00
Azalea 77b2f90259 [F] Fix response syntax limitation 2024-02-19 03:16:35 -05:00
Azalea e962baaf48 [M] Move services to components package 2024-02-19 03:07:32 -05:00
Azalea 2cb5b18975 [+] JWT class 2024-02-19 03:06:42 -05:00
Azalea 32084eb1e7 [F] Fix: Email and username should ignore case 2024-02-19 03:06:30 -05:00
Azalea 2815d76b1d [+] JWT authentication settings 2024-02-19 02:40:00 -05:00
Azalea 9c4f146778 [O] More checks 2024-02-19 02:29:45 -05:00
Azalea 7b89016359 [F] Fix runtime dependency issue 2024-02-19 02:26:20 -05:00
Azalea c7a4902af0 [F] Ignore geoip not found error 2024-02-19 02:26:01 -05:00
Azalea 6f9b686317 [F] Fix error reporting 2024-02-19 02:25:50 -05:00
Azalea 16550e7a83 [O] Better error messages 2024-02-19 02:25:41 -05:00
Azalea a9aa47e390 [U] Update config 2024-02-19 01:57:56 -05:00
Azalea 0846fb94db [F] Fix null case 2024-02-19 01:57:42 -05:00
Azalea 4c3aafd266 [O] Unwrap spaghetti code 2024-02-19 01:49:29 -05:00
Azalea 1e606f8b85 [+] Add username check 2024-02-19 01:38:42 -05:00
Azalea 58596377b1 [+] Add username field 2024-02-19 01:38:30 -05:00
Azalea 94a3234874 [O] CORS allow all 2024-02-19 01:37:50 -05:00
Azalea 7e9db5b52d [+] GeoIP service 2024-02-19 01:36:53 -05:00
Azalea dc098d1ec7 [O] Make data dir if not exist 2024-02-19 01:36:39 -05:00
Azalea 195a8b4315 [+] GeoLite settings 2024-02-19 01:36:18 -05:00
Azalea 7df80bc56a [+] GeoIP library 2024-02-19 01:35:34 -05:00
Azalea 1c541a4adf [F] Fix rating calculation 2024-02-19 00:39:43 -05:00
Azalea f29f563e50 [F] Fix null pointer 2024-02-19 00:39:27 -05:00
Azalea f4280c0768 Merge pull request #11 from Zaphkito/master
Maimai 140 h031 event data and charge data
2024-02-18 15:57:25 -05:00
zaphkito 295ae14658 Add maimai2 charge 2024-02-19 04:40:48 +08:00
zaphkito ccc2bcffce Maimai 140 h031 event data 2024-02-19 04:12:53 +08:00
Azalea 3a94ef57e3 [+] Email service 2024-02-17 04:16:16 -05:00
Azalea db8d8db280 [+] Email settings 2024-02-17 04:04:39 -05:00
Azalea fdcef95d07 [+] Simple java mail 2024-02-17 04:04:14 -05:00
Azalea 7b1d9a777d [+] Email settings 2024-02-17 03:45:49 -05:00
Azalea 3cd8764dbf [+] Turnstile site key 2024-02-17 03:30:05 -05:00
Azalea 32826440cb [F] Fix spring autowire for AquaNetUser 2024-02-17 01:43:52 -05:00
Azalea a65fa8cf10 [U] Finalize mysql migration guide 2024-02-17 01:33:34 -05:00
Azalea 0ae29b1920 [+] Write mysql migration guide 2024-02-17 01:07:23 -05:00
Azalea 5748a11788 [-] Completely drop mysql support 2024-02-17 01:07:09 -05:00
Azalea 7d3579af4f [-] Drop mysql support 2024-02-17 00:37:06 -05:00
Azalea e0dc3bd1f4 [+] Validate captcha 2024-02-17 00:31:40 -05:00
Azalea 6200c56144 [+] User registration endpoint 2024-02-17 00:25:40 -05:00
Azalea 0b4a0eeb55 [+] AquaNetUser JPA entity 2024-02-17 00:25:19 -05:00
Azalea 467f5bd2eb [U] Update config 2024-02-17 00:25:04 -05:00
Azalea 322d90adfa [+] Automatic obtain request ip 2024-02-17 00:24:35 -05:00
Azalea 11eb7c058f [U] Update gitignore 2024-02-17 00:22:48 -05:00
Azalea 361b251952 [+] More extensions 2024-02-16 23:57:31 -05:00
Azalea 3d503971ae [+] Turnstile utility class 2024-02-16 23:56:12 -05:00
Azalea 9faabba361 [+] Turnstile settings 2024-02-16 23:55:44 -05:00
Azalea f33629aba1 [+] Ktor dependency 2024-02-16 23:55:30 -05:00
Azalea a47ed71799 [F] Fix typos in readme 2024-02-16 20:49:44 -08:00
Azalea 4a9b9d57e4 [O] Optimize imports 2024-02-16 17:51:36 -05:00
Azalea 98c3f0ce5b [F] Fix SNI 2024-02-16 17:45:41 -05:00
Azalea 78a3082bcb [U] Use kotlin entrypoint 2024-02-16 17:07:58 -05:00
Azalea b64af43a7e [F] Fix security config 2024-02-16 17:07:45 -05:00
Azalea 1bcacbfebe [U] Update default config 2024-02-16 17:06:53 -05:00
Azalea f32db6c83b [U] Update config 2024-02-16 17:06:39 -05:00
Azalea 437b638973 [M] javax -> jakarta 2024-02-16 17:05:43 -05:00
Azalea 670918efd3 [+] Migrate dependencies to Spring 3 2024-02-16 17:03:52 -05:00
Azalea 006a49cfdb [F] Fix dependency CVE 2024-02-16 15:54:09 -05:00
Azalea 9794ee259a [U] Upgrade gradle wrapper 2024-02-16 15:52:05 -05:00
Azalea 643e0e0c1f [O] Lint 2024-02-16 01:46:11 -05:00
Azalea 6afcb364d1 [+] Add eslint 2024-02-16 01:43:32 -05:00
Azalea 6d4a38404c [O] Sort recent by date, display level 2024-02-16 01:04:29 -05:00
Azalea b925c2ef20 [U] Update readme 2024-02-12 11:26:37 -05:00
Azalea e3f931d4f5 [PR] #10 from afonsopbarros: Update readme
Update AquaiMai README
2024-02-12 09:45:24 -05:00
Afonso 01b5d63972 Update AquaiMai README 2024-02-12 12:50:01 +01:00
Azalea 97794ce7c5 [S] Responsive chart 2024-02-12 04:49:02 -05:00
Azalea ac4c66a1f7 [S] Fix home page 2024-02-12 04:48:51 -05:00
Azalea 9750e26d4b [F] Fix height 2024-02-12 04:35:02 -05:00
Azalea 4b14412190 Merge branch 'master' of https://github.com/hykilpikonna/AquaDX 2024-02-12 04:33:39 -05:00
Azalea 207c2e10e3 [F] Fix height 2024-02-12 04:33:35 -05:00
Azalea 7c73515427 [U] Add related projects 2024-02-12 00:49:07 -08:00
Azalea aea7108940 [U] Yarn upgrade 2024-02-12 03:38:34 -05:00
Azalea 2bdd97d889 [O] Center page 2024-02-12 03:38:25 -05:00
Azalea 93b6dd3374 [S] Fix song name overflow 2024-02-12 03:20:09 -05:00
Azalea bf3c123658 [S] Mobile 2024-02-12 03:03:07 -05:00
Azalea 06c0a361fd [S] Good color 2024-02-12 03:00:24 -05:00
Azalea 92510845d6 [S] Style recent 2024-02-12 03:00:16 -05:00
Azalea 8ab57859f6 [S] mobile 2024-02-12 03:00:07 -05:00
Azalea 0608b50193 [+] Display recent scores 2024-02-12 02:59:46 -05:00
Azalea e14ff26915 [+] UI helper for class 2024-02-12 02:59:33 -05:00
Azalea 8932a16468 [O] Encapsulate all music 2024-02-12 02:59:25 -05:00
Azalea 3804db142f [S] Style UserHome 2024-02-12 02:04:25 -05:00
Azalea 7e198bd7a1 [+] Display more info on user page 2024-02-12 01:48:28 -05:00
Azalea 85301c92ec [O] Import font 2024-02-12 01:48:08 -05:00
Azalea 2ca6be77ed [+] Add summary to SDK 2024-02-12 01:23:32 -05:00
Azalea 48558bec0f [+] Even more info 2024-02-12 01:11:20 -05:00
Azalea 31af8669b5 [O] More info 2024-02-12 01:05:15 -05:00
Azalea d716ee5d26 [O] Optimize query 2024-02-12 01:02:02 -05:00
Azalea 8e1c07d530 [+] maimai user summary 2024-02-12 00:53:20 -05:00
Azalea 0d7b52aadc [+] Sinmai dev notes 2024-02-11 23:30:15 -05:00
Azalea 25eb99f014 [O] Hide chartjs lables 2024-02-11 22:53:31 -05:00
Azalea ab8276df2f [S] Style chartjs 2024-02-11 22:40:12 -05:00
Azalea 68569ad875 [O] Externalize cal heatmap 2024-02-11 22:40:04 -05:00
Azalea c0e77d9eec [O] Switch to cal-heatmap 2024-02-11 22:32:10 -05:00
Azalea 27297c5d24 [O] Write readme 2024-02-10 06:43:01 -05:00
Azalea b6a7a02b23 [+] Home view 2024-02-10 06:31:11 -05:00
Azalea 534e20a072 [+] Helper to register chartjs 2024-02-10 06:30:50 -05:00
Azalea 9478da81a9 [+] Maimai api endpoints 2024-02-10 06:30:22 -05:00
Azalea ee958f20d2 [+] Declare user preview data type 2024-02-10 06:30:15 -05:00
Azalea 00edf44828 [+] Type declaration 2024-02-10 06:27:58 -05:00
Azalea f3a49533fd [+] Add ChartJS, heatmap dependencies 2024-02-10 06:27:49 -05:00
Azalea 3b6517090c [+] Add play count to trend 2024-02-10 05:50:28 -05:00
Azalea 5b2687ae83 [+] New maimai api 2024-02-10 05:30:06 -05:00
Azalea c3402e8d44 [O] Ignore errors on EOF 2024-02-10 05:29:53 -05:00
Azalea a9625dfecd [F] Fix kotlin build 2024-02-10 05:29:31 -05:00
Azalea d6c8464e97 [+] Favicon 2024-02-10 03:52:27 -05:00
Azalea 1b557d5f8c [S] Fix page height overflow 2024-02-10 03:10:21 -05:00
Azalea e1cf944db7 [S] Fix layout 2024-02-10 03:06:18 -05:00
Azalea cb873efd38 [S] Minor style issue 2024-02-10 02:59:54 -05:00
Azalea ee5acfa35f [+] Navbar 2024-02-10 02:56:29 -05:00
Azalea 2904c55f84 [S] Optimize styling 2024-02-10 01:30:19 -05:00
Azalea 4667e9652f Merge branch 'master' of https://github.com/hykilpikonna/AquaDX 2024-02-10 01:24:05 -05:00
Azalea 905b4fe92e [S] Mobile friendly :3 2024-02-10 01:24:03 -05:00
Azalea 85ccc78f8f [S] Style home page 2024-02-10 01:20:10 -05:00
Azalea ad3bb89dc9 [+] Home site 2024-02-10 00:40:56 -05:00
Azalea 106bded9b6 [F] Fix test failure 2024-02-09 19:39:09 -08:00
Azalea Gui f46c8a03d9 [+] Character convert 2024-02-09 22:36:26 -05:00
Azalea Gui 5d9693c419 [U] Combine music jsons 2024-02-09 22:35:13 -05:00
Azalea Gui 126546a938 [O] Fix crash due to duplicate keys in maimai2_user_item 2024-02-09 22:34:16 -05:00
Azalea bb3902730b [U] Update url 2024-02-09 21:55:08 -05:00
Azalea 1b9e25e81c [U] Update url 2024-02-09 21:43:53 -05:00
Azalea b11439ca87 [U] Update url 2024-02-09 21:23:03 -05:00
Azalea 66034ea407 [O] Get userid dynamically 2024-02-09 21:05:53 -05:00
Azalea 6690c665dd [+] Actually query for data 2024-02-09 20:32:13 -05:00
Azalea 4b71cd9940 [O] Responsive 2024-02-08 03:32:33 -05:00
Azalea 8b5ef24681 [+] Show rating 2024-02-08 03:18:55 -05:00
Azalea e161890eaa Merge branch 'master' of https://github.com/hykilpikonna/AquaDX 2024-02-08 02:53:58 -05:00
Azalea 348f27237b [+] Rating screen 2024-02-08 02:53:45 -05:00
Azalea c19164269a [+] Add nginx configuration 2024-02-08 02:52:47 -05:00
Azalea 071491b459 [M] Rename 2024-02-08 02:51:31 -05:00
Azalea e1180a9a14 Merge pull request #9 from hykilpikonna/tc21/fix-crash-slot-data-not-found
Fix crash during call to CommonMonitor.SetCharacterSlot
2024-02-07 23:19:28 -05:00
Tianyi Cao f76a027b32 add a few more comments 2024-02-07 20:08:33 -08:00
Tianyi Cao cc1a91e5cd Update and restore unintentionally-changed formatting 2024-02-07 20:04:15 -08:00
Tianyi Cao fcee4d13da Fix crash during call to CommonMonitor.SetCharacterSlot 2024-02-07 20:02:39 -08:00
Azalea fa567ce0e2 Merge branch 'master' of https://github.com/hykilpikonna/AquaDX 2024-02-07 22:59:58 -05:00
Azalea Gui c10085b65a [+] Maimai data format convert 2024-02-07 22:22:58 -05:00
Azalea a8465408cf [+] AquaTop: Create project 2024-02-07 20:13:53 -05:00
Azalea d123a50054 [U] Detailed instructions
Closes #8
2024-02-07 16:39:46 -05:00
Azalea bd09e4017a [F] Fix build 2024-02-07 16:36:18 -05:00
Azalea 8b5e29d29e Update nightly.yml 2024-02-07 13:35:12 -08:00
Azalea 6e427b060a [O] Better build script 2024-02-07 16:26:59 -05:00
Azalea 7d0f70f1c0 [U] Update documentation 2024-02-07 05:42:40 -05:00
Azalea 5f1ca64d65 [O] Apply patches using reflection 2024-02-07 05:40:13 -05:00
Azalea fb58f08e44 [PR] #7 from tc21: skip-to-music
Add ability to skip a bunch of stuff directly to music selection
2024-02-07 05:26:17 -05:00
Tianyi Cao 017d00371d formatting 2024-02-07 02:22:45 -08:00
Tianyi Cao abe1d3ad29 Merge branch 'master' into tc21/skip-to-music 2024-02-07 02:20:39 -08:00
Azalea fc48ba1994 [U] Update readme 2024-02-07 05:18:47 -05:00
Tianyi Cao 279fe5dcb8 Add ability to skip a bunch of stuff directly to music selection 2024-02-07 02:17:00 -08:00
Azalea ccb3f7ef34 [+] Add cheat config 2024-02-07 05:16:07 -05:00
Azalea de12ec6548 [+] Ticket unlock patch 2024-02-07 05:15:48 -05:00
Azalea 14bd2480ce [+] Fix character selection crash 2024-02-07 05:15:18 -05:00
Azalea 8152b9ab0d [M] Migrate to tomlet 2024-02-07 04:06:58 -05:00
Azalea e6e4782d51 [O] Wording consistency 2024-02-07 03:56:07 -05:00
Azalea aa5f4fb986 [+] Add option 2024-02-07 03:53:13 -05:00
Azalea aa4fe50eeb Merge branch 'master' of https://github.com/hykilpikonna/AquaDX 2024-02-07 03:50:19 -05:00
Azalea df072f1c40 [F] Use yaml instead 2024-02-07 03:49:14 -05:00
Azalea 9b3e202eb8 [PR] Merge #6: Add single player mode
Add single player mode
2024-02-07 02:40:18 -05:00
Azalea b403189afb [+] Config 2024-02-07 02:38:36 -05:00
Tianyi Cao 82d076b87d Add single player mode, enabled by default 2024-02-06 23:38:36 -08:00
Azalea dcdf951ebc [+] Add Tomlyn dependency 2024-02-07 02:37:28 -05:00
Azalea 4c1f8e4005 [F] Fix actions 2024-02-07 02:00:14 -05:00
Azalea 672ecc7f0a [+] More libs 2024-02-07 01:59:12 -05:00
Azalea 81f05528d8 [F] Fix actions 2024-02-07 01:46:45 -05:00
Azalea 57214aadfc [F] Fix actions 2024-02-07 01:45:15 -05:00
Azalea 6209a0120b [F] Fix actions 2024-02-07 01:44:06 -05:00
Azalea 98dcb3fbcb [+] Encrypted DLL 2024-02-07 01:36:06 -05:00
Azalea 2211e1c816 Merge branch 'master' of https://github.com/hykilpikonna/AquaDX 2024-02-07 01:29:36 -05:00
Azalea 36bf37da8d [F] Fix actions 2024-02-06 22:17:54 -08:00
Azalea 21be74fb05 [M] Rename dotnet-desktop.yml to aquamai.yml 2024-02-06 22:17:21 -08:00
Azalea 870ca6cd7f Create dotnet-desktop.yml 2024-02-06 22:17:02 -08:00
Azalea 4e832a5eb2 Merge branch 'master' of https://github.com/hykilpikonna/AquaDX 2024-02-07 00:48:55 -05:00
Azalea 7b9c23c203 [O] Build nightly only when src change 2024-02-06 21:48:32 -08:00
Azalea fc91807e07 [M] Move data to docs 2024-02-07 00:47:17 -05:00
Azalea 8aab359b0b [+] AquaMai: Init project 2024-02-07 00:45:47 -05:00
Azalea Gui 363c9ff028 [+] maimai DX Tickets 2024-02-06 06:13:08 -05:00
Azalea Gui 2a800a825b [U] Update readme 2024-02-06 05:52:51 -05:00
Azalea Gui 36c1b1e0dd [U] openai migrate 2024-02-06 05:26:45 -05:00
Azalea Gui 01d7cdc7de [F] Fix conflict 2024-02-06 05:26:32 -05:00
6f25cb9017 Merge Gamer2097/AquaDX : Updated game notes and added ongeki A084 to 108
99a66858 - Update game_specific_notes.md
10bf6012 - add ongeki A084 to 108

Co-authored-by: Gamer2097 <antoniomarco200564@gmail.com>
Co-authored-by: Gamer2097 <63710393+Gamer2097@users.noreply.github.com>
2024-02-06 05:25:38 -05:00
Azalea Gui c4ff479af4 [+] Maimai 140 event data 2024-02-06 05:17:15 -05:00
Azalea Gui cc8406cd79 [+] Maimai extract script 2024-02-06 05:16:56 -05:00
Azalea Gui b94c1915a8 [+] Add kotlin 2024-02-06 05:16:41 -05:00
Gamer2097 99a6685845 Update game_specific_notes.md 2024-01-10 14:31:25 +01:00
Gamer2097 10bf60126e add ongeki A084 to 108 2024-01-08 15:24:34 +01:00
Azalea 14d8f0730f [U] Update readme 2023-12-28 14:20:01 -08:00
Azalea 618503ccf2 [O] Ignore non-existent release 2023-12-22 19:10:28 -05:00
Azalea f64a837172 [O] Optimize gh actions 2023-12-22 19:06:01 -05:00
Azalea 41d4de6150 [F] Fix github actions 2023-12-22 19:01:28 -05:00
Azalea bcf3333dd2 [F] Fix github actions 2023-12-22 15:37:55 -08:00
Azalea 47fda64c90 [U] Update chusan notes 2023-12-22 16:47:04 -05:00
Azalea 4fce05b7d1 [F] Fix github actions 2023-12-21 02:13:36 -05:00
Azalea 363bcc6060 [F] Fix github actions 2023-12-21 02:10:55 -05:00
Azalea bc734a5d25 [+] Nightly build action 2023-12-21 02:10:08 -05:00
Azalea 3f95678098 [+] Example systemd service 2023-12-21 01:52:11 -05:00
Azalea e52c971aed [+] Build action 2023-12-21 01:47:48 -05:00
Azalea 1f82067752 [F] Resolve name conflict 2023-12-21 01:39:50 -05:00
Azalea 0ac1a4c088 [-] Remove deploy script 2023-12-21 01:28:46 -05:00
Azalea Gui 0fda25b482 [+] Docker 2023-12-21 01:27:18 -05:00
Azalea dd70265cb6 [U] Update readme 2023-12-21 01:24:18 -05:00
62e7d48f3c Merge rinsama/aqua : Ensure Chusan compatibility and add support for SunPlus
7a7076b1 - [chusan]Attempting to ensure compatibility with all known versions of Chusan, both before and after SunPlus
c8e1c5fb - fix BooleanStringIntDeserializer always returns false
50ceaf60 - Add Support for sunplus

Co-authored-by: Sanheiii <35133371+Sanheiii@users.noreply.github.com>
Co-authored-by: HoshimiRIN <admin@sakuramoe.dev>
2023-12-21 01:05:06 -05:00
Azalea 4905106953 [O] Optimize merge script 2023-12-21 01:04:55 -05:00
Azalea 48edab452d [+] Merge script 2023-12-21 00:44:36 -05:00
HoshimiRIN 7a7076b174 [chusan]Attempting to ensure compatibility with all known versions of Chusan, both before and after SunPlus 2023-12-17 21:50:09 +08:00
Sanheiii c8e1c5fbb7 fix BooleanStringIntDeserializer always returns false 2023-12-16 15:39:49 +08:00
HoshimiRIN 50ceaf6097 Add Support for sunplus 2023-12-16 15:39:49 +08:00
Azalea 722d415e75 Merge pull request #4 from FeiZhaixiage/master
[API] Add a feature to get user photos.
2023-12-08 05:12:09 +09:00
肥宅虾哥 0d4221203b [API] Add a feature to retrieve user photos. 2023-12-08 02:49:19 +08:00
肥宅虾哥 4a64895e81 [api] Add maimai2 userPhoto API 2023-12-08 02:45:24 +08:00
肥宅虾哥 e271cb4555 [API] Add a feature to retrieve user photos.
Add:
Add a feature to retrieve user photos.
Fix bug:
Missing dependency: ObjectMapper
2023-12-08 02:21:49 +08:00
肥宅虾哥 0bf54e666b [API] Let web music list read from database
Add a feature to retrieve user photos.
2023-12-08 02:18:35 +08:00
肥宅虾哥 0913ef2060 [api] Add maimai2 userPhoto API 2023-12-08 02:14:20 +08:00
肥宅虾哥 7cc9fb11b6 Revert "New API to return user photos."
This reverts commit ba1f458907.
2023-12-08 02:10:49 +08:00
肥宅虾哥 9c51b1e0ee Revert "Add API - Get user photos (mai)"
This reverts commit e7848cb965.
2023-12-08 02:07:18 +08:00
肥宅虾哥 ba1f458907 New API to return user photos.
New API to return user photos.
2023-12-08 02:02:19 +08:00
肥宅虾哥 e7848cb965 Add API - Get user photos (mai)
Add:
New API to return  user photos.
Fix bug:
Missing dependency: ObjectMapper
2023-12-07 19:13:13 +08:00
Azalea 564ada10f5 Merge pull request #2 from FeiZhaixiage/patch-1 2023-12-06 03:07:40 +09:00
肥宅虾哥 48721ef7a9 Update Api - Add item list output by ItemKind.
Add item list output by ItemKind.
2023-12-05 23:56:32 +08:00
Azalea bae06e2187 Merge pull request #1 from FeiZhaixiage/master 2023-12-05 09:53:08 +09:00
肥宅虾哥 8b8e6cb422 Update ApiMaimai2PlayerDataController.java
Add API to save options settings.
2023-12-05 06:24:46 +08:00
Azalea Gui 2ecc990aae [F] Fix Found more than one migration with version 241 2023-11-15 00:35:20 -05:00
Azalea b47a841207 [F] chmod +x 2023-11-15 00:25:33 -05:00
1853 changed files with 140524 additions and 156268 deletions
+20
View File
@@ -0,0 +1,20 @@
FROM gradle:8.8.0-jdk21
ENV NODE_VERSION=22
RUN apt-get update && \
apt-get install -y curl && \
curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - && \
apt-get install -y nodejs && \
npm install -g npm@latest
RUN npm install -g bun
RUN apt-get install -y maven
RUN gradle --version && \
node --version && \
npm --version && \
bun --version
WORKDIR /workspace
+17
View File
@@ -0,0 +1,17 @@
{
"name": "AquaDX Dev Container",
"build": {
"dockerfile": "Dockerfile"
},
"customizations": {
"vscode": {
"extensions": [
"vscjava.vscode-gradle",
"vscjava.vscode-java-pack",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"fwcd.kotlin"
]
}
}
}
+8
View File
@@ -0,0 +1,8 @@
*
!gradlew
!gradle/
!gradle/**
!build.gradle.kts
!settings.gradle.kts
!src/
!src/**
+63
View File
@@ -0,0 +1,63 @@
name: Build and Publish Docker Image
# Trigger the workflow on push to the main branch or on manual dispatch
on:
push:
branches:
- main
workflow_dispatch:
schedule:
- cron: '0 0 * * 0' # Runs at midnight UTC every Sunday
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
# 1. Checkout the repository
- name: Checkout repository
uses: actions/checkout@v3
# 2. Set up QEMU and Docker Buildx (for multi-platform builds, optional)
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# 3. Log in to Docker Hub
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: hykilpikonna
password: ${{ secrets.DOCKERHUB_TOKEN }}
# 3. Log in to GitHub Container Registry (ghcr.io)
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
# Use GITHUB_TOKEN for authentication
password: ${{ secrets.GITHUB_TOKEN }}
# 4. Cache Docker layers to speed up builds (optional but recommended)
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
# 5. Build and push the Docker image
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: |
hykilpikonna/aquadx:latest
platforms: linux/amd64,linux/arm64
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
+25
View File
@@ -0,0 +1,25 @@
name: Gradle Build
on:
pull_request:
branches: [ master ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '25'
distribution: 'temurin'
- name: Build with Gradle
run: |
mkdir data
bash ./src/main/resources/meta/update.sh
chmod +x gradlew
./gradlew build
+51
View File
@@ -0,0 +1,51 @@
# Build script credit to https://github.com/OpenIntelWireless/itlwm/blob/master/.github/workflows/main.yml
name: Nightly Build
on:
push:
branches: [master]
paths: ['src/**']
workflow_dispatch:
jobs:
build:
permissions: write-all
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: '10'
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '25'
distribution: 'temurin'
server-id: github
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Build Artifact
run: bash ./tools/build.sh
- name: Delete previous nightly release
run: |
gh release delete --cleanup-tag --yes --repo $GITHUB_REPOSITORY nightly || true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish GitHub Release
uses: ncipollo/release-action@v1
with:
bodyFile: "build/release/ReleaseNotes.md"
artifacts: "build/libs/aqua-nightly.jar,build/aqua-nightly.zip"
tag: "nightly"
token: ${{ secrets.GITHUB_TOKEN }}
draft: false
- name: Mark release undraft
run: |
gh release edit nightly --draft=false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+11
View File
@@ -1,3 +1,4 @@
db/
web/ web/
bin/ bin/
@@ -76,3 +77,13 @@ gradle-app.setting
### Gradle Patch ### ### Gradle Patch ###
# Java heap dump # Java heap dump
*.hprof *.hprof
.jpb
src/main/resources/meta/*/*.json
*.log.*.gz
*.salive
test-diff
htmlReport
docs/logs
# Sensitive keys
game_encryption.json
-25
View File
@@ -1,25 +0,0 @@
image: gradle:alpine
before_script:
- GRADLE_USER_HOME="$(pwd)/.gradle"
- export GRADLE_USER_HOME
build:
stage: build
script: gradle --build-cache assemble
cache:
key: "$CI_COMMIT_REF_NAME"
policy: push
paths:
- build
- .gradle
test:
stage: test
script: gradle check
cache:
key: "$CI_COMMIT_REF_NAME"
policy: pull
paths:
- build
- .gradle
+20
View File
@@ -0,0 +1,20 @@
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
# Matches multiple files: .ts, .json, .svelte .sass
[*.{json,svelte,ts,sass}]
indent_style = space
indent_size = 2
# Markdown files (e.g., README.md) often use a line length of 80 characters
[*.md]
max_line_length = 80
trim_trailing_whitespace = false
+26
View File
@@ -0,0 +1,26 @@
# This should reference your AquaDX instance's :80 port.
# Sometimes issues with CORS may appear, the easiest fix is to use a reverse proxy like Caddy to put AquaDX on the /aqua path,
# and set this to match the /aqua path (see example below)
VITE_AQUA_HOST=https://aquadx.net/aqua
# Link to converted game data (ex: all_music.json, all_items.json, etc.)
# Profile pictures are also served through this path, you may want to disable profile pictures if using the primary instance for data fetching
VITE_DATA_HOST=https://aquadx.net
VITE_AQUA_CONNECTION=aquadx.hydev.org
VITE_TURNSTILE_SITE_KEY=0x4AAAAAAASGA2KQEIelo9P9
VITE_DISCORD_INVITE=https://discord.gg/FNgveqFF7s
VITE_TELEGRAM_INVITE=https://t.me/+zBL4RZdyfvUzZGU1
VITE_QQ_INVITE=https://qm.qq.com/q/dpYmGoVHnG
VITE_GITHUB_REPOSITORY=https://github.com/MewoLab/AquaDX
# Documentation for Userbox mode can be found in `docs/aquabox-url-mode.md`
# Please note that if this is set, it must be manually unset by users in Chuni Settings -> Update Userbox -> Switch to URL mode -> (empty value) -> Enter key
VITE_USERBOX_DEFAULT_URL=
# the following is used at some case where custom access code QR code URL has been done.
# example:
# https://aquadx.net/cards/#accesskey=....
VITE_ACCESSCODE_QKEY=accesskey
VITE_DEFAULT_GAME=mai2
+41
View File
@@ -0,0 +1,41 @@
// ..eslintrc.cjs example
module.exports = {
root: true,
env: {
browser: true,
es2023: true
},
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:svelte/recommended',
],
ignorePatterns: ['dist', '..eslintrc.cjs'],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module'
},
rules: {
// Custom styling rules
'comma-dangle': ['warn', 'only-multiline'],
'indent': ['warn', 2],
'semi': ['warn', 'never'],
'quotes': ['warn', 'single'],
'arrow-parens': ['warn', 'as-needed'],
'linebreak-style': ['warn', 'unix'],
'object-curly-spacing': ['warn', 'always'],
'array-bracket-spacing': ["error", "always", {
"singleValue": false,
"objectsInArrays": false,
"arraysInArrays": false
}],
// Disabled rules
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'no-constant-condition': 'off',
'@typescript-eslint/no-explicit-any': 'off',
},
}
+40
View File
@@ -0,0 +1,40 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# Yarn 3 files
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
public/chu3
# local env file
*.local
.env
File diff suppressed because one or more lines are too long
+33
View File
@@ -0,0 +1,33 @@
# AquaNet
This is the codebase for the new frontend of AquaDX.
This project is also heavily WIP, so more details will be added later on.
## Development
This project uses Svelte (NOT SvelteKit) + TypeScript + Sass, built using Vite. The preferred editor is VSCode.
### Running locally
You will need to have Node.js (or equivalent) and `pnpm` installed, Start by installing dependencies by running:
```
pnpm install
```
Then, you would need to start your testing AquaDX server and configure the `VITE_AQUA_HOST` in `.env` (copy `.env.example` file to `.env`) to use your URL.
Please leave `VITE_DATA_HOST` unchanged if you're not sure what it is.
Finally, run:
```
pnpm run dev
```
### Running locally (with bun)
Alternatively, If you prefer [Bun](https://bun.sh), You can do the same as above.
Start by configuring the `VITE_AQUA_HOST` in `.env` (copy `.env.example` file to `.env`) to use your URL.
and finally:
```
bun install
bun run dev
```
+9
View File
@@ -0,0 +1,9 @@
import { existsSync } from "fs"
if (!existsSync(".env")) {
console.error(" I did not see .env being here. You sure it was there?")
console.error(" Copy .env.example to .env, edit .env, and try again.\n")
process.exit(1)
}
process.exit(0)
BIN
View File
Binary file not shown.
+44
View File
@@ -0,0 +1,44 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AquaNet</title>
<link rel="apple-touch-icon" sizes="180x180" href="/assets/icons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/assets/icons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/assets/icons/favicon-16x16.png">
<link rel="manifest" href="/assets/icons/site.webmanifest">
<link rel="mask-icon" href="/assets/icons/safari-pinned-tab.svg" color="#b3c6ff">
<link rel="shortcut icon" href="/assets/icons/favicon.ico">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-config" content="/assets/icons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<!-- Font CSS -->
<link rel="stylesheet" href="/assets/fonts/Quicksand.400.css" />
<link rel="stylesheet" href="/assets/fonts/Quicksand.500.css" />
<!-- Primary Meta Tags -->
<meta name="title" content="AquaNet (AquaDX.net)" />
<meta name="description" content="A certain magical arcade server 🪄" />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://aquadx.net/" />
<meta property="og:title" content="AquaNet (AquaDX.net)" />
<meta property="og:description" content="A certain magical arcade server 🪄" />
<meta property="og:image" content="https://aquadx.net/assets/meta/meta.png" />
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:url" content="https://aquadx.net/" />
<meta property="twitter:title" content="AquaNet (AquaDX.net)" />
<meta property="twitter:description" content="A certain magical arcade server 🪄" />
<meta property="twitter:image" content="https://aquadx.net/assets/meta/meta.png" />
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
+38
View File
@@ -0,0 +1,38 @@
server {
listen 443 ssl;
server_name aqua.example.com;
ssl_certificate /etc/nginx/certs/aqua.example.com.crt;
ssl_certificate_key /etc/nginx/certs/aqua.example.com.key;
# Absolute path to store the compiled AquaNet,
# there should be index.html in the directory.
location / {
root /var/www/html/AquaNet/;
try_files $uri $uri/ @router;
index index.html;
}
# Route for redirection to index.html
location @router{
rewrite ^.*$ /index.html last;
}
# If you have modified DATA_HOST,
# you will need to prepare your own resources.
# location /d/ {
# root /var/www/html/GameData/;
# }
# Reverse Proxy to your AquaDX.
location /aqua/ {
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1/;
proxy_buffering off;
}
}
+46
View File
@@ -0,0 +1,46 @@
{
"name": "aqua-net",
"private": true,
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "node buildcheck.js && vite",
"build": "node buildcheck.js && vite build",
"preview": "vite preview",
"check": "svelte-check --tsconfig ./tsconfig.json",
"lint": "eslint . --ext ts,tsx,svelte --max-warnings 0 --fix"
},
"devDependencies": {
"@iconify/svelte": "^4.1.0",
"@iconify/tools": "^4.1.1",
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@tsconfig/svelte": "^5.0.4",
"@types/d3": "^7.4.3",
"@types/wicg-file-system-access": "^2023.10.5",
"@unocss/svelte-scoped": "^0.65.2",
"chartjs-adapter-moment": "^1.0.1",
"eslint": "^9.17.0",
"eslint-plugin-svelte": "^2.46.1",
"sass": "^1.83.0",
"shiki": "^1.24.4",
"svelte": "^5",
"svelte-check": "^4",
"svelte-turnstile": "^0.9.0",
"tslib": "^2.8.1",
"typescript": "^5.7.2",
"typescript-eslint": "^8.18.2",
"unocss": "^0.65.2",
"vite": "^6.0.5"
},
"dependencies": {
"cal-heatmap": "^4.2.4",
"chart.js": "^4.4.7",
"d3": "^7.9.0",
"lxgw-wenkai-lite-webfont": "^1.7.0",
"modern-normalize": "^3.0.1",
"moment": "^2.30.1",
"svelte-easy-crop": "^4.0.0",
"svelte5-router": "^3.0.1"
},
"packageManager": "pnpm@9.7.0+sha512.dc09430156b427f5ecfc79888899e1c39d2d690f004be70e05230b72cb173d96839587545d09429b55ac3c429c801b4dc3c0e002f653830a420fa2dd4e3cf9cf"
}
+4780
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.
@@ -0,0 +1,27 @@
/* vietnamese */
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(Quicksand.400.vietnamese.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(Quicksand.400.latin-ext.woff2) format('woff2');
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(Quicksand.400.latin.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,27 @@
/* vietnamese */
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url(Quicksand.500.vietnamese.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url(Quicksand.500.latin-ext.woff2) format('woff2');
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url(Quicksand.400.latin.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/assets/icons/mstile-150x150.png"/>
<TileColor>#ffffff</TileColor>
</tile>
</msapplication>
</browserconfig>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 4.6 MiB

@@ -0,0 +1,19 @@
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/assets/icons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/assets/icons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+160
View File
@@ -0,0 +1,160 @@
<script lang="ts">
import { Route, Router } from "svelte5-router";
import Welcome from "./pages/Welcome.svelte";
import UserHome from "./pages/UserHome.svelte";
import Home from "./pages/Home.svelte";
import Ranking from "./pages/Ranking.svelte";
import { CARD, USER } from "./libs/sdk";
import type { AquaNetUser } from "./libs/generalTypes";
import Settings from "./pages/User/Settings.svelte";
import MaiPhoto from "./pages/MaiPhoto.svelte";
import { pfp, tooltip } from "./libs/ui"
import { ANNOUNCEMENT } from "./libs/announcement";
import { DEFAULT_GAME } from "./libs/config"
import { t } from "./libs/i18n";
import Transfer from "./pages/Transfer/Transfer.svelte";
import { link } from "d3";
import Communities from "./pages/Home/Communities.svelte";
import LinkCard from "./pages/Home/LinkCard.svelte";
import SetupInstructions from "./pages/Home/SetupInstructions.svelte";
import PageNotFound from "./pages/PageNotFound.svelte";
console.log(`%c
┏━┓ ┳━┓━┓┏━
┣━┫┏━┓┓ ┏┏━┓┃ ┃ ┣┫
┛ ┗┗━┫┗━┻┗━┻┻━┛━┛┗━
┗ v${APP_VERSION}`, `
background: linear-gradient(-45deg, rgba(18,194,233,1) 0%, rgba(196,113,237,1) 50%, rgba(246,79,89,1) 100%);
font-size: 2em;
font-family: Monospace;
unicode-bidi: isolate;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;`)
export let url = "";
let me: AquaNetUser
let playedMai = false
let recentGame: string = DEFAULT_GAME;
if (USER.isLoggedIn())
{
USER.me().then(m => {
me = m
CARD.userGames(me.username).then(game => {
playedMai = !!game.mai2
recentGame = Object.keys(game)
.filter(k => !!game[k])
.sort((a, b) => {
return (new Date(game[b].lastLogin)) - (new Date(game[a].lastLogin))
})[0] ?? "mai2"
})
}).catch(e => console.error(e))
}
let path = window.location.pathname;
</script>
<nav>
{#if path !== "/"}
<a class="logo" href={USER.isLoggedIn() ? "/home" : "/"}>
<img src="/assets/icons/android-chrome-192x192.png" alt="AquaDX"/>
<span>AquaNet</span>
</a>
{/if}
{#if $ANNOUNCEMENT}
<div class="announcement">
<strong>{t('navigation.notice')}</strong>: {$ANNOUNCEMENT}
</div>
{/if}
<a href="/home">{t('navigation.home').toLowerCase()}</a>
<!-- <div on:click={() => alert("Coming soon™")} on:keydown={e => e.key === "Enter" && alert("Coming soon™")}
role="button" tabindex="0">{t('navigation.maps').toLowerCase()}</div> -->
<!-- kill me -->
<a href={`/ranking/${recentGame}`}>{t('navigation.rankings').toLowerCase()}</a>
{#if playedMai}
<a href="/pictures">photo</a>
{/if}
{#if me}
<a href="/u/{me.username}" use:tooltip={t('navigation.profile')}>
<img alt="profile" class="pfp" use:pfp={me}/>
</a>
{/if}
</nav>
<Router {url}>
<Route path="/" component={Welcome} />
<Route path="/verify" component={Welcome} /> <!-- For email verification only, backwards compatibility with AquaNet2 in the future -->
<Route path="/reset-password" component={Welcome} />
<Route path="/home" component={Home} />
<Route path="/support" component={Communities} />
<Route path="/cards" component={LinkCard} />
<Route path="/setup" component={SetupInstructions} />
<Route path="/ranking" component={Ranking} />
<Route path="/ranking/:game" component={Ranking} />
<Route path="/u/:username" component={UserHome} />
<Route path="/u/:username/:game" component={UserHome} />
<Route path="/settings" component={Settings} />
<Route path="/settings/:page" component={Settings} />
<Route path="/pictures" component={MaiPhoto} />
<Route path="/transfer" component={Transfer} />
<Route component={PageNotFound} />
</Router>
<style lang="sass">
@use "vars"
nav
display: flex
justify-content: flex-end
align-items: center
gap: 32px
height: vars.$nav-height
padding: 0 48px
z-index: 10
position: relative
img
width: 1.5rem
height: 1.5rem
border-radius: vars.$border-radius
object-fit: cover
.announcement
position: absolute
left: 50%
transform: translate(-50%, 0)
top: 0
width: 50%
height: 100%
display: flex
justify-content: center
align-content: center
z-index: -1
background: linear-gradient(90deg, #6f0f0f00 0%, vars.$c-shadow 50%, #6f0f0f00 100%)
font-size: 1.125em
text-decoration: none !important
color: inherit !important
.pfp
width: 2rem
height: 2rem
.logo
display: flex
align-items: center
gap: 8px
font-weight: bold
color: vars.$c-main
letter-spacing: 0.2em
flex: 1
@media (max-width: vars.$w-mobile)
> span
display: none
@media (max-width: vars.$w-mobile)
justify-content: center
</style>
+384
View File
@@ -0,0 +1,384 @@
@use "sass:color"
@use "vars"
@import 'components/font/twemoji-flags.css'
@import 'lxgw-wenkai-lite-webfont/style.css'
html
height: 100%
body
font-family: vars.$font
line-height: 1.5
font-weight: 400
width: 100%
height: 100%
margin: 0
overflow-x: hidden
color-scheme: dark
color: rgba(255, 255, 255, 0.87)
background-color: vars.$c-bg
font-synthesis: none
text-rendering: optimizeLegibility
-webkit-font-smoothing: antialiased
-moz-osx-font-smoothing: grayscale
a
font-weight: 500
color: vars.$c-main
text-decoration: inherit
a:hover
color: vars.$c-main
h1
font-size: 3.2em
line-height: 1.1
.card
display: flex
flex-direction: column
border-radius: vars.$border-radius
padding: 12px 16px
background: vars.$ov-light
blockquote
$c1: rgba(255, 149, 149, 0.05)
$c2: rgba(255, 152, 152, 0.12)
background: repeating-linear-gradient(45deg, $c1, $c1 10px, $c2 10px, $c2 20px)
padding: 10px 20px 10px 20px
margin: 16px 0
border-left: solid #ff7c7c 3px
border-radius: vars.$border-radius
&::before
content: "⚠"
margin-right: 1em
&.success
$c1: rgba(156, 255, 149, 0.05)
$c2: rgba(152, 255, 174, 0.02)
background: repeating-linear-gradient(45deg, $c1, $c1 10px, $c2 10px, $c2 20px)
border-left: solid #97fa8c 3px
&::before
content: "✓"
margin-right: 1em
&.info
$c1: rgba(149, 183, 255, 0.05)
$c2: rgba(152, 186, 255, 0.02)
background: repeating-linear-gradient(45deg, $c1, $c1 10px, $c2 10px, $c2 20px)
border-left: solid #6e8bff 3px
&::before
content: "♢"
margin-right: 1em
#app
width: 100%
height: 100%
main:not(.no-margin)
max-width: 1280px
margin: 0 auto
padding-bottom: 100px
button
border-radius: vars.$border-radius
border: 1px solid transparent
padding: 0.6em 1.2em
font-size: 1em
font-weight: 500
font-family: inherit
background-color: vars.$ov-lighter
opacity: 0.9
cursor: pointer
transition: vars.$transition
white-space: nowrap
button:hover
border-color: vars.$c-main
button:focus, button:focus-visible
color: vars.$c-main
outline: none
button.error
color: unset
&:hover
border-color: vars.$c-error
color: vars.$c-error
//background: $c-error
//border-color: transparent
button.icon
padding: 0.6em
font-size: 1.2em
border-radius: 50px
@extend .flex-center
.level-0
//--lv-color: #6ED43E
--lv-color: 110, 212, 62
.level-1
//--lv-color: #F7B807
--lv-color: 247, 184, 7
.level-2
//--lv-color: #FF828D
--lv-color: 255, 130, 141
.level-3
//--lv-color: #A051DC
--lv-color: 160, 81, 220
.level-4
//--lv-color: #c299e7
--lv-color: 194, 153, 231
.level-5
// World's End for chunithm, or Utage for maimai
// --lv-color: #eff2e1
// --lv-color: 239, 242, 225
--lv-text-clip: linear-gradient(110deg, #5ac42c, #5ccc22, #959f26, #cc7c23, #c93143, #8f4876, #4c3eb1, #3c3397)
.warning
color: vars.$c-warning
.error
color: vars.$c-error
input, textarea
border-radius: vars.$border-radius
border: 1px solid transparent
padding: 0.6em 1.2em
font-size: 1em
font-weight: 500
font-family: inherit
background-color: vars.$ov-lighter
transition: vars.$transition
box-sizing: border-box
resize: none
textarea
height: 5em
// Dropdown
select
border-radius: vars.$border-radius
border: 1px solid transparent
padding: 0.6em 1.2em
font-size: 1em
font-weight: 500
font-family: inherit
background-color: vars.$ov-lighter
transition: vars.$transition
box-sizing: border-box
option
background-color: #333
color: #fff
option:hover
background-color: #555
input[type="checkbox"]
width: 1.2em
height: 1.2em
margin: 0
padding: 0
border: 1px solid vars.$c-main
background-color: vars.$ov-lighter
appearance: none
cursor: pointer
flex-shrink: 0
&:checked
background-color: vars.$c-main
border-color: vars.$c-main
label
cursor: pointer
input:focus, input:focus-visible
border: 1px solid vars.$c-main
outline: none
input.warning
border: 1px solid vars.$c-warning
input.error
border: 1px solid vars.$c-error
.flex-center
display: flex
justify-content: center
align-items: center
.inline-flex-center
display: inline-flex
justify-content: center
align-items: center
.clickable
cursor: pointer
user-select: none
// Content containers
.content-main
display: flex
flex-direction: column
gap: 20px
margin: 100px auto 0
padding: 32px 32px 128px
min-height: 100%
max-width: vars.$w-max
background-color: color.adjust(vars.$c-bg, $lightness: -3%)
border-radius: 16px 16px 0 0
@media (max-width: #{vars.$w-max + (64px) * 2})
margin: 100px 32px 0
@media (max-width: vars.$w-mobile)
margin: 100px 0 0
.fw-block
margin-left: -32px
margin-right: -32px
padding: 12px 32px
background-color: vars.$ov-darker
// Inner shadow
box-shadow: inset 0 10px 10px -2px vars.$c-shadow, inset 0 -10px 10px -2px vars.$c-shadow
> h2.outer-title, > .outer-title-options
margin-top: -5rem
margin-bottom: 1rem
@media (max-width: vars.$w-mobile)
text-align: center
> .outer-title-options
display: flex
justify-content: space-between
align-items: center
nav
display: flex
flex-direction: row
gap: 10px
top: 4px
@media (max-width: vars.$w-mobile)
flex-direction: column
> h2, > .outer-title-options > h2
margin: 0
main.content
@extend .content-main
// Not used. still need a lot of work
.content-popup
position: absolute
inset: 0
> div
@extend .content-main
position: absolute
inset: 0
top: 100px
background: rgba(color.adjust(vars.$c-bg, $lightness: -3%), 0.9)
backdrop-filter: blur(5px)
box-shadow: 0 0 10px 6px rgba(black, 0.4)
max-width: calc(vars.$w-max + 20px)
@media (max-width: #{vars.$w-max + (64px) * 2})
margin: 100px 22px 0
@media (max-width: vars.$w-mobile)
margin: 100px 0 0
// Overlay
.overlay
position: fixed
inset: 0
background-color: rgba(0, 0, 0, 0.5)
display: flex
justify-content: center
align-items: center
z-index: 1000
backdrop-filter: blur(5px)
h2, p
user-select: none
margin: 0
> div
background-color: vars.$c-bg
padding: 2rem
border-radius: vars.$border-radius
display: flex
flex-direction: column
gap: 1rem
max-width: 400px
.aqua-tooltip
z-index: 900
.no-margin
margin: 0
nav
> div, > a
cursor: pointer
transition: vars.$transition
text-decoration: underline 1px solid transparent
text-underline-offset: 0.1em
display: flex
align-items: center
color: unset
font-weight: unset
&:hover
color: vars.$c-main
text-decoration-color: vars.$c-main
text-underline-offset: 0.5em
&.active
color: vars.$c-main
.hide-scrollbar
&::-webkit-scrollbar
display: none
-ms-overflow-style: none
scrollbar-width: none
.aqua-tooltip
box-shadow: 0 0 5px 0 vars.$c-shadow
border-radius: vars.$border-radius
position: absolute
padding: 4px 8px
background: vars.$ov-lighter
backdrop-filter: blur(5px)
+81
View File
@@ -0,0 +1,81 @@
<!-- Svelte 4.2.11 -->
<script lang="ts">
import Icon from "@iconify/svelte";
export let color: string = '179, 198, 255'
export let icon: string
export let href: string | undefined = undefined
export let isSmall: boolean = false
// Manually positioned icons
const iconPos = [
[1, 0.5, 2],
[6, 2, 1.5],
[-0.5, 4.5, 1.3],
[5, -0.5],
[3.5, 4.5],
[9.5, 0.3, 1.2],
[12.5, 2.5, 0.8],
[10, 4.4, 0.8],
]
</script>
<a class="action-card" class:small={isSmall} style="--card-color: {color}" on:click {href} role="button" tabindex="0" on:keydown>
<slot/>
<div class="icons">
{#each iconPos as [x, y, size], i}
<Icon icon={icon} style={`top: ${y}rem; right: ${x}rem; font-size: ${size || 1}em`} />
{/each}
</div>
</a>
<style lang="sass">
@use '../vars'
.action-card
overflow: hidden
display: block
padding: 1rem
border-radius: vars.$border-radius
box-shadow: 0 5px 5px 1px vars.$c-shadow
transition: all 0.2s ease
cursor: pointer
position: relative
background: linear-gradient(45deg, transparent 20%, rgba(var(--card-color), 0.5) 100%)
outline: 1px solid transparent
filter: drop-shadow(0 0 12px rgba(var(--card-color), 0))
color: rgba(255, 255, 255, 0.78)
&:hover
box-shadow: 0 0 0.5rem 0.2rem vars.$c-shadow
transform: translateY(-3px)
// Drop shadow glow
filter: drop-shadow(0 0 12px rgba(var(--card-color), 0.5))
outline-color: rgba(var(--card-color), 0.5)
:global(span), &.small
font-size: 1.2rem
display: block
margin-bottom: 0.5rem
color: color-mix(in oklab, rgb(var(--card-color)) 25%, rgba(255, 255, 255, 0.75))
.icons
position: absolute
inset: 0
color: rgba(var(--card-color), 0.5)
font-size: 2rem
transition: all 0.2s ease
z-index: -1
mask-image: linear-gradient(45deg, transparent 30%, rgba(255,255,255,0.5) 70%, white 100%)
opacity: 0.8
@media (max-width: vars.$w-mobile)
opacity: 0.6
:global(> svg)
position: absolute
rotate: 20deg
</style>
@@ -0,0 +1,65 @@
<!-- Svelte 4.2.11 -->
<script lang="ts">
import Icon from "@iconify/svelte";
export let color: string = '179, 198, 255'
export let icon: string
export let href: string
</script>
<a class="action-card" style="--card-color: {color}" {href} role="button" tabindex="0" on:keydown>
<slot/>
<div class="icon">
<Icon icon={icon} />
</div>
</a>
<style lang="sass">
@use '../vars'
.action-card
overflow: hidden
display: block
padding: 1rem
border-radius: vars.$border-radius
box-shadow: 0 5px 5px 1px vars.$c-shadow
transition: all 0.2s ease
cursor: pointer
position: relative
background: linear-gradient(45deg, transparent 20%, rgba(var(--card-color), 0.5) 100%)
outline: 1px solid transparent
filter: drop-shadow(0 0 12px rgba(var(--card-color), 0))
color: rgba(255, 255, 255, 0.78)
&:hover
box-shadow: 0 0 0.5rem 0.2rem vars.$c-shadow
transform: translateY(-3px)
// Drop shadow glow
filter: drop-shadow(0 0 12px rgba(var(--card-color), 0.5))
outline-color: rgba(var(--card-color), 0.5)
:global(span)
font-size: 1.2rem
display: block
margin-bottom: 0.5rem
color: color-mix(in oklab, rgb(var(--card-color)) 25%, rgba(255, 255, 255, 0.75))
.icon
position: absolute
display: flex
color: rgba(var(--card-color), 0.5)
font-size: 4rem
right: 0
bottom: 0
padding: .5rem
transition: all 0.2s ease
z-index: -1
mask-image: linear-gradient(45deg, transparent 30%, rgba(255,255,255,0.5) 70%, white 100%)
opacity: 0.8
@media (max-width: vars.$w-mobile)
opacity: 0.6
</style>
@@ -0,0 +1,33 @@
<script lang="ts">
import { t } from "../libs/i18n";
const tabs: Record<string, string> = {
[t('home.nav.portal')]: `/home`,
[t('home.nav.link-card')]: `/cards`,
[t('home.nav.game-setup')]: `/setup`,
[t('home.nav.support')]: `/support`
}
</script>
<nav class="tabs">
{#each Object.entries(tabs) as t, i}
<a class="clickable"
href={t[1]}
class:active={
new URL(location.href).pathname === t[1]
}>
{t[0]}
</a>
{/each}
</nav>
<style lang="sass">
@use "../vars"
.tabs
display: flex
gap: 1rem
a
&.active
color: vars.$c-main
</style>
+65
View File
@@ -0,0 +1,65 @@
<script lang="ts">
import { createEventDispatcher } from 'svelte'
export let page: number
export let totalPages: number
const dispatch = createEventDispatcher()
let editing = false
let inputPage: number
function focus(node: HTMLInputElement) {
node.focus()
}
function updatePage(newPage: number) {
const p = Math.floor(Number(newPage))
if (!isNaN(p) && p > 0 && p <= totalPages) dispatch('updatePage', p)
}
function startEditing() {
inputPage = page
editing = true
}
function finishEditing() {
editing = false
if (inputPage !== page) updatePage(inputPage)
}
function handleKeydown(event: KeyboardEvent) {
if (event.key === 'Enter') finishEditing()
else if (event.key === 'Escape') editing = false
}
</script>
<div class="pagination">
<button on:click={() => updatePage(page - 1)} disabled={page <= 1}>Previous</button>
{#if editing}
<input type="number" bind:value={inputPage} on:blur={finishEditing} on:keydown={handleKeydown} min="1" max={totalPages} use:focus/>
{:else}
<span on:click={startEditing} role="button" tabindex="0" on:keydown={(e) => e.key === 'Enter' && startEditing()}>
Page {page} of {totalPages}
</span>
{/if}
<button on:click={() => updatePage(page + 1)} disabled={page >= totalPages}>Next</button>
</div>
<style lang="sass">
.pagination
display: flex
justify-content: center
align-items: center
margin: 1rem 0
gap: 1rem
input
width: 100px
text-align: center
span[role="button"]
cursor: pointer
</style>
+64
View File
@@ -0,0 +1,64 @@
<!-- Svelte 4.2.11 -->
<script lang="ts">
import { slide } from "svelte/transition";
import { t } from "../libs/i18n";
import type { GenericGameSummary } from "../libs/generalTypes";
export let g: GenericGameSummary
const detail = Object.entries(g.detailedRanks).toSorted((a, b) => +b[0] - +a[0])
</script>
<div class="rank-detail-container fw-block" transition:slide>
<div>
<h2>{t("UserHome.RankDetail.Title")}</h2>
<table><tbody>
<!-- rankDetails: { Level : { Rank : Count } } -->
<!-- Rows are levels, columns are ranks -->
<!-- Headers -->
<tr>
<th>{t("UserHome.RankDetail.Level")}</th>
{#each Object.values(g.ranks) as rankMap}<th>{rankMap.name}</th>{/each}
</tr>
<!-- Data -->
{#each detail as [level, rankMap]}
<tr>
<td>{level}</td>
{#each Object.values(rankMap) as count}<td>{count}</td>{/each}
</tr>
{/each}
</tbody></table>
</div>
</div>
<style lang="sass">
@use "../vars"
.rank-detail-container
> div
margin: 1em auto
max-width: 500px
table
width: 100%
border-collapse: collapse
table-layout: fixed
th:not(:first-child)
background: vars.$grad-special
-webkit-background-clip: text
-webkit-text-fill-color: transparent
background-clip: text
color: vars.$c-main
padding: 0.5em
th, td
padding: 0.5em
text-align: center
&:first-child
color: vars.$c-main
</style>
@@ -0,0 +1,143 @@
<!-- Svelte 4.2.11 -->
<script lang="ts">
import { slide } from "svelte/transition";
import { t } from "../libs/i18n";
import { type GameName, type ParsedComposition, roundFloor } from "../libs/scoring";
import { coverNotFound } from "../libs/ui";
import { tooltip } from "../libs/ui";
import useLocalStorage from "../libs/hooks/useLocalStorage.svelte";
export let game: GameName
export let p: ParsedComposition
const rounding = useLocalStorage("rounding", true)
</script>
<div class="map-detail-container" transition:slide>
<div class="scores">
<div>
<img src={p.img} alt="" on:error={coverNotFound} />
<div class="info">
<div class="first-line">
<div class="song-title">{p.name ?? t("UserHome.UnknownSong")}</div>
<span class={`lv level-${p.diffId === 10 ? 3 : p.diffId}`}>
{ p.difficulty ?? '-' }
</span>
</div>
<div class="second-line">
<span class={`rank-${p.rank[0]}`}>
<span class="rank-text">{p.rank.replace("p", "+")}</span>
<span class="rank-num" use:tooltip={(p.score / 10000).toFixed(4)}>
{rounding.value ? roundFloor(p.score, game, 1) : (p.score / 10000).toFixed(4)}%
</span>
</span>
{#if p.ratingChange !== undefined}
<span class="dx-change">{ p.ratingChange }</span>
{/if}
</div>
</div>
</div>
</div>
</div>
<style lang="sass">
@use "../vars"
vars.$gap: 20px
.map-detail-container
background-color: rgb(35,35,35)
border-radius: vars.$border-radius
overflow: hidden
.scores
display: flex
flex-direction: column
flex-wrap: wrap
gap: vars.$gap
// Image and song info
> div
display: flex
align-items: center
gap: 12px
max-width: 100%
box-sizing: border-box
img
width: 50px
height: 50px
border-radius: vars.$border-radius
object-fit: cover
// Song info and score
> div.info
flex: 1
display: flex
justify-content: space-between
overflow: hidden
flex-direction: column
.first-line
display: flex
flex-direction: row
// Limit song name to one line
.song-title
flex: 1
min-width: 0
overflow: hidden
text-overflow: ellipsis
white-space: nowrap
// Make song score and rank not wrap
> div:last-child
white-space: nowrap
@media (max-width: vars.$w-mobile)
flex-direction: column
gap: 0
.rank-text
text-align: left
.rank-S
// Gold green gradient on text
background: vars.$grad-special
-webkit-background-clip: text
color: transparent
.rank-A
color: #ff8a8a
.rank-B
color: #6ba6ff
.lv
width: 30px
text-align: center
background: rgba(var(--lv-color), 0.6)
padding: 0 6px
border-radius: 0 vars.$border-radius 0 vars.$border-radius
// Inset shadow, like it's a paper below this card with a cut
box-shadow: inset 0 0 10px rgba(0,0,0,0.5)
span
display: inline-block
text-align: left
.second-line
display: flex
justify-content: space-between
align-items: center
// Vertical table-like alignment
span.rank-text
min-width: 40px
span.rank-num
min-width: 60px
span.dx-change
margin-right: 0.5rem
color: vars.$c-good
</style>
@@ -0,0 +1,87 @@
<!-- Svelte 4.2.11 -->
<script lang="ts">
import RatingCompSong from "./RatingCompSong.svelte";
import { parseComposition, type GameName } from "../libs/scoring";
import { type MusicMeta } from "../libs/generalTypes";
export let title: string;
export let comp: string | undefined;
export let allMusics: Record<string, MusicMeta>;
export let game: GameName;
export let top: number | undefined = undefined;
let split = comp?.split(",")?.filter(it => it.split(":")[0] !== '0')
?.map(it => parseComposition(it, allMusics, game))
if (top) split = split?.toSorted((a, b) => b.score - a.score).slice(0, top)
if (split) console.log("Split", split)
let mustResize = split && split.length > 12
</script>
{#if split && split.length > 0 && comp}
<div class="rating-composition-container" class:must-resize={mustResize}>
{#if mustResize}
<input type="checkbox">
{/if}
<h2>{title}</h2>
<div class="rating-composition">
{#each split as p}
<div>
<RatingCompSong {p} {game}/>
</div>
{/each}
</div>
</div>
{/if}
<style lang="sass">
@use "../vars"
.rating-composition
display: grid
// 3 columns
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr))
gap: vars.$gap
overflow: hidden
transition: max-height 250ms
.rating-composition-container
position: relative
input
width: 100%
height: 100%
position: absolute
z-index: 10
border: none
border-radius: 0
opacity: 0
transition: opacity 250ms
.rating-composition-container.must-resize
input
& ~ .rating-composition
max-height: 250px
& ~ h2::after
content: "▾"
margin-left: 0.5em
&:checked ~ h2::after
content: "▴"
&:checked
opacity: 0
&:checked ~ .rating-composition
max-height: 3000px
opacity: 1
background: linear-gradient(#0000 250px, rgb(28.35, 28.35, 28.35) 100%) /* for some reason the color.adjust doesn't work here so whatever */
</style>
@@ -0,0 +1,52 @@
<!-- Svelte 4.2.11 -->
<script lang="ts">
import { fade } from 'svelte/transition'
import type { ConfirmProps } from "../libs/generalTypes";
import { t } from "../libs/i18n"
import Loading from './ui/Loading.svelte';
import Error from './ui/Error.svelte';
// Props
export let confirm: ConfirmProps | null = null
export let error: string | null = null
export let loading: boolean = false
function doConfirm(fn?: () => void) {
confirm = null
fn && fn()
}
</script>
{#if confirm}
<div class="overlay" transition:fade>
<div>
<h2>{confirm.title}</h2>
<span>{confirm.message}</span>
<div class="actions">
{#if confirm.cancel}
<button on:click={() => doConfirm(confirm?.cancel)}>{t('action.cancel')}</button>
{/if}
<button on:click={() => doConfirm(confirm?.confirm)} class:error={confirm.dangerous}>{t('action.confirm')}</button>
</div>
</div>
</div>
{/if}
{#if error}
<Error {error}/>
{/if}
{#if loading && !error}
<Loading/>
{/if}
<style lang="sass">
.actions
display: flex
gap: 16px
button
width: 100%
</style>
+76
View File
@@ -0,0 +1,76 @@
<script lang="ts">
import { onMount, onDestroy } from 'svelte'
export let triggeredBy: string
export let loading: boolean = false
let isHovered = false
let x: number, y: number
let targets: Element[] = []
onMount(() => {
targets = [...document.querySelectorAll(triggeredBy)]
targets.forEach((el) => {
el.addEventListener('mouseover', mouseOver)
el.addEventListener('mousemove', mouseMove)
el.addEventListener('mouseleave', mouseLeave)
})
if (targets.length === 0) {
console.warn(`No elements found with selector "${triggeredBy}"`)
}
})
onDestroy(() => {
targets.forEach((el) => {
el.removeEventListener('mouseover', mouseOver)
el.removeEventListener('mousemove', mouseMove)
el.removeEventListener('mouseleave', mouseLeave)
})
})
function mouseOver(event: Event) {
console.log('over')
isHovered = true
updatePosition(event as MouseEvent)
}
function mouseMove(event: Event) {
console.log('move')
updatePosition(event as MouseEvent)
}
function updatePosition(event: MouseEvent) {
x = event.pageX + 5
y = event.pageY + 20
}
function mouseLeave() {
console.log('leave')
isHovered = false
}
</script>
{#if isHovered}
<div style="top: {y}px; left: {x}px" class="tooltip" class:loading>
<slot />
</div>
{/if}
<style lang="sass">
@use "../vars"
.tooltip
position: absolute
z-index: 900
background: white
padding: 10px 16px
border-radius: vars.$border-radius
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1)
pointer-events: none
white-space: nowrap
color: #242424
transform: translate(-50%, 0)
transition: opacity 0.2s
&.loading
opacity: 0
</style>
+56
View File
@@ -0,0 +1,56 @@
<!-- Svelte 4.2.11 -->
<script lang="ts">
import type { GenericGameSummary } from "../libs/generalTypes";
import { GAME } from "../libs/sdk";
import type { GameName } from "../libs/scoring";
import { pfp, pfpNotFound } from "../libs/ui";
export let username: string
export let game: GameName
export let setLoading: (loading: boolean) => void = () => {}
let data: GenericGameSummary
let error = ""
setLoading(true)
GAME.userSummary(username, game).then(d => data = d).catch(e => error = e).finally(() => setLoading(false))
</script>
{#if !data}
<div>Loading...</div>
{:else if error}
<div>Error: {error}</div>
{:else}
<div class="user-card">
<img use:pfp={data.aquaUser} alt="Profile" />
<div class="details">
<span class="in-game-name">{data.name}</span>
<span class="username">@{username}</span>
</div>
</div>
{/if}
<style lang="sass">
@use "../vars"
.user-card
display: flex
align-items: center
gap: vars.$gap
.details
display: flex
flex-direction: column
justify-content: center
.username
font-size: 0.8em
img
width: 50px
height: 50px
border-radius: 50%
object-fit: cover
object-position: center
</style>
+29
View File
@@ -0,0 +1,29 @@
<script lang="ts">
import { Chart, Tooltip, type ChartData, type ChartOptions } from 'chart.js';
import type { HTMLCanvasAttributes } from 'svelte/elements';
import 'chart.js/auto';
interface Props extends HTMLCanvasAttributes {
data: ChartData<'line', any, string>
options: ChartOptions<'line'>
}
const { data, options, ...rest }: Props = $props()
Chart.register(Tooltip)
let canvasElem: HTMLCanvasElement
let chart: Chart
$effect(() => {
chart = new Chart(canvasElem, { type: 'line', data, options })
return () => chart.destroy()
})
$effect(() => {
if (!chart) return
chart.data = data
chart.update()
})
</script>
<canvas bind:this={canvasElem} {...rest}></canvas>
@@ -0,0 +1,11 @@
@font-face {
font-family: 'TwemojiCountryFlags';
src: url('./TwemojiCountryFlags.woff2') format('woff2');
font-weight: normal;
font-style: normal;
}
.country {
font-family: TwemojiCountryFlags,"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif;
font-size: 2em;
}
@@ -0,0 +1,257 @@
<script lang="ts">
import { fade, slide } from "svelte/transition";
import { CHU3_MATCHINGS } from "../../libs/config.js";
import type { ChusanMatchingOption, GameOption } from "../../libs/generalTypes.js";
import { t, ts } from "../../libs/i18n.js";
import { DATA, GAME, SETTING, USER } from "../../libs/sdk.js";
import StatusOverlays from "../StatusOverlays.svelte";
import GameSettingFields from "./GameSettingFields.svelte";
import { EN_REF } from "../../libs/i18n/en_ref.js";
let custom = false
let overlay = false
let loading = false
let error = ""
let changed: string[] = [];
let symbols: Record<number, number> = {};
let allItems: Record<string, Record<string, { name: string }>> = {}
let submitting: string | undefined | null;
let settings: Record<string, GameOption> = {};
let existingUrl = "";
SETTING.get().then(s => {
existingUrl = s.filter(it => it.key === 'chusanMatchingServer')[0]?.value
if (existingUrl && !CHU3_MATCHINGS.some(it => it.matching === existingUrl)) {
custom = true
}
const symbolKey = "chusanSymbolChat"
s.forEach(opt => {
if (opt.key.substring(0, symbolKey.length) == symbolKey && opt.value)
symbols[parseInt(opt.key.substring(symbolKey.length))] = opt.value;
})
settings = Object.fromEntries(s.map(v => [v.key, v]))
})
async function fetchSymbolData() {
allItems = await DATA.allItems('chu3').catch(_ => {
loading = false
error = t("userbox.error.nodata")
}) as typeof allItems
}
async function submitSymbol(id: number) {
if (submitting) return false
const field = `chusanSymbolChat${id + 1}`;
submitting = field
await SETTING.set(field, symbols[id + 1]).catch(e => error = e.message).finally(() => submitting = null);
changed = changed.filter(v => v != `chusanSymbolChat${id}`)
return true
}
async function updateLvDifficulty() {
if (submitting) return false
submitting = `chusanLvDifficulty`
await SETTING.set("chusanLvDifficulty", settings["chusanLvDifficulty"].value).catch(e => error = e.message).finally(() => submitting = null);
changed = changed.filter(v => v != `chusanLvDifficulty`)
return true
}
// Click on "Custom" option"
function clickCustom() {
custom = true
overlay = false
}
// Click on a matching option, set the reflector and matching server
function clickOption(opt: ChusanMatchingOption) {
Promise.all([
SETTING.set('chusanMatchingReflector', opt.reflector),
SETTING.set('chusanMatchingServer', opt.matching),
]).then(() => {
overlay = false
custom = false
existingUrl = opt.matching
}).catch(e => error = e.message)
}
let linkedVerseAvailable = false;
USER.me().then(async me => {
let summary = await GAME.userSummary(me.username, "chu3")
let version = summary.lastVersion.split(".");
if (version[0] == "2" && parseInt(version[1]) >= 40)
linkedVerseAvailable = true;
})
</script>
<StatusOverlays {error} {loading}/>
<div class="matching">
<h2>{t("userbox.header.matching")}{linkedVerseAvailable ? ` & ${t("userbox.header.linkedVerse")}` : ""}</h2>
<blockquote class="info">
{t("settings.cabNotice")}
{#if linkedVerseAvailable}
{t("userbox.lv.diffnotice")}
{/if}
</blockquote>
{#if linkedVerseAvailable}
<GameSettingFields game="chu3-linked-verse" />
{#if settings["chusanLvDifficulty"]}
<a target="_blank" href="https://silentblue.remywiki.com/CHUNITHM:Linked_VERSE">{t(`userbox.lv.help`)}</a>
<div class="field">
<label for={`chusanLvDifficulty`}>{ts(`userbox.lv.difficulty`)}</label>
<div>
<select bind:value={settings["chusanLvDifficulty"].value} id={`chusanLvDifficulty`} on:change={() => {changed = [...changed, `chusanLvDifficulty`];}}>
{#each {length: 6}, i}
<option value={i}>{t(`userbox.lv.difficulty.${i}` as keyof typeof EN_REF)}</option>
{/each}
</select>
{#if changed.includes(`chusanLvDifficulty`)}
<button transition:slide={{axis: "x"}} disabled={!!submitting} on:click={updateLvDifficulty}>
{t("settings.profile.save")}
</button>
{/if}
</div>
</div>
{/if}
{/if}
<div class="matching-selector">
<button on:click={_ => overlay = true}>{t('userbox.matching.select')}</button>
</div>
{#if custom}
<GameSettingFields game="chu3-matching"/>
{/if}
<h2>{t("userbox.header.matching.symbolChat")}</h2>
{#await fetchSymbolData() then}
{#each {length: 4}, i}
<div class="field">
<label for={`chusanSymbolChat${i}`}>{ts(`userbox.matching.symbolChat`) + ` #${i + 1}`}</label>
<div>
<select bind:value={symbols[i + 1]} id={`chusanSymbolChat${i}`} on:change={() => {changed = [...changed, `chusanSymbolChat${i}`];}}>
<option value={null}>{ts(`userbox.matching.symbolChat.default`)}</option>
{#each Object.entries(allItems.symbolChat).filter((f) => parseInt(f[0]) !== 0) as [id, option]}
<option value={parseInt(id)}>{option?.name || `(unknown ${id})`}</option>
{/each}
</select>
{#if changed.includes(`chusanSymbolChat${i}`)}
<button transition:slide={{axis: "x"}} disabled={!!submitting} on:click={() => submitSymbol(i)}>
{t("settings.profile.save")}
</button>
{/if}
</div>
</div>
{/each}
{/await}
</div>
{#if overlay}
<div class="overlay" transition:fade>
<div>
<div>
<h2>{t('userbox.header.matching')}</h2>
<p>{t('userbox.matching.select.sub')}</p>
</div>
<div class="options">
<!-- Selectable options -->
{#each CHU3_MATCHINGS as option}
<div class="clickable option" on:click={() => clickOption(option)}
role="button" tabindex="0" on:keypress={e => e.key === 'Enter' && clickOption(option)}
class:selected={!custom && existingUrl === option.matching}>
<span class="name">{option.name}</span>
<div class="links">
<a href={option.ui} target="_blank" rel="noopener">{t('userbox.matching.option.ui')}</a> /
<a href={option.guide} target="_blank" rel="noopener">{t('userbox.matching.option.guide')}</a>
</div>
<div class="divider"></div>
<div class="coop">
<span>{t('userbox.matching.option.collab')}</span>
<div>
{#each option.coop as coop}
<span>{coop}</span>
{/each}
</div>
</div>
</div>
{/each}
<!-- Placeholder option for "Custom" -->
<div class="clickable option" on:click={clickCustom}
role="button" tabindex="0" on:keypress={e => e.key === 'Enter' && clickCustom()}
class:selected={custom}>
<span class="name">{t('userbox.matching.custom.name')}</span>
<p class="notice custom">{t('userbox.matching.custom.sub')}</p>
</div>
</div>
</div>
</div>
{/if}
<style lang="sass">
@use "../../vars"
.matching
display: flex
flex-direction: column
gap: 12px
h2
margin-bottom: 0
p.notice
opacity: 0.6
margin: 0
&.custom
font-size: 0.9rem
.options
display: flex
flex-wrap: wrap
gap: 1rem
.option
flex: 1
display: flex
flex-direction: column
align-items: center
border-radius: vars.$border-radius
background: vars.$ov-light
padding: 1rem
min-width: 150px
&.selected
border: 1px solid vars.$c-main
.divider
width: 100%
height: 0.5px
background: white
opacity: 0.2
margin: 0.8rem 0
.name
font-size: 1.1rem
font-weight: bold
.coop
text-align: center
div
display: flex
flex-direction: column
font-size: 0.9rem
opacity: 0.6
</style>
@@ -0,0 +1,684 @@
<!-- Svelte 4.2.11 -->
<script lang="ts">
import {
type AquaNetUser,
type GameUserOption,
type UserBox,
type UserItem,
} from "../../libs/generalTypes";
import { DATA, USER, USERBOX, GAME, SETTING } from "../../libs/sdk";
import { t, ts } from "../../libs/i18n";
import { FADE_IN, FADE_OUT, USERBOX_DEFAULT_URL } from "../../libs/config";
import { fade, slide } from "svelte/transition";
import StatusOverlays from "../StatusOverlays.svelte";
import Icon from "@iconify/svelte";
import GameSettingFields from "./GameSettingFields.svelte";
import { userboxFileProcess, ddsDB, initializeDb } from "../../libs/userbox/userbox"
import ChuniPenguinComponent from "./userbox/ChuniPenguin.svelte"
import ChuniUserplateComponent from "./userbox/ChuniUserplate.svelte";
import useLocalStorage from "../../libs/hooks/useLocalStorage.svelte";
import { DDS } from "../../libs/userbox/dds";
import ChuniMatchingSettings from "./ChuniMatchingSettings.svelte";
import InputField from "../ui/InputField.svelte";
import UserOptionSlider from "./UserOptionSlider.svelte";
let user: AquaNetUser
let [loading, error, submitting, preview] = [true, "", "", ""]
let changed: string[] = [];
let userOptions: GameUserOption = {};
let userIsUsingPreset = false;
// Available (unlocked) options for each kind of item
// In allItems: 'namePlate', 'frame', 'trophy', 'mapIcon', 'systemVoice', 'avatarAccessory'
let allItems: Record<string, Record<string, { name: string }>> = {}
let iKinds = { namePlate: 1, frame: 2, trophy: 3, trophySub1: 4, trophySub2: 5, mapIcon: 8, systemVoice: 9, avatarAccessory: 11, stage: 13 }
// In userbox: 'nameplateId', 'frameId', 'trophyId', 'mapIconId', 'voiceId', 'avatar{Wear/Head/Face/Skin/Item/Front/Back}'
let userbox: UserBox
let avatarKinds = ['Wear', 'Head', 'Face', 'Skin', 'Item', 'Front', 'Back'] as const
// iKey should match allItems keys, and ubKey should match userbox keys
let userItems: { iKey: string, ubKey: keyof UserBox, items: UserItem[] }[] = []
let userNameField: any
// Submit changes
function submit(field: keyof UserBox) {
let obj = { field, value: userbox[field] }
if (submitting) return
submitting = obj.field
USERBOX.setUserBox(obj)
.then(() => changed = changed.filter((c) => c !== obj.field))
.catch(e => error = e.message)
.finally(() => submitting = "")
}
// Fetch data from the server
async function fetchData() {
const profile = await USERBOX.getProfile().catch(_ => {
loading = false
error = t("userbox.error.nodata")
})
if (!profile) return
userbox = profile.user
userNameField = {key: "gameUsername", value: userbox.userName, type: "String"}
userItems = Object.entries(iKinds).flatMap(([iKey, iKind]) => {
if (iKey != 'avatarAccessory') {
let ubKey = `${iKey}Id`
if (iKey.slice('trophy'.length, 'trophy'.length + 3) == "Sub") {
ubKey = `trophyIdSub${iKey.slice('trophySub'.length, 'trophySub'.length + 1)}`;
iKey = `trophy`;
}
if (ubKey == 'namePlateId') ubKey = 'nameplateId'
if (ubKey == 'systemVoiceId') ubKey = 'voiceId'
return [{ iKey, ubKey: ubKey as keyof UserBox,
items: profile.items.filter(x => x.itemKind === iKind || (iKey == "trophy" && x.itemKind == 3))
}]
}
return avatarKinds.map((aKind, i) => {
let items = profile.items.filter(x => x.itemKind === iKind && Math.floor(x.itemId / 100000) % 10 === i + 1)
return { iKey, ubKey: `avatar${aKind}` as keyof UserBox, items }
})
})
allItems = await DATA.allItems('chu3').catch(_ => {
loading = false
error = t("userbox.error.nodata")
}) as typeof allItems
console.log("User Items", userItems)
console.log("All items", allItems)
console.log("Userbox", userbox)
userOptions = await SETTING.optionGet('chu3').catch(_ => {
loading = false
error = t("userbox.error.nodata")
}) as GameUserOption
if (userOptions["optionSet"] != 3)
userIsUsingPreset = true;
loading = false
}
USER.me().then(u => {
if (!u) throw new Error(t("userbox.error.nodata"))
user = u
return fetchData()
}).catch((e) => { loading = false; error = e.message });
function exportData() {
submitting = "export"
GAME.export('chu3')
.then(data => download(JSON.stringify(data), `AquaDX_chu3_export_${userbox.userName}.json`))
.catch(e => error = e.message)
.finally(() => submitting = "")
}
async function exportBatchManual() {
submitting = "batchExport"
const DIFFICULTY_MAP: Record<number, string> = {
0: "BASIC",
1: "ADVANCED",
2: "EXPERT",
3: "MASTER",
4: "ULTIMA"
} as const // WORLD'S END scores not supported by Tachi
const DAN_MAP: Record<number, string> = {
1: "DAN_I",
2: "DAN_II",
3: "DAN_III",
4: "DAN_IV",
5: "DAN_V",
6: "DAN_INFINITE"
} as const
const SKILL_IDS: Record<number, string> = {
100009: 'CATASTROPHY',
102009: 'CATASTROPHY',
103007: 'CATASTROPHY',
100008: 'ABSOLUTE',
101008: 'ABSOLUTE',
102008: 'ABSOLUTE',
103006: 'ABSOLUTE',
100007: 'BRAVE',
101007: 'BRAVE',
102007: 'BRAVE',
103005: 'BRAVE',
100005: 'HARD',
100006: 'HARD',
101004: 'HARD',
101005: 'HARD',
101006: 'HARD',
102004: 'HARD',
102005: 'HARD',
102006: 'HARD',
103002: 'HARD',
103003: 'HARD',
103004: 'HARD'
} as const
// Shamelessly stolen from https://github.com/beer-psi/saekawa/commit/b3bee13e126df2f4e2a449bdf971debb8c95ba40, needs to be updated every major version :(
let data: any
let output: any = {
"meta": {
"game": "chunithm",
"playtype": "Single",
"service": "AquaDX-Manual"
},
"scores": [],
"classes": {}
}
try {
data = await GAME.export('chu3')
}
catch (e: any) {
error = e.message
submitting = ""
return
}
if (data && "userPlaylogList" in data) {
for (let score of data.userPlaylogList) {
let clearLamp = null
let noteLamp = null
if (score.level in DIFFICULTY_MAP) {
if (score.isClear) {
clearLamp = score.skillId in SKILL_IDS ? SKILL_IDS[score.skillId] : "CLEAR"
}
else {
clearLamp = "FAILED"
}
if (score.score === 1010000) {
noteLamp = "ALL JUSTICE CRITICAL"
}
else if (score.isAllJustice) {
noteLamp = "ALL JUSTICE"
}
else if (score.isFullCombo) {
noteLamp = "FULL COMBO"
}
else {
noteLamp = "NONE"
}
output.scores.push({
"score": score.score,
"clearLamp": clearLamp,
"noteLamp": noteLamp,
"judgements": {
"jcrit": score.judgeHeaven + score.judgeCritical,
"justice": score.judgeJustice,
"attack": score.judgeAttack,
"miss": score.judgeGuilty
},
"matchType": "inGameID",
"identifier": score.musicId.toString(),
"difficulty": DIFFICULTY_MAP[score.level],
"timeAchieved": score.sortNumber * 1000,
"optional": {
"maxCombo": score.maxCombo
}
})
}
}
}
if (data.userData.classEmblemMedal in DAN_MAP) {
output.classes["dan"] = DAN_MAP[data.userData.classEmblemMedal]
}
if (data.userData.classEmblemBase in DAN_MAP) {
output.classes["emblem"] = DAN_MAP[data.userData.classEmblemBase]
}
download(JSON.stringify(output), `AquaDX_chu3_BatchManualExport_${userbox.userName}.json`)
submitting = ""
}
function download(data: string, filename: string) {
const blob = new Blob([data]);
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = filename;
link.click();
}
let DDSreader: DDS | undefined;
let USERBOX_PROGRESS = 0;
let USERBOX_SETUP_RUN = false;
let USERBOX_SETUP_MODE = false;
let USERBOX_SETUP_TEXT = t("userbox.new.setup");
let USERBOX_ENABLED = useLocalStorage("userboxNew", false);
let USERBOX_PROFILE_ENABLED = useLocalStorage("userboxNewProfile", false);
let USERBOX_INSTALLED = false;
let USERBOX_SUPPORT = "webkitGetAsEntry" in DataTransferItem.prototype;
type OnlyNumberPropsOf<T extends Record<string, any>> = {[Prop in keyof T as (T[Prop] extends number ? Prop : never)]: T[Prop]}
let userboxSelected: keyof OnlyNumberPropsOf<UserBox> = "avatarWear";
const userboxNewOptions = ["systemVoice", "frame", "trophy", "mapIcon", "stage"]
async function userboxSafeDrop(event: Event & { currentTarget: EventTarget & HTMLInputElement; }) {
if (!event.target) return null;
let input = event.target as HTMLInputElement;
let folder = input.webkitEntries[0];
error = await userboxFileProcess(folder, (progress: number, progressString: string) => {
USERBOX_SETUP_TEXT = progressString;
USERBOX_PROGRESS = progress;
}) ?? "";
}
let USERBOX_URL_STATE = useLocalStorage("userboxURL", USERBOX_DEFAULT_URL);
function userboxHandleInput(baseURL: string, isSetByServer: boolean = false) {
if (baseURL != "")
try {
// validate url
new URL(baseURL, location.href);
} catch(err) {
if (isSetByServer)
return;
return error = t("userbox.new.error.invalidUrl")
}
USERBOX_URL_STATE.value = baseURL;
USERBOX_ENABLED.value = true;
USERBOX_PROFILE_ENABLED.value = true;
location.reload();
}
if (USERBOX_DEFAULT_URL && !USERBOX_URL_STATE.value)
userboxHandleInput(USERBOX_DEFAULT_URL, true);
indexedDB.databases().then(async (dbi) => {
let databaseExists = dbi.some(db => db.name == "userboxChusanDDS");
if (USERBOX_URL_STATE.value && databaseExists) {
indexedDB.deleteDatabase("userboxChusanDDS")
}
if (databaseExists) {
await initializeDb();
}
if (databaseExists || USERBOX_URL_STATE.value) {
DDSreader = new DDS(ddsDB);
USERBOX_INSTALLED = databaseExists || USERBOX_URL_STATE.value != "";
}
})
</script>
<StatusOverlays {error} loading={loading || !!submitting} />
{#if !loading && !error}
<div>
<div class="general-options">
<GameSettingFields game="chu3"/>
<InputField bind:field={userNameField}
callback={() => USERBOX.setUserBox({ field: "userName", value: userNameField.value })}/>
<!-- User Options -->
{#if userIsUsingPreset}
<blockquote class="info">
{t('settings.options.all.preset-warning')}
</blockquote>
{/if}
<div class="fields-ranges">
<UserOptionSlider
game="chu3" type="headphone"
minValue={0} maxValue={60}
defaultValue={userOptions["headphone"]}
getTextFunction={(value: number) => `${((value / 60) * 100).toFixed(0)}%`}
/>
<UserOptionSlider
game="chu3" type="trackSkip"
minValue={0} maxValue={7}
defaultValue={userOptions["trackSkip"]}
getTextFunction={(value: number) => [t('settings.options.all.none'), `S`, `S+`, `SS`, `SS+`, `SSS`, `SSS+`, t('settings.options.all.personal-best')][value]}
/>
<UserOptionSlider
game="chu3" type="speed"
minValue={0} maxValue={61}
defaultValue={userOptions["speed"]}
getTextFunction={(value: number) => value >= 61 ? "SONIC" : value < 55 ? `${(value / 4) + 1}` : `${value - 40}`}
/>
<UserOptionSlider
game="chu3" type="speed_120"
minValue={0} maxValue={61}
defaultValue={userOptions["speed_120"]}
getTextFunction={(value: number) => value >= 61 ? "SONIC" : value < 55 ? `${(value / 4) + 1}` : `${value - 40}`}
/>
</div>
</div>
<h2>{t("userbox.header.userbox")}</h2>
{#if !USERBOX_ENABLED.value || !USERBOX_INSTALLED}
<div class="fields">
{#each userItems as { iKey, ubKey, items }, i}
{#if items.length > 0}
<div class="field">
<label for={ubKey}>{ts(`userbox.${ubKey}`)}</label>
<div>
<select bind:value={userbox[ubKey]} id={ubKey} on:change={() => changed = [...changed, ubKey]}>
{#each items as option}
<option value={option.itemId}>{allItems[iKey][option.itemId]?.name || `(unknown ${option.itemId})`}</option>
{/each}
</select>
{#if changed.includes(ubKey)}
<button transition:slide={{axis: "x"}} on:click={() => submit(ubKey)} disabled={!!submitting}>
{t("settings.profile.save")}
</button>
{/if}
</div>
</div>
{/if}
{/each}
</div>
{:else}
<div class="chuni-userbox-container">
<ChuniUserplateComponent chuniIsUserbox={true} on:click={() => userboxSelected = "nameplateId"} chuniCharacter={userbox.characterId} chuniLevel={userbox.level.toString()} chuniRating={userbox.playerRating / 100}
chuniNameplate={userbox.nameplateId} chuniName={userbox.userName} chuniTrophyName={allItems.trophy[userbox.trophyId].name}></ChuniUserplateComponent>
<ChuniPenguinComponent chuniWear={userbox.avatarWear} chuniHead={userbox.avatarHead} chuniBack={userbox.avatarBack}
chuniFront={userbox.avatarFront} chuniFace={userbox.avatarFace} chuniItem={userbox.avatarItem}
chuniSkin={userbox.avatarSkin}></ChuniPenguinComponent>
</div>
<div class="chuni-userbox-row">
{#each avatarKinds as avatarKind}
{#await DDSreader?.getFile(`avatarAccessoryThumbnail:${userbox[`avatar${avatarKind}`].toString().padStart(8, "0")}`) then imageURL}
<button on:click={() => userboxSelected = `avatar${avatarKind}`}>
<img src={imageURL} class={userboxSelected == `avatar${avatarKind}` ? "focused" : ""} alt={allItems.avatarAccessory[userbox[`avatar${avatarKind}`]].name} title={allItems.avatarAccessory[userbox[`avatar${avatarKind}`]].name}>
</button>
{/await}
{/each}
</div>
<div class="chuni-userbox">
{#if userboxSelected == "nameplateId"}
{#each userItems.find(f => f.ubKey == "nameplateId")?.items ?? [] as item}
{#await DDSreader?.getFile(`nameplate:${item.itemId.toString().padStart(8, "0")}`) then imageURL}
<button class="nameplate" on:click={() => {userbox[userboxSelected] = item.itemId; submit(userboxSelected)}}>
<img src={imageURL} alt={allItems.namePlate[item.itemId].name} title={allItems.namePlate[item.itemId].name}>
</button>
{/await}
{/each}
{:else}
{#each userItems.find(f => f.ubKey == userboxSelected)?.items ?? [] as item}
{#await DDSreader?.getFile(`avatarAccessoryThumbnail:${item.itemId.toString().padStart(8, "0")}`) then imageURL}
<button on:click={() => {userbox[userboxSelected] = item.itemId; submit(userboxSelected)}}>
<img src={imageURL} alt={allItems.avatarAccessory[item.itemId].name} title={allItems.avatarAccessory[item.itemId].name}>
</button>
{/await}
{/each}
{/if}
</div>
<div class="fields">
{#each userItems.filter(i => userboxNewOptions.includes(i.iKey)) as { iKey, ubKey, items }, i}
{#if items.length > 0}
<div class="field">
<label for={ubKey}>{ts(`userbox.${ubKey}`)}</label>
<div>
<select bind:value={userbox[ubKey]} id={ubKey} on:change={() => changed = [...changed, ubKey]}>
{#each items as option}
<option value={option.itemId}>{allItems[iKey][option.itemId]?.name || `(unknown ${option.itemId})`}</option>
{/each}
</select>
{#if changed.includes(ubKey)}
<button transition:slide={{axis: "x"}} on:click={() => submit(ubKey)} disabled={!!submitting}>
{t("settings.profile.save")}
</button>
{/if}
</div>
</div>
{/if}
{/each}
</div>
{/if}
{#if USERBOX_INSTALLED}
<!-- god this is a mess but idgaf atp -->
<div class="field boolean" style:margin-top="1em">
<input type="checkbox" bind:checked={USERBOX_ENABLED.value} id="newUserbox">
<label for="newUserbox">
<span class="name">{t("userbox.new.activate")}</span>
<span class="desc">{t(`userbox.new.activate_desc`)}</span>
</label>
</div>
<div class="field boolean" style:margin-top="1em">
<input type="checkbox" bind:checked={USERBOX_PROFILE_ENABLED.value} id="newUserboxProfile">
<label for="newUserboxProfile">
<span class="name">{t("userbox.new.activate_profile")}</span>
<span class="desc">{t(`userbox.new.activate_profile_desc`)}</span>
</label>
</div>
{/if}
{#if USERBOX_SUPPORT && !USERBOX_DEFAULT_URL}
<p>
<button on:click={() => USERBOX_SETUP_RUN = !USERBOX_SETUP_RUN}>{t(!USERBOX_INSTALLED ? `userbox.new.activate_first` : `userbox.new.activate_update`)}</button>
</p>
{/if}
<ChuniMatchingSettings/><br>
<button class="exportButton" on:click={exportData}>
<Icon icon="bxs:file-export"/>
{t('settings.export')}
</button>
<button class="exportBatchManualButton" on:click={exportBatchManual}>
<Icon icon="bxs:file-export"/>
{t('settings.batchManualExport')}
</button>
</div>
{/if}
{#if USERBOX_SETUP_RUN && !error}
<div class="overlay" transition:fade>
<div>
<h2>{t('userbox.new.name')}</h2>
<span>{USERBOX_SETUP_MODE ? t('userbox.new.url_warning') : USERBOX_SETUP_TEXT}</span>
<div class="actions">
{#if USERBOX_SETUP_MODE}
<input type="text" on:keyup={e => {if (e.key == "Enter") { userboxHandleInput((e.target as HTMLInputElement).value) }}} class="add-margin" placeholder="Base URL">
{:else}
{#if USERBOX_PROGRESS != 0}
<div class="progress">
<div class="progress-bar" style="width: {USERBOX_PROGRESS}%"></div>
</div>
{:else}
<p class="notice add-margin">
{t('userbox.new.setup.notice')}
</p>
<button class="drop-btn">
<input type="file" on:input={userboxSafeDrop} on:click={e => e.preventDefault()}>
{t('userbox.new.drop')}
</button>
{/if}
{/if}
{#if USERBOX_PROGRESS == 0}
<button on:click={() => USERBOX_SETUP_RUN = false}>
{t('back')}
</button>
<button on:click={() => USERBOX_SETUP_MODE = !USERBOX_SETUP_MODE}>
{t(USERBOX_SETUP_MODE ? 'userbox.new.switch.to_drop' : 'userbox.new.switch.to_url')}
</button>
{/if}
</div>
</div>
</div>
{/if}
<style lang="sass">
@use "../../vars"
input
width: 100%
.general-options
display: flex
flex-direction: column
flex-wrap: wrap
gap: 12px
p.notice
opacity: 0.6
margin-top: 0
.progress
width: 100%
height: 10px
box-shadow: 0 0 1px 1px vars.$ov-lighter
border-radius: 25px
margin-bottom: 15px
overflow: hidden
.progress-bar
background: #b3c6ff
height: 100%
border-radius: 25px
.add-margin, .drop-btn
margin-bottom: 1em
.drop-btn
position: relative
width: 100%
aspect-ratio: 3
background: transparent
box-shadow: 0 0 1px 1px vars.$ov-lighter
> input
position: absolute
top: 0
left: 0
width: 100%
height: 100%
opacity: 0
.fields
display: flex
flex-direction: column
gap: 12px
width: 100%
flex-grow: 0
label
display: flex
flex-direction: column
select
width: 100%
.field
display: flex
flex-direction: column
width: 100%
label
max-width: max-content
> div:not(.bool)
display: flex
align-items: center
gap: 1rem
margin-top: 0.5rem
> select
flex: 1
.field.boolean
display: flex
flex-direction: row
align-items: center
gap: 1rem
width: auto
input
width: auto
aspect-ratio: 1 / 1
label
display: flex
flex-direction: column
max-width: max-content
.desc
opacity: 0.6
.fields-ranges
display: flex
flex-wrap: wrap
margin: 0.5rem 0
gap: 0 1rem
justify-content: center
:global(.field)
flex: calc(50% - 1rem)
width: 50%
/* AquaBox */
.chuni-userbox-row
width: 100%
display: flex
button
padding: 0
margin: 0
width: 100%
flex: 0 1 100%
background: none
aspect-ratio: 1
img
width: 100%
filter: brightness(50%)
&.focused
filter: brightness(75%)
.chuni-userbox
width: calc(100% - 20px)
height: 350px
display: flex
flex-direction: row
flex-wrap: wrap
padding: 10px
background: vars.$c-bg
border-radius: 16px
overflow-y: auto
margin-bottom: 15px
justify-content: center
button
padding: 0
margin: 0
width: 20%
align-self: flex-start
background: none
aspect-ratio: 1
img
width: 100%
&.nameplate
width: 50%
aspect-ratio: unset
border: none
.chuni-userbox-container
display: flex
align-items: center
justify-content: center
@media (max-width: 1000px)
.chuni-userbox-container
flex-wrap: wrap
</style>
@@ -0,0 +1,41 @@
<script lang="ts">
import { slide } from "svelte/transition";
import { SETTING } from "../../libs/sdk";
import type { GameOption } from "../../libs/generalTypes";
import { ts } from "../../libs/i18n";
import StatusOverlays from "../StatusOverlays.svelte";
import InputWithButton from "../ui/InputWithButton.svelte";
import InputField from "../ui/InputField.svelte";
export let game: string;
let gameFields: GameOption[] = []
let submitting = ""
let error: string;
SETTING.get().then(s => {
gameFields = s.filter(it => it.game === game)
})
async function submitGameOption(field: string, value: any) {
if (submitting) return false
submitting = field
await SETTING.set(field, value).catch(e => error = e.message).finally(() => submitting = "")
return true
}
</script>
<div class="fields">
{#each gameFields as field}
<InputField field={field} callback={() => submitGameOption(field.key, field.value)}/>
{/each}
</div>
<StatusOverlays {error} loading={!gameFields.length || !!submitting}/>
<style lang="sass">
.fields
display: flex
flex-direction: column
gap: 12px
</style>
@@ -0,0 +1,92 @@
<script lang="ts">
import { fade } from "svelte/transition";
import { FADE_IN, FADE_OUT } from "../../libs/config";
import { t, ts } from "../../libs/i18n";
import useLocalStorage from "../../libs/hooks/useLocalStorage.svelte";
import RegionSelector from "./RegionSelector.svelte";
import { USER } from "../../libs/sdk";
import type { AquaNetUser } from "../../libs/generalTypes";
import StatusOverlays from "../StatusOverlays.svelte";
const rounding = useLocalStorage("rounding", true);
let me: AquaNetUser;
let submitting = "";
let error = "";
let loading = true;
USER.me().then((m) => {
me = m;
loading = false;
}).catch(e => error = e.message)
function submit(field: string, value: string) {
if (submitting) return
submitting = field
USER.setting(field, value).then(() => {
}).catch(e => error = e.message).finally(() => submitting = "")
}
</script>
{#if !loading}
<div class="fields">
<blockquote class="info">
{ts("settings.siteNotice")}
</blockquote>
<div class="field">
<div class="bool">
<input id="rounding" type="checkbox" bind:checked={rounding.value}/>
<label for="rounding">
<span class="name">{ts(`settings.fields.rounding.name`)}</span>
<span class="desc">{ts(`settings.fields.rounding.desc`)}</span>
</label>
</div>
</div>
<div class="field m-t">
<div class="bool">
<input id="displayCandidates" type="checkbox" bind:checked={me.displayCandidates}
on:change={() => submit('displayCandidates', me.displayCandidates.toString())}/>
<label for="displayCandidates">
<span class="name">{ts(`settings.fields.displayCandidates.name`)}</span>
<span class="desc">{ts(`settings.fields.displayCandidates.desc`)}</span>
</label>
</div>
</div>
<div class="divider"></div>
<blockquote class="info">
{ts("settings.regionNotice")}
</blockquote>
<RegionSelector/>
</div>
{/if}
<StatusOverlays {error} {loading} />
<style lang="sass">
@use "../../vars"
.fields
display: flex
flex-direction: column
gap: 12px
.bool
display: flex
align-items: center
gap: 1rem
label
display: flex
flex-direction: column
.desc
opacity: 0.6
.divider
width: 100%
height: 0.5px
background: white
opacity: 0.2
margin: 0.4rem 0
</style>
@@ -0,0 +1,315 @@
<script lang="ts">
import { slide, fade } from "svelte/transition";
import { FADE_IN, FADE_OUT, DATA_HOST } from "../../libs/config";
import { t } from "../../libs/i18n.js";
import Icon from "@iconify/svelte";
import StatusOverlays from "../StatusOverlays.svelte";
import { GAME, SETTING, USER } from "../../libs/sdk";
import GameSettingFields from "./GameSettingFields.svelte";
import { download } from "../../libs/ui";
import UserOptionSlider from "./UserOptionSlider.svelte";
import type { GameUserOption } from "../../libs/generalTypes";
import InputField from "../ui/InputField.svelte";
let userNameField: any
let error: string
let submitting = ""
let loading = true
let changed: string[] = []
let userOptions: GameUserOption = {}
let userIsUsingPreset = false
USER.me().then(me =>
GAME.userSummary(me.username, 'mai2').then(async ({name}) => {
userNameField = {key: "gameUsername", value: name, type: "String"}
userOptions = await SETTING.optionGet('mai2').catch(_ => {
error = t("userbox.error.nodata")
loading = true
}) as GameUserOption
if (userOptions["optionKind"] != 3)
userIsUsingPreset = true
loading = false
}).catch(e => error = e.message));
async function exportBatchManual() {
submitting = "batchExport"
const DIFFICULTY_MAP: Record<number, string> = {
0: "Basic",
1: "Advanced",
2: "Expert",
3: "Master",
4: "Re:Master"
}
const DAN_MAP: Record<number, string> = {
1: "DAN_1",
2: "DAN_2",
3: "DAN_3",
4: "DAN_4",
5: "DAN_5",
6: "DAN_6",
7: "DAN_7",
8: "DAN_8",
9: "DAN_9",
10: "DAN_10",
11: "SHINDAN_1",
12: "SHINDAN_2",
13: "SHINDAN_3",
14: "SHINDAN_4",
15: "SHINDAN_5",
16: "SHINDAN_6",
17: "SHINDAN_7",
18: "SHINDAN_8",
19: "SHINDAN_9",
20: "SHINDAN_10",
21: "SHINKAIDEN",
22: "URAKAIDEN"
}
const CLASS_MAP: Record<number, string> = {
0: "B5",
1: "B4",
2: "B3",
3: "B2",
4: "B1",
5: "A5",
6: "A4",
7: "A3",
8: "A2",
9: "A1",
10: "S5",
11: "S4",
12: "S3",
13: "S2",
14: "S1",
15: "SS5",
16: "SS4",
17: "SS3",
18: "SS2",
19: "SS1",
20: "SSS5",
21: "SSS4",
22: "SSS3",
23: "SSS2",
24: "SSS1",
25: "LEGEND"
}
let data: any
let musicData: any
let output: any = {
"meta": {
"game": "maimaidx",
"playtype": "Single",
"service": "AquaDX-Manual"
},
"scores": [],
"classes": {}
}
try {
musicData = await fetch(`${DATA_HOST}/d/mai2/00/all-music.json`).then(res => res.json())
} catch (e: any) {
error = e.message;
submitting = ""
return;
}
try {
data = await GAME.export('mai2');
} catch (e: any) {
error = e.message;
submitting = ""
return;
}
if (data && "userPlaylogList" in data) {
for (let score of data.userPlaylogList) {
if(score.musicId > 100000){
continue; // UTAGE charts are not supported
}
const musicItem = musicData[score.musicId as string];
if (!musicItem) continue;
let difficulty = null;
if (!(score.level in DIFFICULTY_MAP))
continue;
const isDX = score.musicId >= 10000;
difficulty = isDX ? `DX ${DIFFICULTY_MAP[score.level]}` : DIFFICULTY_MAP[score.level];
const percent = score.achievement/10000;
const pcrit = score.tapCriticalPerfect + score.holdCriticalPerfect + score.slideCriticalPerfect + score.touchCriticalPerfect + score.breakCriticalPerfect;
const perfect = score.tapPerfect + score.holdPerfect + score.slidePerfect + score.touchPerfect + score.breakPerfect;
const great = score.tapGreat + score.holdGreat + score.slideGreat + score.touchGreat + score.breakGreat;
const good = score.tapGood + score.holdGood + score.slideGood + score.touchGood + score.breakGood;
const miss = score.tapMiss + score.holdMiss + score.slideMiss + score.touchMiss + score.breakMiss;
const judgements = {
"pcrit": pcrit,
"perfect": perfect,
"great": great,
"good": good,
"miss": miss
}
let lamp = null;
if (score.isAllPerfect) {
lamp = "ALL PERFECT";
if (percent >= 101.0) {
lamp = "ALL PERFECT+";
}
} else if (score.isFullCombo) {
lamp = "FULL COMBO";
if (!good) {
lamp = "FULL COMBO+";
}
} else if (score.isClear) {
lamp = "CLEAR";
} else {
lamp = "FAILED";
}
const optional = {
"fast": score.fastCount,
"slow": score.lateCount,
"maxCombo": score.maxCombo
}
output.scores.push({
"percent": percent,
"lamp": lamp,
"matchType": "inGameID",
"identifier": score.musicId.toString(),
"difficulty": difficulty,
"timeAchieved": new Date(score.userPlayDate).getTime(),
"judgements": judgements,
"optional": optional
})
}
}
if(data.userData.courseRank in DAN_MAP){
output.classes["dan"] = DAN_MAP[data.userData.courseRank]
}
if(data.userData.classRank in CLASS_MAP){
output.classes["matchingClass"] = CLASS_MAP[data.userData.classRank]
}
download(JSON.stringify(output), `AquaDX_maimai2_BatchManualExport_${userNameField.value}.json`)
submitting = ""
}
function exportData() {
submitting = "export"
GAME.export('mai2')
.then(data => download(JSON.stringify(data), `AquaDX_maimai2_export_${userNameField.value}.json`))
.catch(e => error = e.message)
.finally(() => submitting = "")
}
</script>
{#if !loading}
<div class="fields">
<InputField bind:field={userNameField}
callback={() => GAME.changeName('mai2', userNameField.value)}/>
{#if userIsUsingPreset}
<blockquote class="info">
{t('settings.options.all.preset-warning')}
</blockquote>
{/if}
<div class="fields-ranges">
<!-- TODO: determine min & max -->
<UserOptionSlider
game="mai2" type="noteSpeed"
minValue={0} maxValue={37}
defaultValue={userOptions["noteSpeed"]}
getTextFunction={(value: number) => value >= 37 ? "SONIC" : `${(value / 4) + 1}`}
/>
<UserOptionSlider
game="mai2" type="touchSpeed"
minValue={0} maxValue={37}
defaultValue={userOptions["touchSpeed"]}
getTextFunction={(value: number) => value >= 37 ? "SONIC" : `${(value / 4) + 1}`}
/>
<UserOptionSlider
game="mai2" type="slideSpeed"
minValue={0} maxValue={20}
defaultValue={userOptions["slideSpeed"]}
getTextFunction={(value: number) => value == 10 ? "Normal" : `${value > 10 ? "Late" : "Fast"} ${(Math.abs(value - 10) / 10).toFixed(1)}`}
/>
<UserOptionSlider
game="mai2" type="headPhoneVolume"
minValue={0} maxValue={19}
defaultValue={userOptions["headPhoneVolume"]}
getTextFunction={(value: number) => `${((value / 19) * 100).toFixed(0)}%`}
/>
<UserOptionSlider
game="mai2" type="trackSkip"
minValue={0} maxValue={11}
defaultValue={userOptions["trackSkip"]}
getTextFunction={(value: number) => [
t('settings.options.all.none'),
t('settings.options.all.push'),
`S`, `SS`, `SSS`,
t('settings.options.all.personal-best'),
t('settings.options.all.rival-score'),
`${t('settings.options.all.life')} 300`,
`${t('settings.options.all.life')} 100`,
`${t('settings.options.all.life')} 50`,
`${t('settings.options.all.life')} 10`,
`${t('settings.options.all.life')} 1`
][value]}
/>
</div>
<GameSettingFields game="mai2"/>
<button class="exportButton" on:click={exportData}>
<Icon icon="bxs:file-export"/>
{t('settings.export')}
</button>
<button class="exportBatchManualButton" on:click={exportBatchManual}>
<Icon icon="bxs:file-export"/>
{t('settings.batchManualExport')}
</button>
</div>
{/if}
<StatusOverlays {error} loading={!userNameField || !!submitting || loading}/>
<style lang="sass">
.fields
display: flex
flex-direction: column
gap: 12px
.field
display: flex
flex-direction: column
label
max-width: max-content
> div:not(.bool)
display: flex
align-items: center
gap: 1rem
margin-top: 0.5rem
> input
flex: 1
.fields-ranges
display: flex
flex-wrap: wrap
margin: 0.5rem 0
gap: 0 1rem
justify-content: center
:global(.field)
flex: calc(50% - 1rem)
width: 50%
.exportButton
display: flex
justify-content: center
align-items: center
gap: 5px
</style>
@@ -0,0 +1,55 @@
<script lang="ts">
import { fade } from "svelte/transition";
import { FADE_IN, FADE_OUT } from "../../libs/config";
import GameSettingFields from "./GameSettingFields.svelte";
import { GAME, SETTING, USER } from "../../libs/sdk";
import { download } from "../../libs/ui";
import InputField from "../ui/InputField.svelte";
import Icon from "@iconify/svelte";
import { t } from "../../libs/i18n";
import StatusOverlays from "../StatusOverlays.svelte";
let userNameField: any
let submitting = "";
let error: string
let loading = true;
USER.me().then(me =>
GAME.userSummary(me.username, 'ongeki').then(async ({name}) => {
userNameField = {key: "gameUsername", value: name, type: "String"}
loading = false;
}))
function exportData() {
submitting = "export"
GAME.export('ongeki')
.then(data => download(JSON.stringify(data), `AquaDX_ongeki_export_${userNameField.value}.json`))
.catch(e => error = e.message)
.finally(() => submitting = "")
}
</script>
{#if !loading}
<div>
<div class="fields">
<InputField bind:field={userNameField}
callback={() => SETTING.detailSet('ongeki', 'userName', userNameField.value)}/>
<GameSettingFields game="ongeki"/>
<button class="exportButton" on:click={exportData}>
<Icon icon="bxs:file-export"/>
{t('settings.export')}
</button>
</div>
</div>
{/if}
<StatusOverlays {error} loading={!userNameField || !!submitting || loading}/>
<style lang="sass">
.fields
display: flex
flex-direction: column
gap: 12px
</style>
@@ -0,0 +1,59 @@
<script lang="ts">
import { USER} from "../../libs/sdk";
import { ts } from "../../libs/i18n";
import StatusOverlays from "../StatusOverlays.svelte";
let regionId = $state(0);
let submitting = $state("")
let error: string = $state("");
const prefectures = ["None","Aichi","Aomori","Akita","Ishikawa","Ibaraki","Iwate","Ehime","Oita","Osaka","Okayama","Okinawa","Kagawa","Kagoshima","Kanagawa","Gifu","Kyoto","Kumamoto","Gunma","Kochi","Saitama","Saga","Shiga","Shizuoka","Shimane","Chiba","Tokyo","Tokushima","Tochigi","Tottori","Toyama","Nagasaki","Nagano","Nara","Niigata","Hyogo","Hiroshima","Fukui","Fukuoka","Fukushima","Hokkaido","Mie","Miyagi","Miyazaki","Yamagata","Yamaguchi","Yamanashi","Wakayama"]
USER.me().then(user => {
const parsedRegion = parseInt(user.region);
if (!isNaN(parsedRegion) && parsedRegion > 0) {
regionId = parsedRegion - 1;
} else {
regionId = 0;
}
})
async function saveNewRegion() {
if (submitting) return false
submitting = "region"
await USER.changeRegion(regionId+1).catch(e => error = e.message).finally(() => submitting = "")
return true
}
</script>
<div class="fields">
<label for="rounding">
<span class="name">{ts(`settings.regionSelector.title`)}</span>
<span class="desc">{ts(`settings.regionSelector.desc`)}</span>
</label>
<select bind:value={regionId} onchange={saveNewRegion}>
<option value={0} disabled selected>{ts("settings.regionSelector.select")}</option>
{#each prefectures.slice(1) as prefecture, index}
<option value={index}>{prefecture}</option>
{/each}
</select>
</div>
<StatusOverlays {error} loading={!!submitting}/>
<style lang="sass">
@use "../../vars"
.fields
display: flex
flex-direction: column
gap: 12px
label
display: flex
flex-direction: column
.desc
opacity: 0.6
</style>
@@ -0,0 +1,86 @@
<script lang="ts">
import { t } from "../../libs/i18n";
import { EN_REF } from "../../libs/i18n/en_ref";
import type { GameName } from "../../libs/scoring";
import { SETTING } from "../../libs/sdk";
export let getTextFunction: (value: number) => string
export let defaultValue: number = 0
export let minValue: number = 0
export let maxValue: number = 0
export let type: string = "speed";
export let game: GameName;
export let disabled: boolean = false;
let value = defaultValue;
let rationalizedValue = defaultValue / maxValue;
async function submit() {
await SETTING.optionSet(game, type, value);
}
</script>
<div class="field range">
<div class="range-label">
{t(`settings.options.${game}.${type}` as keyof typeof EN_REF)} <!-- TODO: i18n -->
</div>
<div class="range-value">
<input
type="range" min={minValue} {disabled}
on:change={submit} max={maxValue} bind:value={value}
>
<div>
{getTextFunction(value)}
</div>
</div>
</div>
<style lang="sass">
@use "../../vars"
.field
width: 100%
.range-value
display: flex
align-items: center
div
min-width: 4rem
white-space: nowrap
display: flex
justify-content: center
input
flex: 100%
input
-webkit-appearance: none
width: 100%
height: 5px !important
outline: none
transition: opacity 200ms
padding: 4px
border-radius: 4px
opacity: 80%
background: linear-gradient(to right, transparent 0%, #caf1 10%, #caf1 90%, transparent 100%)
margin: 16px 0
&:hover
opacity: 100%
*:focus
outline: none
input::-webkit-slider-thumb
-webkit-appearance: none
appearance: none
width: 8px
height: 30px
background: vars.$c-main
border-radius: 8px
cursor: pointer
box-shadow: 0 0 2px 0 vars.$c-main
</style>
@@ -0,0 +1,304 @@
<script lang="ts">
import { slide, fade } from "svelte/transition";
import type { AquaNetUser, ConfirmProps } from "../../libs/generalTypes";
import { CARD, GAME, USER, type ExportGameName } from "../../libs/sdk";
import StatusOverlays from "../../components/StatusOverlays.svelte";
import Icon from "@iconify/svelte";
import { download, pfp } from "../../libs/ui";
import { t, ts } from "../../libs/i18n";
import Cropper from "svelte-easy-crop";
let me: AquaNetUser;
let error: string;
let submitting = ""
let loading = false;
let confirm: ConfirmProps | null = null;
const profileFields = [
[ 'displayName', t('settings.profile.name') ],
[ 'username', t('settings.profile.username') ],
[ 'password', t('settings.profile.password') ],
[ 'profileBio', t('settings.profile.bio') ],
] as const
// Fetch user data
const getMe = () => {
loading = true;
USER.me().then((m) => {
if (pfpCropURL != null) {
URL.revokeObjectURL(pfpCropURL);
pfpField.value = "";
pfpCropURL = null;
}; me = m;
loading = false;
}).catch(e => error = e.message)
}
getMe();
let changed: string[] = []
let pfpField: HTMLInputElement
let pfpCropURL: string | null = null;
let pfpCrop = { width: 0, height: 0, x: 0, y: 0 };
function submit(field: string, value: string) {
if (submitting) return
submitting = field
USER.setting(field, value).then(() => {
changed = changed.filter(c => c !== field)
}).catch(e => error = e.message).finally(() => submitting = "")
}
function uploadPfp() {
if (submitting) return
let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
const size = Math.round(Math.min(pfpCrop.width, pfpCrop.height, 1024));
canvas.width = size;
canvas.height = size;
let img = document.createElement("img");
img.onload = () => {
ctx?.drawImage(img, pfpCrop.x, pfpCrop.y, pfpCrop.width, pfpCrop.height, 0, 0, size, size);
canvas.toBlob(blob => {
if (!blob) return;
submitting = 'profilePicture'
USER.uploadPfp(blob as File).then(() => {
me.profilePicture = me.username
setTimeout(getMe, 200);
}).catch(e => error = e.message).finally(() => submitting = "")
});
}
img.src = pfpCropURL ?? "";
}
function handlePfpUpload(e: Event & { currentTarget: HTMLInputElement }) {
if (!e.target) return;
let files = e?.currentTarget?.files;
if (!files || files.length <= 0) return;
let file = files[0];
console.log(me.username, me);
switch (file.type) {
case "image/gif":
USER.uploadPfp(file).then(() => {
me.profilePicture = me.username
// reload
setTimeout(getMe, 200);
}).catch(e => error = e.message).finally(() => submitting = "")
break;
case "image/png":
case "image/jpeg":
case "image/webp":
pfpCropURL = URL.createObjectURL(file);
break;
default:
error = t("settings.profile.bad-format");
}
};
function logOut() {
localStorage.removeItem("token");
location.href = "/";
}
function requestAccountDeletion() {
if (submitting) return;
confirm = {
title: t('settings.profile.delete-confirm-title'),
message: t('settings.profile.delete-confirm-message'),
dangerous: true,
cancel: () => confirm = null,
confirm: deleteAccount,
};
}
async function deleteAccount() {
if (submitting) return;
submitting = "deleteAccount";
try {
const gameSummary = await CARD.userGames(me.username);
const games = (['mai2', 'chu3', 'ongeki', 'wacca', 'diva'] as ExportGameName[])
.filter(game => gameSummary[game] !== null);
const exports = await Promise.all(games.map(async game => ({
game,
data: await GAME.export(game),
})));
exports.forEach(({game, data}) => download(
JSON.stringify(data, null, 2),
`AquaDX_${game}_export_${me.username}.json`,
));
await USER.deleteAccount();
localStorage.removeItem("token");
location.href = "/";
} catch (e) {
error = (e as Error).message;
submitting = "";
}
}
const passwordAction = (node: HTMLInputElement, whether: boolean) => {
if (whether) node.type = 'password'
}
</script>
<StatusOverlays bind:confirm={confirm} {error} loading={!!submitting || loading} />
{#if !submitting && !error && me}
<div>
<div class="fields">
<div class="field">
<label for="profile-upload">{t('settings.profile.picture')}</label>
<div>
{#if me && me.profilePicture}
<div on:click={() => pfpField.click()} on:keydown={e => e.key === 'Enter' && pfpField.click()}
role="button" tabindex="0" class="clickable">
<img use:pfp={me} alt="Profile" />
</div>
{:else}
<button on:click={() => pfpField.click()}>
{t('settings.profile.upload-new')}
</button>
{/if}
</div>
<input id="profile-upload" type="file" accept="image/gif,image/png,image/jpeg,image/webp" hidden bind:this={pfpField}
on:change={handlePfpUpload} />
</div>
{#each profileFields as [field, name], i (field)}
<div class="field">
<label for={field}>{name}</label>
<div>
{#if field == "profileBio"}
<textarea id={field} bind:value={me[field]} on:input={() => changed = [...changed, field]} maxlength=255 placeholder={t('settings.profile.unset')}></textarea>
{:else}
<input id={field} type="text" use:passwordAction={field === 'password'}
bind:value={me[field]} on:input={() => changed = [...changed, field]}
placeholder={field === 'password' ? t('settings.profile.unchanged') : t('settings.profile.unset')}/>
{/if}
{#if changed.includes(field) && me[field]}
<button transition:slide={{axis: 'x'}} on:click={() => submit(field, me[field])}>
{#if submitting === field}
<Icon icon="line-md:loading-twotone-loop" />
{:else}
{t('settings.profile.save')}
{/if}
</button>
{/if}
</div>
</div>
{/each}
<div class="field m-t">
<div class="bool">
<input id="optOutOfLeaderboard" type="checkbox" bind:checked={me.optOutOfLeaderboard}
on:change={() => submit('optOutOfLeaderboard', me.optOutOfLeaderboard.toString())}/>
<label for="optOutOfLeaderboard">
<span class="name">{ts(`settings.fields.optOutOfLeaderboard.name`)}</span>
<span class="desc">{ts(`settings.fields.optOutOfLeaderboard.desc`)}</span>
</label>
</div>
</div>
<div class="field m-t">
<div class="bool">
<input id="hideCountry" type="checkbox" bind:checked={me.hideCountry}
on:change={() => submit('hideCountry', me.hideCountry.toString())}/>
<label for="hideCountry">
<span class="name">{ts(`settings.fields.hideCountry.name`)}</span>
<span class="desc">{ts(`settings.fields.hideCountry.desc`)}</span>
</label>
</div>
</div>
<div class="field m-t">
<div>
<button on:click={logOut}>{ts(`settings.profile.logout`)}</button>
</div>
</div>
<div class="field danger-zone m-t">
<span class="name">{t('settings.profile.delete-title')}</span>
<span class="desc">{t('settings.profile.delete-description')}</span>
<div>
<button class="error" on:click={requestAccountDeletion}>
<Icon icon="tabler:trash-x-filled" />
{t('settings.profile.delete')}
</button>
</div>
</div>
</div>
</div>
{/if}
{#if pfpCropURL != null}
<div class="overlay" transition:fade>
<div>
<div class="cropper-container">
<Cropper maxZoom={1e9} oncropcomplete={(e) => pfpCrop = e.pixels} image={pfpCropURL ?? "assets/imgs/no_profile.png"} aspect={1} cropShape="round"></Cropper>
</div>
<button on:click={uploadPfp}>
{t("settings.profile.save")}
</button>
<button on:click={getMe}>
{t("back")}
</button>
</div>
</div>
{/if}
<style lang="sass">
@use "../../vars"
.fields
display: flex
flex-direction: column
gap: 12px
.bool
display: flex
align-items: center
gap: 1rem
label
display: flex
flex-direction: column
.desc
opacity: 0.6
.field
display: flex
flex-direction: column
label
max-width: max-content
> div:not(.bool)
display: flex
align-items: center
gap: 1rem
margin-top: 0.5rem
> input, > textarea
flex: 1
img
max-width: 100px
max-height: 100px
border-radius: vars.$border-radius
object-fit: cover
aspect-ratio: 1
.danger-zone
margin-top: 1.5rem
padding-top: 1.5rem
border-top: 1px solid vars.$ov-lighter
.desc
opacity: 0.6
button
display: flex
align-items: center
gap: 0.5rem
.cropper-container
position: relative
width: 400px
aspect-ratio: 1
</style>
@@ -0,0 +1,9 @@
<script>
import { fade } from "svelte/transition";
import { FADE_IN, FADE_OUT } from "../../libs/config";
import GameSettingFields from "./GameSettingFields.svelte";
</script>
<div>
<GameSettingFields game="wacca"/>
</div>
@@ -0,0 +1,227 @@
<script lang="ts">
import { removeImg } from "../../../libs/ui";
import { DDS } from "../../../libs/userbox/dds"
import { ddsDB } from "../../../libs/userbox/userbox"
const DDSreader = new DDS(ddsDB);
export var chuniWear = 1100001;
export var chuniHead = 1200001;
export var chuniFace = 1300001;
export var chuniSkin = 1400001;
export var chuniItem = 1500001;
export var chuniFront = 1600001;
export var chuniBack = 1700001;
export var classPassthrough: string = ``;
</script>
<div class="chuni-penguin {classPassthrough}">
<div class="chuni-penguin-body">
<!-- Body -->
{#await DDSreader.getFileFromSheet(`avatarAccessory:${chuniSkin.toString().padStart(8, "0")}`, 0, 0, 256, 400, 0.75) then imageURL}
<img class="chuni-penguin-skin" src={imageURL} alt="Body" on:error={removeImg}>
{/await}
<!-- Face -->
{#await DDSreader.getFileFromSheet("surfboard:CHU_UI_Common_Avatar_face_00.dds", 0, 0, 225, 150, 0.75) then imageURL}
<img class="chuni-penguin-eyes chuni-penguin-accessory" src={imageURL} alt="Eyes" on:error={removeImg}>
{/await}
{#await DDSreader.getFileFromSheet("surfboard:CHU_UI_Common_Avatar_body_00.dds", 86, 103, 96, 43, 0.75) then imageURL}
<img class="chuni-penguin-beak chuni-penguin-accessory" src={imageURL} alt="Beak" on:error={removeImg}>
{/await}
{#if chuniItem != 1500001}
<!-- Arms (straight) -->
{#await DDSreader.getFileFromSheet("surfboard:CHU_UI_Common_Avatar_body_00.dds", 0, 0, 85, 160, 0.75) then imageURL}
<img class="chuni-penguin-arm-left chuni-penguin-arm" src={imageURL} alt="Left Arm" on:error={removeImg}/>
<div class="chuni-penguin-arm-left chuni-penguin-arm-type-1 chuni-penguin-arm">
{#await DDSreader.getFileFromSheet(`avatarAccessory:${chuniItem.toString().padStart(8, "0")}`, 0, 0, 200, 544, 0.75) then imageURL}
<img class="chuni-penguin-item chuni-penguin-accessory chuni-penguin-item-left" src={imageURL} alt="Item" on:error={removeImg}>
{/await}
</div>
{/await}
{#await DDSreader.getFileFromSheet("surfboard:CHU_UI_Common_Avatar_body_00.dds", 0, 0, 85, 160, 0.75) then imageURL}
<img class="chuni-penguin-arm-right chuni-penguin-arm" src={imageURL} alt="Right Arm" on:error={removeImg}>
<div class="chuni-penguin-arm-right chuni-penguin-arm-type-1 chuni-penguin-arm">
{#await DDSreader.getFileFromSheet(`avatarAccessory:${chuniItem.toString().padStart(8, "0")}`, 200, 0, 200, 544, 0.75) then imageURL}
<img class="chuni-penguin-item chuni-penguin-accessory chuni-penguin-item-right" src={imageURL} alt="Item" on:error={removeImg}>
{/await}
</div>
{/await}
{:else}
<!-- Arms (bent) -->
{#await DDSreader.getFileFromSheet("surfboard:CHU_UI_Common_Avatar_body_00.dds", 80, 0, 110, 100, 0.75) then imageURL}
<img class="chuni-penguin-arm-left chuni-penguin-arm chuni-penguin-arm-type-2" src={imageURL} alt="Left Arm" on:error={removeImg}>
{/await}
{#await DDSreader.getFileFromSheet("surfboard:CHU_UI_Common_Avatar_body_00.dds", 80, 0, 110, 100, 0.75) then imageURL}
<img class="chuni-penguin-arm-right chuni-penguin-arm chuni-penguin-arm-type-2" src={imageURL} alt="Right Arm" on:error={removeImg}>
{/await}
{/if}
<!-- Wear -->
{#await DDSreader.getFileScaled(`avatarAccessory:${chuniWear.toString().padStart(8, "0")}`, 0.75, `avatarAccessory:01100001`) then imageURL}
<img class="chuni-penguin-wear chuni-penguin-accessory" src={imageURL} alt="Wear" on:error={removeImg}>
{/await}
<!-- Head -->
{#await DDSreader.getFileScaled(`avatarAccessory:${chuniHead.toString().padStart(8, "0")}`, 0.75, `avatarAccessory:01200001`) then imageURL}
<img class="chuni-penguin-head chuni-penguin-accessory" src={imageURL} alt="Head" on:error={removeImg}>
{/await}
{#if chuniHead == 1200001}
<!-- If wearing original hat, add the feather -->
{#await DDSreader.getFileFromSheet("surfboard:CHU_UI_Common_Avatar_body_00.dds", 5, 160, 100, 150, 0.75) then imageURL}
<img class="chuni-penguin-head-3 chuni-penguin-accessory" src={imageURL} alt="Head3" on:error={removeImg}>
{/await}
{/if}
<!-- Oops, I realized just now that the thing on it's forehead applies to all hats. My mistake! -->
{#await DDSreader.getFileFromSheet("surfboard:CHU_UI_Common_Avatar_body_00.dds", 105, 153, 56, 58, 0.75) then imageURL}
<img class="chuni-penguin-head-2 chuni-penguin-accessory" src={imageURL} alt="Head2" on:error={removeImg}>
{/await}
<!-- Face (Accessory) -->
{#await DDSreader.getFileScaled(`avatarAccessory:${chuniFace.toString().padStart(8, "0")}`, 0.75, `avatarAccessory:01300001`) then imageURL}
<img class="chuni-penguin-face-accessory chuni-penguin-accessory" src={imageURL} alt="Face (Accessory)" on:error={removeImg}>
{/await}
<!-- Front -->
{#await DDSreader.getFileScaled(`avatarAccessory:${chuniFront.toString().padStart(8, "0")}`, 0.75) then imageURL}
<img class="chuni-penguin-front chuni-penguin-accessory" src={imageURL} alt="Front" on:error={removeImg}>
{/await}
<!-- Back -->
{#await DDSreader.getFileScaled(`avatarAccessory:${chuniBack.toString().padStart(8, "0")}`, 0.75) then imageURL}
<img class="chuni-penguin-back chuni-penguin-accessory" src={imageURL} alt="Back" on:error={removeImg}>
{/await}
</div>
<div class="chuni-penguin-feet">
<!-- Feet -->
{#await DDSreader.getFileFromSheet(`avatarAccessory:${chuniSkin.toString().padStart(8, "0")}`, 0, 410, 85, 80, 0.75) then imageURL}
<img src={imageURL} alt="Foot" on:error={removeImg}>
{/await}
{#await DDSreader.getFileFromSheet(`avatarAccessory:${chuniSkin.toString().padStart(8, "0")}`, 85, 410, 85, 80, 0.75) then imageURL}
<img src={imageURL} alt="Foot" on:error={removeImg}>
{/await}
</div>
</div>
<!-- Truly sorry for the horrors below -->
<style lang="sass">
@keyframes chuniPenguinBodyBob
0%
transform: translate(-50%, 5px) translate(0%, -50%)
50%
transform: translate(-50%, 0%) translate(0%, -50%)
100%
transform: translate(-50%, 5px) translate(0%, -50%)
@keyframes chuniPenguinArmLeft
0%
transform: translate(-50%, 0) rotate(-2deg)
50%
transform: translate(-50%, 0) rotate(2deg)
100%
transform: translate(-50%, 0) rotate(-2deg)
@keyframes chuniPenguinArmRight
0%
transform: translate(-50%, 0) scaleX(-1) rotate(-2deg)
50%
transform: translate(-50%, 0) scaleX(-1) rotate(2deg)
100%
transform: translate(-50%, 0) scaleX(-1) rotate(-2deg)
img
-webkit-user-drag: none
user-select: none
.chuni-penguin
height: 512px
aspect-ratio: 1/2
position: relative
pointer-events: none
z-index: 1
&.chuni-penguin-float
position: absolute
top: 50%
left: 50%
transform: translate(-50%, -50%)
.chuni-penguin-body, .chuni-penguin-feet
transform: translate(-50%, -50%)
position: absolute
left: 50%
.chuni-penguin-body
top: 50%
z-index: 1
animation: chuniPenguinBodyBob 1s infinite cubic-bezier(0.45, 0, 0.55, 1)
.chuni-penguin-feet
top: 80%
z-index: 0
width: 175px
display: flex
justify-content: center
img
margin-left: auto
margin-right: auto
.chuni-penguin-arm
transform-origin: 90% 10%
position: absolute
top: 40%
z-index: 0
&.chuni-penguin-arm-type-1
width: calc(85px * 0.75)
height: calc(160px * 0.75)
z-index: 2
&.chuni-penguin-arm-type-2
transform-origin: 40% 10%
z-index: 2
&.chuni-penguin-arm-left
left: 0%
transform: translate(-50%, 0)
animation: chuniPenguinArmLeft 1s infinite cubic-bezier(0.45, 0, 0.55, 1)
&.chuni-penguin-arm-type-2
left: 15%
&.chuni-penguin-arm-right
left: 72.5%
transform: translate(-50%, 0) scaleX(-1)
animation: chuniPenguinArmRight 1s infinite cubic-bezier(0.45, 0, 0.55, 1)
&.chuni-penguin-arm-type-2
left: 95%
.chuni-penguin-accessory
transform: translate(-50%, -50%)
position: absolute
top: 50%
left: 50%
.chuni-penguin-item
z-index: 1
top: 25%
left: 0
&.chuni-penguin-item-left
transform: translate(-50%, -50%) rotate(-15deg)
&.chuni-penguin-item-right
transform: translate(-50%, -50%) scaleX(-1) rotate(15deg)
.chuni-penguin-eyes
top: 22.5%
.chuni-penguin-beak
top: 29.5%
.chuni-penguin-wear
top: 60%
.chuni-penguin-head
top: 7.5%
z-index: 10
.chuni-penguin-head-2
top: 13.5%
.chuni-penguin-head-3
top: -12.5%
.chuni-penguin-face-accessory
top: 27.5%
.chuni-penguin-back
z-index: -1
</style>
@@ -0,0 +1,70 @@
<script lang="ts">
import { initializeDb } from "../../../libs/userbox/userbox"
import ChuniPenguinComponent from "./ChuniPenguin.svelte"
import ChuniUserplateComponent from "./ChuniUserplate.svelte"
import { type UserBox } from "../../../libs/generalTypes"
import { DATA, USERBOX } from "../../../libs/sdk"
import useLocalStorage from "../../../libs/hooks/useLocalStorage.svelte"
import { t } from "../../../libs/i18n"
/**
* This is a UserBox viewer on the Profile page (UserHome), added by raymond
* to view other user's penguins on their profile.
*/
export let game: string
export let username: string
export let error: string = ""
let USERBOX_ACTIVE = useLocalStorage("userboxNewProfile", false)
let USERBOX_INSTALLED = false
let userbox: UserBox
let allItems: Record<string, Record<string, { name: string }>> = {}
if (game == "chu3" && USERBOX_ACTIVE.value) {
indexedDB.databases().then(async (dbi) => {
let databaseExists = dbi.some(db => db.name == "userboxChusanDDS")
if (databaseExists) {
await initializeDb()
const profile = await USERBOX.getUserProfile(username).catch(_ => null)
if (!profile) return
userbox = profile
console.log(userbox)
allItems = await DATA.allItems('chu3').catch(_ => {
error = t("userbox.error.nodata")
}) as typeof allItems
USERBOX_INSTALLED = databaseExists
}
})
}
</script>
{#if USERBOX_ACTIVE.value && USERBOX_INSTALLED && game == "chu3"}
<div class="chuni-userbox-container">
<ChuniUserplateComponent chuniCharacter={userbox.characterId} chuniRating={userbox.playerRating / 100} chuniLevel={userbox.level.toString()}
chuniNameplate={userbox.nameplateId} chuniName={userbox.userName} chuniTrophyName={allItems.trophy[userbox.trophyId].name}></ChuniUserplateComponent>
<div class="chuni-penguin-container">
<ChuniPenguinComponent classPassthrough="chuni-penguin-float" chuniWear={userbox.avatarWear} chuniHead={userbox.avatarHead} chuniBack={userbox.avatarBack}
chuniFront={userbox.avatarFront} chuniFace={userbox.avatarFace} chuniItem={userbox.avatarItem}
chuniSkin={userbox.avatarSkin}></ChuniPenguinComponent>
</div>
</div>
{/if}
<style lang="sass">
.chuni-userbox-container
display: flex
align-items: center
justify-content: center
.chuni-penguin-container
height: 256px
aspect-ratio: 1
position: relative
@media (max-width: 1000px)
.chuni-userbox-container
flex-wrap: wrap
</style>
@@ -0,0 +1,192 @@
<script lang="ts">
import { DDS, type RGB } from "../../../libs/userbox/dds"
import { ddsDB } from "../../../libs/userbox/userbox"
const DDSreader = new DDS(ddsDB);
export var chuniLevel: string = "╳"
export var chuniName: string = "AquaDX"
export var chuniRating: number = 1.23
export var chuniNameplate: number = 1
export var chuniCharacter: number = 0
export var chuniTrophyName: string = "NEWCOMER"
export var chuniIsUserbox: boolean = false;
let ratingToString = (rating: number) => {
return rating.toFixed(2)
}
interface RatingRange {
min: number,
offset: number,
color?: RGB
};
// https://en.wikipedia.org/wiki/Chunithm#Rating
const ratingColors: RatingRange[] = ([
{min: 0.00, offset: 4, color: {r: 0, g: 191, b: 64}},
{min: 4.00, offset: 4, color: {r: 255, g: 111, b: 0}},
{min: 7.00, offset: 4, color: {r: 255, g: 64, b: 64}},
{min: 10.00, offset: 4, color: {r: 147, g: 38, b: 255}},
{min: 12.00, offset: 3},
{min: 13.25, offset: 2},
{min: 14.50, offset: 1},
{min: 15.25, offset: 0},
{min: 16.00, offset: 5}
]).filter(f => f.min <= chuniRating);
const ratingDigitOrder = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."]
const ratingColorData = (ratingColors[ratingColors.length - 1] ?? ratingColors[0]);
</script>
{#await DDSreader?.getFile(`nameplate:${chuniNameplate.toString().padStart(8, "0")}`, `nameplate:00000001`) then nameplateURL}
<!-- svelte-ignore a11y_click_events_have_key_events -->
<!-- svelte-ignore a11y_no_static_element_interactions -->
<div on:click class="chuni-nameplate" class:chuni-nameplate-clickable={chuniIsUserbox} style:background={`url(${nameplateURL})`}>
{#await DDSreader?.getFile(`characterThumbnail:${chuniCharacter.toString().padStart(6, "0")}`, `characterThumbnail:000000`) then characterThumbnailURL}
<img class="chuni-character" src={characterThumbnailURL} alt="Character">
{/await}
{#await DDSreader?.getFileFromSheet("surfboard:CHU_UI_title_rank_00_v10.dds", 5, 5 + (75 * 2), 595, 64) then trophyURL}
<div class="chuni-trophy" title={chuniTrophyName}>
{chuniTrophyName}
</div>
<img src={trophyURL} class="chuni-trophy-bg" alt="Trophy" title={chuniTrophyName}>
{/await}
<div class="chuni-user-info">
<div class="chuni-user-name">
<span>
Lv.
<span class="chuni-user-level">
{chuniLevel}
</span>
</span>
<span class="chuni-user-name-text">
{chuniName}
</span>
</div>
<div class={`chuni-user-rating color-${ratingColorData.color}`}>
{#await DDSreader?.getFileFromSheet("surfboard:CHU_UI_Common_01_v11.dds", 485, 5 + (28 * ratingColorData.offset), 62, 15, undefined, ratingColorData.color) then url}
{#if url}
<img src={url} alt="Rating">
<span class="chuni-user-rating-number">
{#each ratingToString(chuniRating).split("") as digit}
{#await DDSreader?.getFileFromSheet("surfboard:CHU_UI_Common_01_v11.dds", 552 + (24 * (ratingDigitOrder.indexOf(digit) ?? 0)), 1 + (28 * ratingColorData.offset), 16, 20, undefined, ratingColorData.color) then url}
<img src={url} alt="Rating Digit">
{/await}
{/each}
</span>
{:else}
RATING
<span class="chuni-user-rating-number">
{ratingToString(chuniRating)}
</span>
{/if}
{/await}
</div>
</div>
</div>
{/await}
<style lang="sass">
@use "../../../vars"
@font-face
font-family: "Gothic A1"
src: url("/assets/fonts/GothicA1.woff2")
.chuni-nameplate
width: 576px
height: 228px
position: relative
font-size: 16px
/* Overlap penguin avatar when put side to side */
z-index: 1
&.chuni-nameplate-clickable
cursor: pointer
.chuni-trophy
width: 390px
height: 45px
background-position: center
background-size: cover
color: black
display: flex
justify-content: center
align-items: center
position: absolute
right: 25px
top: 40px
font-size: 1.15em
font-family: "Gothic A1", sans-serif
font-weight: bold
overflow-x: hidden
white-space: nowrap
text-overflow: ellipsis
z-index: 1
text-shadow: 0 1px white
margin: 0 10px
img.chuni-trophy-bg
width: 410px
height: 45px
position: absolute
top: 40px
right: 25px
z-index: -1
.chuni-character
position: absolute
top: 87px
right: 25px
width: 82px
aspect-ratio: 1
box-shadow: 0 0 1px 1px white
background: #efefef
.chuni-user-info
height: 82px
width: 320px
position: absolute
top: 87px
right: 110px
background: #fff9
border-radius: 1px
box-shadow: 0 0 1px 1px #ccc
display: flex
flex-direction: column
.chuni-user-name, .chuni-user-rating
margin: 0 4px
display: flex
align-items: center
color: black
font-family: "Gothic A1", sans-serif
font-weight: bold
.chuni-user-name
flex: 1 0 65%
box-shadow: 0 1px 0 #ccc
white-space: nowrap
text-overflow: ellipsis
.chuni-user-level
font-size: 1.5em
margin-left: 10px
.chuni-user-name-text
margin-left: auto
font-size: 2em
.chuni-user-rating
flex: 1 0 35%
font-size: 0.875em
text-shadow: #333 1px 1px, #333 1px -1px, #333 -1px 1px, #333 -1px -1px
color: #fff
.chuni-user-rating-number
font-size: 1.5em
margin-left: 10px
</style>
+43
View File
@@ -0,0 +1,43 @@
<script lang="ts">
import { fade } from "svelte/transition";
import { t } from "../../libs/i18n";
import { DISCORD_INVITE } from "../../libs/config";
export let error: string;
</script>
<div class="overlay" transition:fade>
<div>
<h2 class="error">{t('status.error')}</h2>
<span class="detail">{error}</span>
<a class="hint" href="/support">{t("status.error.hint")}</a>
<div class="actions">
<button on:click={() => location.reload()} class="error">
{t('action.refresh')}
</button>
<button on:click={() => location.href = "/home"} class="error">
{t('action.home')}
</button>
</div>
</div>
</div>
<style lang="sass">
.actions
display: flex
gap: 0.5em
button
width: 100%
.detail
white-space: pre-line
line-height: 1.2
.hint
font-size: 0.875em
.overlay > div
min-width: 15rem
max-width: 25rem
</style>
@@ -0,0 +1,47 @@
<script lang="ts">
import { slide } from "svelte/transition";
import { ts } from "../../libs/i18n";
import InputWithButton from "./InputWithButton.svelte";
export let field: {key: string, value: any, type: string, changed?: boolean};
export let callback: () => Promise<boolean>;
</script>
<div class="field {field.type.toLowerCase()}">
{#if field.type.toLowerCase() === "boolean"}
<input id={field.key} type="checkbox" bind:checked={field.value} on:change={callback}/>
<label for={field.key}>
<span class="name">{ts(`settings.fields.${field.key}.name`)}</span>
<span class="desc">{ts(`settings.fields.${field.key}.desc`)}</span>
</label>
{/if}
{#if field.type.toLowerCase() === "string"}
<label for={field.key}>
<span class="name">{ts(`settings.fields.${field.key}.name`)}</span>
<span class="desc">{ts(`settings.fields.${field.key}.desc`)}</span>
</label>
<InputWithButton bind:field={field} callback={callback}/>
{/if}
</div>
<style lang="sass">
.field.string
flex-direction: column
align-items: flex-start
gap: 0.5rem
.field.boolean
align-items: center
gap: 1rem
.field
display: flex
label
display: flex
flex-direction: column
max-width: max-content
.desc
opacity: 0.6
</style>
@@ -0,0 +1,29 @@
<script lang="ts">
import { slide } from "svelte/transition";
import { ts } from "../../libs/i18n";
export let field: {key: string, value: string, changed?: boolean};
export let callback: () => Promise<boolean>;
</script>
<div class="field">
<input id={field.key} type="text" bind:value={field.value}
on:input={() => field.changed = true}/>
{#if field.changed}
<button on:click={async () => { if (await callback()) field.changed = false } }
transition:slide={{axis: 'x'}}>
{ts('settings.profile.save')}
</button>
{/if}
</div>
<style lang="sass">
.field
display: flex
align-items: center
gap: 1rem
width: 100%
input
flex: 1
</style>
+30
View File
@@ -0,0 +1,30 @@
<script lang="ts">
import Icon from '@iconify/svelte';
import { fade } from 'svelte/transition'
</script>
<div class="overlay loading" transition:fade>
<Icon class="icon" icon="svg-spinners:pulse-2"/>
<span><span>LOADING</span></span>
</div>
<style lang="sass">
.loading.overlay
font-size: 28rem
:global(.icon)
opacity: 0.5
> span
position: absolute
inset: 0
display: flex
justify-content: center
align-items: center
background: transparent
letter-spacing: 20px
margin-left: 20px
font-size: 1.5rem
</style>
+35
View File
@@ -0,0 +1,35 @@
// card handler. for dealing user QR scan.
// this will assumes that the link of the generated QR code in [access code]
// page has been altered by modder to link to custom
import { ACCESSCODE_QKEY } from "./config";
const query = new URLSearchParams(location.hash.slice(1));
const lsKey = "acurl"
export const url_has = (): boolean => query.has(ACCESSCODE_QKEY);
export const get = (): string => localStorage.getItem(lsKey) || "";
export const has = (): boolean => !!localStorage.getItem(lsKey);
export const clear = (): void => localStorage.removeItem(lsKey);
export function check() {
if (!url_has()) return
console.log("Found access code in URL. Saving.")
localStorage.setItem(lsKey, query.get(ACCESSCODE_QKEY) || "")
}
export function preview() {
const card = get()
const masked =
card.slice(0, 4) +
"x".repeat(card.length - 4);
return masked.match(/.{1,4}/g)?.join(" ");
}
export function previewR() {
const card = get()
return card.match(/.{1,4}/g)?.join(" ");
}
+11
View File
@@ -0,0 +1,11 @@
import { writable } from "svelte/store"
export const ANNOUNCEMENT = writable('')
// This task must not bother the existing one. Keep it async in the background instead
void (async () => {
let r = await fetch("/announcement.txt")
if (!r.ok) return;
ANNOUNCEMENT.set(await r.text())
})()
+49
View File
@@ -0,0 +1,49 @@
import type { ChusanMatchingOption } from "./generalTypes"
export const AQUA_HOST = import.meta.env.VITE_AQUA_HOST
export const DATA_HOST = import.meta.env.VITE_DATA_HOST
// This will be displayed for users to connect from the client
export const AQUA_CONNECTION = import.meta.env.VITE_AQUA_CONNECTION
export const TURNSTILE_SITE_KEY = import.meta.env.VITE_TURNSTILE_SITE_KEY
export const DISCORD_INVITE = import.meta.env.VITE_DISCORD_INVITE
export const TELEGRAM_INVITE = import.meta.env.VITE_TELEGRAM_INVITE
export const QQ_INVITE = import.meta.env.VITE_QQ_INVITE
export const GITHUB_REPOSITORY = import.meta.env.VITE_GITHUB_REPOSITORY
// UI
export const FADE_OUT = { duration: 200 }
export const FADE_IN = { delay: 400 }
export const DEFAULT_PFP = '/assets/imgs/no_profile.png'
// Key name for access key scanned from QR code
export const ACCESSCODE_QKEY = import.meta.env.VITE_ACCESSCODE_QKEY || "accesskey"
export const USERBOX_DEFAULT_URL = import.meta.env.VITE_USERBOX_DEFAULT_URL || ""
export const HAS_USERBOX_ASSETS = true
export const DEFAULT_GAME = import.meta.env.VITE_DEFAULT_GAME || "mai2"
// Meow meow meow
// Matching servers
export const CHU3_MATCHINGS: ChusanMatchingOption[] = [
{
name: "Yukiotoko",
ui: "https://yukiotoko.metatable.sh/",
guide: "https://github.com/MewoLab/AquaDX/blob/v1-dev/docs/chu3-national-matching.md",
matching: "http://yukiotoko.chara.lol:9004/",
reflector: "http://yukiotoko.chara.lol:50201/",
coop: ["Missless", "CozyNet", "GMG"]
},
{
name: "林国对战",
ui: "https://chu3-match.sega.ink/rooms",
guide: "https://performai.evilleaker.com/manual/games/chunithm/national_battle/",
matching: "https://chu3-match.sega.ink/",
reflector: "http://reflector.naominet.live:18080/",
coop: ["RinNET", "MysteriaNET"],
},
]
+176
View File
@@ -0,0 +1,176 @@
export type Dict = Record<string, any>
export interface TrendEntry {
date: string
rating: number
plays: number
}
export interface Card {
luid: string
registerTime: string
accessTime: string
linked: boolean
isGhost: boolean
}
export interface AquaNetUser {
username: string
email: string
displayName: string
country: string
region:string
lastLogin: number
regTime: number
profileLocation: string
profileBio: string
profilePicture: string
emailConfirmed: boolean
ghostCard: Card
cards: Card[]
computedName: string,
password: string,
optOutOfLeaderboard: boolean,
canModifyKeychips: boolean,
hideCountry: boolean,
displayCandidates: boolean
}
export interface CardSummaryGame {
name: string
rating: number
lastLogin: string
}
export interface CardSummary {
mai2: CardSummaryGame | null
chu3: CardSummaryGame | null
ongeki: CardSummaryGame | null
diva: CardSummaryGame | null
wacca: CardSummaryGame | null
}
export interface ConfirmProps {
title: string
message: string
confirm?: () => void
cancel?: () => void
dangerous?: boolean
}
export interface GenericGamePlaylog {
musicId: number
level: number
playDate: string
achievement: number
maxCombo: number
totalCombo: number
afterRating: number
beforeRating: number
isFullCombo?: boolean
isAllPerfect?: boolean
isAllJustice?: boolean
}
export interface GenericRanking {
name: string
username: string
rank: number
accuracy: number
rating: number
fullCombo: number
allPerfect: number
lastSeen: string
}
export interface RankCount {
name: string
count: number
}
export interface GenericGameSummary {
name: string
iconId: number
aquaUser?: AquaNetUser
serverRank: string
accuracy: number
rating: number
ratingHighest: number,
ratingNotGeneric: boolean,
ranks: RankCount[]
detailedRanks: { [key: number]: { [key: string]: number } }
maxCombo: number
fullCombo: number
allPerfect: number
totalScore: number
plays: number
totalPlayTime: number
joined: string
lastSeen: string
lastVersion: string
ratingComposition: { [key: string]: any }
recent: GenericGamePlaylog[]
rival?: boolean,
favorites?: number[]
}
export interface MusicMeta {
name: string,
composer: string,
bpm: number,
ver: number,
notes: {
lv: number
designer: string
lv_id: number
notes: number
}[],
worldsEndTag?: string
worldsEndStars?: number
}
export type AllMusic = { [key: string]: MusicMeta }
export interface GameOption {
key: string
value: any
type: 'Boolean' | 'String'
game: string
changed?: boolean
}
export type GameUserOption = Record<string, number>
export interface UserItem { itemKind: number, itemId: number, stock: number }
export interface UserBox {
userName: string,
nameplateId: number,
frameId: number,
characterId: number,
trophyId: number,
trophyIdSub1: number,
trophyIdSub2: number,
mapIconId: number,
voiceId: number,
avatarWear: number,
avatarHead: number,
avatarFace: number,
avatarSkin: number,
avatarItem: number,
avatarFront: number,
avatarBack: number,
level: number
playerRating: number
}
export interface ChusanMatchingOption {
name: string
ui: string
guide: string
matching: string
reflector: string
coop: string[]
}
@@ -0,0 +1,24 @@
import { onMount } from 'svelte';
const useLocalStorage = <T>(key: string, initialValue: T) => {
let value = initialValue;
const currentValue = localStorage.getItem(key);
if (currentValue) value = JSON.parse(currentValue);
const save = () => {
localStorage.setItem(key, JSON.stringify(value));
};
return {
get value() {
return value;
},
set value(v: T) {
value = v;
save();
},
};
};
export default useLocalStorage;
+93
View File
@@ -0,0 +1,93 @@
import { EN_REF, type LocalizedMessages } from "./i18n/en_ref";
import { ZH } from "./i18n/zh";
import type { GameName } from "./scoring";
import zhCountires from "./i18n/zh_countries.json"
import enCountires from "./i18n/en_countries.json"
type Lang = 'en' | 'zh'
const msgs: Record<Lang, LocalizedMessages> = {
en: EN_REF,
zh: ZH
}
const countries: Record<Lang, typeof enCountires> = {
en: enCountires,
zh: zhCountires
}
let lang: Lang = 'en'
// Infer language from browser
if (navigator.language.startsWith('zh')) {
lang = 'zh'
}
export function ts(key: string, variables?: { [index: string]: any }) {
return t(key as keyof LocalizedMessages, variables)
}
/**
* Load the translation for the given key
*
* TODO: Check for translation completion on build
*
* @param key
* @param variables
*/
export function t(key: keyof LocalizedMessages, variables?: { [index: string]: any }): string {
// Check if the key exists
let msg = msgs[lang][key]
if (!msg) {
// Check if the key exists in English
if (!(msg = msgs.en[key])) {
msg = key
console.error(`ERROR!! Missing translation reference entry (English) for ${key}`)
}
else console.warn(`Missing translation for ${key} in ${lang}`)
}
// Replace variables
if (variables) {
return msg.replace(/\${(.*?)}/g, (_: string, v: string | number) => variables[v] + "")
}
return msg
}
Object.assign(window, { t })
export function getCountryName(code: keyof typeof enCountires) {
return countries[lang][code]
}
export const GAME_TITLE: { [key in GameName]: string } =
{chu3: t("game.chu3"), mai2: t("game.mai2"), ongeki: t("game.ongeki"), wacca: t("game.wacca")}
/**
* Converts a two-letter country code to its corresponding flag emoji.
*
* The Unicode flag emoji is represented by two Regional Indicator Symbols.
* Each letter in the country code is transformed into a Regional Indicator Symbol
* by adding its alphabetical position (A = 0, B = 1, etc.) to the base code point U+1F1E6.
*
* @param countryCode - A two-letter ISO country code (e.g., "US", "GB").
* @returns The corresponding flag emoji if the country code is valid; otherwise, an empty string.
*/
export function countryCodeToEmoji(countryCode: string): string {
if (!countryCode) return ""
if (countryCode.length !== 2) return ""
// Convert the country code to uppercase to standardize it
const code = countryCode.toUpperCase();
// The base code point for Regional Indicator Symbol Letter A is 0x1F1E6.
const OFFSET = 0x1F1E6;
const firstCharCode = code.charCodeAt(0);
const secondCharCode = code.charCodeAt(1);
// 'A' has a char code of 65.
const firstIndicator = OFFSET + (firstCharCode - 65);
const secondIndicator = OFFSET + (secondCharCode - 65);
// Create and return the flag emoji string
return String.fromCodePoint(firstIndicator, secondIndicator);
}
+248
View File
@@ -0,0 +1,248 @@
{
"AF": "Afghanistan",
"AX": "Aland Islands",
"AL": "Albania",
"DZ": "Algeria",
"AS": "American Samoa",
"AD": "Andorra",
"AO": "Angola",
"AI": "Anguilla",
"AQ": "Antarctica",
"AG": "Antigua And Barbuda",
"AR": "Argentina",
"AM": "Armenia",
"AW": "Aruba",
"AU": "Australia",
"AT": "Austria",
"AZ": "Azerbaijan",
"BS": "Bahamas",
"BH": "Bahrain",
"BD": "Bangladesh",
"BB": "Barbados",
"BY": "Belarus",
"BE": "Belgium",
"BZ": "Belize",
"BJ": "Benin",
"BM": "Bermuda",
"BT": "Bhutan",
"BO": "Bolivia",
"BA": "Bosnia And Herzegovina",
"BW": "Botswana",
"BV": "Bouvet Island",
"BR": "Brazil",
"IO": "British Indian Ocean Territory",
"BN": "Brunei Darussalam",
"BG": "Bulgaria",
"BF": "Burkina Faso",
"BI": "Burundi",
"KH": "Cambodia",
"CM": "Cameroon",
"CA": "Canada",
"CV": "Cape Verde",
"KY": "Cayman Islands",
"CF": "Central African Republic",
"TD": "Chad",
"CL": "Chile",
"CN": "China",
"CX": "Christmas Island",
"CC": "Cocos (Keeling) Islands",
"CO": "Colombia",
"KM": "Comoros",
"CG": "Congo",
"CD": "Congo, Democratic Republic",
"CK": "Cook Islands",
"CR": "Costa Rica",
"CI": "Cote D\"Ivoire",
"HR": "Croatia",
"CU": "Cuba",
"CY": "Cyprus",
"CZ": "Czech Republic",
"DK": "Denmark",
"DJ": "Djibouti",
"DM": "Dominica",
"DO": "Dominican Republic",
"EC": "Ecuador",
"EG": "Egypt",
"SV": "El Salvador",
"GQ": "Equatorial Guinea",
"ER": "Eritrea",
"EE": "Estonia",
"ET": "Ethiopia",
"FK": "Falkland Islands (Malvinas)",
"FO": "Faroe Islands",
"FJ": "Fiji",
"FI": "Finland",
"FR": "France",
"GF": "French Guiana",
"PF": "French Polynesia",
"TF": "French Southern Territories",
"GA": "Gabon",
"GM": "Gambia",
"GE": "Georgia",
"DE": "Germany",
"GH": "Ghana",
"GI": "Gibraltar",
"GR": "Greece",
"GL": "Greenland",
"GD": "Grenada",
"GP": "Guadeloupe",
"GU": "Guam",
"GT": "Guatemala",
"GG": "Guernsey",
"GN": "Guinea",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HT": "Haiti",
"HM": "Heard Island & Mcdonald Islands",
"VA": "Holy See (Vatican City State)",
"HN": "Honduras",
"HK": "Hong Kong",
"HU": "Hungary",
"IS": "Iceland",
"IN": "India",
"ID": "Indonesia",
"IR": "Iran, Islamic Republic Of",
"IQ": "Iraq",
"IE": "Ireland",
"IM": "Isle Of Man",
"IL": "Israel",
"IT": "Italy",
"JM": "Jamaica",
"JP": "Japan",
"JE": "Jersey",
"JO": "Jordan",
"KZ": "Kazakhstan",
"KE": "Kenya",
"KI": "Kiribati",
"KR": "Korea",
"KP": "North Korea",
"KW": "Kuwait",
"KG": "Kyrgyzstan",
"LA": "Lao People\"s Democratic Republic",
"LV": "Latvia",
"LB": "Lebanon",
"LS": "Lesotho",
"LR": "Liberia",
"LY": "Libyan Arab Jamahiriya",
"LI": "Liechtenstein",
"LT": "Lithuania",
"LU": "Luxembourg",
"MO": "Macao",
"MK": "Macedonia",
"MG": "Madagascar",
"MW": "Malawi",
"MY": "Malaysia",
"MV": "Maldives",
"ML": "Mali",
"MT": "Malta",
"MH": "Marshall Islands",
"MQ": "Martinique",
"MR": "Mauritania",
"MU": "Mauritius",
"YT": "Mayotte",
"MX": "Mexico",
"FM": "Micronesia, Federated States Of",
"MD": "Moldova",
"MC": "Monaco",
"MN": "Mongolia",
"ME": "Montenegro",
"MS": "Montserrat",
"MA": "Morocco",
"MZ": "Mozambique",
"MM": "Myanmar",
"NA": "Namibia",
"NR": "Nauru",
"NP": "Nepal",
"NL": "Netherlands",
"AN": "Netherlands Antilles",
"NC": "New Caledonia",
"NZ": "New Zealand",
"NI": "Nicaragua",
"NE": "Niger",
"NG": "Nigeria",
"NU": "Niue",
"NF": "Norfolk Island",
"MP": "Northern Mariana Islands",
"NO": "Norway",
"OM": "Oman",
"PK": "Pakistan",
"PW": "Palau",
"PS": "Palestinian Territory, Occupied",
"PA": "Panama",
"PG": "Papua New Guinea",
"PY": "Paraguay",
"PE": "Peru",
"PH": "Philippines",
"PN": "Pitcairn",
"PL": "Poland",
"PT": "Portugal",
"PR": "Puerto Rico",
"QA": "Qatar",
"RE": "Reunion",
"RO": "Romania",
"RU": "Russian Federation",
"RW": "Rwanda",
"BL": "Saint Barthelemy",
"SH": "Saint Helena",
"KN": "Saint Kitts And Nevis",
"LC": "Saint Lucia",
"MF": "Saint Martin",
"PM": "Saint Pierre And Miquelon",
"VC": "Saint Vincent And Grenadines",
"WS": "Samoa",
"SM": "San Marino",
"ST": "Sao Tome And Principe",
"SA": "Saudi Arabia",
"SN": "Senegal",
"RS": "Serbia",
"SC": "Seychelles",
"SL": "Sierra Leone",
"SG": "Singapore",
"SK": "Slovakia",
"SI": "Slovenia",
"SB": "Solomon Islands",
"SO": "Somalia",
"ZA": "South Africa",
"GS": "South Georgia And Sandwich Isl.",
"ES": "Spain",
"LK": "Sri Lanka",
"SD": "Sudan",
"SR": "Suriname",
"SJ": "Svalbard And Jan Mayen",
"SZ": "Swaziland",
"SE": "Sweden",
"CH": "Switzerland",
"SY": "Syrian Arab Republic",
"TW": "Taiwan",
"TJ": "Tajikistan",
"TZ": "Tanzania",
"TH": "Thailand",
"TL": "Timor-Leste",
"TG": "Togo",
"TK": "Tokelau",
"TO": "Tonga",
"TT": "Trinidad And Tobago",
"TN": "Tunisia",
"TR": "Turkey",
"TM": "Turkmenistan",
"TC": "Turks And Caicos Islands",
"TV": "Tuvalu",
"UG": "Uganda",
"UA": "Ukraine",
"AE": "United Arab Emirates",
"GB": "United Kingdom",
"US": "United States",
"UM": "United States Outlying Islands",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VU": "Vanuatu",
"VE": "Venezuela",
"VN": "Vietnam",
"VG": "Virgin Islands, British",
"VI": "Virgin Islands, U.S.",
"WF": "Wallis And Futuna",
"EH": "Western Sahara",
"YE": "Yemen",
"ZM": "Zambia",
"ZW": "Zimbabwe"
}
+398
View File
@@ -0,0 +1,398 @@
export const EN_REF_USER = {
'UserHome.ServerRank': 'Server Rank',
'UserHome.DXRating': 'DX Rating',
'UserHome.Rating': 'Rating',
'UserHome.HighestDXRating': 'Peak DX Rating',
'UserHome.HighestRating': 'Peak Rating',
'UserHome.Statistics': 'Statistics',
'UserHome.Accuracy': 'Accuracy',
'UserHome.MaxCombo': 'Max Combo',
'UserHome.FullCombo': 'Full Combo',
'UserHome.AllPerfect': 'All Perfect',
'UserHome.DXScore': 'DX Score',
'UserHome.Score': 'Score',
'UserHome.PlayActivity': ' Play Activity',
'UserHome.Plays': 'Plays',
'UserHome.PlayTime': 'Play Time',
'UserHome.FirstSeen': 'First Seen',
'UserHome.LastSeen': 'Last Seen',
'UserHome.Version': 'Last Version',
'UserHome.RecentScores': 'Recent Scores',
'UserHome.NoData': 'No data in the past ${days} days',
'UserHome.UnknownSong': '(unknown song)',
'UserHome.Settings': 'Settings',
'UserHome.NoValidGame': 'The user hasn\'t played any game yet.',
'UserHome.ShowRanksDetails': 'Click to show details',
'UserHome.RankDetail.Title': 'Achievement Details',
'UserHome.RankDetail.Level': 'Level',
'UserHome.B50': 'B50',
'UserHome.RatingComposition.Best': 'Best ${n}',
'UserHome.RatingComposition.New': 'New ${n}',
'UserHome.RatingComposition.BestCandidates': 'Best ${n} Candidates',
'UserHome.RatingComposition.NewCandidates': 'New ${n} Candidates',
'UserHome.RatingComposition.Platinum': 'Platinum ${n}',
'UserHome.RatingComposition.PlatinumCandidates': 'Platinum ${n} Candidates',
'UserHome.RatingComposition.Recent': 'Recent ${n}',
'UserHome.AddRival': "Add to Rival",
'UserHome.RemoveRival': "Remove from Rival",
'UserHome.InvalidGame': "Game ${game} is not supported on the web UI yet. We only support maimai, chunithm, wacca, and ongeki for now.",
'UserHome.ShowMoreRecent': 'Show more',
'UserHome.FavoriteSongs': 'Favorite Songs'
}
export const EN_REF_Welcome = {
'back': 'Back',
'email': 'Email',
'password': 'Password',
'new-password': 'New password',
'username': 'Username',
'welcome.btn-login': 'Log in',
'welcome.btn-signup': 'Sign up',
'welcome.btn-reset-password': 'Forgot password?',
'welcome.btn-submit-reset-password': 'Send reset link',
'welcome.btn-submit-new-password': 'Change password',
'welcome.email-missing': 'Email is required',
'welcome.password-missing': 'Password is required',
'welcome.username-missing': 'Username/email is required',
'welcome.email-password-missing': 'Email and password are required',
'welcome.waiting-turnstile': 'Waiting for Turnstile to verify your network environment...',
'welcome.turnstile-error': 'Error verifying your network environment. Please turn off your VPN and try again.',
'welcome.turnstile-timeout': 'Network verification timed out. Please try again.',
'welcome.verification-sent': 'A verification email has been sent to ${email}. Please check your inbox!',
'welcome.reset-password-sent': 'A password reset email has been sent to ${email}. Please check your inbox!',
'welcome.verify-state-0': 'You haven\'t verified your email. A verification email has been sent to your inbox just now. Please check your inbox!',
'welcome.verify-state-1': 'You haven\'t verified your email. You have requested too many emails, please try again later.',
'welcome.verify-state-2': 'You haven\'t verified your email. We just sent you another verification email. Please check your inbox!',
'welcome.reset-state-0': 'A reset email has been sent to your inbox just now. Please check your inbox!',
'welcome.reset-state-1': 'Too many emails have been sent. Another will not be sent.',
'welcome.verifying': 'Verifying your email... please wait.',
'welcome.verified': 'Your email has been verified! You can now log in now.',
'welcome.verification-failed': 'Verification failed: ${message}. Please try again.',
'welcome.password-reset-done': 'Your password has been updated! Please log back in.',
'welcome.login_link': 'Login / register to link your card.'
}
export const EN_REF_LEADERBOARD = {
'Leaderboard.Title': 'Server Leaderboard',
'Leaderboard.Rank': 'Rank',
'Leaderboard.Rating': 'Rating',
'Leaderboard.LegacyRating': 'Legacy Rating',
'Leaderboard.ModernRating': 'Modern Rating',
'Leaderboard.Accuracy': 'Accuracy',
'Leaderboard.FC': 'FC',
'Leaderboard.AP': 'AP',
'Leaderboard.Loading': "Loading..."
}
export const EN_REF_GENERAL = {
'game.mai2': 'Mai',
'game.chu3': 'Chuni',
'game.ongeki': 'Ongeki',
'game.wacca': 'Wacca',
'status.error': 'Error',
'status.error.hint': 'Support',
'status.detail': 'Detail: ${detail}',
'action.refresh': 'Retry',
'action.cancel': 'Cancel',
'action.confirm': 'Confirm',
'action.home': 'Home',
'navigation.profile': 'Profile',
'navigation.maps': 'Maps',
'navigation.home': 'Home',
'navigation.rankings': 'Rankings',
'navigation.notice': 'Notice',
'loading': `Please wait...`,
'404': 'Page not found (${pathname}). If this is in error, please report it via an appropriate support channel.'
}
export const EN_REF_HOME = {
'home.nav.portal': 'Portal',
'home.nav.link-card': 'Link Card',
'home.nav.game-setup': 'Game Setup',
'home.nav.support': 'Support',
'home.user-profile': 'Profile',
'home.rankings': 'Rankings',
'home.settings': 'Settings',
'home.manage-cards': 'Manage Cards',
'home.manage-cards-description': 'Link, unlink, and manage your cards.',
'home.link-card': 'Link Card',
'home.link-cards-description': 'Link your Amusement IC / Aime card to play games.',
'home.join-community': 'Community & Support',
'home.join-community-description': 'Join our community for support and chatting with other players.',
'home.setup': 'Setup Network Connection',
'home.setup-description': 'Configure a game to connect to our servers.',
'home.import': 'Import Player Data',
'home.import-description': 'Add player data from a separate instance.',
'home.linkcard.cards': 'Your Cards',
'home.linkcard.description': 'Access cards that are currently linked',
'home.linkcard.account-card': 'Account Card',
'home.linkcard.registered': 'Registered',
'home.linkcard.lastused': 'Last used',
'home.linkcard.enter-info': 'Please enter either an Access Code or a Serial Number in the following boxes. Dragging and dropping aime.txt or felica.txt is also supported.',
'home.linkcard.access-code': 'If you have an Access Code, enter it below. Access Codes can be obtained from the back of your card or from the title screen of your game (press the Access Code button and card in). If you do not have an Access Code, you may generate one.',
'home.linkcard.enter-sn': 'If you have a Serial Number, enter it below. Serial Numbers can be obtained via most smartphones (NFC Tools: <a href="https://play.google.com/store/apps/details?id=com.wakdev.wdnfc">Android</a> / <a href="https://apps.apple.com/us/app/nfc-tools/id1252962749">Apple</a>) or a card reader.',
'home.linkcard.kdx-notice': 'If you are playing KanadeDX, please enter the virtual card number here (can be found in Settings > Card Number).',
'home.linkcard.link': 'Link',
'home.linkcard.data-conflict': 'Data Conflict',
'home.linkcard.name': 'Name',
'home.linkcard.rating': 'Rating',
'home.linkcard.last-login': 'Last Login',
'home.linkcard.linked-own': 'This card is already linked to your account',
'home.linkcard.linked-another': 'This card is already linked to another account',
'home.linkcard.notfound': 'Card not found',
'home.linkcard.unlink': 'Unlink Card',
'home.linkcard.unlink-notice': 'Are you sure you want to unlink this card?',
'home.linkcard.felica-ac-warning': 'This Access Code is of a FeliCa AIC card.\nIf you are logging in with a physical card (not aime.txt emulation), unlike the official server, you need to bind the FeliCa SN of the card (or the 00-prefixed card number shown in the game) instead of this code.\nIf you are logging in with aime.txt emulation, please ignore this warning and proceed.',
'home.linkcard.card-security-warning': 'Access Cards give full access to your games\' player data. Do not share your card information with anyone.',
'home.community.discord': 'Discord',
'home.community.telegram': 'Telegram (Chinese)',
'home.community.qq': 'QQ (Chinese)',
'home.community.github': 'GitHub Repository',
'home.import.unknown-game': 'Unknown game type. Currently only Mai and Chuni are supported for importing.',
'home.import.new-data': 'Data to import',
'home.import.data-conflict': 'Proceed will override your current data',
}
export const EN_REF_SETUP = {
'setup.welcome': `Welcome! If you have a game set up, please follow the instructions below to set up the connection with AquaDX.`,
'setup.keychip-warning': `Your keychip(s) are linked to your account and should be kept secure.`,
'setup.steps.one': `Pick a method of setting up network communications. Some browsers may not be able to do automatic setup.`,
'setup.steps.two': `Link your Aime card to your AquaDX account using the <a href="/cards">Cards</a> page via it's access code or serial number.`,
'setup.steps.three': `Start the game. Upon reaching the title screen, the network icon in the corner should now show green instead of grey.`,
'setup.support-info': `If you need additional assistance, feel free to make an inquiry in a <a href="/support">support channel</a>.`,
'setup.reveal-keychip': `Reveal keychip`,
'setup.type.automatic': `Automatic Setup`,
'setup.type.manual': `Manual Setup`,
'setup.manual': `Please modify your segatools.ini with the following information.`,
'setup.automatic': `Select your segatools.ini below to autofill the network information.`,
'setup.automatic.success': `Success, data has been updated`,
'setup.automatic.failure': `Failed to update information, please ensure access is not blocked and try again.`,
'setup.automatic.select': `Pick file`,
'setup.troubleshooting.header': 'Setup Troubleshooting (FAQ)',
'setup.troubleshooting.items.one': `» It displays DNS BAD on Network Test<br>
You likely misconfigured your segatools.ini. Ensure it's pointing to the DNS shown above (under Manual Setup).`,
'setup.troubleshooting.items.two': `» It displays タイトル サーバー BAD (Title Server BAD) on Network Test<br>
You should check your segatools.ini to ensure your keychip is set correctly.<br>
Additionally, Card Maker users and players using a game version higher than what's listed may need to disable encryption
<a target="_blank" href="https://gitea.tendokyu.moe/Dniel97/SEGAguide/wiki/SDED#patching-assemblycsharpdll">(instructions for Card Maker)</a>`,
'setup.troubleshooting.items.three': `» I can't scan my card<br>
The built-in emulated card reader, by default, is configured to use the Enter / Return key to scan in (hold the key).`,
'setup.keychip': 'Keychip Management',
'setup.keychip.warning': 'Keychips can be manually set here for cabinet owners with physical keychips trying to connect to AquaDX. Selecting a keychip will autofill it for the setup below.',
'setup.keychip.add': `Add keychip`,
'setup.keychip.delete': `Delete`,
'setup.keychip.placeholder': `New Keychip ID`
}
export const EN_REF_SETTINGS = {
'settings.title': 'Settings',
'settings.page-title': '${page} Settings',
'settings.tabs.profile': 'Profile',
'settings.tabs.global': 'Global',
'settings.tabs.chu3': 'Chuni',
'settings.tabs.mai2': 'Mai',
'settings.tabs.ongeki': 'Ongeki',
'settings.tabs.wacca': 'Wacca',
'settings.options.all.preset-warning': 'You are using a preset option set. Options may be reflected incorrectly.',
'settings.options.all.personal-best': 'Record',
'settings.options.all.rival-score': 'Rival',
'settings.options.all.life': 'Life',
'settings.options.all.push': 'Push',
'settings.options.all.none': 'None',
// Chuni User Options
'settings.options.chu3.speed': 'Lane Speed (60fps)',
'settings.options.chu3.speed_120': 'Lane Speed (120fps)',
'settings.options.chu3.trackSkip': 'Track Skip Type',
'settings.options.chu3.headphone': 'Headphone Volume',
// Maimai User Options
'settings.options.mai2.noteSpeed': 'Note Speed',
'settings.options.mai2.touchSpeed': 'Touch Speed',
'settings.options.mai2.slideSpeed': 'Slide Speed',
'settings.options.mai2.headPhoneVolume': 'Headphone Volume',
'settings.options.mai2.trackSkip': 'Track Skip Type',
'settings.fields.mai2UnlockMusic.name': 'Unlock All Music',
'settings.fields.mai2UnlockMusic.desc': 'Unlock all music and master difficulty.',
'settings.fields.mai2UnlockChara.name': 'Unlock All Characters',
'settings.fields.mai2UnlockChara.desc': 'Unlock all characters (new characters start at level 1).',
'settings.fields.mai2UnlockCharaMaxLevel.name': 'Max Character Level',
'settings.fields.mai2UnlockCharaMaxLevel.desc': 'Set all characters to max level.',
'settings.fields.mai2UnlockPartners.name': 'Unlock All Partners',
'settings.fields.mai2UnlockPartners.desc': 'Unlock all partners.',
'settings.fields.mai2UnlockCollectables.name': 'Unlock All Collectables',
'settings.fields.mai2UnlockCollectables.desc': 'Unlock all collectables (nameplate, title, icon, frame).',
'settings.fields.mai2UnlockTickets.name': 'Unlock All Tickets',
'settings.fields.mai2UnlockTickets.desc': 'Infinite tickets (Note: client still limits which tickets can be used).',
'settings.fields.waccaUnlockMusic.name': 'Unlock All Music',
'settings.fields.waccaUnlockMusic.desc': 'Unlock all music.',
'settings.fields.waccaUnlockPlates.name': 'Unlock All Plates',
'settings.fields.waccaUnlockPlates.desc': 'Unlock all plates.',
'settings.fields.waccaUnlockCollectables.name': 'Unlock All Collectables',
'settings.fields.waccaUnlockCollectables.desc': 'Unlock all collectables (icon, trophy).',
'settings.fields.waccaUnlockTickets.name': 'Infinite Tickets',
'settings.fields.waccaUnlockTickets.desc': 'Infinite tickets.',
'settings.fields.waccaInfiniteWp.name': 'Infinite WP',
'settings.fields.waccaInfiniteWp.desc': 'Set WP to 999999.',
'settings.fields.waccaAlwaysVip.name': 'Always VIP',
'settings.fields.waccaAlwaysVip.desc': 'Set VIP expiration date to 2077-01-01.',
'settings.fields.chusanTeamName.name': 'Team Name',
'settings.fields.chusanTeamName.desc': 'Customize the text displayed on the top of your profile.',
'settings.fields.chusanInfinitePenguins.name': 'Infinite Penguins',
'settings.fields.chusanInfinitePenguins.desc': 'Set penguin statues for character level prompting to 999.',
'settings.fields.chusanUnlock29672999Ultima.name': 'Unlock 2967, 2999 Ultima',
'settings.fields.chusanUnlock29672999Ultima.desc': 'Unlocks Ultima difficulty ONLY for musicIds 2967, 2999. Do not use if you don\'t know why you need this.',
'settings.fields.chusanLvUnlockAll.name': 'Unlock Linked Gates',
'settings.fields.chusanLvUnlockAll.desc': 'Incurs a long animated sequence, cannot be undone',
'settings.fields.chusanMatchingReflector.name': 'Matching Server Reflector',
'settings.fields.chusanMatchingReflector.desc': 'URL of the national matching server\'s UDP reflector.',
'settings.fields.chusanMatchingServer.name': 'Matching Server',
'settings.fields.chusanMatchingServer.desc': 'URL of the national matching server.',
'settings.fields.ongekiInfiniteKaika.name': 'Infinite Kaika',
'settings.fields.ongekiInfiniteKaika.desc': 'Set Kaika to 999',
'settings.fields.rounding.name': 'Score Rounding',
'settings.fields.rounding.desc': 'Round the score to one decimal place',
'settings.fields.gameUsername.name': 'Player Name',
'settings.fields.gameUsername.desc': 'Your name shown in game',
'settings.fields.optOutOfLeaderboard.name': 'Opt Out of Leaderboard',
'settings.fields.optOutOfLeaderboard.desc': 'It may take some time for this to take effect',
'settings.fields.hideCountry.name': 'Hide Country',
'settings.fields.hideCountry.desc': 'Your country of registration will not be visible on your profile',
'settings.fields.displayCandidates.name': 'Display Candidates',
'settings.fields.displayCandidates.desc': 'Shows upcoming songs that could improve your rating on your profile (when available)',
'settings.fields.enableMusicRank.name': 'Enable Recommended Music Rank on Your Machine',
'settings.fields.enableMusicRank.desc': 'If you have your own ranking, you can turn this off. It only affects your own machine',
'settings.profile.picture': 'Profile Picture',
'settings.profile.upload-new': 'Upload New',
'settings.profile.bad-format': 'Invalid image format. Supported types are PNG, JPG, JPEG, WEBP & GIF.',
'settings.profile.save': 'Save',
'settings.profile.name': 'Display Name',
'settings.profile.username': 'Username',
'settings.profile.password': 'Password',
'settings.profile.country': 'Country',
'settings.profile.location': 'Location',
'settings.profile.bio': 'Bio',
'settings.profile.unset': 'Unset',
'settings.profile.logout': 'Log out',
'settings.profile.unchanged': 'Unchanged',
'settings.profile.delete-title': 'Delete account',
'settings.profile.delete-description': 'Download a backup, then permanently delete your account and all associated game data.',
'settings.profile.delete': 'Delete account',
'settings.profile.delete-confirm-title': 'Permanently delete your account?',
'settings.profile.delete-confirm-message': 'A backup of all game data will be downloaded first. After that, your account and all associated game data will be permanently deleted. This cannot be undone.',
'settings.export': 'Export Player Data',
'settings.batchManualExport': "Export in Batch Manual (for Tachi)",
'settings.cabNotice': "These settings only apply for your keychip. If you're playing on someone else's setup, please ask them to change these settings.",
'settings.siteNotice': "These settings only apply to the website.",
'settings.regionNotice': "These settings are shared amongst Mai, Ongeki and Chuni.",
'settings.regionSelector.title': "Prefecture Selector",
'settings.regionSelector.desc': "Select the region where you want the game to identify you",
'settings.regionSelector.select': "Select Prefecture",
}
export const EN_REF_USERBOX = {
'userbox.header.general': 'General Settings',
'userbox.header.matching': 'National Matching',
'userbox.header.matching.symbolChat': 'Chat Symbols (Matching)',
'userbox.header.linkedVerse': 'Linked Verse',
'userbox.header.userbox': 'UserBox Settings',
'userbox.header.preview': 'UserBox Preview',
'userbox.nameplateId': 'Nameplate',
'userbox.frameId': 'Frame',
'userbox.trophyId': 'Trophy (Title)',
'userbox.trophyIdSub1': 'Trophy Sub #1 (Title)',
'userbox.trophyIdSub2': 'Trophy Sub #2 (Title)',
'userbox.mapIconId': 'Map Icon',
'userbox.voiceId': 'System Voice',
'userbox.stageId': 'Stage',
'userbox.avatarWear': 'Avatar Wear',
'userbox.avatarHead': 'Avatar Head',
'userbox.avatarFace': 'Avatar Face',
'userbox.avatarSkin': 'Avatar Skin',
'userbox.avatarItem': 'Avatar Item',
'userbox.avatarFront': 'Avatar Front',
'userbox.avatarBack': 'Avatar Back',
'userbox.preview.url': 'Image URL',
'userbox.error.nodata': 'Chuni data not found',
'userbox.matching.select': 'Select Matching Server',
'userbox.matching.select.sub': 'Choose the matching server you want to use.',
'userbox.matching.option.ui': 'Rooms',
'userbox.matching.option.guide': 'Guide',
'userbox.matching.option.collab': 'Collaborators',
'userbox.matching.custom.name': 'Custom',
'userbox.matching.custom.sub': 'Enter your own URL',
'userbox.matching.symbolChat': 'Message Choice',
'userbox.matching.symbolChat.default': 'Default',
'userbox.lv.help': 'Information about Linked Verse Difficulty',
'userbox.lv.diffnotice': 'In Linked Verse, you will be matched separately based on your difficulty.',
'userbox.lv.difficulty': 'Linked Verse Difficulty',
'userbox.lv.difficulty.0': 'LEVEL ∞ (Only for supported gates)',
'userbox.lv.difficulty.1': 'LEVEL V',
'userbox.lv.difficulty.2': 'LEVEL IV',
'userbox.lv.difficulty.3': 'LEVEL III',
'userbox.lv.difficulty.4': 'LEVEL II',
'userbox.lv.difficulty.5': 'LEVEL I',
'userbox.new.name': 'AquaBox',
'userbox.new.setup': 'Drag and drop your Chuni game folder (Lumi or newer) into the box below to display UserBoxes with their nameplate & avatar. All files are handled in-browser.',
'userbox.new.setup.notice': 'Select the highest folder containing your game data.',
'userbox.new.setup.processing_file': 'Processing',
'userbox.new.setup.finalizing': 'Saving to internal storage',
'userbox.new.drop': 'Drop game folder here',
'userbox.new.switch.to_url': 'Switch to URL mode',
'userbox.new.switch.to_drop': 'Switch to drop mode',
'userbox.new.url_warning': 'Enter in the path to access Userbox assets. You are responsible for any results in this state. Please read the documentation. Don\'t expect support for this mode.',
'userbox.new.activate_first': 'Enable AquaBox (game files required)',
'userbox.new.activate_update': 'Update AquaBox (game files required)',
'userbox.new.activate': 'Use AquaBox',
'userbox.new.activate_desc': 'Enable displaying UserBoxes with their nameplate & avatar',
'userbox.new.activate_profile': 'Use AquaBox on profiles',
'userbox.new.activate_profile_desc': 'Enable displaying UserBoxes with their nameplate & avatar on profile pages',
'userbox.new.error.invalidFolder': 'The folder you selected is invalid. Ensure that your game\'s version is Lumi or newer and that the "A000" option pack is present.',
'userbox.new.error.invalidUrl': 'The URL you inputted is invalid.'
}
export const EN_REF_MAI_PHOTO = {
'maiphoto.title': 'Mai Memorial Photo Gallery',
'maiphoto.url_warning': 'If you want to share a photo with your friend, please save the photo. Do not copy image URL because the URL contains sensitive information.',
'maiphoto.none': 'No photo found. You can upload photo by clicking upload at the end of each game session.',
}
export const EN_REF_AQUATRANS = {
'trans.title': '🏳️‍⚧️ AquaTrans™ Data Transfer',
'trans.confirm.unbackuped.title': 'Confirm transfer',
'trans.confirm.unbackuped.msg': "It seems like you haven't backed up your destination data. Are you sure you want to proceed? (This will overwrite your destination server's data)",
'trans.confirm.untested.title': 'Error',
'trans.confirm.untested.msg': "It seems like you haven't tested both connections yet. Please test the connections first.",
'trans.confirm.done.title': 'Done!',
'trans.confirm.done.msg': 'Transfer completed successfully! Your data on ${dst} is overwritten with your data from ${src}.',
'trans.alert.in-progress': "Transfer already in progress!",
'trans.prompt-html': `
<p>👋 Welcome to the AquaTrans™ server data transfer tool!</p>
<p>You can use this to export data from any server, and input data into any server using the connection credentials (card number, server address, and keychip id).</p>
<p>This tool will simulate a game client and pull your data from the source server, and push your data to the destination server.</p>
<p>Please fill out the info below to get started!</p>
`,
'trans.error.empty': 'Please fill out all fields.',
'trans.error.untested': 'Please test the connections first.',
'trans.success.import': 'Data imported successfully!',
'trans.source.title': 'Source Server',
'trans.target.title': 'Destination Server',
'trans.field.addr': 'Server Address',
'trans.field.keychip': 'Keychip ID',
'trans.field.game': 'Game',
'trans.field.version': 'Version',
'trans.field.card': 'Card Number',
'trans.btn.test': 'Test Connection',
'trans.btn.export': 'Export Data',
'trans.btn.import': 'Import Data',
'trans.blacklist': "This server may have rules against tools such as AquaTrans, please use caution.",
}
export const EN_REF = { ...EN_REF_USER, ...EN_REF_Welcome, ...EN_REF_GENERAL,
...EN_REF_LEADERBOARD, ...EN_REF_HOME, ...EN_REF_SETTINGS, ...EN_REF_USERBOX,
...EN_REF_MAI_PHOTO, ...EN_REF_AQUATRANS, ...EN_REF_SETUP
}
export type LocalizedMessages = typeof EN_REF

Some files were not shown because too many files have changed in this diff Show More