From 3fe8a47e04919eba9fb8e6eedf7aa26db5268349 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 5 Jul 2026 16:15:12 +0000 Subject: [PATCH] Dildo items, admin fixes, UI refactor - Add 85 custom Dildo items (knife/skin pattern names, various rarities) - Create Dildo Case config (hidden, items obtained via contracts) - Fix admin user_detail.html nested script tag (Notify fallback removed) - Fix admin cases.html embedded script tag - Add notifications.js to admin base.html - Fix admin users.html: use counts instead of relationship lists - Replace old money format with |money filter across all templates - Standardize nav partial (_nav.html) with active_page highlighting - Fix RARITY_COLORS rename in activity sidebar - Fix toast animation (forwards) and remove duplicate CSS - Replace showToast() with Notify.* in upgrade page - Add cs2_simulator.db and *.log to .gitignore - Create remote-deploy.sh with DB exclusion --- .gitignore | 2 + admin.py | 13 +- cases.json | 8 + custom_items.json | 2486 +++++++++++++++++++++++++++++- frontend.py | 81 +- remote-deploy.sh | 16 + static/css/style.css | 45 +- templates/_activity_sidebar.html | 45 +- templates/_nav.html | 25 + templates/achievements.html | 22 +- templates/activity.html | 35 +- templates/admin/base.html | 1 + templates/admin/cases.html | 2 - templates/admin/dashboard.html | 4 +- templates/admin/user_detail.html | 5 +- templates/admin/users.html | 10 +- templates/case_detail.html | 38 +- templates/cases.html | 34 +- templates/contracts.html | 28 +- templates/crash.html | 20 +- templates/index.html | 15 +- templates/login.html | 10 +- templates/profile.html | 56 +- templates/register.html | 10 +- templates/upgrade.html | 48 +- 25 files changed, 2669 insertions(+), 390 deletions(-) create mode 100755 remote-deploy.sh create mode 100644 templates/_nav.html diff --git a/.gitignore b/.gitignore index c3b31bf..04ebc30 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ __pycache__/ *.pyc *.pyo .DS_Store +cs2_simulator.db +*.log diff --git a/admin.py b/admin.py index 4a0af7e..a9972f8 100644 --- a/admin.py +++ b/admin.py @@ -15,6 +15,14 @@ from rpu import get_user_rpu, calculate_rpu_level, get_rpu_description admin_router = APIRouter(prefix="/admin", tags=["admin"]) templates = Jinja2Templates(directory="templates") +def money_filter(value): + try: + return "{:,.0f}".format(float(value)).replace(",", " ") + except (ValueError, TypeError): + return "0" + +templates.env.filters["money"] = money_filter + # Загрузка конфигов CASES_FILE = Path("cases.json") MAINPAGE_FILE = Path("mainpage.json") @@ -137,8 +145,9 @@ async def admin_users( "balance": u.balance, "is_admin": u.is_admin, "created_at": u.created_at, - "inventory_items": u.inventory_items, - "case_openings": u.case_openings, + "case_openings": db.query(CaseOpening).filter(CaseOpening.user_id == u.id).count(), + "contracts": db.query(Contract).filter(Contract.user_id == u.id).count(), + "inventory_count": db.query(InventoryItem).filter(InventoryItem.user_id == u.id).count(), "rpu_level": round(calculate_rpu_level(rpu)) }) diff --git a/cases.json b/cases.json index faa04d2..061a252 100644 --- a/cases.json +++ b/cases.json @@ -1448,5 +1448,13 @@ ], "image_url": "", "description": "" + }, + { + "name": "dildo_case", + "display_name": "Dildo Case", + "price_open": 149.0, + "items": [], + "image_url": "", + "description": "Самые сомнительные предметы коллекции Dildo" } ] \ No newline at end of file diff --git a/custom_items.json b/custom_items.json index 0f3adcf..5f06fe2 100644 --- a/custom_items.json +++ b/custom_items.json @@ -14,28 +14,478 @@ "mid_float_used": 0.01, "doppler_phase": null, "price_usd": 1000.0, - "price_rub": 100000.0, + "price_rub": 100000, "price_source": "custom", "image_url": "", "crates_names": [ - "create: dildo_case" + "dildo_case" ], "float_range": [ 0.0, 0.07 ], "can_be_assigned_from": [ - "create: dildo_case" + "dildo_case" ], "is_craftable": true }, { - "market_hash_name": "★ Dildo | Crimson Web (Minimal Wear)", + "market_hash_name": "★ Dildo | Doppler Ruby (Factory New)", + "weapon": "Dildo", + "pattern": "Doppler Ruby", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 1500.0, + "price_rub": 150000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Doppler Sapphire (Factory New)", + "weapon": "Dildo", + "pattern": "Doppler Sapphire", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 1800.0, + "price_rub": 180000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Doppler Black Pearl (Factory New)", + "weapon": "Dildo", + "pattern": "Doppler Black Pearl", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 1300.0, + "price_rub": 130000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Gamma Doppler Emerald (Factory New)", + "weapon": "Dildo", + "pattern": "Gamma Doppler Emerald", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 1400.0, + "price_rub": 140000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Gamma Doppler Phase 1 (Factory New)", + "weapon": "Dildo", + "pattern": "Gamma Doppler Phase 1", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 600.0, + "price_rub": 60000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Gamma Doppler Phase 2 (Factory New)", + "weapon": "Dildo", + "pattern": "Gamma Doppler Phase 2", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 950.0, + "price_rub": 95000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Gamma Doppler Phase 3 (Factory New)", + "weapon": "Dildo", + "pattern": "Gamma Doppler Phase 3", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 550.0, + "price_rub": 55000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Gamma Doppler Phase 4 (Factory New)", + "weapon": "Dildo", + "pattern": "Gamma Doppler Phase 4", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 850.0, + "price_rub": 85000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Marble Fade (Factory New)", + "weapon": "Dildo", + "pattern": "Marble Fade", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 900.0, + "price_rub": 90000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Tiger Tooth (Factory New)", + "weapon": "Dildo", + "pattern": "Tiger Tooth", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 800.0, + "price_rub": 80000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Lore (Factory New)", + "weapon": "Dildo", + "pattern": "Lore", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 750.0, + "price_rub": 75000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Autotronic (Factory New)", + "weapon": "Dildo", + "pattern": "Autotronic", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 650.0, + "price_rub": 65000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Slaughter (Factory New)", + "weapon": "Dildo", + "pattern": "Slaughter", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 700.0, + "price_rub": 70000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Crimson Web (Factory New)", "weapon": "Dildo", "pattern": "Crimson Web", "rarity": "Covert", "collection": "Dildo Collection", "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 850.0, + "price_rub": 85000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Ultraviolet (Factory New)", + "weapon": "Dildo", + "pattern": "Ultraviolet", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 400.0, + "price_rub": 40000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Night Stripe (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Night Stripe", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", "wear": "Minimal Wear", "wear_range": [ 0.07, @@ -43,26 +493,56 @@ ], "mid_float_used": 0.1, "doppler_phase": null, - "price_usd": 800.0, - "price_rub": 80000.0, + "price_usd": 200.0, + "price_rub": 20000, "price_source": "custom", "image_url": "", "crates_names": [ - "create: dildo_case" + "dildo_case" ], "float_range": [ 0.07, 0.15 ], "can_be_assigned_from": [ - "create: dildo_case" + "dildo_case" ], "is_craftable": true }, { - "market_hash_name": "Dildo | Blue Gem (Factory New)", + "market_hash_name": "★ Dildo | Freehand (Factory New)", "weapon": "Dildo", - "pattern": "Blue Gem", + "pattern": "Freehand", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 350.0, + "price_rub": 35000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Case Hardened (Factory New)", + "weapon": "Dildo", + "pattern": "Case Hardened", "rarity": "Classified", "collection": "Dildo Collection", "type": "Normal", @@ -74,18 +554,1998 @@ "mid_float_used": 0.01, "doppler_phase": null, "price_usd": 500.0, - "price_rub": 50000.0, + "price_rub": 50000, "price_source": "custom", "image_url": "", "crates_names": [ - "create: dildo_case" + "dildo_case" ], "float_range": [ 0.0, 0.07 ], "can_be_assigned_from": [ - "create: dildo_case" + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Damascus Steel (Factory New)", + "weapon": "Dildo", + "pattern": "Damascus Steel", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 250.0, + "price_rub": 25000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Blue Steel (Factory New)", + "weapon": "Dildo", + "pattern": "Blue Steel", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 220.0, + "price_rub": 22000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Bright Water (Field-Tested)", + "weapon": "Dildo", + "pattern": "Bright Water", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 150.0, + "price_rub": 15000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Rust Coat (Well-Worn)", + "weapon": "Dildo", + "pattern": "Rust Coat", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Well-Worn", + "wear_range": [ + 0.38, + 0.45 + ], + "mid_float_used": 0.42, + "doppler_phase": null, + "price_usd": 50.0, + "price_rub": 5000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.38, + 0.45 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Stained (Field-Tested)", + "weapon": "Dildo", + "pattern": "Stained", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 120.0, + "price_rub": 12000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Vanilla (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Vanilla", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 180.0, + "price_rub": 18000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Boreal Forest (Well-Worn)", + "weapon": "Dildo", + "pattern": "Boreal Forest", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Well-Worn", + "wear_range": [ + 0.38, + 0.45 + ], + "mid_float_used": 0.42, + "doppler_phase": null, + "price_usd": 30.0, + "price_rub": 3000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.38, + 0.45 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Forest DDPAT (Battle-Scarred)", + "weapon": "Dildo", + "pattern": "Forest DDPAT", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Battle-Scarred", + "wear_range": [ + 0.45, + 1.0 + ], + "mid_float_used": 0.55, + "doppler_phase": null, + "price_usd": 25.0, + "price_rub": 2500, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.45, + 1.0 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Urban Masked (Field-Tested)", + "weapon": "Dildo", + "pattern": "Urban Masked", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 20.0, + "price_rub": 2000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Scorched (Well-Worn)", + "weapon": "Dildo", + "pattern": "Scorched", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Well-Worn", + "wear_range": [ + 0.38, + 0.45 + ], + "mid_float_used": 0.42, + "doppler_phase": null, + "price_usd": 30.0, + "price_rub": 3000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.38, + 0.45 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "★ Dildo | Safari Mesh (Battle-Scarred)", + "weapon": "Dildo", + "pattern": "Safari Mesh", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Battle-Scarred", + "wear_range": [ + 0.45, + 1.0 + ], + "mid_float_used": 0.55, + "doppler_phase": null, + "price_usd": 15.0, + "price_rub": 1500, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.45, + 1.0 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Whiteout (Field-Tested)", + "weapon": "Dildo", + "pattern": "Whiteout", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 450.0, + "price_rub": 45000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Flux (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Flux", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 300.0, + "price_rub": 30000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Heat (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Heat", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 180.0, + "price_rub": 18000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Radiation Hazard (Field-Tested)", + "weapon": "Dildo", + "pattern": "Radiation Hazard", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 150.0, + "price_rub": 15000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Hot Rod (Factory New)", + "weapon": "Dildo", + "pattern": "Hot Rod", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 550.0, + "price_rub": 55000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Asiimov (Field-Tested)", + "weapon": "Dildo", + "pattern": "Asiimov", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 600.0, + "price_rub": 60000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Neptune (Factory New)", + "weapon": "Dildo", + "pattern": "Neptune", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 500.0, + "price_rub": 50000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Printstream (Factory New)", + "weapon": "Dildo", + "pattern": "Printstream", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 650.0, + "price_rub": 65000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Kill Confirmed (Field-Tested)", + "weapon": "Dildo", + "pattern": "Kill Confirmed", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 580.0, + "price_rub": 58000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Bloodsport (Factory New)", + "weapon": "Dildo", + "pattern": "Bloodsport", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 350.0, + "price_rub": 35000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Desolate Space (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Desolate Space", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 280.0, + "price_rub": 28000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Neon Revolution (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Neon Revolution", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 250.0, + "price_rub": 25000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Imperial (Field-Tested)", + "weapon": "Dildo", + "pattern": "Imperial", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 180.0, + "price_rub": 18000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Emperor (Factory New)", + "weapon": "Dildo", + "pattern": "Emperor", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 320.0, + "price_rub": 32000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Medusa (Field-Tested)", + "weapon": "Dildo", + "pattern": "Medusa", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 800.0, + "price_rub": 80000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Poseidon (Field-Tested)", + "weapon": "Dildo", + "pattern": "Poseidon", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 700.0, + "price_rub": 70000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Pandora's Box (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Pandora's Box", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 750.0, + "price_rub": 75000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Spearmint (Factory New)", + "weapon": "Dildo", + "pattern": "Spearmint", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 650.0, + "price_rub": 65000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Welcome to the Jungle (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Welcome to the Jungle", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 900.0, + "price_rub": 90000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Wildfire (Field-Tested)", + "weapon": "Dildo", + "pattern": "Wildfire", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 300.0, + "price_rub": 30000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Hot Copper (Battle-Scarred)", + "weapon": "Dildo", + "pattern": "Hot Copper", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Battle-Scarred", + "wear_range": [ + 0.45, + 1.0 + ], + "mid_float_used": 0.55, + "doppler_phase": null, + "price_usd": 120.0, + "price_rub": 12000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.45, + 1.0 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Night Heist (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Night Heist", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 100.0, + "price_rub": 10000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Lightning Strike (Factory New)", + "weapon": "Dildo", + "pattern": "Lightning Strike", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 480.0, + "price_rub": 48000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Icarus Fell (Factory New)", + "weapon": "Dildo", + "pattern": "Icarus Fell", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 520.0, + "price_rub": 52000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Dragon Tattoo (Factory New)", + "weapon": "Dildo", + "pattern": "Dragon Tattoo", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 100.0, + "price_rub": 10000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Blue Filigree (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Blue Filigree", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 120.0, + "price_rub": 12000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Orange DDPAT (Field-Tested)", + "weapon": "Dildo", + "pattern": "Orange DDPAT", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 40.0, + "price_rub": 4000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Sand Dune (Battle-Scarred)", + "weapon": "Dildo", + "pattern": "Sand Dune", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Battle-Scarred", + "wear_range": [ + 0.45, + 1.0 + ], + "mid_float_used": 0.55, + "doppler_phase": null, + "price_usd": 15.0, + "price_rub": 1500, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.45, + 1.0 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Army Sheen (Field-Tested)", + "weapon": "Dildo", + "pattern": "Army Sheen", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 20.0, + "price_rub": 2000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Contractor (Battle-Scarred)", + "weapon": "Dildo", + "pattern": "Contractor", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Battle-Scarred", + "wear_range": [ + 0.45, + 1.0 + ], + "mid_float_used": 0.55, + "doppler_phase": null, + "price_usd": 18.0, + "price_rub": 1800, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.45, + 1.0 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Cotton Candy (Factory New)", + "weapon": "Dildo", + "pattern": "Cotton Candy", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 220.0, + "price_rub": 22000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Rainbow (Factory New)", + "weapon": "Dildo", + "pattern": "Rainbow", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 250.0, + "price_rub": 25000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Galaxy (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Galaxy", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 350.0, + "price_rub": 35000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Unicorn (Factory New)", + "weapon": "Dildo", + "pattern": "Unicorn", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 450.0, + "price_rub": 45000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Carbon Fiber (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Carbon Fiber", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 200.0, + "price_rub": 20000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Gold Plated (Factory New)", + "weapon": "Dildo", + "pattern": "Gold Plated", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 400.0, + "price_rub": 40000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Pool Party (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Pool Party", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 150.0, + "price_rub": 15000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Tie Dye (Field-Tested)", + "weapon": "Dildo", + "pattern": "Tie Dye", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 100.0, + "price_rub": 10000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Neon Tiger (Factory New)", + "weapon": "Dildo", + "pattern": "Neon Tiger", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 280.0, + "price_rub": 28000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Lava (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Lava", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 180.0, + "price_rub": 18000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Glacier (Factory New)", + "weapon": "Dildo", + "pattern": "Glacier", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 500.0, + "price_rub": 50000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Cherry Blossom (Factory New)", + "weapon": "Dildo", + "pattern": "Cherry Blossom", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 160.0, + "price_rub": 16000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Electric Haze (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Electric Haze", + "rarity": "Classified", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 300.0, + "price_rub": 30000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Mint Condition (Factory New)", + "weapon": "Dildo", + "pattern": "Mint Condition", + "rarity": "Mil-Spec", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 50.0, + "price_rub": 5000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Candy Cane (Factory New)", + "weapon": "Dildo", + "pattern": "Candy Cane", + "rarity": "Mil-Spec", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 50.0, + "price_rub": 5000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Pineapple (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Pineapple", + "rarity": "Mil-Spec", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 50.0, + "price_rub": 5000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Toothpaste (Field-Tested)", + "weapon": "Dildo", + "pattern": "Toothpaste", + "rarity": "Mil-Spec", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 35.0, + "price_rub": 3500, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Pumpkin (Field-Tested)", + "weapon": "Dildo", + "pattern": "Pumpkin", + "rarity": "Mil-Spec", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 60.0, + "price_rub": 6000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Zebra (Battle-Scarred)", + "weapon": "Dildo", + "pattern": "Zebra", + "rarity": "Industrial", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Battle-Scarred", + "wear_range": [ + 0.45, + 1.0 + ], + "mid_float_used": 0.55, + "doppler_phase": null, + "price_usd": 25.0, + "price_rub": 2500, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.45, + 1.0 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Bread (Field-Tested)", + "weapon": "Dildo", + "pattern": "Bread", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Field-Tested", + "wear_range": [ + 0.15, + 0.38 + ], + "mid_float_used": 0.25, + "doppler_phase": null, + "price_usd": 100.0, + "price_rub": 10000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.15, + 0.38 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Watermelon (Minimal Wear)", + "weapon": "Dildo", + "pattern": "Watermelon", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Minimal Wear", + "wear_range": [ + 0.07, + 0.15 + ], + "mid_float_used": 0.1, + "doppler_phase": null, + "price_usd": 120.0, + "price_rub": 12000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.07, + 0.15 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Doodle Bug (Factory New)", + "weapon": "Dildo", + "pattern": "Doodle Bug", + "rarity": "Mil-Spec", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 40.0, + "price_rub": 4000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Spray Paint (Battle-Scarred)", + "weapon": "Dildo", + "pattern": "Spray Paint", + "rarity": "Mil-Spec", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Battle-Scarred", + "wear_range": [ + 0.45, + 1.0 + ], + "mid_float_used": 0.55, + "doppler_phase": null, + "price_usd": 40.0, + "price_rub": 4000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.45, + 1.0 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Melted Ice Cream (Battle-Scarred)", + "weapon": "Dildo", + "pattern": "Melted Ice Cream", + "rarity": "Restricted", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Battle-Scarred", + "wear_range": [ + 0.45, + 1.0 + ], + "mid_float_used": 0.55, + "doppler_phase": null, + "price_usd": 80.0, + "price_rub": 8000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.45, + 1.0 + ], + "can_be_assigned_from": [ + "dildo_case" + ], + "is_craftable": true + }, + { + "market_hash_name": "Dildo | Holographic (Factory New)", + "weapon": "Dildo", + "pattern": "Holographic", + "rarity": "Covert", + "collection": "Dildo Collection", + "type": "Normal", + "wear": "Factory New", + "wear_range": [ + 0.0, + 0.07 + ], + "mid_float_used": 0.01, + "doppler_phase": null, + "price_usd": 300.0, + "price_rub": 30000, + "price_source": "custom", + "image_url": "", + "crates_names": [ + "dildo_case" + ], + "float_range": [ + 0.0, + 0.07 + ], + "can_be_assigned_from": [ + "dildo_case" ], "is_craftable": true } diff --git a/frontend.py b/frontend.py index dda3ede..6fd32a4 100644 --- a/frontend.py +++ b/frontend.py @@ -58,6 +58,14 @@ app.include_router(admin_router) app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="templates") +def money_filter(value): + try: + return "{:,.0f}".format(float(value)).replace(",", " ") + except (ValueError, TypeError): + return "0" + +templates.env.filters["money"] = money_filter + # Создаем отдельный роутер для API оригинального симулятора from backend import app as api_app @@ -301,7 +309,8 @@ async def index(request: Request, user: Optional[User] = Depends(get_current_use return templates.TemplateResponse("index.html", { "request": request, - "user": None + "user": None, + "active_page": "home" }) @app.get("/login", response_class=HTMLResponse) @@ -312,7 +321,8 @@ async def login_page(request: Request, user: Optional[User] = Depends(get_curren return templates.TemplateResponse("login.html", { "request": request, - "user": None + "user": None, + "active_page": "login" }) @app.get("/register", response_class=HTMLResponse) @@ -323,7 +333,8 @@ async def register_page(request: Request, user: Optional[User] = Depends(get_cur return templates.TemplateResponse("register.html", { "request": request, - "user": None + "user": None, + "active_page": "register" }) @app.get("/profile", response_class=HTMLResponse) @@ -403,7 +414,8 @@ async def profile_page( "types": sorted(types), "rarity_order": RARITY_ORDER, "is_public": False, - "profile_user": user + "profile_user": user, + "active_page": "profile" }) # ═══════════════════════════════════════════════════════════════════════════════ @@ -436,9 +448,42 @@ async def public_profile_page( inventory_items = db.query(InventoryItem).filter( InventoryItem.user_id == profile_user.id - ).all() + ).order_by(desc(InventoryItem.obtained_at)).all() rarity_order = {k: v for k, v in RARITY_ORDER.items()} + + rarities = set() + types = set() + enriched_items = [] + for item in inventory_items: + item_data = None + for idx, it in enumerate(ALL_ITEMS): + if it.get("_id", idx) == item.item_id: + item_data = it + break + if not item_data: + item_data = get_item(item.item_id) + image_url = "" + price_rub = 100 + if item_data: + image_url = item_data.get("image_url", "") + price_rub = item_data.get("price_rub", 100) + enriched_items.append({ + "id": item.id, + "item_id": item.item_id, + "name": item.market_hash_name, + "rarity": item.rarity, + "wear": item.wear, + "float": item.float_value, + "type": item.type, + "image_url": image_url, + "price_rub": price_rub + }) + if item.rarity: + rarities.add(item.rarity) + if item.type: + types.add(item.type) + valuable_items = sorted( inventory_items, key=lambda x: rarity_order.get(x.rarity, 0), @@ -455,7 +500,12 @@ async def public_profile_page( "contracts_completed": contracts_completed, "recent_openings": recent_openings, "recent_contracts": recent_contracts, - "valuable_items": valuable_items + "valuable_items": valuable_items, + "inventory_items": enriched_items, + "rarities": sorted(rarities), + "types": sorted(types), + "rarity_order": RARITY_ORDER, + "active_page": "profile" }) @@ -539,7 +589,8 @@ async def cases_page( return templates.TemplateResponse("cases.html", { "request": request, "user": user, - "sections": sections + "sections": sections, + "active_page": "cases" }) @@ -598,7 +649,8 @@ async def contracts_page( "user": user, "inventory_items": all_items + knife_items, "has_contract": has_contract or has_knife_contract, - "knife_count": len(knife_items) + "knife_count": len(knife_items), + "active_page": "contracts" }) @app.get("/inventory") @@ -1432,7 +1484,8 @@ async def case_detail_page( "items_by_rarity": items_by_rarity, "sorted_rarities": sorted_rarities, "rarities_count": rarities_count, - "case_items": case_items_json + "case_items": case_items_json, + "active_page": "cases" }) @@ -2175,7 +2228,8 @@ async def upgrade_page( "total_attempts": total_attempts, "total_success": total_success, "success_rate": round(success_rate, 1), - "recent_upgrades": recent_upgrades + "recent_upgrades": recent_upgrades, + "active_page": "upgrade" }) @app.post("/web/api/upgrade/calculate") @@ -2438,7 +2492,8 @@ async def achievements_page( "user": user, "achievements": achievements, "total": total, - "unlocked": unlocked + "unlocked": unlocked, + "active_page": "achievements" }) @@ -2479,7 +2534,8 @@ async def activity_page( "created_at": a.created_at.isoformat() } for a in activities - ] + ], + "active_page": "activity" }) @@ -2614,6 +2670,7 @@ async def crash_page( return templates.TemplateResponse("crash.html", { "request": request, "user": user, + "active_page": "crash" }) diff --git a/remote-deploy.sh b/remote-deploy.sh new file mode 100755 index 0000000..b520860 --- /dev/null +++ b/remote-deploy.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# Deploy to remote server, excluding DB and other local-only files +rsync -av \ + --exclude '.git' \ + --exclude '__pycache__' \ + --exclude '*.pyc' \ + --exclude '.gitignore' \ + --exclude 'cs2_simulator.db' \ + --exclude '*.log' \ + --exclude 'remote-deploy.sh' \ + --delete \ + /root/dodep-simulator/ \ + root@zernmc.ru:/root/dodep/ + +ssh root@zernmc.ru "cd /root/dodep && sleep 1 && pkill -f 'frontend:app' 2>/dev/null; setsid python3 -m uvicorn frontend:app --host 0.0.0.0 --port 13669 > /tmp/frontend.log 2>&1 &" +echo "Deployed and restarted." diff --git a/static/css/style.css b/static/css/style.css index 786e8c8..7fdbe23 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -3984,49 +3984,6 @@ h1, h2, h3, h4, h5, h6, .logo, .nav-link, .btn { /* Результат */ /* Toast */ -.toast-container { - position: fixed; - top: 70px; - left: 50%; - transform: translateX(-50%); - z-index: 1000; - display: flex; - flex-direction: column; - gap: 0.4rem; - pointer-events: none; -} - -.toast { - padding: 0.5rem 1rem; - border-radius: 8px; - font-size: 0.8rem; - font-weight: 600; - white-space: nowrap; - opacity: 0; - transform: translateY(-10px); - transition: all 0.3s cubic-bezier(0.2, 0.9, 0.3, 1.2); - pointer-events: auto; - background: var(--bg-card); - border: 1px solid var(--border-color); - color: var(--text-primary); - box-shadow: 0 4px 20px rgba(0,0,0,0.5); -} - -.toast.show { - opacity: 1; - transform: translateY(0); -} - -.toast.success { - border-color: #10b981; - box-shadow: 0 4px 20px rgba(16,185,129,0.3); -} - -.toast.fail { - border-color: #ef4444; - box-shadow: 0 4px 20px rgba(239,68,68,0.2); -} - .upgrade-page .result-item-display img { width: 72px; height: 60px; @@ -4515,7 +4472,7 @@ a:not(.btn):not(.nav-link):not(.logo):hover { gap: 10px; pointer-events: auto; box-shadow: 0 8px 32px rgba(0,0,0,0.5); - animation: toastSlideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1); + animation: toastSlideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards; transform-origin: top right; position: relative; overflow: hidden; diff --git a/templates/_activity_sidebar.html b/templates/_activity_sidebar.html index 620320d..9be8bdc 100644 --- a/templates/_activity_sidebar.html +++ b/templates/_activity_sidebar.html @@ -172,40 +172,37 @@ {% block scripts %}{% endblock %} diff --git a/templates/admin/cases.html b/templates/admin/cases.html index 03e80db..8f523e1 100644 --- a/templates/admin/cases.html +++ b/templates/admin/cases.html @@ -252,8 +252,6 @@ async function searchCaseItems() { document.getElementById('caseItemSearchResults').innerHTML = html; } - - // ====== BALANCE ====== function openBalanceModal() { openModal('balanceModal'); } async function updateBalance() { diff --git a/templates/admin/users.html b/templates/admin/users.html index 27e1cab..fd6e579 100644 --- a/templates/admin/users.html +++ b/templates/admin/users.html @@ -21,7 +21,7 @@ Статус Кейсов Контрактов - Достижений + Предметов @@ -34,15 +34,15 @@ {{ u.username }} - {{ "%.0f"|format(u.balance) }} ₽ + {{ u.balance|money }} ₽ {% if u.is_admin %}Админ{% endif %} {% if u.is_banned %}Забанен{% endif %} {% if not u.is_admin and not u.is_banned %}Игрок{% endif %} - {{ u.case_openings|default(0) }} - {{ u.contracts|default(0) }} - {{ u.achievements|default(0) }} + {{ u.case_openings }} + {{ u.contracts }} + {{ u.inventory_count }} ✏️ diff --git a/templates/case_detail.html b/templates/case_detail.html index d38902f..080de5a 100644 --- a/templates/case_detail.html +++ b/templates/case_detail.html @@ -214,35 +214,7 @@ - + {% include "_nav.html" %}
@@ -255,7 +227,7 @@

