mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2026-02-04 21:47:28 +08:00
- Change something to make that purchase things can have some cores. - Fix the download link of Arcaea client in README > This is a small update.
283 lines
8.3 KiB
Python
283 lines
8.3 KiB
Python
from server.sql import Connect
|
||
import server.item
|
||
import server.character
|
||
import time
|
||
import json
|
||
|
||
|
||
def int2b(x):
|
||
# int与布尔值转换
|
||
if x is None or x == 0:
|
||
return False
|
||
else:
|
||
return True
|
||
|
||
|
||
def get_purchase(c, type='pack'):
|
||
# 读取packs内容,返回字典列表
|
||
c.execute(
|
||
'''select * from purchase where purchase_name in (select purchase_name from purchase_item where type = :a)''', {'a': type})
|
||
x = c.fetchall()
|
||
if not x:
|
||
return []
|
||
|
||
re = []
|
||
for i in x:
|
||
items = []
|
||
c.execute(
|
||
'''select a.*, b.amount from item a, purchase_item b where a.item_id=b.item_id and a.type=b.type and b.purchase_name=:name''', {'name': i[0]})
|
||
y = c.fetchall()
|
||
t = None
|
||
if y:
|
||
for j in y:
|
||
if j[3]:
|
||
amount = j[3]
|
||
else:
|
||
amount = 1
|
||
if i[0] == j[0]:
|
||
# 物品排序,否则客户端报错
|
||
t = {
|
||
"type": j[1],
|
||
"id": j[0],
|
||
"is_available": int2b(j[2]),
|
||
'amount': amount
|
||
}
|
||
else:
|
||
items.append({
|
||
"type": j[1],
|
||
"id": j[0],
|
||
"is_available": int2b(j[2]),
|
||
"amount": amount
|
||
})
|
||
|
||
|
||
if t is not None:
|
||
# 放到列表头
|
||
items = [t, items]
|
||
|
||
r = {"name": i[0],
|
||
"items": items,
|
||
"price": i[1],
|
||
"orig_price": i[2]}
|
||
|
||
if i[3] > 0:
|
||
r['discount_from'] = i[3]
|
||
if i[4] > 0:
|
||
r['discount_to'] = i[4]
|
||
|
||
re.append(r)
|
||
|
||
return re
|
||
|
||
|
||
def get_single_purchase():
|
||
# main里面没开数据库,这里写一下代替
|
||
re = []
|
||
with Connect() as c:
|
||
re = get_purchase(c, type='single')
|
||
|
||
return re
|
||
|
||
|
||
def buy_item(c, user_id, price):
|
||
# 购买接口,返回成功与否标识符和剩余源点数
|
||
c.execute('''select ticket from user where user_id = :a''',
|
||
{'a': user_id})
|
||
ticket = c.fetchone()
|
||
if ticket:
|
||
ticket = ticket[0]
|
||
else:
|
||
ticket = 0
|
||
|
||
if ticket < price:
|
||
return False, ticket
|
||
|
||
c.execute('''update user set ticket = :b where user_id = :a''',
|
||
{'a': user_id, 'b': ticket-price})
|
||
|
||
return True, ticket - price
|
||
|
||
|
||
def buy_thing(user_id, purchase_id):
|
||
# 购买物品接口,返回字典
|
||
success_flag = False
|
||
ticket = 0
|
||
packs = []
|
||
singles = []
|
||
characters = []
|
||
|
||
with Connect() as c:
|
||
c.execute('''select price, orig_price, discount_from, discount_to from purchase where purchase_name=:a''',
|
||
{'a': purchase_id})
|
||
x = c.fetchone()
|
||
price = 0
|
||
flag = False
|
||
if x:
|
||
price = x[0]
|
||
orig_price = x[1]
|
||
discount_from = x[2]
|
||
discount_to = x[3]
|
||
else:
|
||
return {
|
||
"success": False,
|
||
"error_code": 501
|
||
}
|
||
|
||
c.execute(
|
||
'''select item_id, type, amount from purchase_item where purchase_name=:a''', {'a': purchase_id})
|
||
x = c.fetchall()
|
||
if x:
|
||
now = int(time.time() * 1000)
|
||
if not(discount_from <= now <= discount_to):
|
||
price = orig_price
|
||
|
||
flag, ticket = buy_item(c, user_id, price)
|
||
|
||
if flag:
|
||
for i in x:
|
||
if i[2]:
|
||
amount = i[2]
|
||
else:
|
||
amount = 1
|
||
server.item.claim_user_item(c, user_id, i[0], i[1], amount)
|
||
|
||
success_flag = True
|
||
else:
|
||
return {
|
||
"success": False,
|
||
"error_code": 501
|
||
}
|
||
|
||
packs = server.item.get_user_items(c, user_id, 'pack')
|
||
singles = server.item.get_user_items(c, user_id, 'single')
|
||
characters = server.character.get_user_characters(c, user_id)
|
||
|
||
return {
|
||
"success": success_flag,
|
||
"value": {'user_id': user_id,
|
||
'ticket': ticket,
|
||
'packs': packs,
|
||
'singles': singles,
|
||
'characters': characters
|
||
}
|
||
}
|
||
|
||
|
||
def get_prog_boost(user_id):
|
||
# 世界模式源韵强化,扣50源点,返回剩余源点数
|
||
|
||
ticket = -1
|
||
with Connect() as c:
|
||
flag, ticket = buy_item(c, user_id, 50)
|
||
|
||
if flag:
|
||
c.execute('''update user set prog_boost = 1 where user_id = :a''', {
|
||
'a': user_id})
|
||
if ticket >= 0:
|
||
return ticket, None
|
||
else:
|
||
return 0, 108
|
||
|
||
|
||
def get_user_present(c, user_id):
|
||
# 获取用户奖励,返回字典列表
|
||
c.execute(
|
||
'''select * from present where present_id in (select present_id from user_present where user_id=:a)''', {'a': user_id})
|
||
x = c.fetchall()
|
||
re = []
|
||
now = int(time.time() * 1000)
|
||
if x:
|
||
for i in x:
|
||
if now <= int(i[1]):
|
||
c.execute(
|
||
'''select * from present_item where present_id=?''', (i[0],))
|
||
y = c.fetchall()
|
||
items = []
|
||
if y:
|
||
for j in y:
|
||
if j is not None:
|
||
items.append({
|
||
"type": j[2],
|
||
"id": j[1],
|
||
"amount": j[3]
|
||
})
|
||
re.append({'expire_ts': i[1],
|
||
'description': i[2],
|
||
'present_id': i[0],
|
||
'items': items
|
||
})
|
||
|
||
return re
|
||
|
||
|
||
def claim_user_present(user_id, present_id):
|
||
# 确认并删除用户奖励,返回成功与否的布尔值
|
||
flag = False
|
||
with Connect() as c:
|
||
c.execute('''select exists(select * from user_present where user_id=:a and present_id=:b)''',
|
||
{'a': user_id, 'b': present_id})
|
||
if c.fetchone() == (1,):
|
||
c.execute('''delete from user_present where user_id=:a and present_id=:b''',
|
||
{'a': user_id, 'b': present_id})
|
||
c.execute('''select * from present where present_id=:b''',
|
||
{'b': present_id})
|
||
x = c.fetchone()
|
||
now = int(time.time() * 1000)
|
||
if now <= int(x[1]):
|
||
# 处理memory
|
||
c.execute(
|
||
'''select * from present_item where present_id=?''', (x[0],))
|
||
y = c.fetchall()
|
||
flag = True
|
||
if y:
|
||
for j in y:
|
||
if j is not None:
|
||
flag = flag and server.item.claim_user_item(
|
||
c, user_id, j[1], j[2], j[3])
|
||
|
||
else:
|
||
# 过期
|
||
flag = False
|
||
|
||
return flag
|
||
|
||
|
||
def claim_user_redeem(user_id, code):
|
||
# 处理兑换码,返回碎片数量和错误码
|
||
fragment = 0
|
||
error_code = 108
|
||
with Connect() as c:
|
||
c.execute('''select * from redeem where code=:a''', {'a': code})
|
||
x = c.fetchone()
|
||
if not x:
|
||
return 0, 504
|
||
|
||
if x[1] == 0: # 一次性
|
||
c.execute(
|
||
'''select exists(select * from user_redeem where code=:a)''', {'a': code})
|
||
if c.fetchone() == (1,):
|
||
return 0, 505
|
||
elif x[1] == 1: # 每个玩家一次
|
||
c.execute('''select exists(select * from user_redeem where code=:a and user_id=:b)''',
|
||
{'a': code, 'b': user_id})
|
||
if c.fetchone() == (1,):
|
||
return 0, 506
|
||
|
||
c.execute('''insert into user_redeem values(:b,:a)''',
|
||
{'a': code, 'b': user_id})
|
||
|
||
c.execute('''select * from redeem_item where code=?''', (code,))
|
||
x = c.fetchall()
|
||
flag = True
|
||
if x:
|
||
for i in x:
|
||
if i[2] == 'fragment':
|
||
fragment += i[3]
|
||
else:
|
||
flag = flag and server.item.claim_user_item(
|
||
c, user_id, i[1], i[2], i[3])
|
||
if flag:
|
||
error_code = None
|
||
|
||
return fragment, error_code
|