diff --git a/routes/dashboard.py b/routes/dashboard.py index fa4ba2a..9c20fe7 100644 --- a/routes/dashboard.py +++ b/routes/dashboard.py @@ -291,6 +291,50 @@ def get_towns(): return jsonify(towns) +# ------------------------------------------------------------------ +# GET /dashboard/clan-towns?world_id=... +# Returns all towns for ALL clan members in a given world. +# Used by attack planner to let admin pick any player's town. +# ------------------------------------------------------------------ +@dashboard.route('/dashboard/clan-towns', methods=['GET']) +@login_required +def get_clan_towns(): + world_id = request.args.get('world_id', '').strip() + clan_id = current_user.clan_id + if not clan_id or not world_id: + return jsonify([]) + + conn = get_db() + rows = conn.execute(''' + SELECT ts.town_id, ts.town_name, ts.player, ts.player_id, + ts.x, ts.y, ts.sea, ts.world_id, ts.updated_at, ts.data + FROM town_state ts + INNER JOIN clan_members cm + ON cm.player_id = ts.player_id + AND cm.world_id = ts.world_id + AND cm.clan_id = ? + WHERE ts.world_id = ? + ORDER BY ts.player ASC, ts.town_name ASC + ''', (clan_id, world_id)).fetchall() + conn.close() + + towns = [] + for r in rows: + d = json.loads(r['data']) if r['data'] else {} + towns.append({ + 'town_id': r['town_id'], + 'town_name': r['town_name'], + 'player': r['player'], + 'player_id': r['player_id'], + 'world_id': r['world_id'], + 'x': r['x'], + 'y': r['y'], + 'sea': r['sea'], + 'units': d.get('units', {}), + }) + return jsonify(towns) + + # ------------------------------------------------------------------ # POST /dashboard/blueprints # Toggle a blueprint for a specific town diff --git a/templates/attack_planner.html b/templates/attack_planner.html index 0bc3ec8..63a86c4 100644 --- a/templates/attack_planner.html +++ b/templates/attack_planner.html @@ -2,480 +2,460 @@ - + Attack Planner — Grepolis Remote - - -