120 lines
4.4 KiB
Python
120 lines
4.4 KiB
Python
|
|
import logging
|
|
from flask import Flask, request, jsonify
|
|
from flask_cors import CORS
|
|
import traceback
|
|
import asyncio
|
|
|
|
from database.inventory.inventory_data import SubAffix
|
|
from game_server.game.player.player_manager import PlayerManager
|
|
from game_server.net.session import PlayerSession
|
|
from game_server.srtools.models.srtools_data import SRToolDataRsp,SRToolDataReq,SRToolData
|
|
from database.account.account_data import find_account_by_name
|
|
from utils.logger import Info
|
|
from game_server.srtools.gateway import get_gateway_instance
|
|
flask_app = Flask(__name__)
|
|
log = logging.getLogger('werkzeug')
|
|
log.setLevel(logging.ERROR)
|
|
CORS(flask_app, resources={r"/*": {"origins": "https://srtools.pages.dev"}})
|
|
|
|
|
|
async def ClearInventory(conn: PlayerSession):
|
|
# un equip all lightcones and relic after that remove it
|
|
for _, items in list(conn.player.inventory_manager.items()):
|
|
if items.equip_avatar != 0 and items.main_type in (1, 2):
|
|
await conn.player.unequip_items(items.equip_avatar)
|
|
if items.main_type == 1:
|
|
await conn.notify(items.LightconeSyncProto())
|
|
if items.main_type == 2:
|
|
await conn.notify(items.RelicSyncProto())
|
|
await conn.player.remove_items(0, items.unique_id)
|
|
|
|
async def AddAllData(player: PlayerManager, data: SRToolData):
|
|
for key, avatar_data in data.avatars.items():
|
|
avatar = player.avatar_manager.get(avatar_data.avatar_id)
|
|
if avatar_data.avatar_id >= 8000:continue
|
|
if not avatar:
|
|
avatar = player.add_avatar(avatar_data.avatar_id)
|
|
if avatar:
|
|
player.avatar_manager[avatar_data.avatar_id] = avatar
|
|
|
|
avatar.level = avatar_data.level
|
|
avatar.promotion = avatar_data.promotion
|
|
avatar.rank = avatar_data.data.rank if avatar_data.data else 0
|
|
avatar.skills = avatar_data.data.skills
|
|
|
|
for lightcone in data.lightcones:
|
|
if lightcone.equip_avatar > 8000:continue
|
|
lightcone_data = player.add_lightcone(
|
|
lightcone.item_id,
|
|
lightcone.rank
|
|
)
|
|
if lightcone_data:
|
|
if lightcone.equip_avatar > 0:
|
|
player.avatar_manager[lightcone.equip_avatar].lightcone_id = lightcone_data.unique_id
|
|
lightcone_data.equip_avatar = lightcone.equip_avatar
|
|
player.inventory_manager[lightcone_data.unique_id] = lightcone_data
|
|
|
|
for relic in data.relics:
|
|
if relic.equip_avatar > 8000:continue
|
|
relic_data = player.add_relic(
|
|
relic_id=relic.relic_id,
|
|
main_affix=relic.main_affix_id,
|
|
sub_affix=[
|
|
SubAffix(
|
|
id=affix.sub_affix_id,
|
|
count=affix.count,
|
|
step=affix.step
|
|
)
|
|
for affix in relic.sub_affixes
|
|
]
|
|
)
|
|
if relic_data:
|
|
if relic.equip_avatar > 0:
|
|
player.avatar_manager[relic.equip_avatar].relic_ids[str(relic_data.sub_type)] = relic_data.unique_id
|
|
relic_data.equip_avatar = relic.equip_avatar
|
|
player.inventory_manager[relic_data.unique_id] = relic_data
|
|
|
|
|
|
@flask_app.route("/srtools", methods=["POST"])
|
|
async def srtools_handler():
|
|
body = request.get_json()
|
|
try:
|
|
req = SRToolDataReq(**body)
|
|
except Exception:
|
|
return jsonify({"message": "Invalid input", "status": 400}), 400
|
|
|
|
rsp = SRToolDataRsp(message="OK", status=200)
|
|
|
|
account = find_account_by_name(req.username)
|
|
if not account:
|
|
rsp.message = "Invalid account"
|
|
rsp.status = 400
|
|
return jsonify(rsp.model_dump()), 401
|
|
|
|
if req.data is None:
|
|
return jsonify(rsp.model_dump()), 200
|
|
|
|
gateway = get_gateway_instance()
|
|
conn : PlayerSession = gateway.get_active_connection(account.id)
|
|
if not conn:
|
|
rsp.message = "Player Not Online"
|
|
rsp.status = 401
|
|
return jsonify(rsp.model_dump()), 401
|
|
|
|
try:
|
|
await ClearInventory(conn)
|
|
await AddAllData(conn.player,req.data)
|
|
conn.pending_notify(conn.player.SrToolItemsSync())
|
|
conn.pending_notify(conn.player.SrToolAvatarSync())
|
|
except:
|
|
rsp.message = "Internal Server Error"
|
|
rsp.status = 500
|
|
print(traceback.print_exc())
|
|
return jsonify(rsp.model_dump()), 500
|
|
return jsonify(rsp.model_dump()), 200
|
|
|
|
def run_flask(host, port):
|
|
Info(f"SRTools Server Starting on {host}:{port}")
|
|
flask_app.run(host=host, port=port)
|