proitlab
c262b4677c
fix(B27): gate warn notify on real Telegram delivery (V66a) + scan config.env bind
...
VOTE ULANG SEGERA never reached community channel though dashboard badge showed:
- scan service lacked NFS config.env bind -> empty TELEGRAM_* -> send_text silent no-op
- _notify_warn still record_notify'd -> fake dedup rows blocked future sends
send_text/notify_warn now return delivery bool; record_notify only on True.
scan service mounts config.env:/app/.env:ro.
2026-09-02 12:39:24 +07:00
proitlab
1e93437a90
feat: VOTE ULANG SEGERA Telegram notification + emoticon on all notifications
...
- telegram.py: emoticons on all existing notif (🚀 ✅ ⚠️ 🔴 💰 🔍 ) + new notify_warn for expiring voters
- db.py: voter_notify table (owner/urgency/notified_at) for state-change dedup
- get_voters.py: _notify_warn() after persist() — urgency escalation ⚠️ /🔴 /🚨 by days remaining
- Dockerfile.scan: add telegram.py to COPY
- test_get_voters.py: 15 new V66 assertions (schema, record, cleanup, integration, escalation)
- test_distribute.py: updated notification format assertions
- SPEC.md: V66 + B26
2026-08-27 16:12:53 +07:00
proitlab
56ff265d11
stempel scan UTC-naive utk scanned_at/first_seen_at (V62/B24) — pemilih BARU ⊖ tertahan 7 jam
2026-08-17 00:55:53 +07:00
proitlab
0e83137b5a
dashboard: hapus TOTAL VEX + perbaiki wrap mobile (V48) ; catatan stats-note dipendekkan (buang perbandingan vexascan) ; formula last_vote 52-pekan (V13/B12) ; image web rebuild + push
2026-08-07 22:04:25 +07:00
proitlab
81ec6bdfe7
V40-V43: band umur vote (BARU/VALID/KADALUARSA, scan simpan semua umur) → REVOTE = VALID langsung (V42) → tag mint 1-hari + badge VOTE ULANG SEGERA (V43) ; klaim recovery jendela lewat + parse respons dict rows (B7/B8) ; backend mysql test_mariadb ; oracle test_dashboard/distribute/get_voters/mariadb ; images web/scan/dist/claim rebuild + push
2026-08-07 12:07:34 +07:00
proitlab
fdb5d0de15
T17: backend penyimpanan bersama db.py (sqlite | mysql via PyMySQL)
...
- db.py: abstraksi connect/query/queryone/replace_snapshot; %s → ? utk sqlite;
replace snapshot mysql = CREATE IF NOT EXISTS + DELETE + INSERT (MVCC)
- config/.env.example: VEX_DB_BACKEND (default sqlite) + VEX_DB_HOST/PORT/USER/PASS/NAME
- get_voters.persist → db.replace_snapshot; dashboard baca via db.query
- LIKE pakai ESCAPE '!' (backslash memutus literal string MySQL, B2);
db.query selalu kembalikan list (PyMySQL tuple vs sqlite list, B3)
- docker-compose.yml: kontainer uji mariadb:11 (databisnisid-mariadb, 127.0.0.1:3306)
- test_mariadb.py: suite integrasi opt-in (skip bila bukan mysql)
- SPEC.md §V17/T17/B2/B3; AGENTS.md runbook
2026-08-05 12:41:17 +07:00
proitlab
eb4f941b37
T13: klamp last_vote heuristik ke waktu scan (⊥ di masa depan)
...
Unstake tanpa revote membuat rasio bobot/stake membesar → estimasi
last_vote melewati now. normalize() kini mengklamp ke now; voters.db
dikembalikan (27 baris, MAX(last_vote) ≤ MAX(scanned_at)). Oracle lolos.
2026-08-05 10:21:45 +07:00
proitlab
41990af9af
T15: buang voter basi di scan + hapus bobot suara & UI basi di web
...
get_voters.py kini menyimpan hanya pemilih segar (last_vote tak
diketahui atau > VEX_STALE_DAYS dibuang di normalize, V13). Web
menampilkan kolom RANK/AKUN/STAKE/VOTE TERAKHIR, tanpa BOBOT SUARA,
stat VOTE BASI, penanda/ filter ?stale=1 (V15). voters.db dipangkas
336 → 42. Oracle diperbarui dan lolos.
2026-08-04 17:18:50 +07:00
proitlab
b0b3ba8ab3
T14: penanda vote basi (last_vote dari rasio bobot/stake, filter ?stale=1, VEX_STALE_DAYS)
2026-08-04 17:05:16 +07:00
proitlab
c5e30a4785
T1-T5: Python voter fetcher (§V1-9)
...
- get_voters.py: scan Vexanium voters table (vexcore), retry/paginate,
filter databisnisid single-vote + stake ≥1000 VEX, store weight verbatim,
daily-replace SQLite snapshot (owner PK, scanned_at)
- V8/V9 + test_get_voters.py (oracle, §V1-9)
- SPEC.md, AGENTS.md, requirements.txt
2026-08-04 15:56:19 +07:00