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 %}