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 @@ item_id text,
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,
+ "r": True
+ }, {
+ "ma": 1,
"mi": 2,
- "ma": 1
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 1,
"mi": 3,
- "ma": 1
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 1,
"mi": 4,
- "ma": 1
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 1,
"mi": 5,
- "ma": 1
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 1,
"mi": 6,
- "ma": 1
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 1,
"mi": 7,
- "ma": 1
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 1,
"mi": 8,
- "ma": 1
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 1,
"mi": 9,
- "ma": 1
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 2,
"mi": 1,
- "ma": 2
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 2,
"mi": 2,
- "ma": 2
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 2,
"mi": 3,
- "ma": 2
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 2,
"mi": 4,
- "ma": 2
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 2,
"mi": 5,
- "ma": 2
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 2,
"mi": 6,
- "ma": 2
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 2,
"mi": 7,
- "ma": 2
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 2,
"mi": 8,
- "ma": 2
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 2,
"mi": 9,
- "ma": 2
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 100,
"mi": 1,
- "ma": 100
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 100,
"mi": 2,
- "ma": 100
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 100,
"mi": 3,
- "ma": 100
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 100,
"mi": 4,
- "ma": 100
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 100,
"mi": 5,
- "ma": 100
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 101,
"mi": 1,
- "ma": 101
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 101,
"mi": 2,
- "ma": 101
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 101,
"mi": 3,
- "ma": 101
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 101,
"mi": 4,
- "ma": 101
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 101,
"mi": 5,
- "ma": 101
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 101,
"mi": 6,
- "ma": 101
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 101,
"mi": 7,
- "ma": 101
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 101,
"mi": 8,
- "ma": 101
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 3,
"mi": 1,
- "ma": 3
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 3,
"mi": 2,
- "ma": 3
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 3,
"mi": 3,
- "ma": 3
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 3,
"mi": 4,
- "ma": 3
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 3,
"mi": 5,
- "ma": 3
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 3,
"mi": 6,
- "ma": 3
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 4,
"mi": 1,
- "ma": 4
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 4,
"mi": 2,
- "ma": 4
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 4,
"mi": 3,
- "ma": 4
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 4,
"mi": 4,
- "ma": 4
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 4,
"mi": 5,
- "ma": 4
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 4,
"mi": 6,
- "ma": 4
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 4,
"mi": 7,
- "ma": 4
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 4,
"mi": 8,
- "ma": 4
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 5,
"mi": 1,
- "ma": 5
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 5,
"mi": 2,
- "ma": 5
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 5,
"mi": 3,
- "ma": 5
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 5,
"mi": 4,
- "ma": 5
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 5,
"mi": 5,
- "ma": 5
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 5,
"mi": 6,
- "ma": 5
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 6,
"mi": 1,
- "ma": 6
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 6,
"mi": 2,
- "ma": 6
- }, {
- "r": True,
"c": True,
+ "r": True
+ }, {
+ "ma": 6,
"mi": 3,
- "ma": 6
- }]
- },
+ "c": True,
+ "r": True
+ }, {
+ "ma": 7,
+ "mi": 1,
+ "c": True,
+ "r": True
+ }, {
+ "ma": 7,
+ "mi": 2,
+ "c": True,
+ "r": True
+ }, {
+ "ma": 7,
+ "mi": 3,
+ "c": True,
+ "r": True
+ }, {
+ "ma": 7,
+ "mi": 4,
+ "c": True,
+ "r": True
+ }, {
+ "ma": 7,
+ "mi": 5,
+ "c": True,
+ "r": True
+ }, {
+ "ma": 7,
+ "mi": 6,
+ "c": True,
+ "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 arc_register(name: str, password: str): # 注册
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 @@