fix que / add auto

This commit is contained in:
2026-05-07 20:22:28 +03:00
parent 51d15118ed
commit 74b51e74ca
6 changed files with 467 additions and 54 deletions

View File

@@ -731,6 +731,17 @@ def get_agora():
for r in cel_rows:
cooldowns[(r['town_id'], r['celebration_type'])] = r['finished_at']
# ── Auto settings ────────────────────────────────────────
settings_rows = conn.execute('''
SELECT town_id, auto_party, auto_triumph
FROM culture_settings
WHERE player_id = ? AND world_id = ?
''', (player_id, world_id)).fetchall()
auto_settings = {} # town_id → {auto_party, auto_triumph}
for s in settings_rows:
auto_settings[(s['town_id'], 'auto_party')] = s['auto_party']
auto_settings[(s['town_id'], 'auto_triumph')] = s['auto_triumph']
conn.close()
# ── Per-town eligibility ─────────────────────────────────────────
@@ -801,6 +812,8 @@ def get_agora():
'available': triumph_ok,
'cooldown_until': triumph_cd or None,
},
'auto_party': bool(auto_settings.get((tid, 'auto_party'), 0)),
'auto_triumph': bool(auto_settings.get((tid, 'auto_triumph'), 0)),
})
return jsonify({'towns': towns_out, 'costs': {'party': PARTY_COST, 'triumph': TRIUMPH_COST}})
@@ -824,7 +837,7 @@ def _fmt_seconds(secs):
# Body: { player_id, world_id, town_id, town_name, celebration_type }
# • Validates client is online.
# • Validates eligibility (resources / battle_points / cooldown).
# • Inserts a 'culture' command into the commands queue.
# • Inserts a 'culture' command into the culture_queue.
# • Inserts a 'pending' row into culture_log.
# ------------------------------------------------------------------
@dashboard.route('/dashboard/culture-command', methods=['POST'])
@@ -902,32 +915,43 @@ def culture_command():
return jsonify({'error': 'insufficient_battle_points',
'message': f'Ανεπαρκείς πόντοι μάχης ({available_bp}/{TRIUMPH_COST}).'}), 409
# ── Insert command into bot queue ────────────────────────────────
now_iso = datetime.utcnow().isoformat()
# ── Insert into culture_queue ────────────────────────────────
c = conn.cursor()
# One-at-a-time check: reject if this type already pending/executing
existing = c.execute('''
SELECT id FROM culture_queue
WHERE player_id = ? AND world_id = ? AND town_id = ? AND celebration_type = ?
AND status IN ('pending', 'executing')
''', (str(player_id), world_id, town_id, cel_type)).fetchone()
if existing:
conn.close()
label = 'Γιορτή πόλης' if cel_type == 'party' else 'Παρέλαση θριάμβου'
return jsonify({'error': 'already_queued',
'message': f'{label} για την πόλη αυτή είναι ήδη σε αναμονή εκτέλεσης.'}), 409
now_iso = datetime.utcnow().isoformat()
c.execute('''
INSERT INTO commands (town_id, town_name, type, payload, status, created_at, updated_at, player_id)
VALUES (?, ?, 'culture', ?, 'pending', ?, ?, ?)
''', (
town_id, town_name,
json.dumps({'celebration_type': cel_type, 'town_id': int(town_id)}),
now_iso, now_iso, str(player_id)
))
cmd_id = c.lastrowid
INSERT INTO culture_queue
(player_id, world_id, town_id, town_name, celebration_type, status, source, created_at)
VALUES (?, ?, ?, ?, ?, 'pending', 'manual', ?)
''', (str(player_id), world_id, town_id, town_name, cel_type, now_iso))
queue_id = c.lastrowid
# ── Append culture_log row (status=pending until bot confirms) ───
c.execute('''
INSERT INTO culture_log
(player_id, world_id, town_id, town_name, celebration_type,
cost_wood, cost_stone, cost_iron, cost_battle_pts, status, fired_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?)
cost_wood, cost_stone, cost_iron, cost_battle_pts, status, source, fired_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending', 'manual', ?)
''', (str(player_id), world_id, town_id, town_name, cel_type,
cost_wood, cost_stone, cost_iron, cost_bp, now_iso))
log_id = c.lastrowid
conn.commit()
conn.close()
return jsonify({'ok': True, 'cmd_id': cmd_id, 'log_id': log_id})
return jsonify({'ok': True, 'queue_id': queue_id, 'log_id': log_id})
# ------------------------------------------------------------------
@@ -946,7 +970,7 @@ def get_culture_log():
rows = conn.execute('''
SELECT id, town_id, town_name, celebration_type,
cost_wood, cost_stone, cost_iron, cost_battle_pts,
status, result_msg, fired_at, confirmed_at
status, result_msg, source, fired_at, confirmed_at
FROM culture_log
WHERE player_id = ? AND world_id = ?
ORDER BY id DESC
@@ -954,3 +978,64 @@ def get_culture_log():
''', (player_id, world_id)).fetchall()
conn.close()
return jsonify([dict(r) for r in rows])
# ------------------------------------------------------------------
# GET /dashboard/culture-settings?player_id=&world_id=&town_id=
# POST /dashboard/culture-settings
# Body: { player_id, world_id, town_id, auto_party, auto_triumph }
# Save/retrieve per-town auto-celebration preferences.
# ------------------------------------------------------------------
@dashboard.route('/dashboard/culture-settings', methods=['GET', 'POST'])
@login_required
def culture_settings():
if request.method == 'GET':
player_id = request.args.get('player_id')
world_id = request.args.get('world_id', '')
town_id = request.args.get('town_id', '')
if not player_id:
return jsonify({'error': 'missing player_id'}), 400
conn = get_db()
if town_id:
row = conn.execute(
'SELECT auto_party, auto_triumph FROM culture_settings WHERE player_id=? AND world_id=? AND town_id=?',
(player_id, world_id, town_id)
).fetchone()
conn.close()
if row:
return jsonify({'auto_party': bool(row['auto_party']), 'auto_triumph': bool(row['auto_triumph'])})
return jsonify({'auto_party': False, 'auto_triumph': False})
else:
rows = conn.execute(
'SELECT town_id, auto_party, auto_triumph FROM culture_settings WHERE player_id=? AND world_id=?',
(player_id, world_id)
).fetchall()
conn.close()
return jsonify([dict(r) for r in rows])
# POST — save settings
data = request.get_json(silent=True) or {}
player_id = data.get('player_id')
world_id = data.get('world_id', '')
town_id = str(data.get('town_id', ''))
auto_party = 1 if data.get('auto_party') else 0
auto_triumph = 1 if data.get('auto_triumph') else 0
if not player_id or not town_id:
return jsonify({'error': 'missing player_id or town_id'}), 400
now_iso = datetime.utcnow().isoformat()
conn = get_db()
conn.execute('''
INSERT INTO culture_settings (player_id, world_id, town_id, auto_party, auto_triumph, updated_at)
VALUES (?, ?, ?, ?, ?, ?)
ON CONFLICT(player_id, world_id, town_id) DO UPDATE SET
auto_party = excluded.auto_party,
auto_triumph = excluded.auto_triumph,
updated_at = excluded.updated_at
''', (str(player_id), world_id, town_id, auto_party, auto_triumph, now_iso))
conn.commit()
conn.close()
return jsonify({'ok': True, 'auto_party': bool(auto_party), 'auto_triumph': bool(auto_triumph)})