mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2026-02-07 08:17:28 +08:00
Update to v1.4
This commit is contained in:
360
latest version/web/index.py
Normal file
360
latest version/web/index.py
Normal file
@@ -0,0 +1,360 @@
|
||||
from flask import (
|
||||
Blueprint, flash, g, redirect, render_template, request, url_for
|
||||
)
|
||||
from web.login import login_required
|
||||
from werkzeug.utils import secure_filename
|
||||
import sqlite3
|
||||
import web.webscore
|
||||
import web.system
|
||||
import time
|
||||
import server.arcscore
|
||||
import os
|
||||
|
||||
UPLOAD_FOLDER = 'database'
|
||||
ALLOWED_EXTENSIONS = {'db'}
|
||||
|
||||
bp = Blueprint('index', __name__, url_prefix='/web')
|
||||
|
||||
|
||||
def is_number(s):
|
||||
try: # 判断字符串s是浮点数
|
||||
float(s)
|
||||
return True
|
||||
except ValueError:
|
||||
pass
|
||||
return False
|
||||
|
||||
|
||||
@bp.route('/index')
|
||||
@bp.route('/')
|
||||
@login_required
|
||||
def index():
|
||||
# 主页
|
||||
return render_template('web/index.html')
|
||||
|
||||
|
||||
@bp.route('/singleplayer', methods=['POST', 'GET'])
|
||||
@login_required
|
||||
def single_player_score():
|
||||
# 单个玩家分数查询
|
||||
if request.method == 'POST':
|
||||
name = request.form['name']
|
||||
user_code = request.form['user_code']
|
||||
error = None
|
||||
if name or user_code:
|
||||
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||
c = conn.cursor()
|
||||
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()
|
||||
posts = []
|
||||
if user_id:
|
||||
user_id = user_id[0]
|
||||
posts = web.webscore.get_user_score(c, user_id)
|
||||
if not posts:
|
||||
error = '无成绩 No score.'
|
||||
else:
|
||||
error = '玩家不存在 The player does not exist.'
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
else:
|
||||
error = '输入为空 Null Input.'
|
||||
|
||||
if error:
|
||||
flash(error)
|
||||
else:
|
||||
return render_template('web/singleplayer.html', posts=posts)
|
||||
|
||||
return render_template('web/singleplayer.html')
|
||||
|
||||
|
||||
@bp.route('/singleplayerptt', methods=['POST', 'GET'])
|
||||
@login_required
|
||||
def single_player_ptt():
|
||||
# 单个玩家PTT详情查询
|
||||
if request.method == 'POST':
|
||||
name = request.form['name']
|
||||
user_code = request.form['user_code']
|
||||
error = None
|
||||
if name or user_code:
|
||||
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||
c = conn.cursor()
|
||||
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()
|
||||
posts = []
|
||||
if user_id:
|
||||
user_id = user_id[0]
|
||||
user = web.webscore.get_user(c, user_id)
|
||||
posts = web.webscore.get_user_score(c, user_id, 30)
|
||||
recent, recentptt = web.webscore.get_user_recent30(c, user_id)
|
||||
if not posts:
|
||||
error = '无成绩 No score.'
|
||||
else:
|
||||
bestptt = 0
|
||||
for i in posts:
|
||||
if i['rating']:
|
||||
bestptt += i['rating']
|
||||
bestptt = bestptt / 30
|
||||
else:
|
||||
error = '玩家不存在 The player does not exist.'
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
else:
|
||||
error = '输入为空 Null Input.'
|
||||
|
||||
if error:
|
||||
flash(error)
|
||||
else:
|
||||
return render_template('web/singleplayerptt.html', posts=posts, user=user, recent=recent, recentptt=recentptt, bestptt=bestptt)
|
||||
|
||||
return render_template('web/singleplayerptt.html')
|
||||
|
||||
|
||||
@bp.route('/allplayer', methods=['GET'])
|
||||
@login_required
|
||||
def all_player():
|
||||
# 所有玩家数据,按照ptt排序
|
||||
conn = sqlite3.connect('./database/arcaea_database.db')
|
||||
c = conn.cursor()
|
||||
c.execute('''select * from user order by rating_ptt DESC''')
|
||||
x = c.fetchall()
|
||||
error = None
|
||||
if x:
|
||||
posts = []
|
||||
for i in x:
|
||||
join_data = None
|
||||
time_played = None
|
||||
if i[3]:
|
||||
join_date = time.strftime('%Y-%m-%d %H:%M:%S',
|
||||
time.localtime(int(i[3])//1000))
|
||||
if i[20]:
|
||||
time_played = time.strftime('%Y-%m-%d %H:%M:%S',
|
||||
time.localtime(int(i[20])//1000))
|
||||
posts.append({'name': i[1],
|
||||
'user_id': i[0],
|
||||
'join_date': join_date,
|
||||
'user_code': i[4],
|
||||
'rating_ptt': i[5],
|
||||
'song_id': i[11],
|
||||
'difficulty': i[12],
|
||||
'score': i[13],
|
||||
'shiny_perfect_count': i[14],
|
||||
'perfect_count': i[15],
|
||||
'near_count': i[16],
|
||||
'miss_count': i[17],
|
||||
'time_played': time_played,
|
||||
'clear_type': i[21],
|
||||
'rating': i[22]
|
||||
})
|
||||
else:
|
||||
error = '没有玩家数据 No player data.'
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
if error:
|
||||
flash(error)
|
||||
return render_template('web/allplayer.html')
|
||||
else:
|
||||
return render_template('web/allplayer.html', posts=posts)
|
||||
|
||||
|
||||
@bp.route('/allsong', methods=['GET'])
|
||||
@login_required
|
||||
def all_song():
|
||||
# 所有歌曲数据
|
||||
def defnum(x):
|
||||
# 定数转换
|
||||
if x >= 0:
|
||||
return x / 10
|
||||
else:
|
||||
return None
|
||||
|
||||
conn = sqlite3.connect('./database/arcsong.db')
|
||||
c = conn.cursor()
|
||||
c.execute('''select * from songs''')
|
||||
x = c.fetchall()
|
||||
error = None
|
||||
if x:
|
||||
posts = []
|
||||
for i in x:
|
||||
posts.append({'song_id': i[0],
|
||||
'name_en': i[1],
|
||||
'rating_pst': defnum(i[12]),
|
||||
'rating_prs': defnum(i[13]),
|
||||
'rating_ftr': defnum(i[14]),
|
||||
'rating_byn': defnum(i[15])
|
||||
})
|
||||
else:
|
||||
error = '没有铺面数据 No song data.'
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
if error:
|
||||
flash(error)
|
||||
return render_template('web/allsong.html')
|
||||
else:
|
||||
return render_template('web/allsong.html', posts=posts)
|
||||
|
||||
|
||||
@bp.route('/singlecharttop', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
def single_chart_top():
|
||||
# 歌曲排行榜
|
||||
if request.method == 'POST':
|
||||
song_name = request.form['sid']
|
||||
difficulty = request.form['difficulty']
|
||||
if difficulty.isdigit():
|
||||
difficulty = int(difficulty)
|
||||
error = None
|
||||
conn = sqlite3.connect('./database/arcsong.db')
|
||||
c = conn.cursor()
|
||||
song_name = '%'+song_name+'%'
|
||||
c.execute('''select sid, name_en from songs where sid like :a limit 1''',
|
||||
{'a': song_name})
|
||||
x = c.fetchone()
|
||||
conn.commit()
|
||||
conn.close()
|
||||
print(x)
|
||||
if x:
|
||||
song_id = x[0]
|
||||
posts = server.arcscore.arc_score_top(song_id, difficulty, -1)
|
||||
for i in posts:
|
||||
i['time_played'] = time.strftime('%Y-%m-%d %H:%M:%S',
|
||||
time.localtime(i['time_played']))
|
||||
else:
|
||||
error = '查询为空 No song.'
|
||||
|
||||
if not error:
|
||||
return render_template('web/singlecharttop.html', posts=posts, song_name_en=x[1], song_id=song_id, difficulty=difficulty)
|
||||
else:
|
||||
flash(error)
|
||||
|
||||
return render_template('web/singlecharttop.html')
|
||||
|
||||
|
||||
def allowed_file(filename):
|
||||
return '.' in filename and \
|
||||
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
||||
|
||||
|
||||
@bp.route('/updatedatabase', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
def update_database():
|
||||
# 更新数据库
|
||||
error = None
|
||||
if request.method == 'POST':
|
||||
if 'file' not in request.files:
|
||||
flash('无文件 No file part.')
|
||||
return redirect(request.url)
|
||||
file = request.files['file']
|
||||
if file.filename == '':
|
||||
flash('未选择文件 No selected file.')
|
||||
return redirect(request.url)
|
||||
|
||||
if file and allowed_file(file.filename) and file.filename in ['arcsong.db', 'arcaea_database.db']:
|
||||
filename = 'old_' + secure_filename(file.filename)
|
||||
file.save(os.path.join(UPLOAD_FOLDER, filename))
|
||||
flash('上传成功 Success upload.')
|
||||
try:
|
||||
web.system.update_database()
|
||||
flash('数据更新成功 Success update data.')
|
||||
except:
|
||||
flash('数据更新失败 Cannot update data.')
|
||||
else:
|
||||
error = '上传失败 Upload error.'
|
||||
|
||||
if error:
|
||||
flash(error)
|
||||
|
||||
return render_template('web/updatedatabase.html')
|
||||
|
||||
|
||||
@bp.route('/changesong', methods=['GET'])
|
||||
@login_required
|
||||
def change_song():
|
||||
# 修改歌曲数据
|
||||
return render_template('web/changesong.html')
|
||||
|
||||
|
||||
@bp.route('/changesong/addsong', methods=['POST'])
|
||||
@login_required
|
||||
def add_song():
|
||||
# 添加歌曲数据
|
||||
def get_rating(x):
|
||||
# 换算定数
|
||||
if is_number(x):
|
||||
x = float(x)
|
||||
if x >= 0:
|
||||
return int(x*10)
|
||||
else:
|
||||
return -1
|
||||
else:
|
||||
return -1
|
||||
|
||||
error = None
|
||||
song_id = request.form['sid']
|
||||
name_en = request.form['name_en']
|
||||
rating_pst = get_rating(request.form['rating_pst'])
|
||||
rating_prs = get_rating(request.form['rating_prs'])
|
||||
rating_ftr = get_rating(request.form['rating_ftr'])
|
||||
rating_byd = get_rating(request.form['rating_byd'])
|
||||
if len(song_id) >= 256:
|
||||
song_id = song_id[:200]
|
||||
if len(name_en) >= 256:
|
||||
name_en = name_en[:200]
|
||||
conn = sqlite3.connect('./database/arcsong.db')
|
||||
c = conn.cursor()
|
||||
c.execute(
|
||||
'''select exists(select * from songs where sid=:a)''', {'a': song_id})
|
||||
if c.fetchone() == (0,):
|
||||
c.execute('''insert into songs(sid,name_en,rating_pst,rating_prs,rating_ftr,rating_byn) values(:a,:b,:c,:d,:e,:f)''', {
|
||||
'a': song_id, 'b': name_en, 'c': rating_pst, 'd': rating_prs, 'e': rating_ftr, 'f': rating_byd})
|
||||
flash('歌曲添加成功 Successfully add the song.')
|
||||
else:
|
||||
error = '歌曲已存在 The song exists.'
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
if error:
|
||||
flash(error)
|
||||
|
||||
return redirect(url_for('index.change_song'))
|
||||
|
||||
|
||||
@bp.route('/changesong/deletesong', methods=['POST'])
|
||||
@login_required
|
||||
def delete_song():
|
||||
# 删除歌曲数据
|
||||
|
||||
error = None
|
||||
song_id = request.form['sid']
|
||||
conn = sqlite3.connect('./database/arcsong.db')
|
||||
c = conn.cursor()
|
||||
c.execute(
|
||||
'''select exists(select * from songs where sid=:a)''', {'a': song_id})
|
||||
if c.fetchone() == (1,):
|
||||
c.execute('''delete from songs where sid=:a''', {'a': song_id})
|
||||
flash('歌曲删除成功 Successfully delete the song.')
|
||||
else:
|
||||
error = "歌曲不存在 The song doesn't exist."
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
if error:
|
||||
flash(error)
|
||||
|
||||
return redirect(url_for('index.change_song'))
|
||||
50
latest version/web/login.py
Normal file
50
latest version/web/login.py
Normal file
@@ -0,0 +1,50 @@
|
||||
#import sqlite3
|
||||
from flask import (Blueprint, flash, g, redirect,
|
||||
render_template, request, session, url_for)
|
||||
import functools
|
||||
|
||||
bp = Blueprint('login', __name__, url_prefix='/web')
|
||||
|
||||
|
||||
@bp.route('/login', methods=('GET', 'POST'))
|
||||
def login():
|
||||
# 登录
|
||||
if request.method == 'POST':
|
||||
username = request.form['username']
|
||||
password = request.form['password']
|
||||
error = None
|
||||
|
||||
if username != 'admin' and password != 'admin':
|
||||
error = '错误的用户名或密码 Incorrect username or password.'
|
||||
|
||||
if error is None:
|
||||
session.clear()
|
||||
session['user_id'] = 'admin'
|
||||
return redirect(url_for('index.index'))
|
||||
|
||||
flash(error)
|
||||
|
||||
return render_template('web/login.html')
|
||||
|
||||
|
||||
@bp.route('/logout')
|
||||
def logout():
|
||||
# 登出
|
||||
session.clear()
|
||||
flash('成功登出 Successfully log out.')
|
||||
return redirect(url_for('index.index'))
|
||||
|
||||
|
||||
def login_required(view):
|
||||
# 登录验证,写成了修饰器
|
||||
@functools.wraps(view)
|
||||
def wrapped_view(**kwargs):
|
||||
x = session.get('user_id')
|
||||
# 少用户存在验证
|
||||
if x is None:
|
||||
return redirect(url_for('login.login'))
|
||||
|
||||
g.user = {'user_id': x, 'username': 'admin'}
|
||||
return view(**kwargs)
|
||||
|
||||
return wrapped_view
|
||||
113
latest version/web/system.py
Normal file
113
latest version/web/system.py
Normal file
@@ -0,0 +1,113 @@
|
||||
import os
|
||||
import sqlite3
|
||||
|
||||
|
||||
def update_user_char(c):
|
||||
# 用character数据更新user_char
|
||||
c.execute('''select * from character''')
|
||||
x = c.fetchall()
|
||||
c.execute('''select user_id from user''')
|
||||
y = c.fetchall()
|
||||
if x and y:
|
||||
for j in y:
|
||||
for i in x:
|
||||
c.execute('''delete from user_char where user_id=:a and character_id=:b''', {
|
||||
'a': j[0], 'b': i[0]})
|
||||
c.execute('''insert into user_char values(:a,:b,:c,:d,:e,:f,:g,:h,:i,:j,:k,:l,:m,:n,:o)''', {
|
||||
'a': j[0], 'b': i[0], 'c': i[2], 'd': i[3], 'e': i[4], 'f': i[5], 'g': i[6], 'h': i[7], 'i': i[8], 'j': i[9], 'k': i[10], 'l': i[11], 'm': i[12], 'n': i[14], 'o': i[15]})
|
||||
|
||||
|
||||
def update_database():
|
||||
# 将old数据库不存在数据加入到新数据库上,并删除old数据库
|
||||
# 对于arcaea_datebase.db,更新best_score,friend,recent30,user,user_world并用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')
|
||||
c1 = conn1.cursor()
|
||||
conn2 = sqlite3.connect('./database/arcaea_database.db')
|
||||
c2 = conn2.cursor()
|
||||
|
||||
# user
|
||||
c1.execute('''select * from user''')
|
||||
x = c1.fetchall()
|
||||
if x:
|
||||
for i in x:
|
||||
c2.execute(
|
||||
'''select exists(select * from user where user_id=:a)''', {'a': i[0]})
|
||||
if c2.fetchone() == (0,):
|
||||
c2.execute('''insert into user values(:a0,:a1,:a2,:a3,:a4,:a5,:a6,:a7,:a8,:a9,:a10,:a11,:a12,:a13,:a14,:a15,:a16,:a17,:a18,:a19,:a20,:a21,:a22,:a23,:a24,:a25)''', {
|
||||
'a0': i[0], 'a1': i[1], 'a2': i[2], 'a3': i[3], 'a4': i[4], 'a5': i[5], 'a6': i[6], 'a7': i[7], 'a8': i[8], 'a9': i[9], 'a10': i[10], 'a11': i[11], 'a12': i[12], 'a13': i[13], 'a14': i[14], 'a15': i[15], 'a16': i[16], 'a17': i[17], 'a18': i[18], 'a19': i[19], 'a20': i[20], 'a21': i[21], 'a22': i[22], 'a23': i[23], 'a24': i[24], 'a25': i[25]})
|
||||
|
||||
# friend
|
||||
c1.execute('''select * from friend''')
|
||||
x = c1.fetchall()
|
||||
if x:
|
||||
for i in x:
|
||||
c2.execute(
|
||||
'''select exists(select * from friend where user_id_me=:a and user_id_other=:b)''', {'a': i[0], 'b': i[1]})
|
||||
if c2.fetchone() == (0,):
|
||||
c2.execute('''insert into friend values(:a,:b)''', {
|
||||
'a': i[0], 'b': i[1]})
|
||||
|
||||
# best_score
|
||||
c1.execute('''select * from best_score''')
|
||||
x = c1.fetchall()
|
||||
if x:
|
||||
for i in x:
|
||||
c2.execute('''select exists(select * from best_score where user_id=:a and song_id=:b and difficulty=:c)''', {
|
||||
'a': i[0], 'b': i[1], 'c': i[2]})
|
||||
if c2.fetchone() == (0,):
|
||||
c2.execute('''insert into best_score values(:a0,:a1,:a2,:a3,:a4,:a5,:a6,:a7,:a8,:a9,:a10,:a11,:a12,:a13)''', {
|
||||
'a0': i[0], 'a1': i[1], 'a2': i[2], 'a3': i[3], 'a4': i[4], 'a5': i[5], 'a6': i[6], 'a7': i[7], 'a8': i[8], 'a9': i[9], 'a10': i[10], 'a11': i[11], 'a12': i[12], 'a13': i[13]})
|
||||
|
||||
# recent30
|
||||
c1.execute('''select * from recent30''')
|
||||
x = c1.fetchall()
|
||||
if x:
|
||||
for i in x:
|
||||
c2.execute(
|
||||
'''select exists(select * from recent30 where user_id=:a)''', {'a': i[0]})
|
||||
if c2.fetchone() == (0,):
|
||||
c2.execute('''insert into recent30 values(:a0,:a1,:a2,:a3,:a4,:a5,:a6,:a7,:a8,:a9,:a10,:a11,:a12,:a13,:a14,:a15,:a16,:a17,:a18,:a19,:a20,:a21,:a22,:a23,:a24,:a25,:a26,:a27,:a28,:a29,:a30,:a31,:a32,:a33,:a34,:a35,:a36,:a37,:a38,:a39,:a40,:a41,:a42,:a43,:a44,:a45,:a46,:a47,:a48,:a49,:a50,:a51,:a52,:a53,:a54,:a55,:a56,:a57,:a58,:a59,:a60)''', {'a0': i[0], 'a1': i[1], 'a2': i[2], 'a3': i[3], 'a4': i[4], 'a5': i[5], 'a6': i[6], 'a7': i[7], 'a8': i[8], 'a9': i[9], 'a10': i[10], 'a11': i[11], 'a12': i[12], 'a13': i[13], 'a14': i[14], 'a15': i[15], 'a16': i[16], 'a17': i[17], 'a18': i[
|
||||
18], 'a19': i[19], 'a20': i[20], 'a21': i[21], 'a22': i[22], 'a23': i[23], 'a24': i[24], 'a25': i[25], 'a26': i[26], 'a27': i[27], 'a28': i[28], 'a29': i[29], 'a30': i[30], 'a31': i[31], 'a32': i[32], 'a33': i[33], 'a34': i[34], 'a35': i[35], 'a36': i[36], 'a37': i[37], 'a38': i[38], 'a39': i[39], 'a40': i[40], 'a41': i[41], 'a42': i[42], 'a43': i[43], 'a44': i[44], 'a45': i[45], 'a46': i[46], 'a47': i[47], 'a48': i[48], 'a49': i[49], 'a50': i[50], 'a51': i[51], 'a52': i[52], 'a53': i[53], 'a54': i[54], 'a55': i[55], 'a56': i[56], 'a57': i[57], 'a58': i[58], 'a59': i[59], 'a60': i[60]})
|
||||
|
||||
# user_world
|
||||
c1.execute('''select * from user_world''')
|
||||
x = c1.fetchall()
|
||||
if x:
|
||||
for i in x:
|
||||
c2.execute(
|
||||
'''select exists(select * from user_world where user_id=:a and map_id=:b)''', {'a': i[0], 'b': i[1]})
|
||||
if c2.fetchone() == (0,):
|
||||
c2.execute('''insert into user_world values(:a0,:a1,:a2,:a3,:a4)''', {
|
||||
'a0': i[0], 'a1': i[1], 'a2': i[2], 'a3': i[3], 'a4': i[4]})
|
||||
|
||||
update_user_char(c2)
|
||||
conn1.commit()
|
||||
conn1.close()
|
||||
conn2.commit()
|
||||
conn2.close()
|
||||
os.remove('database/old_arcaea_database.db')
|
||||
|
||||
# songs
|
||||
if os.path.isfile("database/old_arcsong.db") and os.path.isfile("database/arcsong.db"):
|
||||
conn1 = sqlite3.connect('./database/old_arcsong.db')
|
||||
c1 = conn1.cursor()
|
||||
conn2 = sqlite3.connect('./database/arcsong.db')
|
||||
c2 = conn2.cursor()
|
||||
|
||||
c1.execute('''select * from songs''')
|
||||
x = c1.fetchall()
|
||||
if x:
|
||||
for i in x:
|
||||
c2.execute(
|
||||
'''select exists(select * from songs where sid=:a)''', {'a': i[0]})
|
||||
if c2.fetchone() == (0,):
|
||||
c2.execute('''insert into songs values(:a0,:a1,:a2,:a3,:a4,:a5,:a6,:a7,:a8,:a9,:a10,:a11,:a12,:a13,:a14,:a15,:a16,:a17,:a18,:a19,:a20,:a21,:a22,:a23,:a24,:a25,:a26,:a27)''', {'a0': i[0], 'a1': i[1], 'a2': i[2], 'a3': i[3], 'a4': i[4], 'a5': i[5], 'a6': i[6], 'a7': i[7], 'a8': i[
|
||||
8], 'a9': i[9], 'a10': i[10], 'a11': i[11], 'a12': i[12], 'a13': i[13], 'a14': i[14], 'a15': i[15], 'a16': i[16], 'a17': i[17], 'a18': i[18], 'a19': i[19], 'a20': i[20], 'a21': i[21], 'a22': i[22], 'a23': i[23], 'a24': i[24], 'a25': i[25], 'a26': i[26], 'a27': i[27]})
|
||||
|
||||
conn1.commit()
|
||||
conn1.close()
|
||||
conn2.commit()
|
||||
conn2.close()
|
||||
os.remove('database/old_arcsong.db')
|
||||
104
latest version/web/webscore.py
Normal file
104
latest version/web/webscore.py
Normal file
@@ -0,0 +1,104 @@
|
||||
import time
|
||||
|
||||
|
||||
def get_user_score(c, user_id, limit=-1):
|
||||
# 返回用户的所有歌曲数据,带排名,返回字典列表
|
||||
if limit >= 0:
|
||||
c.execute('''select * from best_score where user_id =:a order by rating DESC limit :b''',
|
||||
{'a': user_id, 'b': limit})
|
||||
else:
|
||||
c.execute(
|
||||
'''select * from best_score where user_id =:a order by rating DESC''', {'a': user_id})
|
||||
x = c.fetchall()
|
||||
r = []
|
||||
if x:
|
||||
rank = 0
|
||||
for i in x:
|
||||
rank += 1
|
||||
r.append({
|
||||
"song_id": i[1],
|
||||
"difficulty": i[2],
|
||||
"score": i[3],
|
||||
"shiny_perfect_count": i[4],
|
||||
"perfect_count": i[5],
|
||||
"near_count": i[6],
|
||||
"miss_count": i[7],
|
||||
"health": i[8],
|
||||
"modifier": i[9],
|
||||
"time_played": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(i[10])),
|
||||
"best_clear_type": i[11],
|
||||
"clear_type": i[12],
|
||||
"rating": i[13],
|
||||
"rank": rank
|
||||
})
|
||||
|
||||
return r
|
||||
|
||||
|
||||
def get_user(c, user_id):
|
||||
# 得到user表部分用户信息,返回字典
|
||||
c.execute('''select * from user where user_id = :a''', {'a': user_id})
|
||||
x = c.fetchone()
|
||||
r = None
|
||||
if x:
|
||||
join_date = None
|
||||
time_played = None
|
||||
if x[3]:
|
||||
join_date = time.strftime('%Y-%m-%d %H:%M:%S',
|
||||
time.localtime(int(x[3])//1000))
|
||||
if x[20]:
|
||||
time_played = time.strftime('%Y-%m-%d %H:%M:%S',
|
||||
time.localtime(int(x[20])//1000))
|
||||
|
||||
r = {'name': x[1],
|
||||
'user_id': user_id,
|
||||
'join_date': join_date,
|
||||
'user_code': x[4],
|
||||
'rating_ptt': x[5],
|
||||
'song_id': x[11],
|
||||
'difficulty': x[12],
|
||||
'score': x[13],
|
||||
'shiny_perfect_count': x[14],
|
||||
'perfect_count': x[15],
|
||||
'near_count': x[16],
|
||||
'miss_count': x[17],
|
||||
'time_played': time_played,
|
||||
'clear_type': x[21],
|
||||
'rating': x[22]
|
||||
}
|
||||
|
||||
return r
|
||||
|
||||
|
||||
def get_user_recent30(c, user_id):
|
||||
# 获取玩家recent30信息并计算这一部分的ptt,返回字典列表和一个值
|
||||
c.execute('''select * from recent30 where user_id=:a''', {'a': user_id})
|
||||
sumr = 0
|
||||
x = c.fetchone()
|
||||
r = []
|
||||
if x is not None:
|
||||
r30 = []
|
||||
s30 = []
|
||||
for i in range(1, 61, 2):
|
||||
if x[i] is not None:
|
||||
r30.append(float(x[i]))
|
||||
s30.append(x[i+1])
|
||||
else:
|
||||
r30.append(0)
|
||||
s30.append('')
|
||||
r30, s30 = (list(t) for t in zip(*sorted(zip(r30, s30), reverse=True)))
|
||||
songs = []
|
||||
i = 0
|
||||
while len(songs) < 10 and i <= 29 and s30[i] != '' and s30[i] is not None:
|
||||
if s30[i] not in songs:
|
||||
sumr += r30[i]
|
||||
songs.append(s30[i])
|
||||
i += 1
|
||||
for i in range(0, 30):
|
||||
if s30[i]:
|
||||
r.append({
|
||||
'song_id': s30[i][:-1],
|
||||
'difficulty': int(s30[i][-1]),
|
||||
'rating': r30[i]
|
||||
})
|
||||
return r, sumr / 10
|
||||
Reference in New Issue
Block a user