Update to v1.8

close #4
close #7
This commit is contained in:
Lost-MSth
2020-12-03 21:54:24 +08:00
parent dfcbb6f9c0
commit 5c02ecdf37
15 changed files with 889 additions and 673 deletions

View File

@@ -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

Binary file not shown.

View File

@@ -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)'''

View File

@@ -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
}]

View File

@@ -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,

View File

@@ -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": {

File diff suppressed because it is too large Load Diff

View File

@@ -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})

View File

@@ -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"]

View File

@@ -28,7 +28,7 @@
</form>
<br />
<hr />
<form action="/web/changeuserpurchase/" method="post">
<form action="/web/changeuserpurchase/edituser" method="post">
<div class="title">Edit all the users</div>
<br />
<div>对所有单曲和曲包的操作 Operation to all singles and packs:

View File

@@ -20,6 +20,7 @@
<hr>
<h1>系统方面 System</h1>
<a href="{{ url_for('index.update_database') }}">数据库更新 Update databases</a></br></br>
<a href="{{ url_for('index.update_user_save') }}">用户存档更新 Update user saves</a></br></br>
<a href="{{ url_for('index.change_song') }}">歌曲修改 Change the songs</a></br></br>
<a href="{{ url_for('index.change_character') }}">角色修改 Change the characters</a></br></br>
<a href="{{ url_for('index.change_item') }}">购买信息修改 Change the items</a></br></br>

View File

@@ -0,0 +1,30 @@
{% extends 'base.html' %}
{% block header %}
<h1>{% block title %}Update users' saves{% endblock %}</h1>
{% endblock %}
{% block content %}
<form action="/web/updateusersave" method="post">
<div class="title">Update one user's saves to the database</div>
<label for="name">Arcaea Username</label>
<input name="name" id="name">
or<br />
<label for="user_code">Arcaea User Code</label>
<input name="user_code" id="user_code">
<br />
<input type="submit" value="Update">
</form>
<br />
<hr />
<form action="/web/updateusersave" method="post">
<div class="title">Update all users' saves to the database</div>
<br />
<input type="submit" value="Update all">
<div class="content">这里会将用户上传的存档覆盖到best_score表中请注意是覆盖不会进行分数比较。</div>
<div class="content">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.</div>
</form>
{% endblock %}

View File

@@ -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')

View File

@@ -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_scorefriendrecent30useruser_world, user_item并用character数据更新user_char
# 对于arcaea_datebase.db更新best_scorefriendrecent30useruser_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