{{ total_items }} предметов в кейсе

- 🔑 {{ "%.0f"|format(case_price) }} ₽ за шт. + 🔑 {{ case_price|money }} ₽ за шт.
@@ -266,7 +238,7 @@
- Итого: {{ "%.0f"|format(case_price) }} ₽ + Итого: {{ case_price|money }} ₽
- - - {% else %} - Кейсы - Контракты - 🆙 Апгрейд - 📰 Лента - - Войти - Регистрация - {% endif %} - - - + {% include "_nav.html" %}
@@ -203,7 +175,7 @@ {% else %} 📦 {% endif %} - {{ "%.0f"|format(case.price) }} ₽ + {{ case.price|money }} ₽
{{ case.display_name }}
@@ -222,7 +194,7 @@
diff --git a/templates/contracts.html b/templates/contracts.html index a6c6565..e8fca5e 100644 --- a/templates/contracts.html +++ b/templates/contracts.html @@ -7,33 +7,7 @@ - + {% include "_nav.html" %} - + {% include "_nav.html" %}
diff --git a/templates/index.html b/templates/index.html index 6bfc024..985cb4f 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,20 +7,7 @@ - + {% include "_nav.html" %}
diff --git a/templates/login.html b/templates/login.html index 1512c87..3b885ac 100644 --- a/templates/login.html +++ b/templates/login.html @@ -7,15 +7,7 @@ - + {% include "_nav.html" %}
diff --git a/templates/profile.html b/templates/profile.html index a87736d..8c4ba47 100644 --- a/templates/profile.html +++ b/templates/profile.html @@ -446,43 +446,7 @@ - + {% include "_nav.html" %}
@@ -519,18 +483,17 @@
{% if not is_public %}
-
{{ "%.0f"|format(balance) }} ₽
+
{{ balance|money }} ₽
Баланс
{% endif %}
- {% if not is_public %}
🎒 Инвентарь — {{ inventory_items|length }} предметов
- {% if inventory_items %} + {% if not is_public and inventory_items %}
+ {% endif %} + {% if inventory_items %}
{% for item in inventory_items %}
+ {% if not is_public %} + {% endif %}
{{ item.name }}{{ item.wear }}
- 💰 {{ "%.0f"|format(item.price_rub or 100) }} ₽ + 💰 {{ (item.price_rub or 100)|money }} ₽
+ {% if not is_public %}
+ {% endif %}
{% endfor %} @@ -604,12 +573,17 @@
📭

Инвентарь пуст

+ {% if is_public %} +

У пользователя пока нет предметов.

+ {% else %}

Откройте кейсы, чтобы получить первые предметы!

Открыть кейсы + {% endif %}
{% endif %}
+ {% if not is_public %}