Support SRTools web

This commit is contained in:
Naruse
2025-04-17 20:13:39 +08:00
parent 2d6462c321
commit 6208880642
12 changed files with 341 additions and 27 deletions

View File

@@ -0,0 +1,119 @@
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)