diff --git a/README.md b/README.md index ece4729..3742c9e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ This is a small local Arcaea server based on Python and Flask, which can simulat 没有以下 We don't have: - 角色数值 Character characteristic value -- 数据同步的时间和设备记录 The record of time and device for data synchronization +- 数据同步的时间记录 The record of time for data synchronization - 服务器安全性保证 Server security assurance 可能有问题 There may be problems: @@ -54,15 +54,13 @@ It is just so interesting. What it can do is under exploration. > > Tips: When updating, please keep the original database in case of data loss. -### Version 1.7 -- 仍然适用于Arcaea 3.2.3版本 Still for Arcaea 3.2.3 +### Version 1.8 +- 适用于Arcaea 3.3.0版本 For Arcaea 3.3.0 - 更新了歌曲数据库 Update the song database. -- 新增了购买系统,包括单曲购买和曲包购买 Add purchase system, including single purchase and pack purchase. -- 后台查询与修改项目增多 Increase background query and modification items. -- 新增用户下载量限制和下载校验 Add user download limit and download verification. -- 新增了**梦**的语音 Add the voice of **Yume**. -- 新增了网站图标 Add a favicon. -- 尝试解锁了所有的场景 Try to unlock all the scenes. +- 新角色**Alice & Tenniel**已解锁 Unlock new character **Alice & Tenniel**. +- 数据同步机制修改 Modify data synchronization mechanism. +- Recent30增添简易的PTT保护机制 Add simple PTT protection mechanism to Recent30. +- 尝试解锁了一些东西 Try to unlock something. - 修复了一些Bug Fix some bugs. ## 运行环境与依赖 Running environment and requirements diff --git a/latest version/database/arcaea_database.db b/latest version/database/arcaea_database.db index 147e9b6..522cd40 100644 Binary files a/latest version/database/arcaea_database.db and b/latest version/database/arcaea_database.db differ diff --git a/latest version/database/arcsong.db b/latest version/database/arcsong.db index f7725eb..1f3ffbb 100644 Binary files a/latest version/database/arcsong.db and b/latest version/database/arcsong.db differ diff --git a/latest version/database/database_initialize.py b/latest version/database/database_initialize.py index 12d852f..6c4fc46 100644 --- a/latest version/database/database_initialize.py +++ b/latest version/database/database_initialize.py @@ -199,17 +199,26 @@ type text, primary key(user_id, item_id, type) );''') +c.execute('''create table if not exists user_save(user_id int primary key, +scores_data text, +clearlamps_data text, +clearedsongs_data text, +unlocklist_data text, +installid_data text, +devicemodelname_data text, +story_data text +);''') -char = ['Hikari', 'Tairitsu', 'Kou', 'Sapphire', 'Lethe', '', 'Tairitsu(Axium)', 'Tairitsu(Grievous Lady)', 'Stella', 'Hikari & Fisica', 'Ilith', 'Eto', 'Luna', 'Shirabe', 'Hikari(Zero)', 'Hikari(Fracture)', 'Hikari(Summer)', 'Tairitsu(Summer)', 'Tairitsu&Trin', - 'Ayu', 'Eto&Luna', 'Yume', 'Seine & Hikari', 'Saya', 'Tairitsu & Chuni Penguin', 'Chuni Penguin', 'Haruna', 'Nono', 'MTA-XXX', 'MDA-21', 'Kanae', 'Hikari(Fantasia)', 'Tairitsu(Sonata)', 'Sia', 'DORO*C', 'Tairitsu(Tempest)', 'Brillante', 'Ilith(Summer)', 'Etude'] +char = ['Hikari', 'Tairitsu', 'Kou', 'Sapphire', 'Lethe', '', 'Tairitsu(Axium)', 'Tairitsu(Grievous Lady)', 'Stella', 'Hikari & Fisica', 'Ilith', 'Eto', 'Luna', 'Shirabe', 'Hikari(Zero)', 'Hikari(Fracture)', 'Hikari(Summer)', 'Tairitsu(Summer)', 'Tairitsu & Trin', + 'Ayu', 'Eto & Luna', 'Yume', 'Seine & Hikari', 'Saya', 'Tairitsu & Chuni Penguin', 'Chuni Penguin', 'Haruna', 'Nono', 'MTA-XXX', 'MDA-21', 'Kanae', 'Hikari(Fantasia)', 'Tairitsu(Sonata)', 'Sia', 'DORO*C', 'Tairitsu(Tempest)', 'Brillante', 'Ilith(Summer)', 'Etude', 'Alice & Tenniel'] skill_id = ['gauge_easy', '', '', '', 'note_mirror', '', '', 'gauge_hard', 'frag_plus_10_pack_stellights', 'gauge_easy|frag_plus_15_pst&prs', 'gauge_hard|fail_frag_minus_100', 'frag_plus_5_side_light', 'visual_hide_hp', 'frag_plus_5_side_conflict', 'challenge_fullcombo_0gauge', 'gauge_overflow', 'gauge_easy|note_mirror', 'note_mirror', 'visual_tomato_pack_tonesphere', - 'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', '', '', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', ''] + 'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', '', '', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', '', 'note_mirror|visual_hide_far'] skill_id_uncap = ['', '', 'frags_kou', '', 'visual_ink', '', '', '', '', '', '', '', '', 'shirabe_entry_fee', - '', '', '', '', '', '', '', 'frags_yume', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] + '', '', '', '', '', '', '', 'frags_yume', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] -for i in range(0, 39): +for i in range(0, 40): if i in [0, 1, 2, 4, 13, 26, 27, 28, 29, 36, 21]: sql = 'insert into character values('+str( i)+',"'+char[i]+'''",30,25000,25000,90,90,90,"'''+skill_id[i]+'''",0,0,"'''+skill_id_uncap[i]+'''",0,'',1,1)''' diff --git a/latest version/database/packs.json b/latest version/database/packs.json index a586926..bd0993e 100644 --- a/latest version/database/packs.json +++ b/latest version/database/packs.json @@ -3,7 +3,7 @@ "items": [{ "type": "pack", "id": "core", - "_id": "5fb5b68a68273a03de60f205", + "_id": "5fc8306209787401bb857d1b", "is_available": true }], "price": 500, @@ -15,12 +15,12 @@ "items": [{ "type": "pack", "id": "shiawase", - "_id": "5fb5b68a68273a03de60f234", + "_id": "5fc8306209787401bb857d3b", "is_available": true }, { "type": "character", "id": "kou", - "_id": "5fb5b68a68273a03de60f233", + "_id": "5fc8306209787401bb857d3a", "is_available": true }], "price": 500, @@ -32,12 +32,12 @@ "items": [{ "type": "pack", "id": "dynamix", - "_id": "5fb5b68a68273a03de60f238", + "_id": "5fc8306209787401bb857d33", "is_available": true }, { "type": "character", "id": "sapphire", - "_id": "5fb5b68a68273a03de60f237", + "_id": "5fc8306209787401bb857d32", "is_available": true }], "price": 500, @@ -49,12 +49,12 @@ "items": [{ "type": "pack", "id": "mirai", - "_id": "5fb5b68a68273a03de60f23e", + "_id": "5fc8306209787401bb857d37", "is_available": true }, { "type": "character", "id": "lethe", - "_id": "5fb5b68a68273a03de60f23d", + "_id": "5fc8306209787401bb857d36", "is_available": true }], "price": 500, @@ -66,7 +66,7 @@ "items": [{ "type": "pack", "id": "yugamu", - "_id": "5fb5b68a68273a03de60f206", + "_id": "5fc8306209787401bb857d1c", "is_available": true }], "price": 500, @@ -78,7 +78,7 @@ "items": [{ "type": "pack", "id": "lanota", - "_id": "5fb5b68a68273a03de60f211", + "_id": "5fc8306209787401bb857d26", "is_available": true }], "price": 500, @@ -90,7 +90,7 @@ "items": [{ "type": "pack", "id": "nijuusei", - "_id": "5fb5b68a68273a03de60f207", + "_id": "5fc8306209787401bb857d1d", "is_available": true }], "price": 500, @@ -102,7 +102,7 @@ "items": [{ "type": "pack", "id": "rei", - "_id": "5fb5b68a68273a03de60f1fd", + "_id": "5fc8306209787401bb857cfa", "is_available": true }], "price": 500, @@ -114,7 +114,7 @@ "items": [{ "type": "pack", "id": "tonesphere", - "_id": "5fb5b68a68273a03de60f213", + "_id": "5fc8306209787401bb857d28", "is_available": true }], "price": 500, @@ -126,7 +126,7 @@ "items": [{ "type": "pack", "id": "groovecoaster", - "_id": "5fb5b68a68273a03de60f22c", + "_id": "5fc8306209787401bb857d14", "is_available": true }], "price": 500, @@ -138,7 +138,7 @@ "items": [{ "type": "pack", "id": "zettai", - "_id": "5fb5b68a68273a03de60f1ff", + "_id": "5fc8306209787401bb857cfc", "is_available": true }], "price": 500, @@ -150,7 +150,7 @@ "items": [{ "type": "pack", "id": "chunithm", - "_id": "5fb5b68a68273a03de60f221", + "_id": "5fc8306209787401bb857d09", "is_available": true }], "price": 300, @@ -160,7 +160,7 @@ "items": [{ "type": "pack", "id": "prelude", - "_id": "5fb5b68a68273a03de60f22d", + "_id": "5fc8306209787401bb857d15", "is_available": true }], "price": 400, @@ -170,7 +170,7 @@ "items": [{ "type": "pack", "id": "omatsuri", - "_id": "5fb5b68a68273a03de60f200", + "_id": "5fc8306209787401bb857cfd", "is_available": true }], "price": 500, @@ -180,7 +180,7 @@ "items": [{ "type": "pack", "id": "vs", - "_id": "5fb5b68a68273a03de60f224", + "_id": "5fc8306209787401bb857d0c", "is_available": true }], "price": 500, @@ -190,9 +190,19 @@ "items": [{ "type": "pack", "id": "extend", - "_id": "5fb5b68a68273a03de60f230", + "_id": "5fc8306209787401bb857d18", "is_available": true }], "price": 700, "orig_price": 700 +}, { + "name": "alice", + "items": [{ + "type": "pack", + "id": "alice", + "_id": "5fc8306209787401bb857d02", + "is_available": true + }], + "orig_price": 500, + "price": 500 }] \ No newline at end of file diff --git a/latest version/database/singles.json b/latest version/database/singles.json index 5527600..d746292 100644 --- a/latest version/database/singles.json +++ b/latest version/database/singles.json @@ -12,7 +12,7 @@ "items": [{ "id": "dataerror", "type": "single", - "_id": "5fb5b68a68273a03de60f210", + "_id": "5fc8306209787401bb857d0f", "is_available": true }], "price": 100, @@ -24,7 +24,7 @@ "items": [{ "id": "yourvoiceso", "type": "single", - "_id": "5fb5b68a68273a03de60f227", + "_id": "5fc8306209787401bb857cf7", "is_available": true }], "price": 100, @@ -36,7 +36,7 @@ "items": [{ "id": "crosssoul", "type": "single", - "_id": "5fb5b68a68273a03de60f21b", + "_id": "5fc8306209787401bb857d03", "is_available": true }], "price": 100, @@ -48,7 +48,7 @@ "items": [{ "type": "single", "id": "impurebird", - "_id": "5fb5b68a68273a03de60f21c", + "_id": "5fc8306209787401bb857d04", "is_available": true }], "price": 100, @@ -60,7 +60,7 @@ "items": [{ "type": "single", "id": "auxesia", - "_id": "5fb5b68a68273a03de60f228", + "_id": "5fc8306209787401bb857d10", "is_available": true }], "price": 100, @@ -72,7 +72,7 @@ "items": [{ "type": "single", "id": "modelista", - "_id": "5fb5b68a68273a03de60f1fb", + "_id": "5fc8306209787401bb857cf8", "is_available": true }], "price": 100, @@ -84,7 +84,7 @@ "items": [{ "type": "single", "id": "yozakurafubuki", - "_id": "5fb5b68a68273a03de60f21d", + "_id": "5fc8306209787401bb857d05", "is_available": true }], "price": 100, @@ -96,7 +96,7 @@ "items": [{ "type": "single", "id": "surrender", - "_id": "5fb5b68a68273a03de60f229", + "_id": "5fc8306209787401bb857d11", "is_available": true }], "price": 100, @@ -108,7 +108,7 @@ "items": [{ "type": "single", "id": "metallicpunisher", - "_id": "5fb5b68a68273a03de60f1fc", + "_id": "5fc8306209787401bb857cf9", "is_available": true }], "price": 100, @@ -118,7 +118,7 @@ "items": [{ "type": "single", "id": "carminescythe", - "_id": "5fb5b68a68273a03de60f21e", + "_id": "5fc8306209787401bb857d06", "is_available": true }], "price": 100, @@ -128,7 +128,7 @@ "items": [{ "type": "single", "id": "bethere", - "_id": "5fb5b68a68273a03de60f22a", + "_id": "5fc8306209787401bb857d12", "is_available": true }], "price": 100, @@ -140,7 +140,7 @@ "items": [{ "type": "single", "id": "callmyname", - "_id": "5fb5b68a68273a03de60f212", + "_id": "5fc8306209787401bb857d27", "is_available": true }], "price": 100, @@ -152,7 +152,7 @@ "items": [{ "type": "single", "id": "fallensquare", - "_id": "5fb5b68a68273a03de60f208", + "_id": "5fc8306209787401bb857d1e", "is_available": true }], "price": 100, @@ -164,7 +164,7 @@ "items": [{ "type": "single", "id": "dropdead", - "_id": "5fb5b68a68273a03de60f21f", + "_id": "5fc8306209787401bb857d07", "is_available": true }], "price": 100, @@ -176,7 +176,7 @@ "items": [{ "type": "single", "id": "alexandrite", - "_id": "5fb5b68a68273a03de60f22b", + "_id": "5fc8306209787401bb857d13", "is_available": true }], "price": 100, @@ -188,7 +188,7 @@ "items": [{ "type": "single", "id": "astraltale", - "_id": "5fb5b68a68273a03de60f1fe", + "_id": "5fc8306209787401bb857cfb", "is_available": true }], "price": 100, @@ -200,7 +200,7 @@ "items": [{ "type": "single", "id": "phantasia", - "_id": "5fb5b68a68273a03de60f209", + "_id": "5fc8306209787401bb857d1f", "is_available": true }], "price": 100, @@ -210,7 +210,7 @@ "items": [{ "type": "single", "id": "empireofwinter", - "_id": "5fb5b68a68273a03de60f220", + "_id": "5fc8306209787401bb857d08", "is_available": true }], "price": 100, @@ -220,7 +220,7 @@ "items": [{ "type": "single", "id": "libertas", - "_id": "5fb5b68a68273a03de60f214", + "_id": "5fc8306209787401bb857d29", "is_available": true }], "price": 100, @@ -232,7 +232,7 @@ "items": [{ "type": "single", "id": "dottodot", - "_id": "5fb5b68a68273a03de60f20a", + "_id": "5fc8306209787401bb857d20", "is_available": true }], "price": 100, @@ -244,7 +244,7 @@ "items": [{ "type": "single", "id": "dreadnought", - "_id": "5fb5b68a68273a03de60f215", + "_id": "5fc8306209787401bb857d2a", "is_available": true }], "price": 100, @@ -256,7 +256,7 @@ "items": [{ "type": "single", "id": "mirzam", - "_id": "5fb5b68a68273a03de60f20b", + "_id": "5fc8306209787401bb857d21", "is_available": true }], "price": 100, @@ -268,7 +268,7 @@ "items": [{ "type": "single", "id": "heavenlycaress", - "_id": "5fb5b68a68273a03de60f222", + "_id": "5fc8306209787401bb857d0a", "is_available": true }], "price": 100, @@ -278,7 +278,7 @@ "items": [{ "type": "single", "id": "filament", - "_id": "5fb5b68a68273a03de60f22e", + "_id": "5fc8306209787401bb857d16", "is_available": true }], "price": 100, @@ -288,7 +288,7 @@ "items": [{ "type": "single", "id": "avantraze", - "_id": "5fb5b68a68273a03de60f216", + "_id": "5fc8306209787401bb857d2b", "is_available": true }], "price": 100, @@ -298,7 +298,7 @@ "items": [{ "type": "single", "id": "battlenoone", - "_id": "5fb5b68a68273a03de60f201", + "_id": "5fc8306209787401bb857cfe", "is_available": true }], "price": 100, @@ -308,7 +308,7 @@ "items": [{ "type": "single", "id": "saikyostronger", - "_id": "5fb5b68a68273a03de60f20c", + "_id": "5fc8306209787401bb857d22", "is_available": true }], "price": 100, @@ -318,7 +318,7 @@ "items": [{ "type": "single", "id": "izana", - "_id": "5fb5b68a68273a03de60f223", + "_id": "5fc8306209787401bb857d0b", "is_available": true }], "price": 100, @@ -328,7 +328,7 @@ "items": [{ "type": "single", "id": "einherjar", - "_id": "5fb5b68a68273a03de60f22f", + "_id": "5fc8306209787401bb857d17", "is_available": true }], "price": 100, @@ -338,7 +338,7 @@ "items": [{ "type": "single", "id": "laqryma", - "_id": "5fb5b68a68273a03de60f217", + "_id": "5fc8306209787401bb857d2c", "is_available": true }], "price": 100, @@ -348,7 +348,7 @@ "items": [{ "type": "single", "id": "amygdata", - "_id": "5fb5b68a68273a03de60f202", + "_id": "5fc8306209787401bb857cff", "is_available": true }], "price": 100, @@ -358,7 +358,7 @@ "items": [{ "type": "single", "id": "altale", - "_id": "5fb5b68a68273a03de60f20d", + "_id": "5fc8306209787401bb857d23", "is_available": true }], "price": 100, @@ -368,7 +368,7 @@ "items": [{ "type": "single", "id": "feelssoright", - "_id": "5fb5b68a68273a03de60f218", + "_id": "5fc8306209787401bb857d2d", "is_available": true }], "price": 100, @@ -378,7 +378,7 @@ "items": [{ "type": "single", "id": "scarletcage", - "_id": "5fb5b68a68273a03de60f203", + "_id": "5fc8306209787401bb857d00", "is_available": true }], "price": 100, @@ -388,7 +388,7 @@ "items": [{ "type": "single", "id": "teriqma", - "_id": "5fb5b68a68273a03de60f20e", + "_id": "5fc8306209787401bb857d24", "is_available": true }], "price": 100, @@ -398,7 +398,7 @@ "items": [{ "type": "single", "id": "mahoroba", - "_id": "5fb5b68a68273a03de60f225", + "_id": "5fc8306209787401bb857d0d", "is_available": true }], "price": 100, @@ -408,7 +408,7 @@ "items": [{ "type": "single", "id": "badtek", - "_id": "5fb5b68a68273a03de60f219", + "_id": "5fc8306209787401bb857d2e", "is_available": true }], "price": 100, @@ -418,7 +418,7 @@ "items": [{ "type": "single", "id": "maliciousmischance", - "_id": "5fb5b68a68273a03de60f231", + "_id": "5fc8306209787401bb857d19", "is_available": true }], "price": 100, @@ -428,7 +428,7 @@ "items": [{ "type": "single", "id": "buchigireberserker", - "_id": "5fb5b68a68273a03de60f20f", + "_id": "5fc8306209787401bb857d25", "is_available": true }], "price": 100, @@ -438,7 +438,7 @@ "items": [{ "type": "single", "id": "galaxyfriends", - "_id": "5fb5b68a68273a03de60f226", + "_id": "5fc8306209787401bb857d0e", "is_available": true }], "price": 100, @@ -448,7 +448,7 @@ "items": [{ "type": "single", "id": "xeraphinite", - "_id": "5fb5b68a68273a03de60f232", + "_id": "5fc8306209787401bb857d1a", "is_available": true }], "orig_price": 100, @@ -458,7 +458,7 @@ "items": [{ "type": "single", "id": "xanatos", - "_id": "5fb5b68a68273a03de60f21a", + "_id": "5fc8306209787401bb857d2f", "is_available": true }], "price": 100, diff --git a/latest version/main.py b/latest version/main.py index e245acb..1f123bc 100644 --- a/latest version/main.py +++ b/latest version/main.py @@ -440,10 +440,16 @@ def cloud_post(): token = token[7:] scores_data = request.form['scores_data'] clearlamps_data = request.form['clearlamps_data'] + clearedsongs_data = request.form['clearedsongs_data'] + unlocklist_data = request.form['unlocklist_data'] + installid_data = request.form['installid_data'] + devicemodelname_data = request.form['devicemodelname_data'] + story_data = request.form['story_data'] try: user_id = server.auth.token_get_id(token) if user_id is not None: - server.arcscore.arc_all_post(user_id, scores_data, clearlamps_data) + server.arcscore.arc_all_post(user_id, scores_data, clearlamps_data, clearedsongs_data, + unlocklist_data, installid_data, devicemodelname_data, story_data) return jsonify({ "success": True, "value": { diff --git a/latest version/server/arcscore.py b/latest version/server/arcscore.py index 43f5e39..42066bc 100644 --- a/latest version/server/arcscore.py +++ b/latest version/server/arcscore.py @@ -243,7 +243,7 @@ def get_song_state(x): return 0 -def update_recent30(c, user_id, song_id, rating): +def update_recent30(c, user_id, song_id, rating, is_protected): # 刷新r30,这里的判断方法存疑 c.execute('''select * from recent30 where user_id = :a''', {'a': user_id}) x = c.fetchone() @@ -257,7 +257,7 @@ def update_recent30(c, user_id, song_id, rating): if x[i] not in songs: songs.append(x[i]) if flag: - n = len(song_id) + n = len(songs) if n >= 11: r30_id = 29 elif song_id not in songs and n == 10: @@ -279,11 +279,28 @@ def update_recent30(c, user_id, song_id, rating): for i in range(1, 61, 2): a.append(x[i]) b.append(x[i+1]) + + if is_protected: + a_pre = [x for x in a] + b_pre = [x for x in b] + s_pre = 0 + for x in a_pre: + s_pre += x + for i in range(r30_id, 0, -1): a[i] = a[i-1] b[i] = b[i-1] a[0] = rating b[0] = song_id + + if is_protected: + s = 0 + for x in a: + s += x + if s < s_pre: + a = [x for x in a_pre] + b = [x for x in b_pre] + c.execute('''delete from recent30 where user_id = :a''', {'a': user_id}) sql = 'insert into recent30 values(' + str(user_id) for i in range(0, 30): @@ -342,7 +359,10 @@ def arc_score_post(user_id, song_id, difficulty, score, shiny_perfect_count, per c.execute('''update user set song_id = :b, difficulty = :c, score = :d, shiny_perfect_count = :e, perfect_count = :f, near_count = :g, miss_count = :h, health = :i, modifier = :j, clear_type = :k, rating = :l, time_played = :m where user_id = :a''', { 'a': user_id, 'b': song_id, 'c': difficulty, 'd': score, 'e': shiny_perfect_count, 'f': perfect_count, 'g': near_count, 'h': miss_count, 'i': health, 'j': modifier, 'k': clear_type, 'l': rating, 'm': now}) # recent30 更新 - update_recent30(c, user_id, song_id+str(difficulty), rating) + if health == -1 or int(score) >= 9800000: + update_recent30(c, user_id, song_id+str(difficulty), rating, True) + else: + update_recent30(c, user_id, song_id+str(difficulty), rating, False) # 成绩录入 c.execute('''select score, best_clear_type from best_score where user_id = :a and song_id = :b and difficulty = :c''', { 'a': user_id, 'b': song_id, 'c': difficulty}) @@ -514,38 +534,14 @@ def arc_score_check(user_id, song_id, difficulty, score, shiny_perfect_count, pe return True -def arc_all_post(user_id, scores_data, clearlamps_data): +def arc_all_post(user_id, scores_data, clearlamps_data, clearedsongs_data, unlocklist_data, installid_data, devicemodelname_data, story_data): # 向云端同步,无返回 - # 注意,best_score表不比较,直接覆盖 + conn = sqlite3.connect('./database/arcaea_database.db') c = conn.cursor() - scores = json.loads(scores_data)[""] - clearlamps = json.loads(clearlamps_data)[""] - clear_song_id_difficulty = [] - clear_state = [] - for i in clearlamps: - clear_song_id_difficulty.append(i['song_id']+str(i['difficulty'])) - clear_state.append(i['clear_type']) - - for i in scores: - rating = get_one_ptt(i['song_id'], i['difficulty'], i['score']) - try: - index = clear_song_id_difficulty.index( - i['song_id'] + str(i['difficulty'])) - except: - index = -1 - if index != -1: - clear_type = clear_state[index] - else: - clear_type = 0 - c.execute('''delete from best_score where user_id = :a and song_id = :b and difficulty = :c''', { - 'a': user_id, 'b': i['song_id'], 'c': i['difficulty']}) - c.execute('''insert into best_score values(:a,:b,:c,:d,:e,:f,:g,:h,:i,:j,:k,:l,:m,:n)''', { - 'a': user_id, 'b': i['song_id'], 'c': i['difficulty'], 'd': i['score'], 'e': i['shiny_perfect_count'], 'f': i['perfect_count'], 'g': i['near_count'], 'h': i['miss_count'], 'i': i['health'], 'j': i['modifier'], 'k': i['time_played'], 'l': clear_type, 'm': clear_type, 'n': rating}) - - ptt = get_user_ptt(c, user_id) # 更新PTT - c.execute('''update user set rating_ptt = :a where user_id = :b''', { - 'a': ptt, 'b': user_id}) + c.execute('''delete from user_save where user_id=:a''', {'a': user_id}) + c.execute('''insert into user_save values(:a,:b,:c,:d,:e,:f,:g,:h)''', { + 'a': user_id, 'b': scores_data, 'c': clearlamps_data, 'd': clearedsongs_data, 'e': unlocklist_data, 'f': installid_data, 'g': devicemodelname_data, 'h': story_data}) conn.commit() conn.close() return None @@ -555,40 +551,60 @@ def arc_all_get(user_id): # 从云端同步,返回字典 conn = sqlite3.connect('./database/arcaea_database.db') c = conn.cursor() - c.execute('''select * from best_score where user_id = :a''', - {'a': user_id}) - x = c.fetchall() - song_1 = [] - song_2 = [] - song_3 = [] - if x != []: - for i in x: - if i[11] != 0: - song_1.append({ - "grade": get_song_grade(i[3]), - "difficulty": i[2], - "song_id": i[1] - }) - song_2.append({ - "ct": 0, - "clear_type": i[11], - "difficulty": i[2], - "song_id": i[1] - }) - song_3.append({ - "ct": 0, - "time_played": i[10], - "modifier": i[9], - "health": i[8], - "miss_count": i[7], - "near_count": i[6], - "perfect_count": i[5], - "shiny_perfect_count": i[4], - "score": i[3], - "difficulty": i[2], - "version": 1, - "song_id": i[1] - }) + c.execute('''select * from user_save where user_id=:a''', {'a': user_id}) + x = c.fetchone() + + scores_data = [] + clearlamps_data = [] + clearedsongs_data = [] + # unlocklist_data = [] + installid_data = '' + devicemodelname_data = '' + # story_data = [] + + if x: + scores_data = json.loads(x[1])[""] + clearlamps_data = json.loads(x[2])[""] + clearedsongs_data = json.loads(x[3])[""] + # unlocklist_data = json.loads(x[4])[""] + installid_data = json.loads(x[5])["val"] + devicemodelname_data = json.loads(x[6])["val"] + # story_data = json.loads(x[7])[""] + + # c.execute('''select * from best_score where user_id = :a''', + # {'a': user_id}) + # x = c.fetchall() + # song_1 = [] + # song_2 = [] + # song_3 = [] + # if x != []: + # for i in x: + # if i[11] != 0: + # song_1.append({ + # "grade": get_song_grade(i[3]), + # "difficulty": i[2], + # "song_id": i[1] + # }) + # song_2.append({ + # "ct": 0, + # "clear_type": i[11], + # "difficulty": i[2], + # "song_id": i[1] + # }) + # song_3.append({ + # "ct": 0, + # "time_played": i[10], + # "modifier": i[9], + # "health": i[8], + # "miss_count": i[7], + # "near_count": i[6], + # "perfect_count": i[5], + # "shiny_perfect_count": i[4], + # "score": i[3], + # "difficulty": i[2], + # "version": 1, + # "song_id": i[1] + # }) conn.commit() conn.close() @@ -596,820 +612,854 @@ def arc_all_get(user_id): "user_id": user_id, "story": { "": [{ - "r": True, - "c": True, + "ma": 1, "mi": 1, - "ma": 1 - }, { - "r": True, "c": True, - "mi": 2, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 2, "c": True, - "mi": 3, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 3, "c": True, - "mi": 4, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 4, "c": True, - "mi": 5, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 5, "c": True, - "mi": 6, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 6, "c": True, - "mi": 7, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 7, "c": True, - "mi": 8, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 8, "c": True, - "mi": 9, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 9, "c": True, - "mi": 1, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 1, "c": True, - "mi": 2, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 2, "c": True, - "mi": 3, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 3, "c": True, - "mi": 4, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 4, "c": True, - "mi": 5, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 5, "c": True, - "mi": 6, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 6, "c": True, - "mi": 7, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 7, "c": True, - "mi": 8, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 8, "c": True, - "mi": 9, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 9, "c": True, - "mi": 1, - "ma": 100 + "r": True }, { - "r": True, + "ma": 100, + "mi": 1, "c": True, - "mi": 2, - "ma": 100 + "r": True }, { - "r": True, + "ma": 100, + "mi": 2, "c": True, - "mi": 3, - "ma": 100 + "r": True }, { - "r": True, + "ma": 100, + "mi": 3, "c": True, + "r": True + }, { + "ma": 100, "mi": 4, - "ma": 100 + "c": True, + "r": True + }, { + "ma": 100, + "mi": 5, + "c": True, + "r": True }, { - "r": True, + "ma": 101, + "mi": 1, + "c": True, + "r": True + }, { + "ma": 101, + "mi": 2, "c": True, + "r": True + }, { + "ma": 101, + "mi": 3, + "c": True, + "r": True + }, { + "ma": 101, + "mi": 4, + "c": True, + "r": True + }, { + "ma": 101, "mi": 5, - "ma": 100 + "c": True, + "r": True }, { - "r": True, + "ma": 101, + "mi": 6, "c": True, - "mi": 1, - "ma": 101 + "r": True }, { - "r": True, + "ma": 101, + "mi": 7, "c": True, - "mi": 2, - "ma": 101 + "r": True }, { - "r": True, + "ma": 101, + "mi": 8, "c": True, - "mi": 3, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 1, "c": True, - "mi": 4, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 2, "c": True, - "mi": 5, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 3, "c": True, - "mi": 6, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 4, "c": True, - "mi": 7, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 5, "c": True, - "mi": 8, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 6, "c": True, - "mi": 1, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 1, "c": True, - "mi": 2, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 2, "c": True, - "mi": 3, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 3, "c": True, - "mi": 4, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 4, "c": True, - "mi": 5, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 5, "c": True, - "mi": 6, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 6, "c": True, - "mi": 1, - "ma": 4 + "r": True }, { - "r": True, + "ma": 4, + "mi": 7, "c": True, - "mi": 2, - "ma": 4 + "r": True }, { - "r": True, + "ma": 4, + "mi": 8, "c": True, - "mi": 3, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 1, "c": True, - "mi": 4, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 2, "c": True, - "mi": 5, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 3, "c": True, - "mi": 6, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 4, "c": True, - "mi": 7, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 5, "c": True, - "mi": 8, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 6, "c": True, - "mi": 1, - "ma": 5 + "r": True }, { - "r": True, + "ma": 6, + "mi": 1, "c": True, - "mi": 2, - "ma": 5 + "r": True }, { - "r": True, + "ma": 6, + "mi": 2, "c": True, + "r": True + }, { + "ma": 6, "mi": 3, - "ma": 5 + "c": True, + "r": True }, { - "r": True, + "ma": 7, + "mi": 1, "c": True, - "mi": 4, - "ma": 5 + "r": True }, { - "r": True, + "ma": 7, + "mi": 2, "c": True, - "mi": 5, - "ma": 5 + "r": True }, { - "r": True, + "ma": 7, + "mi": 3, "c": True, - "mi": 6, - "ma": 5 + "r": True }, { - "r": True, + "ma": 7, + "mi": 4, "c": True, - "mi": 1, - "ma": 6 + "r": True }, { - "r": True, + "ma": 7, + "mi": 5, "c": True, - "mi": 2, - "ma": 6 + "r": True }, { - "r": True, + "ma": 7, + "mi": 6, "c": True, - "mi": 3, - "ma": 6 - }] - }, + "r": True + }]}, "devicemodelname": { - "val": "MopeMope" + "val": devicemodelname_data }, "installid": { - "val": "b5e064cf-1a3f-4e64-9636-fce4accc9011" + # installid_data 这里如果不固定,可能会导致arcaea以为数据一样而不更新 + "val": "0fcec8ed-7b62-48e2-9d61-55041a22b123" }, "unlocklist": { "": [{ - "complete": 1, - "unlock_key": "worldvanquisher|2|0" + "unlock_key": "worldvanquisher|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "worldvanquisher|1|0" + "unlock_key": "worldvanquisher|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "worldexecuteme|2|0" + "unlock_key": "worldexecuteme|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "viciousheroism|2|0" + "unlock_key": "viciousheroism|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "vector|2|0" + "unlock_key": "vector|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "valhallazero|2|0" + "unlock_key": "valhallazero|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tiferet|1|0" + "unlock_key": "tiferet|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tiemedowngently|1|0" + "unlock_key": "tiemedowngently|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tempestissimo|0|101" + "unlock_key": "tempestissimo|0|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "syro|2|0" + "unlock_key": "syro|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "suomi|1|0" + "unlock_key": "suomi|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "solitarydream|2|0" + "unlock_key": "solitarydream|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "snowwhite|2|0" + "unlock_key": "snowwhite|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "sheriruth|2|0" + "unlock_key": "sheriruth|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "senkyou|2|0" + "unlock_key": "senkyou|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "senkyou|1|0" + "unlock_key": "senkyou|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "scarletlance|2|0" + "unlock_key": "scarletlance|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "scarletlance|1|0" + "unlock_key": "scarletlance|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rugie|2|0" + "unlock_key": "rugie|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rugie|1|0" + "unlock_key": "rugie|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rise|2|0" + "unlock_key": "rise|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "revixy|2|0" + "unlock_key": "revixy|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "reinvent|2|0" + "unlock_key": "reinvent|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "reinvent|1|0" + "unlock_key": "reinvent|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "redandblue|2|0" + "unlock_key": "redandblue|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "redandblue|1|0" + "unlock_key": "redandblue|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rabbitintheblackroom|2|0" + "unlock_key": "rabbitintheblackroom|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rabbitintheblackroom|1|0" + "unlock_key": "rabbitintheblackroom|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "worldexecuteme|1|0" + "unlock_key": "worldexecuteme|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ringedgenesis|2|0" + "unlock_key": "ringedgenesis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "quon|1|0" + "unlock_key": "quon|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "qualia|2|0" + "unlock_key": "qualia|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "purgatorium|2|0" + "unlock_key": "purgatorium|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "supernova|2|0" + "unlock_key": "supernova|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "saikyostronger|2|3|einherjar|2" + "unlock_key": "saikyostronger|2|3|einherjar|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "purgatorium|1|0" + "unlock_key": "purgatorium|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "pragmatism|2|0" + "unlock_key": "pragmatism|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ouroboros|2|0" + "unlock_key": "ouroboros|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ouroboros|1|0" + "unlock_key": "ouroboros|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "oracle|1|0" + "unlock_key": "oracle|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "onelastdrive|2|0" + "unlock_key": "onelastdrive|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "onelastdrive|1|0" + "unlock_key": "onelastdrive|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "oblivia|2|0" + "unlock_key": "oblivia|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "memoryforest|1|0" + "unlock_key": "pragmatism|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "melodyoflove|2|0" + "unlock_key": "nhelv|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "saikyostronger|2|3|laqryma|2" + "unlock_key": "memoryforest|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "melodyoflove|1|0" + "unlock_key": "melodyoflove|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lucifer|2|0" + "unlock_key": "saikyostronger|2|3|laqryma|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "saikyostronger|2|3|izana|2" + "unlock_key": "melodyoflove|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "halcyon|1|0" + "unlock_key": "lucifer|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "memoryforest|2|0" + "unlock_key": "saikyostronger|2|3|izana|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tiemedowngently|2|0" + "unlock_key": "halcyon|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lostdesire|1|0" + "unlock_key": "memoryforest|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "viciousheroism|1|0" + "unlock_key": "tiemedowngently|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "flyburg|1|0" + "unlock_key": "lostdesire|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lostcivilization|2|0" + "unlock_key": "viciousheroism|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "infinityheaven|1|0" + "unlock_key": "flyburg|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lostdesire|2|0" + "unlock_key": "lostcivilization|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ignotus|2|0" + "unlock_key": "infinityheaven|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "harutopia|2|0" + "unlock_key": "lostdesire|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "revixy|1|0" + "unlock_key": "ignotus|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "aterlbus|1|0" + "unlock_key": "harutopia|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "linearaccelerator|2|0" + "unlock_key": "revixy|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "guardina|2|0" + "unlock_key": "aterlbus|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "corpssansorganes|2|0" + "unlock_key": "linearaccelerator|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "linearaccelerator|1|0" + "unlock_key": "guardina|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "guardina|1|0" + "unlock_key": "corpssansorganes|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "saikyostronger|2|0" + "unlock_key": "linearaccelerator|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "guardina|0|0" + "unlock_key": "guardina|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "valhallazero|1|0" + "unlock_key": "saikyostronger|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grimheart|1|0" + "unlock_key": "guardina|0|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "blaster|2|0" + "unlock_key": "blaster|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grievouslady|2|101" + "unlock_key": "grievouslady|2|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "partyvinyl|2|0" + "unlock_key": "partyvinyl|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "darakunosono|1|0" + "unlock_key": "darakunosono|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grievouslady|1|101" + "unlock_key": "grievouslady|1|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "goodtek|1|0" + "unlock_key": "valhallazero|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tempestissimo|3|101" + "unlock_key": "grimheart|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "chronostasis|2|0" + "unlock_key": "ifi|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gloryroad|2|0" + "unlock_key": "gothiveofra|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "supernova|1|0" + "unlock_key": "tempestissimo|3|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "singularity|2|0" + "unlock_key": "chronostasis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gloryroad|0|0" + "unlock_key": "gloryroad|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "shadesoflight|1|0" + "unlock_key": "supernova|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "kanagawa|2|0" + "unlock_key": "singularity|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "genesis|1|0" + "unlock_key": "gloryroad|0|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "fractureray|1|101" + "unlock_key": "shadesoflight|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "freefall|2|0" + "unlock_key": "kanagawa|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "babaroque|1|0" + "unlock_key": "genesis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "monochromeprincess|2|0" + "unlock_key": "fractureray|1|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "flyburg|2|0" + "unlock_key": "freefall|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "shadesoflight|2|0" + "unlock_key": "fractureray|2|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "espebranch|2|0" + "unlock_key": "qualia|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "qualia|1|0" + "unlock_key": "etherstrike|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "etherstrike|2|0" + "unlock_key": "etherstrike|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tempestissimo|1|101" + "unlock_key": "syro|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "conflict|1|0" + "unlock_key": "anokumene|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "nhelv|1|0" + "unlock_key": "essenceoftwilight|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "etherstrike|1|0" + "unlock_key": "shadesoflight|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "syro|1|0" + "unlock_key": "espebranch|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "anokumene|2|0" + "unlock_key": "snowwhite|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "essenceoftwilight|2|0" + "unlock_key": "partyvinyl|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "snowwhite|1|0" + "unlock_key": "axiumcrisis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "partyvinyl|1|0" + "unlock_key": "ifi|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "axiumcrisis|1|0" + "unlock_key": "tempestissimo|1|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "ifi|2|0" + "unlock_key": "nhelv|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "espebranch|1|0" + "unlock_key": "conflict|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lostcivilization|1|0" + "unlock_key": "espebranch|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "goodtek|2|0" + "unlock_key": "lostcivilization|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "dandelion|2|0" + "unlock_key": "goodtek|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "suomi|2|0" + "unlock_key": "dandelion|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "dandelion|1|0" + "unlock_key": "suomi|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "oblivia|1|0" + "unlock_key": "dandelion|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyberneciacatharsis|1|0" + "unlock_key": "oblivia|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "quon|2|0" + "unlock_key": "cyberneciacatharsis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "bookmaker|2|0" + "unlock_key": "quon|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "chronostasis|1|0" + "unlock_key": "bookmaker|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "heavensdoor|1|0" + "unlock_key": "chronostasis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tempestissimo|2|101" + "unlock_key": "heavensdoor|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyaegha|2|0" + "unlock_key": "tempestissimo|2|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "axiumcrisis|2|0" + "unlock_key": "cyaegha|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "blrink|2|0" + "unlock_key": "axiumcrisis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rise|1|0" + "unlock_key": "blrink|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyanine|1|0" + "unlock_key": "rise|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ifi|1|0" + "unlock_key": "cyanine|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "aterlbus|2|0" + "unlock_key": "corpssansorganes|0|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "dreaminattraction|2|0" + "unlock_key": "vector|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "bookmaker|1|0" + "unlock_key": "infinityheaven|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lucifer|1|0" + "unlock_key": "essenceoftwilight|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "solitarydream|1|0" + "unlock_key": "conflict|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ringedgenesis|1|0" + "unlock_key": "singularity|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "corpssansorganes|1|0" + "unlock_key": "harutopia|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "vector|1|0" + "unlock_key": "cyberneciacatharsis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "infinityheaven|2|0" + "unlock_key": "oracle|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "essenceoftwilight|1|0" + "unlock_key": "clotho|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "conflict|2|0" + "unlock_key": "ignotus|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "singularity|1|0" + "unlock_key": "nirvluce|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "harutopia|1|0" + "unlock_key": "monochromeprincess|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyberneciacatharsis|2|0" + "unlock_key": "lethaeus|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "oracle|2|0" + "unlock_key": "clotho|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "clotho|2|0" + "unlock_key": "aterlbus|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "corpssansorganes|0|0" + "unlock_key": "dreaminattraction|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ignotus|1|0" + "unlock_key": "lucifer|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "monochromeprincess|1|0" + "unlock_key": "solitarydream|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "nirvluce|1|0" + "unlock_key": "ringedgenesis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lethaeus|1|0" + "unlock_key": "corpssansorganes|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "clotho|1|0" + "unlock_key": "buchigireberserker|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "blaster|1|0" + "unlock_key": "bookmaker|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "fractureray|0|101" + "unlock_key": "heavensdoor|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "kanagawa|1|0" + "unlock_key": "genesis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "darakunosono|2|0" + "unlock_key": "halcyon|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "freefall|1|0" + "unlock_key": "blrink|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "nirvluce|2|0" + "unlock_key": "grievouslady|0|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "cyanine|2|0" + "unlock_key": "buchigireberserker|2|3|gothiveofra|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "heavensdoor|2|0" + "unlock_key": "kanagawa|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "genesis|2|0" + "unlock_key": "darakunosono|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "pragmatism|1|0" + "unlock_key": "freefall|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "nhelv|2|0" + "unlock_key": "nirvluce|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "halcyon|2|0" + "unlock_key": "cyanine|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "blrink|1|0" + "unlock_key": "lethaeus|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "fractureray|2|101" + "unlock_key": "sheriruth|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lethaeus|2|0" + "unlock_key": "babaroque|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "sheriruth|1|0" + "unlock_key": "tiferet|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "babaroque|2|0" + "unlock_key": "grimheart|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tiferet|2|0" + "unlock_key": "cyaegha|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grimheart|2|0" + "unlock_key": "monochromeprincess|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyaegha|1|0" + "unlock_key": "babaroque|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "aiueoon|2|0" + "unlock_key": "flyburg|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gloryroad|1|0" + "unlock_key": "goodtek|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "anokumene|1|0" + "unlock_key": "buchigireberserker|2|3|ouroboros|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grievouslady|0|101" + "unlock_key": "fractureray|0|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "dreaminattraction|1|0" + "unlock_key": "blaster|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "buchigireberserker|2|0" + "unlock_key": "gothiveofra|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gothiveofra|2|0" + "unlock_key": "aiueoon|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gothiveofra|1|0" - } - - ] + "unlock_key": "gloryroad|1|0", + "complete": 1 + }, { + "unlock_key": "anokumene|1|0", + "complete": 1 + }, { + "unlock_key": "dreaminattraction|1|0", + "complete": 1 + }] }, "clearedsongs": { - "": song_1 + "": clearedsongs_data }, "clearlamps": { - "": song_2 + "": clearlamps_data }, "scores": { - "": song_3 + "": scores_data }, "version": { "val": 1 diff --git a/latest version/server/auth.py b/latest version/server/auth.py index 2afe4a4..8404552 100644 --- a/latest version/server/auth.py +++ b/latest version/server/auth.py @@ -82,7 +82,7 @@ def insert_user_char(c, user_id): now = int(time.time() * 1000) c.execute('''insert into user(user_id, name, password, join_date, user_code, rating_ptt, character_id, is_skill_sealed, is_char_uncapped, is_char_uncapped_override, is_hide_rating, favorite_character, max_stamina_notification_enabled, current_map, ticket) - values(:user_id, :name, :password, :join_date, :user_code, 0, 0, 0, 0, 0, 0, -1, 0, '', 114514) + values(:user_id, :name, :password, :join_date, :user_code, 0, 0, 0, 0, 0, 0, -1, 0, '', 0) ''', {'user_code': user_code, 'user_id': user_id, 'join_date': now, 'name': name, 'password': hash_pwd}) c.execute('''insert into recent30(user_id) values(:user_id)''', { 'user_id': user_id}) diff --git a/latest version/server/info.py b/latest version/server/info.py index 93b2aec..403cdfb 100644 --- a/latest version/server/info.py +++ b/latest version/server/info.py @@ -182,7 +182,7 @@ def get_value_0(c, user_id): "max_stamina_ts": 1586274871917, "stamina": 12, "world_unlocks": ["scenery_chap1", "scenery_chap2", "scenery_chap3", "scenery_chap4", "scenery_chap5"], - "world_songs": ["babaroque", "shadesoflight", "kanagawa", "lucifer", "anokumene", "ignotus", "rabbitintheblackroom", "qualia", "redandblue", "bookmaker", "darakunosono", "espebranch", "blacklotus", "givemeanightmare", "vividtheory", "onefr", "gekka", "vexaria3", "infinityheaven3", "fairytale3", "goodtek3", "suomi", "rugie", "faintlight", "harutopia", "goodtek", "dreaminattraction", "syro", "diode", "freefall", "grimheart", "blaster", "cyberneciacatharsis", "monochromeprincess", "revixy", "vector", "supernova", "nhelv", "purgatorium3", "dement3", "crossover", "guardina", "axiumcrisis", "worldvanquisher", "sheriruth", "pragmatism", "gloryroad", "etherstrike", "corpssansorganes", "lostdesire", "blrink", "essenceoftwilight", "lapis", "solitarydream", "lumia3"], + "world_songs": ["babaroque", "shadesoflight", "kanagawa", "lucifer", "anokumene", "ignotus", "rabbitintheblackroom", "qualia", "redandblue", "bookmaker", "darakunosono", "espebranch", "blacklotus", "givemeanightmare", "vividtheory", "onefr", "gekka", "vexaria3", "infinityheaven3", "fairytale3", "goodtek3", "suomi", "rugie", "faintlight", "harutopia", "goodtek", "dreaminattraction", "syro", "diode", "freefall", "grimheart", "blaster", "cyberneciacatharsis", "monochromeprincess", "revixy", "vector", "supernova", "nhelv", "purgatorium3", "dement3", "crossover", "guardina", "axiumcrisis", "worldvanquisher", "sheriruth", "pragmatism", "gloryroad", "etherstrike", "corpssansorganes", "lostdesire", "blrink", "essenceoftwilight", "lapis", "solitarydream", "lumia3", "purpleverse"], "singles": get_user_singles(c, user_id), # ["dataerror", "yourvoiceso", "crosssoul", "impurebird", "auxesia", "modelista", "yozakurafubuki", "surrender", "metallicpunisher", "carminescythe", "bethere", "callmyname", "fallensquare", "dropdead", "alexandrite", "astraltale", "phantasia", "empireofwinter", "libertas", "dottodot", "dreadnought", "mirzam", "heavenlycaress", "filament", "avantraze", "battlenoone", "saikyostronger", "izana", "einherjar", "laqryma", "amygdata", "altale", "feelssoright", "scarletcage", "teriqma", "mahoroba", "badtek", "maliciousmischance", "buchigireberserker", "galaxyfriends", "xeraphinite", "xanatos"] "packs": get_user_packs(c, user_id), # ["vs", "extend", "dynamix", "prelude", "core", "yugamu", "omatsuri", "zettai", "mirai", "shiawase", "chunithm", "nijuusei", "groovecoaster", "rei", "tonesphere", "lanota"] diff --git a/latest version/templates/web/changeuserpurchase.html b/latest version/templates/web/changeuserpurchase.html index 95c06e4..e7df2bb 100644 --- a/latest version/templates/web/changeuserpurchase.html +++ b/latest version/templates/web/changeuserpurchase.html @@ -28,7 +28,7 @@

{% block title %}Change user purchase information{% endblock %}



-
+
Edit all the users

对所有单曲和曲包的操作 Operation to all singles and packs: diff --git a/latest version/templates/web/index.html b/latest version/templates/web/index.html index 1f37a2f..cda32c2 100644 --- a/latest version/templates/web/index.html +++ b/latest version/templates/web/index.html @@ -20,6 +20,7 @@

游戏方面 Game


系统方面 System

数据库更新 Update databases

+用户存档更新 Update user saves

歌曲修改 Change the songs

角色修改 Change the characters

购买信息修改 Change the items

diff --git a/latest version/templates/web/updateusersave.html b/latest version/templates/web/updateusersave.html new file mode 100644 index 0000000..ae23463 --- /dev/null +++ b/latest version/templates/web/updateusersave.html @@ -0,0 +1,30 @@ +{% extends 'base.html' %} +{% block header %} +

{% block title %}Update users' saves{% endblock %}

+{% endblock %} + +{% block content %} + +
Update one user's saves to the database
+ + + or
+ + +
+ + + +
+
+
+
Update all users' saves to the database
+
+ + +
这里会将用户上传的存档覆盖到best_score表中,请注意是覆盖,不会进行分数比较。
+
Here you can overlay the saves uploaded by users to best_score table. Please remember that it + is an overlay action, so scores will not be compared.
+ +
+{% endblock %} \ No newline at end of file diff --git a/latest version/web/index.py b/latest version/web/index.py index 101c0a2..be009c3 100644 --- a/latest version/web/index.py +++ b/latest version/web/index.py @@ -402,7 +402,7 @@ def all_character(): def change_character(): # 修改角色数据 skill_ids = ['No_skill', 'gauge_easy', 'note_mirror', 'gauge_hard', 'frag_plus_10_pack_stellights', 'gauge_easy|frag_plus_15_pst&prs', 'gauge_hard|fail_frag_minus_100', 'frag_plus_5_side_light', 'visual_hide_hp', 'frag_plus_5_side_conflict', 'challenge_fullcombo_0gauge', 'gauge_overflow', 'gauge_easy|note_mirror', 'note_mirror', 'visual_tomato_pack_tonesphere', - 'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', 'frags_kou', 'visual_ink', 'shirabe_entry_fee', 'frags_yume'] + 'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', 'frags_kou', 'visual_ink', 'shirabe_entry_fee', 'frags_yume', 'note_mirror|visual_hide_far'] return render_template('web/changechar.html', skill_ids=skill_ids) @@ -564,7 +564,6 @@ def edit_user(): '''select user_id from user where name=:a''', {'a': name}) user_id = c.fetchone() - posts = [] if user_id: user_id = user_id[0] @@ -642,7 +641,6 @@ def edit_user_purchase(): '''select user_id from user where name=:a''', {'a': name}) user_id = c.fetchone() - posts = [] if user_id: user_id = user_id[0] @@ -717,11 +715,13 @@ def change_item(): else: orig_price = None if discount_from: - discount_from = int(time.mktime(time.strptime(discount_from, "%Y-%m-%dT%H:%M"))) * 1000 + discount_from = int(time.mktime(time.strptime( + discount_from, "%Y-%m-%dT%H:%M"))) * 1000 else: discount_from = None if discount_to: - discount_to = int(time.mktime(time.strptime(discount_to, "%Y-%m-%dT%H:%M"))) * 1000 + discount_to = int(time.mktime(time.strptime( + discount_to, "%Y-%m-%dT%H:%M"))) * 1000 else: discount_to = None except: @@ -767,3 +767,60 @@ def change_item(): flash(error) return render_template('web/changeitem.html') + + +@bp.route('/updateusersave', methods=['POST', 'GET']) +@login_required +def update_user_save(): + # 将用户存档覆盖到分数表中 + + if request.method == 'GET': + return render_template('web/updateusersave.html') + + error = None + flag = True + name = None + user_code = None + + conn = sqlite3.connect('./database/arcaea_database.db') + c = conn.cursor() + + # 全修改 + if 'name' not in request.form and 'user_code' not in request.form: + flag = False + web.system.update_all_save(c) + flash("全部用户存档同步成功 Successfully update all users' saves.") + + else: + name = request.form['name'] + user_code = request.form['user_code'] + + # 指定修改 + if name or user_code: + + if user_code: + c.execute('''select user_id from user where user_code=:a''', { + 'a': user_code}) + else: + c.execute( + '''select user_id from user where name=:a''', {'a': name}) + + user_id = c.fetchone() + if user_id: + user_id = user_id[0] + web.system.update_one_save(c, user_id) + flash("用户存档同步成功 Successfully update the user's saves.") + + else: + error = '玩家不存在 The player does not exist.' + + else: + if flag: + error = '输入为空 Null Input.' + + conn.commit() + conn.close() + if error: + flash(error) + + return render_template('web/updateusersave.html') diff --git a/latest version/web/system.py b/latest version/web/system.py index d0b2355..5a9b92b 100644 --- a/latest version/web/system.py +++ b/latest version/web/system.py @@ -1,6 +1,8 @@ import os import sqlite3 import time +import json +import server.arcscore def int2b(x): @@ -140,7 +142,7 @@ def update_user_char(c): def update_database(): # 将old数据库不存在数据加入到新数据库上,并删除old数据库 - # 对于arcaea_datebase.db,更新best_score,friend,recent30,user,user_world, user_item并用character数据更新user_char + # 对于arcaea_datebase.db,更新best_score,friend,recent30,user,user_world, user_item, user_save并用character数据更新user_char # 对于arcsong.db,更新songs if os.path.isfile("database/old_arcaea_database.db") and os.path.isfile("database/arcaea_database.db"): conn1 = sqlite3.connect('./database/old_arcaea_database.db') @@ -154,6 +156,7 @@ def update_database(): update_one_table(c1, c2, 'recent30') update_one_table(c1, c2, 'user_world') update_one_table(c1, c2, 'user_item') + update_one_table(c1, c2, 'user_save') update_user_char(c2) @@ -243,3 +246,55 @@ def get_all_item(): conn.commit() conn.close() return re + + +def update_one_save(c, user_id): + # 同步指定用户存档 + # 注意,best_score表不比较,直接覆盖 + + c.execute('''select scores_data, clearlamps_data from user_save where user_id=:a''', { + 'a': user_id}) + x = c.fetchone() + if x: + scores = json.loads(x[0])[""] + clearlamps = json.loads(x[1])[""] + clear_song_id_difficulty = [] + clear_state = [] + for i in clearlamps: + clear_song_id_difficulty.append(i['song_id']+str(i['difficulty'])) + clear_state.append(i['clear_type']) + + for i in scores: + rating = server.arcscore.get_one_ptt( + i['song_id'], i['difficulty'], i['score']) + try: + index = clear_song_id_difficulty.index( + i['song_id'] + str(i['difficulty'])) + except: + index = -1 + if index != -1: + clear_type = clear_state[index] + else: + clear_type = 0 + c.execute('''delete from best_score where user_id=:a and song_id=:b and difficulty=:c''', { + 'a': user_id, 'b': i['song_id'], 'c': i['difficulty']}) + c.execute('''insert into best_score values(:a, :b, :c, :d, :e, :f, :g, :h, :i, :j, :k, :l, :m, :n)''', { + 'a': user_id, 'b': i['song_id'], 'c': i['difficulty'], 'd': i['score'], 'e': i['shiny_perfect_count'], 'f': i['perfect_count'], 'g': i['near_count'], 'h': i['miss_count'], 'i': i['health'], 'j': i['modifier'], 'k': i['time_played'], 'l': clear_type, 'm': clear_type, 'n': rating}) + + ptt = server.arcscore.get_user_ptt(c, user_id) # 更新PTT + c.execute('''update user set rating_ptt=:a where user_id=:b''', { + 'a': ptt, 'b': user_id}) + + return + + +def update_all_save(c): + # 同步所有用户存档 + + c.execute('''select user_id from user_save''') + x = c.fetchall() + if x: + for i in x: + update_one_save(c, i[0]) + + return