mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2025-12-14 08:06:23 +08:00
607 lines
24 KiB
Python
607 lines
24 KiB
Python
import sqlite3
|
||
import time
|
||
import json
|
||
|
||
# 数据库初始化文件,删掉arcaea_database.db文件后运行即可,谨慎使用
|
||
|
||
ARCAEA_SERVER_VERSION = 'v2.10.0'
|
||
|
||
|
||
def main(path='./'):
|
||
conn = sqlite3.connect(path+'arcaea_database.db')
|
||
c = conn.cursor()
|
||
c.execute('''create table if not exists config(id text primary key,
|
||
value text
|
||
);''')
|
||
c.execute('''insert into config values("version", :a);''',
|
||
{'a': ARCAEA_SERVER_VERSION})
|
||
c.execute('''create table if not exists user(user_id int primary key,
|
||
name text unique,
|
||
password text not null,
|
||
join_date char(20),
|
||
user_code char(10),
|
||
rating_ptt int,
|
||
character_id int,
|
||
is_skill_sealed int,
|
||
is_char_uncapped int,
|
||
is_char_uncapped_override int,
|
||
is_hide_rating int,
|
||
song_id text,
|
||
difficulty int,
|
||
score int,
|
||
shiny_perfect_count int,
|
||
perfect_count int,
|
||
near_count int,
|
||
miss_count int,
|
||
health int,
|
||
modifier int,
|
||
time_played int,
|
||
clear_type int,
|
||
rating real,
|
||
favorite_character int,
|
||
max_stamina_notification_enabled int,
|
||
current_map text,
|
||
ticket int,
|
||
prog_boost int,
|
||
email text,
|
||
world_rank_score int,
|
||
ban_flag text,
|
||
next_fragstam_ts int,
|
||
max_stamina_ts int,
|
||
stamina int,
|
||
world_mode_locked_end_ts int
|
||
);''')
|
||
c.execute('''create table if not exists login(access_token text,
|
||
user_id int,
|
||
login_time int,
|
||
login_ip text,
|
||
login_device text,
|
||
primary key(access_token, user_id)
|
||
);''')
|
||
c.execute('''create table if not exists friend(user_id_me int,
|
||
user_id_other int,
|
||
primary key (user_id_me, user_id_other)
|
||
);''')
|
||
c.execute('''create table if not exists best_score(user_id int,
|
||
song_id text,
|
||
difficulty int,
|
||
score int,
|
||
shiny_perfect_count int,
|
||
perfect_count int,
|
||
near_count int,
|
||
miss_count int,
|
||
health int,
|
||
modifier int,
|
||
time_played int,
|
||
best_clear_type int,
|
||
clear_type int,
|
||
rating real,
|
||
primary key(user_id, song_id, difficulty)
|
||
);''')
|
||
c.execute('''create table if not exists user_char(user_id int,
|
||
character_id int,
|
||
level int,
|
||
exp real,
|
||
is_uncapped int,
|
||
is_uncapped_override int,
|
||
primary key(user_id, character_id)
|
||
);''')
|
||
c.execute('''create table if not exists user_char_full(user_id int,
|
||
character_id int,
|
||
level int,
|
||
exp real,
|
||
is_uncapped int,
|
||
is_uncapped_override int,
|
||
primary key(user_id, character_id)
|
||
);''')
|
||
c.execute('''create table if not exists character(character_id int primary key,
|
||
name text,
|
||
max_level int,
|
||
frag1 real,
|
||
prog1 real,
|
||
overdrive1 real,
|
||
frag20 real,
|
||
prog20 real,
|
||
overdrive20 real,
|
||
frag30 real,
|
||
prog30 real,
|
||
overdrive30 real,
|
||
skill_id text,
|
||
skill_unlock_level int,
|
||
skill_requires_uncap int,
|
||
skill_id_uncap text,
|
||
char_type int,
|
||
is_uncapped int
|
||
);''')
|
||
c.execute('''create table if not exists char_item(character_id int,
|
||
item_id text,
|
||
type text,
|
||
amount int,
|
||
primary key(character_id, item_id, type)
|
||
);''')
|
||
c.execute('''create table if not exists recent30(user_id int primary key,
|
||
r0 real,
|
||
song_id0 text,
|
||
r1 real,
|
||
song_id1 text,
|
||
r2 real,
|
||
song_id2 text,
|
||
r3 real,
|
||
song_id3 text,
|
||
r4 real,
|
||
song_id4 text,
|
||
r5 real,
|
||
song_id5 text,
|
||
r6 real,
|
||
song_id6 text,
|
||
r7 real,
|
||
song_id7 text,
|
||
r8 real,
|
||
song_id8 text,
|
||
r9 real,
|
||
song_id9 text,
|
||
r10 real,
|
||
song_id10 text,
|
||
r11 real,
|
||
song_id11 text,
|
||
r12 real,
|
||
song_id12 text,
|
||
r13 real,
|
||
song_id13 text,
|
||
r14 real,
|
||
song_id14 text,
|
||
r15 real,
|
||
song_id15 text,
|
||
r16 real,
|
||
song_id16 text,
|
||
r17 real,
|
||
song_id17 text,
|
||
r18 real,
|
||
song_id18 text,
|
||
r19 real,
|
||
song_id19 text,
|
||
r20 real,
|
||
song_id20 text,
|
||
r21 real,
|
||
song_id21 text,
|
||
r22 real,
|
||
song_id22 text,
|
||
r23 real,
|
||
song_id23 text,
|
||
r24 real,
|
||
song_id24 text,
|
||
r25 real,
|
||
song_id25 text,
|
||
r26 real,
|
||
song_id26 text,
|
||
r27 real,
|
||
song_id27 text,
|
||
r28 real,
|
||
song_id28 text,
|
||
r29 real,
|
||
song_id29 text
|
||
);''')
|
||
c.execute('''create table if not exists user_world(user_id int,
|
||
map_id text,
|
||
curr_position int,
|
||
curr_capture real,
|
||
is_locked int,
|
||
primary key(user_id, map_id)
|
||
);''')
|
||
c.execute('''create table if not exists songplay_token(token text primary key,
|
||
user_id int,
|
||
song_id text,
|
||
difficulty int,
|
||
course_id text,
|
||
course_state int,
|
||
course_score int,
|
||
course_clear_type int,
|
||
stamina_multiply int,
|
||
fragment_multiply int,
|
||
prog_boost_multiply int
|
||
);''')
|
||
c.execute('''create table if not exists download_token(user_id int,
|
||
song_id text,
|
||
file_name text,
|
||
token text,
|
||
time int,
|
||
primary key(user_id, song_id, file_name)
|
||
);''')
|
||
c.execute('''create table if not exists user_download(user_id int,
|
||
time int,
|
||
token text,
|
||
primary key(user_id, time, token)
|
||
);''')
|
||
c.execute('''create table if not exists item(item_id text,
|
||
type text,
|
||
is_available int,
|
||
_id text,
|
||
primary key(item_id, type)
|
||
);''')
|
||
c.execute('''create table if not exists user_item(user_id int,
|
||
item_id text,
|
||
type text,
|
||
amount int,
|
||
primary key(user_id, item_id, type)
|
||
);''')
|
||
c.execute('''create table if not exists purchase(purchase_name text primary key,
|
||
price int,
|
||
orig_price int,
|
||
discount_from int,
|
||
discount_to int,
|
||
discount_reason text
|
||
);''')
|
||
c.execute('''create table if not exists purchase_item(purchase_name text,
|
||
item_id text,
|
||
type text,
|
||
amount int,
|
||
primary key(purchase_name, 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,
|
||
createdAt int,
|
||
finalestate_data text
|
||
);''')
|
||
c.execute('''create table if not exists present(present_id text primary key,
|
||
expire_ts int,
|
||
description text
|
||
);''')
|
||
c.execute('''create table if not exists user_present(user_id int,
|
||
present_id text,
|
||
primary key(user_id, present_id)
|
||
);''')
|
||
c.execute('''create table if not exists present_item(present_id text,
|
||
item_id text,
|
||
type text,
|
||
amount int,
|
||
primary key(present_id, item_id, type)
|
||
);''')
|
||
c.execute('''create table if not exists chart(song_id text primary key,
|
||
name text,
|
||
rating_pst int,
|
||
rating_prs int,
|
||
rating_ftr int,
|
||
rating_byn int
|
||
);''')
|
||
c.execute('''create table if not exists redeem(code text primary key,
|
||
type int
|
||
);''')
|
||
c.execute('''create table if not exists user_redeem(user_id int,
|
||
code text,
|
||
primary key(user_id, code)
|
||
);''')
|
||
c.execute('''create table if not exists redeem_item(code text,
|
||
item_id text,
|
||
type text,
|
||
amount int,
|
||
primary key(code, item_id, type)
|
||
);''')
|
||
|
||
c.execute('''create table if not exists role(role_id int primary key,
|
||
role_name text,
|
||
caption text
|
||
);''')
|
||
c.execute('''create table if not exists user_role(user_id int,
|
||
role_id int,
|
||
primary key(user_id, role_id)
|
||
);''')
|
||
c.execute('''create table if not exists power(power_id int primary key,
|
||
power_name text,
|
||
caption text
|
||
);''')
|
||
c.execute('''create table if not exists role_power(role_id int,
|
||
power_id int,
|
||
primary key(role_id, power_id)
|
||
);''')
|
||
c.execute('''create table if not exists api_login(user_id int,
|
||
token text,
|
||
login_time int,
|
||
login_ip text,
|
||
primary key(user_id, token)
|
||
);''')
|
||
c.execute('''create table if not exists course(course_id text primary key,
|
||
course_name text,
|
||
dan_name text,
|
||
style int,
|
||
gauge_requirement text,
|
||
flag_as_hidden_when_requirements_not_met int,
|
||
can_start int
|
||
);''')
|
||
c.execute('''create table if not exists user_course(user_id int,
|
||
course_id text,
|
||
high_score int,
|
||
best_clear_type int,
|
||
primary key(user_id, course_id)
|
||
);''')
|
||
c.execute('''create table if not exists course_chart(course_id text,
|
||
song_id text,
|
||
difficulty int,
|
||
flag_as_hidden int,
|
||
song_index int,
|
||
primary key(course_id, song_index)
|
||
);''')
|
||
c.execute('''create table if not exists course_requirement(course_id text,
|
||
required_id text,
|
||
primary key(course_id, required_id)
|
||
);''')
|
||
c.execute('''create table if not exists course_item(course_id text,
|
||
item_id text,
|
||
type text,
|
||
amount int,
|
||
primary key(course_id, item_id, type)
|
||
);''')
|
||
|
||
c.execute(
|
||
'''create index best_score_1 on best_score (song_id, difficulty);''') # 排名查询优化
|
||
c.execute(
|
||
'''create index download_token_1 on download_token (song_id, file_name);''') # 下载token判断优化
|
||
|
||
# 搭档初始化
|
||
char = ['hikari', 'tairitsu', 'kou', 'sapphire', 'lethe', 'hikari&tairitsu(reunion)', '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', 'Luna & Mia', 'areus', 'seele', 'isabelle', 'mir', 'lagrange', 'linka', 'nami', 'Saya & Elizabeth', 'lily', 'kanae(midsummer)', 'alice&tenniel(minuet)', 'tairitsu(elegy)', 'marija', 'vita', 'hikari(fatalis)', 'saki', 'setsuna']
|
||
|
||
skill_id = ['gauge_easy', '', '', '', 'note_mirror', 'skill_reunion', '', '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', '', 'note_mirror|visual_hide_far', 'frags_ongeki', 'gauge_areus', 'gauge_seele', 'gauge_isabelle', 'gauge_exhaustion', 'skill_lagrange', 'gauge_safe_10', 'frags_nami', 'skill_elizabeth', 'skill_lily', 'skill_kanae_midsummer', '', '', 'visual_ghost_skynotes', 'skill_vita', 'skill_fatalis', 'frags_ongeki_slash', 'frags_ongeki_hard']
|
||
|
||
skill_id_uncap = ['', '', 'frags_kou', '', 'visual_ink', '', '', '', '', '', '', 'eto_uncap', 'luna_uncap', 'shirabe_entry_fee',
|
||
'', '', '', '', '', 'ayu_uncap', '', 'frags_yume', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
|
||
|
||
skill_unlock_level = [0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 0, 0, 0, 0, 0,
|
||
0, 0, 0, 8, 0, 14, 0, 0, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 0]
|
||
|
||
frag1 = [55, 55, 60, 50, 47, 79, 47, 57, 41, 22, 50, 54, 60, 56, 78, 42, 41, 61, 52, 50, 52, 32,
|
||
42, 55, 45, 58, 43, 0.5, 68, 50, 62, 45, 45, 52, 44, 27, 59, 0, 45, 50, 50, 47, 47, 61, 43, 42, 38, 25, 58, 50, 61, 45, 45, 38, 34, 27, 18, 56]
|
||
|
||
prog1 = [35, 55, 47, 50, 60, 70, 60, 70, 58, 45, 70, 45, 42, 46, 61, 67, 49, 44, 28, 45, 24, 46, 52,
|
||
59, 62, 33, 58, 25, 63, 69, 50, 45, 45, 51, 34, 70, 62, 70, 45, 32, 32, 61, 47, 47, 37, 42, 50, 50, 45, 41, 61, 45, 45, 58, 50, 130, 18, 57]
|
||
|
||
overdrive1 = [35, 55, 25, 50, 47, 70, 72, 57, 41, 7, 10, 32, 65, 31, 61, 53, 31, 47, 38, 12, 39, 18,
|
||
48, 65, 45, 55, 44, 25, 46, 44, 33, 45, 45, 37, 25, 27, 50, 20, 45, 63, 21, 47, 61, 47, 65, 80, 38, 30, 49, 15, 34, 45, 45, 38, 67, 120, 44, 33]
|
||
|
||
frag20 = [78, 80, 90, 75, 70, 79, 70, 79, 65, 40, 50, 80, 90, 82, 0, 61, 67, 92, 85, 50, 86, 52,
|
||
65, 85, 67, 88, 64, 0.5, 95, 70, 95, 50, 80, 87, 71, 50, 85, 0, 80, 75, 50, 70, 70, 90, 65, 80, 61, 50, 68, 60, 90, 67, 50, 60, 51, 50, 34, 85]
|
||
|
||
prog20 = [61, 80, 70, 75, 90, 70, 90, 102, 84, 78, 105, 67, 63, 68, 0, 99, 80, 66, 46, 83, 40, 73,
|
||
80, 90, 93, 50, 86, 78, 89, 98, 75, 80, 50, 64, 55, 100, 90, 110, 80, 50, 74, 90, 70, 70, 56, 80, 79, 55, 65, 59, 90, 50, 90, 90, 75, 210, 34, 86]
|
||
|
||
overdrive20 = [61, 80, 47, 75, 70, 70, 95, 79, 65, 31, 50, 59, 90, 58, 0, 78, 50, 70, 62, 49, 64,
|
||
46, 73, 95, 67, 84, 70, 78, 69, 70, 50, 80, 80, 63, 25, 50, 72, 55, 50, 95, 55, 70, 90, 70, 99, 80, 61, 40, 69, 62, 51, 90, 67, 60, 100, 200, 84, 50]
|
||
|
||
frag30 = [88, 90, 100, 75, 80, 89, 70, 79, 65, 40, 50, 90, 100, 92, 0, 61, 67, 92, 85, 50, 86, 62,
|
||
65, 85, 67, 88, 74, 0.5, 105, 80, 95, 50, 80, 87, 71, 50, 95, 0, 80, 75, 50, 70, 80, 100, 65, 80, 61, 50, 68, 60, 90, 67, 50, 60, 51, 50, 34, 85]
|
||
|
||
prog30 = [71, 90, 80, 75, 100, 80, 90, 102, 84, 78, 105, 77, 73, 78, 0, 99, 80, 66, 46, 93, 40, 83,
|
||
80, 90, 93, 50, 96, 88, 99, 108, 75, 80, 50, 64, 55, 100, 100, 110, 80, 50, 74, 90, 80, 80, 56, 80, 79, 55, 65, 59, 90, 50, 90, 90, 75, 210, 34, 86]
|
||
|
||
overdrive30 = [71, 90, 57, 75, 80, 80, 95, 79, 65, 31, 50, 69, 100, 68, 0, 78, 50, 70, 62, 59, 64,
|
||
56, 73, 95, 67, 84, 80, 88, 79, 80, 50, 80, 80, 63, 25, 50, 82, 55, 50, 95, 55, 70, 100, 80, 99, 80, 61, 40, 69, 62, 51, 90, 67, 60, 100, 200, 84, 50]
|
||
|
||
char_type = [1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 0, 1,
|
||
0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 2]
|
||
|
||
char_core = {
|
||
0: [{'core_id': 'core_hollow', 'amount': 25}, {'core_id': 'core_desolate', 'amount': 5}],
|
||
1: [{'core_id': 'core_hollow', 'amount': 5}, {'core_id': 'core_desolate', 'amount': 25}],
|
||
2: [{'core_id': 'core_hollow', 'amount': 5}, {'core_id': 'core_crimson', 'amount': 25}],
|
||
4: [{'core_id': 'core_ambivalent', 'amount': 25}, {'core_id': 'core_desolate', 'amount': 5}],
|
||
13: [{'core_id': 'core_scarlet', 'amount': 30}],
|
||
21: [{'core_id': 'core_scarlet', 'amount': 30}],
|
||
26: [{'core_id': 'core_chunithm', 'amount': 15}],
|
||
27: [{'core_id': 'core_chunithm', 'amount': 15}],
|
||
28: [{'core_id': 'core_chunithm', 'amount': 15}],
|
||
29: [{'core_id': 'core_chunithm', 'amount': 15}],
|
||
36: [{'core_id': 'core_chunithm', 'amount': 15}],
|
||
42: [{'core_id': 'core_chunithm', 'amount': 15}],
|
||
43: [{'core_id': 'core_chunithm', 'amount': 15}],
|
||
11: [{'core_id': 'core_binary', 'amount': 25}, {'core_id': 'core_hollow', 'amount': 5}],
|
||
12: [{'core_id': 'core_binary', 'amount': 25}, {'core_id': 'core_desolate', 'amount': 5}],
|
||
19: [{'core_id': 'core_colorful', 'amount': 30}]
|
||
}
|
||
|
||
for i in range(0, 58):
|
||
skill_requires_uncap = 1 if i == 2 else 0
|
||
|
||
if i in [0, 1, 2, 4, 13, 26, 27, 28, 29, 36, 21, 42, 43, 11, 12, 19, 5]:
|
||
sql = '''insert into character values(?,?,30,?,?,?,?,?,?,?,?,?,?,?,?,?,?,1)'''
|
||
c.execute(sql, (i, char[i], frag1[i], prog1[i], overdrive1[i], frag20[i], prog20[i], overdrive20[i],
|
||
frag30[i], prog30[i], overdrive30[i], skill_id[i], skill_unlock_level[i], skill_requires_uncap, skill_id_uncap[i], char_type[i]))
|
||
else:
|
||
sql = '''insert into character values(?,?,20,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0)'''
|
||
c.execute(sql, (i, char[i], frag1[i], prog1[i], overdrive1[i], frag20[i], prog20[i], overdrive20[i],
|
||
frag30[i], prog30[i], overdrive30[i], skill_id[i], skill_unlock_level[i], skill_requires_uncap, skill_id_uncap[i], char_type[i]))
|
||
|
||
c.execute('''insert into character values(?,?,20,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0)''', (99,
|
||
'shirahime', 38, 33, 28, 66, 58, 50, 66, 58, 50, 'frags_preferred_song', 0, 0, '', 0))
|
||
|
||
for i in char_core:
|
||
for j in char_core[i]:
|
||
c.execute('''insert into char_item values(?,?,'core',?)''',
|
||
(i, j['core_id'], j['amount']))
|
||
cores = ['core_hollow', 'core_desolate', 'core_chunithm', 'core_crimson',
|
||
'core_ambivalent', 'core_scarlet', 'core_groove', 'core_generic', 'core_binary', 'core_colorful', 'core_course_skip_purchase']
|
||
|
||
for i in cores:
|
||
c.execute('''insert into item values(?,"core",1,'')''', (i,))
|
||
|
||
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", "moonheart3", "glow", "enchantedlove", "take", "lifeispiano", "vandalism", "nexttoyou3", "lostcivilization3", "turbocharger", "bookmaker3", "laqryma3", "kyogenkigo", "hivemind", "seclusion", "quonwacca3", "bluecomet", "energysynergymatrix", "gengaozo", "lastendconductor3", "antithese3", "qualia3", "kanagawa3", "heavensdoor3", "pragmatism3", "nulctrl", "avril", "ddd", "merlin3", "omakeno3", "nekonote", "sanskia", 'altair', 'mukishitsu', 'trapcrow', 'redandblue3', 'ignotus3', 'singularity3', 'dropdead3', 'arcahv']
|
||
for i in world_songs:
|
||
c.execute('''insert into item values(?,"world_song",1,'')''', (i,))
|
||
|
||
world_unlocks = ["scenery_chap1", "scenery_chap2",
|
||
"scenery_chap3", "scenery_chap4", "scenery_chap5", "scenery_chap6", "scenery_chap7"]
|
||
for i in world_unlocks:
|
||
c.execute('''insert into item values(?,"world_unlock",1,'')''', (i,))
|
||
|
||
course_banners = ['course_banner_' + str(i) for i in range(1, 12)]
|
||
for i in course_banners:
|
||
c.execute('''insert into item values(?,"course_banner",1,'')''', (i,))
|
||
|
||
c.execute('''insert into item values(?,?,?,?)''',
|
||
('fragment', 'fragment', 1, ''))
|
||
c.execute('''insert into item values(?,?,?,?)''',
|
||
('memory', 'memory', 1, ''))
|
||
c.execute('''insert into item values(?,?,?,?)''',
|
||
('anni5tix', 'anni5tix', 1, ''))
|
||
|
||
def insert_items(c, items):
|
||
# 物品数据导入
|
||
for i in items:
|
||
if 'discount_from' not in i:
|
||
discount_from = -1
|
||
else:
|
||
discount_from = i['discount_from']
|
||
if 'discount_to' not in i:
|
||
discount_to = -1
|
||
else:
|
||
discount_to = i['discount_to']
|
||
if 'discount_reason' not in i:
|
||
discount_reason = ''
|
||
else:
|
||
discount_reason = i['discount_reason']
|
||
c.execute('''insert into purchase values(?,?,?,?,?,?)''',
|
||
(i['name'], i['price'], i['orig_price'], discount_from, discount_to, discount_reason))
|
||
for j in i['items']:
|
||
if "_id" not in j:
|
||
_id = ''
|
||
else:
|
||
_id = j['_id']
|
||
c.execute(
|
||
'''select exists(select * from item where item_id=?)''', (j['id'],))
|
||
if c.fetchone() == (0,):
|
||
c.execute('''insert into item values(?,?,?,?)''',
|
||
(j['id'], j['type'], j['is_available'], _id))
|
||
if 'amount' in j:
|
||
amount = j['amount']
|
||
else:
|
||
amount = 1
|
||
c.execute('''insert into purchase_item values(?,?,?,?)''',
|
||
(i['name'], j['id'], j['type'], amount))
|
||
|
||
# item初始化
|
||
try:
|
||
f = open(path+'singles.json', 'r')
|
||
singles = json.load(f)
|
||
f.close()
|
||
insert_items(c, singles)
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
f = open(path+'packs.json', 'r')
|
||
packs = json.load(f)
|
||
f.close()
|
||
insert_items(c, packs)
|
||
c.execute('''select exists(select * from item where item_id='epilogue')''')
|
||
if c.fetchone() == (0,):
|
||
c.execute('''insert into item values('epilogue','pack',1,'')''')
|
||
except:
|
||
pass
|
||
|
||
# course初始化
|
||
try:
|
||
f = open(path+'courses.json', 'r', encoding="utf-8")
|
||
courses = json.load(f)
|
||
f.close()
|
||
except:
|
||
courses = []
|
||
|
||
if courses:
|
||
if path == './':
|
||
# 有什么好办法吗
|
||
import sys
|
||
sys.path.append('..')
|
||
from core.course import Course
|
||
for i in courses:
|
||
x = Course(c).from_dict(i)
|
||
x.insert_all()
|
||
|
||
# api权限与权限组初始化
|
||
role = ['admin', 'user', 'selecter']
|
||
role_caption = ['管理员', '用户', '查询接口']
|
||
|
||
power = ['select', 'select_me', 'change', 'change_me', 'grant',
|
||
'grant_inf', 'select_song_rank', 'select_song_info']
|
||
power_caption = ['总体查询权限', '自我查询权限', '总体修改权限',
|
||
'自我修改权限', '授权权限', '下级授权权限', '歌曲排行榜查询权限', '歌曲信息查询权限']
|
||
|
||
role_power = {'0': [0, 1, 3, 5, 6, 7],
|
||
'1': [1, 3, 6, 7],
|
||
'2': [0]
|
||
}
|
||
|
||
for i in range(0, len(role)):
|
||
c.execute('''insert into role values(:a,:b,:c)''', {
|
||
'a': i, 'b': role[i], 'c': role_caption[i]})
|
||
for i in range(0, len(power)):
|
||
c.execute('''insert into power values(:a,:b,:c)''', {
|
||
'a': i, 'b': power[i], 'c': power_caption[i]})
|
||
for i in role_power:
|
||
for j in role_power[i]:
|
||
c.execute('''insert into role_power values(:a,:b)''',
|
||
{'a': int(i), 'b': j})
|
||
|
||
conn.commit()
|
||
conn.close()
|
||
|
||
def arc_register(name: str):
|
||
def build_user_code(c):
|
||
return '123456789'
|
||
|
||
def build_user_id(c):
|
||
return 2000000
|
||
|
||
def insert_user_char(c, user_id):
|
||
# 为用户添加可用角色
|
||
c.execute('''insert into user_char values(?,?,?,?,?,?)''',
|
||
(user_id, 0, 30, 25000, 1, 0))
|
||
c.execute('''insert into user_char values(?,?,?,?,?,?)''',
|
||
(user_id, 1, 30, 25000, 1, 0))
|
||
|
||
c.execute(
|
||
'''select character_id, max_level, is_uncapped from character''')
|
||
x = c.fetchall()
|
||
if x:
|
||
for i in x:
|
||
exp = 25000 if i[1] == 30 else 10000
|
||
c.execute('''insert into user_char_full values(?,?,?,?,?,?)''',
|
||
(user_id, i[0], i[1], exp, i[2], 0))
|
||
|
||
conn = sqlite3.connect(path+'arcaea_database.db')
|
||
c = conn.cursor()
|
||
hash_pwd = '41e5653fc7aeb894026d6bb7b2db7f65902b454945fa8fd65a6327047b5277fb'
|
||
c.execute(
|
||
'''select exists(select * from user where name = :name)''', {'name': name})
|
||
if c.fetchone() == (0,):
|
||
user_code = build_user_code(c)
|
||
user_id = build_user_id(c)
|
||
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, 1250, 1, 0, 1, 0, 0, -1, 0, '', 114514)
|
||
''', {'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})
|
||
c.execute(
|
||
'''insert into best_score values(2000000,'vexaria',3,10000000,100,0,0,0,100,0,1599667200,3,3,10.8)''')
|
||
insert_user_char(c, user_id)
|
||
conn.commit()
|
||
conn.close()
|
||
return None
|
||
else:
|
||
conn.commit()
|
||
conn.close()
|
||
return None
|
||
|
||
arc_register('admin')
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|