mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2026-02-10 09:47:26 +08:00
Add files via upload
This commit is contained in:
1242
v1.0/arcscore.py
Normal file
1242
v1.0/arcscore.py
Normal file
File diff suppressed because it is too large
Load Diff
141
v1.0/auth.py
Normal file
141
v1.0/auth.py
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
import sqlite3
|
||||||
|
import hashlib
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
def arc_login(name: str, password: str) -> str: # 登录判断
|
||||||
|
# 查询数据库中的user表,验证账号密码,返回并记录token
|
||||||
|
# token采用user_id和时间戳连接后hash生成(真的是瞎想的,没用bear)
|
||||||
|
# 密码和token的加密方式为 SHA-256
|
||||||
|
|
||||||
|
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
hash_pwd = hashlib.sha256(password.encode("utf8")).hexdigest()
|
||||||
|
c.execute('''select user_id from user where name = :name and password = :password''', {
|
||||||
|
'name': name, 'password': hash_pwd})
|
||||||
|
x = c.fetchone()
|
||||||
|
if x is not None:
|
||||||
|
user_id = str(x[0])
|
||||||
|
now = int(time.time() * 1000)
|
||||||
|
token = hashlib.sha256((user_id + str(now)).encode("utf8")).hexdigest()
|
||||||
|
c.execute(
|
||||||
|
'''select exists(select * from login where user_id = :user_id)''', {"user_id": user_id})
|
||||||
|
|
||||||
|
if c.fetchone() == (1,): # 删掉多余token
|
||||||
|
c.execute('''delete from login where user_id = :user_id''',
|
||||||
|
{'user_id': user_id})
|
||||||
|
|
||||||
|
c.execute('''insert into login(access_token, user_id) values(:access_token, :user_id)''', {
|
||||||
|
'user_id': user_id, 'access_token': token})
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return token
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def arc_register(name: str, password: str): # 注册
|
||||||
|
# 账号注册,只记录hash密码和用户名,生成user_id和user_code,自动登录返回token
|
||||||
|
# token和密码的处理同登录部分
|
||||||
|
|
||||||
|
def build_user_code(c):
|
||||||
|
# 生成9位的user_code,用的自然是随机
|
||||||
|
import random
|
||||||
|
flag = True
|
||||||
|
while flag:
|
||||||
|
user_code = ''.join([str(random.randint(0, 9)) for i in range(9)])
|
||||||
|
c.execute('''select exists(select * from user where user_code = :user_code)''',
|
||||||
|
{'user_code': user_code})
|
||||||
|
if c.fetchone() == (0,):
|
||||||
|
flag = False
|
||||||
|
return user_code
|
||||||
|
|
||||||
|
def build_user_id(c):
|
||||||
|
# 生成user_id,往后加1
|
||||||
|
c.execute('''select max(user_id) from user''')
|
||||||
|
x = c.fetchone()
|
||||||
|
if x[0] is not None:
|
||||||
|
return x[0] + 1
|
||||||
|
else:
|
||||||
|
return 2000001
|
||||||
|
|
||||||
|
def insert_user_char(c, user_id):
|
||||||
|
# 为用户添加所有可用角色
|
||||||
|
for i in range(0, 38):
|
||||||
|
if i in [0, 1, 2, 4, 13, 26, 27, 28, 29, 36]:
|
||||||
|
sql = 'insert into user_char values('+str(user_id)+','+str(
|
||||||
|
i)+''',30,25000,25000,90,90,90,'',0,0,'',0,1,1)'''
|
||||||
|
c.execute(sql)
|
||||||
|
else:
|
||||||
|
if i != 5:
|
||||||
|
sql = 'insert into user_char values('+str(user_id)+','+str(
|
||||||
|
i)+''',30,25000,25000,90,90,90,'',0,0,'',0,0,0)'''
|
||||||
|
c.execute(sql)
|
||||||
|
|
||||||
|
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
hash_pwd = hashlib.sha256(password.encode("utf8")).hexdigest()
|
||||||
|
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)
|
||||||
|
values(:user_id, :name, :password, :join_date, :user_code, 0, 0, 0, 0, 0, 0, -1, 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})
|
||||||
|
|
||||||
|
token = hashlib.sha256(
|
||||||
|
(str(user_id) + str(now)).encode("utf8")).hexdigest()
|
||||||
|
c.execute('''insert into login(access_token, user_id) values(:access_token, :user_id)''', {
|
||||||
|
'user_id': user_id, 'access_token': token})
|
||||||
|
|
||||||
|
insert_user_char(c, user_id)
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return user_id, token, 0
|
||||||
|
else:
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return None, None, 101
|
||||||
|
|
||||||
|
|
||||||
|
def token_get_id(token: str):
|
||||||
|
# 用token获取id,没有考虑不同用户token相同情况,说不定会有bug
|
||||||
|
|
||||||
|
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute('''select user_id from login where access_token = :token''', {
|
||||||
|
'token': token})
|
||||||
|
x = c.fetchone()
|
||||||
|
if x is not None:
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return x[0]
|
||||||
|
else:
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def code_get_id(user_code):
|
||||||
|
# 用user_code获取id
|
||||||
|
|
||||||
|
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute('''select user_id from user where user_code = :a''',
|
||||||
|
{'a': user_code})
|
||||||
|
x = c.fetchone()
|
||||||
|
if x is not None:
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return x[0]
|
||||||
|
else:
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return None
|
||||||
BIN
v1.0/database/arcaea_database.db
Normal file
BIN
v1.0/database/arcaea_database.db
Normal file
Binary file not shown.
BIN
v1.0/database/arcsong.db
Normal file
BIN
v1.0/database/arcsong.db
Normal file
Binary file not shown.
204
v1.0/database/database_initialize.py
Normal file
204
v1.0/database/database_initialize.py
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
import sqlite3
|
||||||
|
import hashlib
|
||||||
|
import time
|
||||||
|
# 数据库初始化文件,删掉arcaea_database.db文件后运行即可,谨慎使用
|
||||||
|
|
||||||
|
conn = sqlite3.connect('arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
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
|
||||||
|
);''')
|
||||||
|
c.execute('''create table if not exists login(access_token text,
|
||||||
|
user_id int,
|
||||||
|
last_login_time int,
|
||||||
|
last_login_ip text,
|
||||||
|
last_login_device text
|
||||||
|
);''')
|
||||||
|
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,
|
||||||
|
level_exp real,
|
||||||
|
frag int,
|
||||||
|
prog int,
|
||||||
|
overdrive int,
|
||||||
|
skill_id text,
|
||||||
|
skill_unlock_level int,
|
||||||
|
skill_requires_uncap int,
|
||||||
|
skill_id_uncap text,
|
||||||
|
char_type int,
|
||||||
|
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
|
||||||
|
);''')
|
||||||
|
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
|
||||||
|
);''')
|
||||||
|
|
||||||
|
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)']
|
||||||
|
|
||||||
|
for i in range(0, 38):
|
||||||
|
c.execute("insert into character values("+str(i)+",'"+char[i]+"');")
|
||||||
|
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def arc_register(name: str, password: str):
|
||||||
|
def build_user_code(c):
|
||||||
|
return '123456789'
|
||||||
|
|
||||||
|
def build_user_id(c):
|
||||||
|
return 2000000
|
||||||
|
|
||||||
|
def insert_user_char(c, user_id):
|
||||||
|
for i in range(0, 38):
|
||||||
|
if i in [0, 1, 2, 4, 13, 26, 27, 28, 29, 36]:
|
||||||
|
sql = 'insert into user_char values('+str(user_id)+','+str(
|
||||||
|
i)+''',30,25000,25000,90,90,90,'',0,0,'',0,1,1)'''
|
||||||
|
c.execute(sql)
|
||||||
|
else:
|
||||||
|
if i != 5:
|
||||||
|
sql = 'insert into user_char values('+str(user_id)+','+str(
|
||||||
|
i)+''',30,25000,25000,90,90,90,'',0,0,'',0,0,0)'''
|
||||||
|
c.execute(sql)
|
||||||
|
|
||||||
|
conn = sqlite3.connect('arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
hash_pwd = hashlib.sha256(password.encode("utf8")).hexdigest()
|
||||||
|
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)
|
||||||
|
values(:user_id, :name, :password, :join_date, :user_code, 1250, 1, 0, 1, 0, 0, -1, 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})
|
||||||
|
c.execute('''insert into best_score values(2000000,'vexaria',3,10000000,100,0,0,0,100,0,1599667200000,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', 'admin123')
|
||||||
4060
v1.0/info.py
Normal file
4060
v1.0/info.py
Normal file
File diff suppressed because it is too large
Load Diff
418
v1.0/main.py
Normal file
418
v1.0/main.py
Normal file
@@ -0,0 +1,418 @@
|
|||||||
|
from flask import Flask, request, jsonify, make_response
|
||||||
|
import configparser
|
||||||
|
import base64
|
||||||
|
import auth
|
||||||
|
import info
|
||||||
|
import setme
|
||||||
|
import arcscore
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
wsgi_app = app.wsgi_app
|
||||||
|
|
||||||
|
|
||||||
|
def error_return(error_code): # 错误返回
|
||||||
|
# 100 无法在此ip地址下登录游戏
|
||||||
|
# 101 用户名占用
|
||||||
|
# 102 电子邮箱已注册
|
||||||
|
# 103 已有一个账号由此设备创建
|
||||||
|
# 104 用户名密码错误
|
||||||
|
# 105 24小时内登入两台设备
|
||||||
|
# 106 账户冻结
|
||||||
|
# 107 你没有足够的体力
|
||||||
|
# 401 用户不存在
|
||||||
|
# 403 无法连接至服务器
|
||||||
|
# 501 502 此物品目前无法获取
|
||||||
|
# 504 无效的序列码
|
||||||
|
# 505 此序列码已被使用
|
||||||
|
# 506 你已拥有了此物品
|
||||||
|
# 601 好友列表已满
|
||||||
|
# 602 此用户已是好友
|
||||||
|
# 604 你不能加自己为好友
|
||||||
|
# 其它 发生未知错误
|
||||||
|
return jsonify({
|
||||||
|
"success": False,
|
||||||
|
"error_code": error_code
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def hello():
|
||||||
|
return "Hello World!"
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/auth/login', methods=['POST']) # 登录接口
|
||||||
|
def login():
|
||||||
|
headers = request.headers
|
||||||
|
id_pwd = headers['Authorization']
|
||||||
|
id_pwd = base64.b64decode(id_pwd[6:]).decode()
|
||||||
|
name, password = id_pwd.split(':', 1)
|
||||||
|
|
||||||
|
try:
|
||||||
|
token = auth.arc_login(name, password)
|
||||||
|
if token is not None:
|
||||||
|
r = {"success": True, "token_type": "Bearer"}
|
||||||
|
r['access_token'] = token
|
||||||
|
return jsonify(r)
|
||||||
|
else:
|
||||||
|
return error_return(104) # 用户名或密码错误
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/user/', methods=['POST']) # 注册接口
|
||||||
|
def register():
|
||||||
|
name = request.form['name']
|
||||||
|
password = request.form['password']
|
||||||
|
try:
|
||||||
|
user_id, token, error_code = auth.arc_register(name, password)
|
||||||
|
if user_id is not None:
|
||||||
|
r = {"success": True, "value": {
|
||||||
|
'user_id': user_id, 'access_token': token}}
|
||||||
|
return jsonify(r)
|
||||||
|
else:
|
||||||
|
return error_return(error_code) # 应该是101,用户名被占用,毕竟电子邮箱、设备号没记录
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/compose/aggregate', methods=['GET']) # 用户信息获取
|
||||||
|
def aggregate():
|
||||||
|
calls = request.args.get('calls')
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
if calls == '[{ "endpoint": "/user/me", "id": 0 }]': # 极其沙雕的判断,我猜get的参数就两种
|
||||||
|
r = info.arc_aggregate_small(user_id)
|
||||||
|
else:
|
||||||
|
r = info.arc_aggregate_big(user_id)
|
||||||
|
return jsonify(r)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/user/me/character', methods=['POST']) # 角色切换
|
||||||
|
def character_change():
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
character_id = request.form['character']
|
||||||
|
skill_sealed = request.form['skill_sealed']
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
flag = setme.change_char(user_id, character_id, skill_sealed)
|
||||||
|
if flag:
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": {
|
||||||
|
"user_id": user_id,
|
||||||
|
"character": character_id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/<path:path>/toggle_uncap', methods=['POST']) # 角色觉醒切换
|
||||||
|
def character_uncap(path):
|
||||||
|
character_id = int(path[22:])
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
r = setme.change_char_uncap(user_id, character_id)
|
||||||
|
if r is not None:
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": {
|
||||||
|
"user_id": user_id,
|
||||||
|
"character": [r]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/friend/me/add', methods=['POST']) # 加好友
|
||||||
|
def add_friend():
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
friend_code = request.form['friend_code']
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
friend_id = auth.code_get_id(friend_code)
|
||||||
|
if user_id is not None and friend_id is not None:
|
||||||
|
r = setme.arc_add_friend(user_id, friend_id)
|
||||||
|
if r is not None and r != 602 and r != 604:
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": {
|
||||||
|
"user_id": user_id,
|
||||||
|
"updatedAt": "2020-09-07T07:32:12.740Z",
|
||||||
|
"createdAt": "2020-09-06T10:05:18.471Z",
|
||||||
|
"friends": r
|
||||||
|
}
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
if r is not None:
|
||||||
|
return error_return(r)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
else:
|
||||||
|
if friend_id is None:
|
||||||
|
return error_return(401)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/friend/me/delete', methods=['POST']) # 删好友
|
||||||
|
def delete_friend():
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
friend_id = int(request.form['friend_id'])
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None and friend_id is not None:
|
||||||
|
r = setme.arc_delete_friend(user_id, friend_id)
|
||||||
|
if r is not None:
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": {
|
||||||
|
"user_id": user_id,
|
||||||
|
"updatedAt": "2020-09-07T07:32:12.740Z",
|
||||||
|
"createdAt": "2020-09-06T10:05:18.471Z",
|
||||||
|
"friends": r
|
||||||
|
}
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
else:
|
||||||
|
if friend_id is None:
|
||||||
|
return error_return(401)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/score/song/friend', methods=['GET']) # 好友排名,默认最多50
|
||||||
|
def song_score_friend():
|
||||||
|
song_id = request.args.get('song_id')
|
||||||
|
difficulty = request.args.get('difficulty')
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
r = arcscore.arc_score_friend(user_id, song_id, difficulty)
|
||||||
|
if r is not None:
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": r
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/score/song/me', methods=['GET']) # 我的排名,默认最多20
|
||||||
|
def song_score_me():
|
||||||
|
song_id = request.args.get('song_id')
|
||||||
|
difficulty = request.args.get('difficulty')
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
r = arcscore.arc_score_me(user_id, song_id, difficulty)
|
||||||
|
if r is not None:
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": r
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/score/song', methods=['GET']) # TOP20
|
||||||
|
def song_score_top():
|
||||||
|
song_id = request.args.get('song_id')
|
||||||
|
difficulty = request.args.get('difficulty')
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
r = arcscore.arc_score_top(song_id, difficulty)
|
||||||
|
if r is not None:
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": r
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/score/song', methods=['POST']) # 成绩上传
|
||||||
|
def song_score_post():
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
song_id = request.form['song_id']
|
||||||
|
difficulty = int(request.form['difficulty'])
|
||||||
|
score = int(request.form['score'])
|
||||||
|
shiny_perfect_count = int(request.form['shiny_perfect_count'])
|
||||||
|
perfect_count = int(request.form['perfect_count'])
|
||||||
|
near_count = int(request.form['near_count'])
|
||||||
|
miss_count = int(request.form['miss_count'])
|
||||||
|
health = int(request.form['health'])
|
||||||
|
modifier = int(request.form['modifier'])
|
||||||
|
beyond_gauge = int(request.form['beyond_gauge'])
|
||||||
|
clear_type = int(request.form['clear_type'])
|
||||||
|
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
r = arcscore.arc_score_post(user_id, song_id, difficulty, score, shiny_perfect_count,
|
||||||
|
perfect_count, near_count, miss_count, health, modifier, beyond_gauge, clear_type)
|
||||||
|
if r is not None:
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": {"user_rating": r}
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/score/token', methods=['GET']) # 成绩上传所需的token,显然我不想验证
|
||||||
|
def score_token():
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": {
|
||||||
|
"token": "1145141919810"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/user/me/save', methods=['GET']) # 从云端同步
|
||||||
|
def cloud_get():
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
r = arcscore.arc_all_get(user_id)
|
||||||
|
if r is not None:
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": r
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/user/me/save', methods=['POST']) # 向云端同步
|
||||||
|
def cloud_post():
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
scores_data = request.form['scores_data']
|
||||||
|
clearlamps_data = request.form['clearlamps_data']
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
arcscore.arc_all_post(user_id, scores_data, clearlamps_data)
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"value": {
|
||||||
|
"user_id": user_id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/12/purchase/me/redeem', methods=['POST']) # 兑换码,自然没有用
|
||||||
|
def redeem():
|
||||||
|
return error_return(504)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/coffee/<path:path>', methods=['POST']) # 三个设置,写在最后降低优先级
|
||||||
|
def sys_set(path):
|
||||||
|
set_arg = path[10:]
|
||||||
|
headers = request.headers
|
||||||
|
token = headers['Authorization']
|
||||||
|
token = token[7:]
|
||||||
|
value = request.form['value']
|
||||||
|
|
||||||
|
try:
|
||||||
|
user_id = auth.token_get_id(token)
|
||||||
|
if user_id is not None:
|
||||||
|
setme.arc_sys_set(user_id, value, set_arg)
|
||||||
|
r = info.arc_aggregate_small(user_id)
|
||||||
|
r['value'] = r['value'][0]['value']
|
||||||
|
return jsonify(r)
|
||||||
|
else:
|
||||||
|
return error_return(108)
|
||||||
|
except:
|
||||||
|
return error_return(108)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
path = r'setting.ini'
|
||||||
|
config.read(path, encoding="utf-8")
|
||||||
|
HOST = config.get('CONFIG','HOST')
|
||||||
|
PORT = config.get('CONFIG','PORT')
|
||||||
|
app.run(HOST, PORT)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
||||||
|
|
||||||
|
## Made By Lost 2020.9.11
|
||||||
1
v1.0/run.bat
Normal file
1
v1.0/run.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
python main.py
|
||||||
155
v1.0/setme.py
Normal file
155
v1.0/setme.py
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
import sqlite3
|
||||||
|
import info
|
||||||
|
|
||||||
|
|
||||||
|
def b2int(x):
|
||||||
|
# int与布尔值转换
|
||||||
|
if x:
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def int2b(x):
|
||||||
|
# int与布尔值转换
|
||||||
|
if x is None or x == 0:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def change_char(user_id, character_id, skill_sealed):
|
||||||
|
# 角色改变,包括技能封印的改变,返回成功与否的布尔值
|
||||||
|
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute('''select is_uncapped, is_uncapped_override from user_char where user_id = :a and character_id = :b''',
|
||||||
|
{'a': user_id, 'b': character_id})
|
||||||
|
x = c.fetchone()
|
||||||
|
if x is not None:
|
||||||
|
if skill_sealed == 'false':
|
||||||
|
skill_sealed = False
|
||||||
|
else:
|
||||||
|
skill_sealed = True
|
||||||
|
c.execute('''update user set is_skill_sealed = :a, character_id = :b, is_char_uncapped = :c, is_char_uncapped_override = :d where user_id = :e''', {
|
||||||
|
'a': b2int(skill_sealed), 'b': character_id, 'c': x[0], 'd': x[1], 'e': user_id})
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return True
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def change_char_uncap(user_id, character_id):
|
||||||
|
# 角色觉醒改变,返回字典
|
||||||
|
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute('''select is_uncapped, is_uncapped_override from user_char where user_id = :a and character_id = :b''',
|
||||||
|
{'a': user_id, 'b': character_id})
|
||||||
|
x = c.fetchone()
|
||||||
|
r = None
|
||||||
|
if x is not None and x[0] == 1:
|
||||||
|
c.execute('''update user set is_char_uncapped_override = :a where user_id = :b''', {
|
||||||
|
'a': b2int(x[1] == 0), 'b': user_id})
|
||||||
|
c.execute('''update user_char set is_uncapped_override = :a where user_id = :b and character_id = :c''', {
|
||||||
|
'a': b2int(x[1] == 0), 'b': user_id, 'c': character_id})
|
||||||
|
c.execute('''select * from user_char where user_id = :a and character_id = :b''',
|
||||||
|
{'a': user_id, 'b': character_id})
|
||||||
|
y = c.fetchone()
|
||||||
|
c.execute(
|
||||||
|
'''select name from character where character_id = :x''', {'x': y[1]})
|
||||||
|
z = c.fetchone()
|
||||||
|
if z is not None:
|
||||||
|
char_name = z[0]
|
||||||
|
if y is not None:
|
||||||
|
r = {
|
||||||
|
"is_uncapped_override": int2b(y[14]),
|
||||||
|
"is_uncapped": int2b(y[13]),
|
||||||
|
"uncap_cores": [],
|
||||||
|
"char_type": y[12],
|
||||||
|
"skill_id_uncap": y[11],
|
||||||
|
"skill_requires_uncap": int2b(y[10]),
|
||||||
|
"skill_unlock_level": y[9],
|
||||||
|
"skill_id": y[8],
|
||||||
|
"overdrive": y[7],
|
||||||
|
"prog": y[6],
|
||||||
|
"frag": y[5],
|
||||||
|
"level_exp": y[4],
|
||||||
|
"exp": y[3],
|
||||||
|
"level": y[2],
|
||||||
|
"name": char_name,
|
||||||
|
"character_id": y[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def arc_sys_set(user_id, value, set_arg):
|
||||||
|
# 三个设置,PTT隐藏、体力满通知、最爱角色,无返回
|
||||||
|
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
if 'favorite_character' in set_arg:
|
||||||
|
value = int(value)
|
||||||
|
c.execute('''update user set favorite_character = :a where user_id = :b''', {
|
||||||
|
'a': value, 'b': user_id})
|
||||||
|
|
||||||
|
else:
|
||||||
|
if value == 'false':
|
||||||
|
value = False
|
||||||
|
else:
|
||||||
|
value = True
|
||||||
|
|
||||||
|
if 'is_hide_rating' in set_arg:
|
||||||
|
c.execute('''update user set is_hide_rating = :a where user_id = :b''', {
|
||||||
|
'a': b2int(value), 'b': user_id})
|
||||||
|
if 'max_stamina_notification_enabled' in set_arg:
|
||||||
|
c.execute('''update user set max_stamina_notification_enabled = :a where user_id = :b''', {
|
||||||
|
'a': b2int(value), 'b': user_id})
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def arc_add_friend(user_id, friend_id):
|
||||||
|
# 加好友,返回好友列表,或者是错误码602、604
|
||||||
|
if user_id == friend_id:
|
||||||
|
return 604
|
||||||
|
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute('''select exists(select * from friend where user_id_me = :x and user_id_other = :y)''',
|
||||||
|
{'x': user_id, 'y': friend_id})
|
||||||
|
r = None
|
||||||
|
if c.fetchone() == (0,):
|
||||||
|
c.execute('''insert into friend values(:a, :b)''',
|
||||||
|
{'a': user_id, 'b': friend_id})
|
||||||
|
r = info.get_user_friend(c, user_id)
|
||||||
|
|
||||||
|
else:
|
||||||
|
return 602
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def arc_delete_friend(user_id, friend_id):
|
||||||
|
# 删好友,返回好友列表
|
||||||
|
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute('''select exists(select * from friend where user_id_me = :x and user_id_other = :y)''',
|
||||||
|
{'x': user_id, 'y': friend_id})
|
||||||
|
r = None
|
||||||
|
if c.fetchone() == (1,):
|
||||||
|
c.execute('''delete from friend where user_id_me = :x and user_id_other = :y''',
|
||||||
|
{'x': user_id, 'y': friend_id})
|
||||||
|
|
||||||
|
r = info.get_user_friend(c, user_id)
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return r
|
||||||
3
v1.0/setting.ini
Normal file
3
v1.0/setting.ini
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[CONFIG]
|
||||||
|
HOST = 192.168.1.112
|
||||||
|
PORT = 80
|
||||||
Reference in New Issue
Block a user