Ajoute l'assistant IA "Ruby" (Claude + Scenario) et corrige plusieurs bugs de la scène
Intègre un chat IA capable de manipuler la scène via les mêmes fonctions que l'éditeur manuel (objets, variables, déclencheurs, images générées), avec conversations multiples par écran façon Claude. Corrige au passage le rafraîchissement pjax hors-ordre, l'onglet IA/déclencheurs vide après sélection d'un objet, la comparaison de booléens dans les conditions, et le blocage du glisser-déposer hors du cadre caméra après un redimensionnement de fond par l'IA. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
ab6635eee0
commit
b07b231a61
@@ -0,0 +1 @@
|
||||
from . import upload_user_asset, serve_user_asset
|
||||
@@ -0,0 +1,15 @@
|
||||
from flask import g, send_from_directory, abort
|
||||
|
||||
import auth
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/assets/<int:user_id>/<path:filename>")
|
||||
def serve_user_asset(user_id, filename):
|
||||
"""403 si le compte connecté n'est pas le propriétaire — même esprit
|
||||
que l'isolation par propriétaire des projets (core/auth_guard.py) :
|
||||
"Mes assets" ne doit jamais fuiter d'un compte à l'autre."""
|
||||
if user_id != g.current_user["id"]:
|
||||
abort(403)
|
||||
return send_from_directory(auth.user_assets_dir(user_id), filename)
|
||||
@@ -0,0 +1,27 @@
|
||||
import os
|
||||
|
||||
from flask import g, request, jsonify, url_for
|
||||
|
||||
import auth
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/assets/upload", methods=["POST"])
|
||||
def upload_user_asset():
|
||||
""""Mes assets" (voir auth/user_assets_dir.py) : mirroir de
|
||||
routes/uploads/upload_file.py, mais stocké PAR COMPTE plutôt que par
|
||||
jeu, pour être réutilisable dans n'importe quel projet du même
|
||||
compte. Écriture disque + ligne base factorisées dans
|
||||
auth.save_user_asset (partagé avec la génération IA, voir
|
||||
ai/tools.py::_dispatch_add_generated_image)."""
|
||||
f = request.files.get("file")
|
||||
if not f or not f.filename:
|
||||
return jsonify({"error": "Aucun fichier reçu"}), 400
|
||||
ext = "".join(c for c in os.path.splitext(f.filename)[1].lower() if c.isalnum() or c == ".")[:10]
|
||||
user_id = g.current_user["id"]
|
||||
asset_id, filename = auth.save_user_asset(user_id, f.read(), ext, original_name=f.filename, source="upload")
|
||||
return jsonify({
|
||||
"id": asset_id,
|
||||
"url": url_for("serve_user_asset", user_id=user_id, filename=filename),
|
||||
})
|
||||
Reference in New Issue
Block a user