klaim reward BP harian (claim service V32-V34) + kill-switch DISTRIBUTE_ENABLED (V35) + Telegram dua kanal komunitas/internal (V30/V36) + placement web/scan/dist/claim != server2U
This commit is contained in:
1 parent
d3a0e768a0
commit
b1e6e93796
14 files changed
+878
-72
No files matched your search
@@ -255,3 +255,99 @@ def list_payments(run_id=None):
|
||||
params = (run_id,)
|
||||
sql += ' ORDER BY payment_id DESC'
|
||||
return query(sql, params)
|
||||
|
||||
|
||||
# ——————————————————————————————————————————————————————————————————————
|
||||
# Riwayat klaim reward BP (V32..V34). Satu baris per klaim sukses; fee yang
|
||||
# belum terkirim (`pending`/`failed`) jadi sumber resume saat restart.
|
||||
# ——————————————————————————————————————————————————————————————————————
|
||||
|
||||
_CLAIM_COLS = (
|
||||
'run_date TEXT NOT NULL, '
|
||||
'claim_txid TEXT, '
|
||||
'reward DOUBLE NOT NULL, '
|
||||
'fee_amount DOUBLE NOT NULL, '
|
||||
'fee_status TEXT NOT NULL, ' # pending | sent | failed | skipped
|
||||
'fee_txid TEXT, '
|
||||
'claimed_at TEXT, '
|
||||
'fee_sent_at TEXT, '
|
||||
'created_at TEXT NOT NULL'
|
||||
)
|
||||
_CLAIM_DDL_SQLITE = (f'CREATE TABLE IF NOT EXISTS claim_runs '
|
||||
f'(claim_id INTEGER PRIMARY KEY AUTOINCREMENT, '
|
||||
f'{_CLAIM_COLS})')
|
||||
_CLAIM_DDL_MYSQL = (f'CREATE TABLE IF NOT EXISTS claim_runs '
|
||||
f'(claim_id INT AUTO_INCREMENT PRIMARY KEY, '
|
||||
f'{_CLAIM_COLS})')
|
||||
|
||||
|
||||
def ensure_claim_schema():
|
||||
"""Buat tabel riwayat klaim bila belum ada (idempoten, kedua backend)."""
|
||||
conn = connect()
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
if DB_BACKEND == 'sqlite':
|
||||
cur.execute(_CLAIM_DDL_SQLITE)
|
||||
else:
|
||||
cur.execute(_CLAIM_DDL_MYSQL)
|
||||
conn.commit()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def record_claim(run_date, claim_txid, reward, fee_amount, fee_status,
|
||||
created_at):
|
||||
"""Insert baris `claim_runs` → claim_id."""
|
||||
ensure_claim_schema()
|
||||
conn = connect()
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
cur.execute(_translate(
|
||||
'INSERT INTO claim_runs '
|
||||
'(run_date, claim_txid, reward, fee_amount, fee_status, '
|
||||
' claimed_at, fee_sent_at, created_at) '
|
||||
'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)'),
|
||||
(run_date, claim_txid, reward, fee_amount, fee_status, created_at,
|
||||
None, created_at))
|
||||
conn.commit()
|
||||
return cur.lastrowid
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def update_claim_fee(claim_id, fee_status, fee_txid=None):
|
||||
"""Perbarui status fee satu klaim (V33): pending → sent|failed|skipped."""
|
||||
from datetime import datetime
|
||||
conn = connect()
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
if fee_status == 'sent':
|
||||
now = datetime.now().isoformat(timespec='seconds')
|
||||
cur.execute(_translate(
|
||||
'UPDATE claim_runs SET fee_status = %s, fee_txid = %s, '
|
||||
'fee_sent_at = %s WHERE claim_id = %s'),
|
||||
(fee_status, fee_txid, now, claim_id))
|
||||
else:
|
||||
cur.execute(_translate(
|
||||
'UPDATE claim_runs SET fee_status = %s, fee_txid = %s '
|
||||
'WHERE claim_id = %s'),
|
||||
(fee_status, fee_txid, claim_id))
|
||||
conn.commit()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def pending_claim_fee():
|
||||
"""Klaim terbaru dengan fee belum terkirim (fee_amount > 0) → baris | None.
|
||||
|
||||
Source of truth resume: fee `pending`/`failed` diulang tiap siklus dan
|
||||
dilanjutkan saat restart (V34).
|
||||
"""
|
||||
ensure_claim_schema()
|
||||
return queryone(
|
||||
'SELECT claim_id, run_date, claim_txid, reward, fee_amount, '
|
||||
' fee_status, fee_txid, claimed_at, fee_sent_at, created_at '
|
||||
'FROM claim_runs '
|
||||
'WHERE fee_status IN (%s, %s) AND fee_amount > 0 '
|
||||
'ORDER BY claim_id DESC LIMIT 1',
|
||||
('pending', 'failed'))
|
||||
Reference in new issue
Block a user