RPU v2, promo/bank система, админка, оптимизации
— RPU v2: бюджет удачи, потолок (ceiling), комбек после проигрышей, hot/cold анализ, интеграция с promo-фазами — Bank API: mock-банк для карты (депозит/вывод с балансом 1000₽) — Promo-сервис: автогенерация промокодов каждый час, типы (card_to_site, luck_boost, ceiling_boost, free_case, reset_streak) — Promo-фазы: LUCKY/NEUTRAL/UNLUCKY, переключение каждые 1-6ч — Admin: история транзакций (user_history), управление промокодами, управление promo-фазами, API фильтров/коллекций, RPU info — Database: WAL mode, новые поля RPU v2, TransactionLog, карточный баланс, статистики (streaks, ceiling, budget) — Frontend: /deposit, /promo/activate, /withdraw, /card-balance, /online-count, /rpu-info, lifespan вместо startup event — UI: user_history.html, улучшения профиля, кейсов, навигации — Cases: обновление cases.json (1892 строки новых данных) — Achievements: кэш коллекций, оптимизация is_custom проверок — Sounds: дополнительные звуковые эффекты — Upgrade: интеграция с RPU (множители, streaks) — .gitignore: исключены .db, .bak, __pycache__
This commit is contained in:
+29
-10
@@ -519,9 +519,10 @@
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
userBalance = data.balance;
|
||||
document.querySelectorAll('.user-balance').forEach(el => {
|
||||
el.textContent = `${Math.floor(data.balance)} ₽`;
|
||||
});
|
||||
const el = document.getElementById('siteBalanceDisplay');
|
||||
if (el) {
|
||||
el.innerHTML = Math.floor(data.balance).toLocaleString('ru') + ' ₽ <span style="font-size:0.6rem;opacity:0.5;margin-left:0.25rem">▼ депозит</span>';
|
||||
}
|
||||
updatePriceDisplay();
|
||||
}
|
||||
} catch (e) {
|
||||
@@ -1091,7 +1092,7 @@
|
||||
const inventoryIds = [];
|
||||
for (const trashItem of trashItems) {
|
||||
const invItem = items.find(i => i.item_id === trashItem.id &&
|
||||
Math.abs(i.float - trashItem.float) < 0.001);
|
||||
Math.abs(i.float - trashItem.float) < 0.01);
|
||||
if (invItem) {
|
||||
inventoryIds.push(invItem.id);
|
||||
}
|
||||
@@ -1101,10 +1102,28 @@
|
||||
const formData = new FormData();
|
||||
formData.append('inventory_ids', JSON.stringify(inventoryIds));
|
||||
|
||||
await fetch('/web/api/inventory/sell/bulk', {
|
||||
const res = await fetch('/web/api/inventory/sell/bulk', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
if (!res.ok) {
|
||||
await new Promise(r => setTimeout(r, 500));
|
||||
const retry = await fetch('/web/api/inventory/items');
|
||||
const items2 = await retry.json();
|
||||
const retryIds = [];
|
||||
for (const trashItem of trashItems) {
|
||||
const invItem = items2.find(i => i.item_id === trashItem.id &&
|
||||
Math.abs(i.float - trashItem.float) < 0.01);
|
||||
if (invItem && !inventoryIds.includes(invItem.id)) {
|
||||
retryIds.push(invItem.id);
|
||||
}
|
||||
}
|
||||
if (retryIds.length > 0) {
|
||||
const fd2 = new FormData();
|
||||
fd2.append('inventory_ids', JSON.stringify(retryIds));
|
||||
await fetch('/web/api/inventory/sell/bulk', { method: 'POST', body: fd2 });
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Ошибка продажи шлака:', e);
|
||||
@@ -1702,7 +1721,7 @@
|
||||
</div>
|
||||
<div class="result-footer-enhanced">
|
||||
<span class="result-price-enhanced">${(item.price || 100).toLocaleString()} ₽</span>
|
||||
<button class="btn-sell-result" onclick="sellResultItem(${item.id})">Продать</button>
|
||||
<button class="btn-sell-result" onclick="sellResultItem(${item.id}, ${item.float})">Продать</button>
|
||||
</div>
|
||||
</div>
|
||||
${item.count > 1 ? `<span class="result-count-badge">x${item.count}</span>` : ''}
|
||||
@@ -1724,13 +1743,14 @@
|
||||
});
|
||||
}
|
||||
|
||||
async function sellResultItem(itemId) {
|
||||
async function sellResultItem(itemId, itemFloat) {
|
||||
Notify.confirm('Продать этот предмет?', 'Продажа', async function(confirmed) {
|
||||
if (!confirmed) return;
|
||||
try {
|
||||
const response = await fetch('/web/api/inventory/items');
|
||||
const items = await response.json();
|
||||
const inventoryItem = items.find(i => i.item_id === itemId);
|
||||
const inventoryItem = items.find(i => i.item_id === itemId &&
|
||||
Math.abs(i.float - (itemFloat || 0)) < 0.001);
|
||||
|
||||
if (!inventoryItem) {
|
||||
Notify.error('Предмет не найден в инвентаре');
|
||||
@@ -1865,8 +1885,7 @@
|
||||
if (data && data.achievements_unlocked && Array.isArray(data.achievements_unlocked) && data.achievements_unlocked.length > 0) {
|
||||
data.achievements_unlocked.forEach(ach => {
|
||||
const title = ach.title || ach.name || 'Достижение';
|
||||
const reward = ach.reward || '';
|
||||
showAchievementPopup(title, reward);
|
||||
showAchievementPopup(title);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user