new market

This commit is contained in:
2026-04-25 16:01:15 +03:00
parent 8a64a7b4fc
commit a143345831
6 changed files with 282 additions and 8 deletions

View File

@@ -101,6 +101,8 @@ def get_pending_command():
farm_cmd = _fetch_pending_of_type(c, 'farm_loot', player_id)
farm_upgrade_cmd = _fetch_pending_of_type(c, 'farm_upgrade', player_id)
research_cmd = _fetch_pending_of_type(c, 'research', player_id)
scan_market_cmd = _fetch_pending_of_type(c, 'scan_market', player_id)
accept_market_offer_cmd = _fetch_pending_of_type(c, 'accept_market_offer', player_id)
sync_req = _check_and_reset_sync(c, player_id)
# Also return current farm settings so TM knows loot_option
@@ -119,6 +121,8 @@ def get_pending_command():
'build': build_cmd,
'recruit': recruit_cmd,
'market': market_cmd,
'scan_market': scan_market_cmd,
'accept_market_offer': accept_market_offer_cmd,
'research': research_cmd,
'farm': farm_cmd,
'farm_upgrade': farm_upgrade_cmd,
@@ -202,3 +206,28 @@ def captcha_alert():
conn.commit()
conn.close()
return jsonify({'ok': True})
# ------------------------------------------------------------------
# POST /api/market_data
# Tampermonkey uploads the market scan data.
# ------------------------------------------------------------------
@api.route('/api/market_data', methods=['POST'])
def upload_market_data():
player_id = request.args.get('player_id')
if not player_id:
return jsonify({'error': 'no player_id provided'}), 400
data = request.get_json(silent=True) or {}
kv_key = f'market_data_{player_id}'
conn = get_db()
conn.execute('''
INSERT INTO kv_store (key, value, updated_at)
VALUES (?, ?, ?)
ON CONFLICT(key) DO UPDATE SET
value = excluded.value,
updated_at = excluded.updated_at
''', (kv_key, json.dumps(data), datetime.utcnow().isoformat()))
conn.commit()
conn.close()
return jsonify({'ok': True})

View File

@@ -129,6 +129,24 @@ def get_farm_data():
return jsonify(farms_summary)
# ------------------------------------------------------------------
# GET /dashboard/market-data
# Returns the latest market scan data for a player.
# ------------------------------------------------------------------
@dashboard.route('/dashboard/market-data', methods=['GET'])
def get_market_data():
player_id = request.args.get('player_id')
conn = get_db()
row = conn.execute(
"SELECT value, updated_at FROM kv_store WHERE key = ?", (f'market_data_{player_id}', )
).fetchone()
conn.close()
if row:
return jsonify({'data': json.loads(row['value']), 'updated_at': row['updated_at']})
return jsonify({'data': None, 'updated_at': None})
# ------------------------------------------------------------------
# GET /dashboard/towns
# Returns all known towns with their latest state snapshot.
@@ -266,8 +284,8 @@ def create_command():
return jsonify({'error': f'missing field: {field}'}), 400
cmd_type = data['type']
if cmd_type not in ('build', 'recruit', 'market_offer', 'farm_loot', 'farm_upgrade', 'research'):
return jsonify({'error': 'type must be build, recruit, market_offer, farm_loot, farm_upgrade, or research'}), 400
if cmd_type not in ('build', 'recruit', 'market_offer', 'farm_loot', 'farm_upgrade', 'research', 'scan_market', 'accept_market_offer'):
return jsonify({'error': 'type must be build, recruit, market_offer, farm_loot, farm_upgrade, research, scan_market, or accept_market_offer'}), 400
# Reject if the Tampermonkey client is offline (no state push in last 150 s)
conn = get_db()