From 30a17f7d99aefc322842ba03705d708b1170382e Mon Sep 17 00:00:00 2001 From: Caffeine Date: Mon, 14 Sep 2026 02:09:15 +0300 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=D1=82=D1=80=D0=B5=D1=82=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=B8=D1=81=D1=85=D0=BE=D0=B4=20=D0=B2=20UI=20?= =?UTF-8?q?=E2=80=94=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=82=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B8=D1=87=D1=8C=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit onBetClosed показывал бинарно: всё, что не payout_done, — «ПРОИГРАЛ (house_won)» красным. Ничья (деньги вернулись игроку) выглядела как проигрыш. Теперь три исхода + нейтральная заглушка: - payout_done → ВЫИГРАЛ (ok) - house_won → ПРОИГРАЛ (err) - refunded → ВОЗВРАТ (ничья, ставка возвращена) (info) - иное → РАССЧИТАНА () (info), не валится в проигрыш API.md: пример bet_closed со status 3 + описание refunded. Проверено: node --check инлайн-JS OK, образ smart/test-front:5, раздача наружу. --- API.md | 6 +++++- index.html | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/API.md b/API.md index 4bc97ac..1c36b20 100644 --- a/API.md +++ b/API.md @@ -128,8 +128,12 @@ await fetch(`${BASE}/bet`, { {"type":"bet_closed","id":"2","bettor":"8KbUFCHV…", "exitPrice":10104000000,"status":1,"statusName":"payout_done"} ``` +```json +{"type":"bet_closed","id":"3","bettor":"8KbUFCHV…", + "exitPrice":10105000000,"status":3,"statusName":"refunded"} +``` * `exitPrice` — цена выхода, тот же масштаб 1e8. -* `statusName`: `payout_done` (игрок выиграл) | `house_won` (выиграл дом) | `open` (ещё открыта). +* `statusName`: `payout_done` (игрок выиграл, выплата с множителем) | `house_won` (выиграл дом, ставка остаётся в ваулте) | `refunded` (ничья при `exitPrice == entryPrice`: залог возвращён игроку ровно суммой ставки, без множителя) | `open` (ещё открыта). Исход считает контракт: `UP` выигрывает при `exitPrice > entryPrice`, `DOWN` — при `<`. diff --git a/index.html b/index.html index 5e0bb0a..a18d5aa 100644 --- a/index.html +++ b/index.html @@ -271,11 +271,21 @@ function onBetOpen(m){ /** Событие WS: ставка рассчитана — сервер закрыл её сам. */ function onBetClosed(m){ setLiveBet('liveBetId', String(m.id)); - const won = m.statusName === 'payout_done'; - setLiveBet('liveBetState', won ? 'ВЫИГРАЛ (payout_done)' : 'ПРОИГРАЛ (house_won)'); setLiveBet('liveBetExit', String(m.exitPrice)); - const text = 'bet_closed: #'+m.id+', выход='+m.exitPrice+', '+(won?'ВЫИГРАЛ':'ПРОИГРАЛ'); - if(won) log.ok(text); else log.err(text); + const sn = m.statusName; + if(sn === 'payout_done'){ + setLiveBet('liveBetState', 'ВЫИГРАЛ (payout_done)'); + log.ok('bet_closed: #'+m.id+', выход='+m.exitPrice+', ВЫИГРАЛ'); + } else if(sn === 'house_won'){ + setLiveBet('liveBetState', 'ПРОИГРАЛ (house_won)'); + log.err('bet_closed: #'+m.id+', выход='+m.exitPrice+', ПРОИГРАЛ'); + } else if(sn === 'refunded'){ + setLiveBet('liveBetState', 'ВОЗВРАТ (ничья, ставка возвращена)'); + log.info('bet_closed: #'+m.id+', выход='+m.exitPrice+', НИЧЬЯ — залог возвращён'); + } else { + setLiveBet('liveBetState', 'РАССЧИТАНА ('+(sn||'?')+')'); + log.info('bet_closed: #'+m.id+', выход='+m.exitPrice+', статус='+(sn||'?')); + } } function copyLog(){ const t=document.getElementById('log').innerText; navigator.clipboard?.writeText(t).then(()=>log.ok('лог скопирован')).catch(()=>{}); }