Обновлены обработчики в main.py для использования глобального объекта oracle_db вместо передаваемого db. Удален неиспользуемый файл шаблона telegram_post_template_decodevin.j2. Это улучшает читаемость кода и упрощает управление подключением к базе данных.

This commit is contained in:
Vlad 2025-05-25 11:29:08 +03:00
parent 3e175ff913
commit b7de851580
3 changed files with 55 additions and 54 deletions

View File

@ -0,0 +1,6 @@
---
description:
globs:
alwaysApply: false
---
Разаабаотка ведется в ОС Windows 10, все консольные команды формируй с учетом этого

69
main.py
View File

@ -21,7 +21,7 @@ else:
TOKEN = getenv("BOT_TOKEN")
BOTNAME = getenv("BOT_NAME")
# SALVAGEDB_TOKEN=getenv("SALVAGEDB_TOKEN",'1234567890')
oracle_db = OracleDatabase(
user= getenv("db_user"),
@ -38,9 +38,12 @@ class VinStates(StatesGroup):
# Command handler
@dp.message(Command("start"))
async def command_start_handler(message: Message, db: OracleDatabase) -> None:
async def command_start_handler(message: Message, db: OracleDatabase = None) -> None:
# Используем переданный db или глобальный oracle_db
database = db or oracle_db
# Сохраняем данные пользователя при каждом взаимодействии
await db.save_user(message.from_user, "start_command")
await database.save_user(message.from_user, "start_command")
welcome_text = (
"Welcome to SalvagedbBot — your trusted assistant for vehicle history checks via VIN!\n\n"
@ -64,9 +67,12 @@ async def command_start_handler(message: Message, db: OracleDatabase) -> None:
@dp.callback_query(lambda c: c.data == "decode_vin")
async def decode_vin_callback(callback: CallbackQuery, state: FSMContext, db: OracleDatabase):
async def decode_vin_callback(callback: CallbackQuery, state: FSMContext, db: OracleDatabase = None):
# Используем переданный db или глобальный oracle_db
database = db or oracle_db
# Сохраняем данные пользователя при нажатии кнопки
await db.save_user(callback.from_user, "decode_vin_button")
await database.save_user(callback.from_user, "decode_vin_button")
await callback.message.answer("Please enter the vehicle VIN.")
await state.set_state(VinStates.waiting_for_vin)
@ -74,19 +80,25 @@ async def decode_vin_callback(callback: CallbackQuery, state: FSMContext, db: Or
@dp.callback_query(lambda c: c.data == "main_menu")
async def main_menu_callback(callback: CallbackQuery, state: FSMContext, db: OracleDatabase):
async def main_menu_callback(callback: CallbackQuery, state: FSMContext, db: OracleDatabase = None):
# Используем переданный db или глобальный oracle_db
database = db or oracle_db
# Сохраняем данные пользователя при возврате в главное меню
await db.save_user(callback.from_user, "main_menu_button")
await database.save_user(callback.from_user, "main_menu_button")
await state.clear()
await command_start_handler(callback.message, db)
await command_start_handler(callback.message, database)
await callback.answer()
@dp.callback_query(lambda c: c.data and c.data.startswith("pay_detailed_info:"))
async def pay_detailed_info_callback(callback: CallbackQuery, db: OracleDatabase):
async def pay_detailed_info_callback(callback: CallbackQuery, db: OracleDatabase = None):
# Используем переданный db или глобальный oracle_db
database = db or oracle_db
# Сохраняем данные пользователя при инициации платежа
await db.save_user(callback.from_user, "payment_initiation")
await database.save_user(callback.from_user, "payment_initiation")
# Extract VIN from callback data
vin = callback.data.split(":")[1]
@ -105,14 +117,17 @@ async def pay_detailed_info_callback(callback: CallbackQuery, db: OracleDatabase
@dp.message(VinStates.waiting_for_vin)
async def process_vin(message: Message, state: FSMContext, db: OracleDatabase):
async def process_vin(message: Message, state: FSMContext, db: OracleDatabase = None):
# Используем переданный db или глобальный oracle_db
database = db or oracle_db
# Сохраняем данные пользователя при обработке VIN
await db.save_user(message.from_user, "vin_processing")
await database.save_user(message.from_user, "vin_processing")
vin = message.text.strip().upper()
if len(vin) == 17 and vin.isalnum() and all(c not in vin for c in ["I", "O", "Q"]):
try:
make, model, year, cnt = await db.fetch_vin_info(vin)
make, model, year, cnt = await database.fetch_vin_info(vin)
logging.info(f"Decode VIN 1st step: make: {make}, model: {model}, year: {year}, cnt: {cnt}")
response_text = f"🚗 **{year} {make} {model}**\n\n"
if cnt == 0:
@ -140,14 +155,22 @@ async def process_vin(message: Message, state: FSMContext, db: OracleDatabase):
@dp.pre_checkout_query()
async def pre_checkout_handler(pre_checkout_query: PreCheckoutQuery):
async def pre_checkout_handler(pre_checkout_query: PreCheckoutQuery, db: OracleDatabase = None):
# Используем переданный db или глобальный oracle_db
database = db or oracle_db
# Сохраняем данные пользователя при pre-checkout
await database.save_user(pre_checkout_query.from_user, "pre_checkout")
await pre_checkout_query.answer(ok=True)
ADMIN_USER_ID = int(getenv("ADMIN_USER_ID", "0")) # ID администратора из переменных окружения
@dp.message(Command("admin_stats"))
async def admin_stats_handler(message: Message, db: OracleDatabase):
async def admin_stats_handler(message: Message, db: OracleDatabase = None):
# Используем переданный db или глобальный oracle_db
database = db or oracle_db
# Проверяем, является ли пользователь администратором
if message.from_user.id != ADMIN_USER_ID:
await message.answer("❌ Access denied. This command is for administrators only.")
@ -155,7 +178,7 @@ async def admin_stats_handler(message: Message, db: OracleDatabase):
try:
# Получаем общую статистику
stats = await db.get_users_summary()
stats = await database.get_users_summary()
# Формируем отчет
report = f"""
@ -184,10 +207,13 @@ async def admin_stats_handler(message: Message, db: OracleDatabase):
@dp.message(lambda message: message.successful_payment)
async def successful_payment_handler(message: Message, db: OracleDatabase):
async def successful_payment_handler(message: Message, db: OracleDatabase = None):
# Используем переданный db или глобальный oracle_db
database = db or oracle_db
# Сохраняем данные о платеже пользователя
await db.save_user(message.from_user, "successful_payment")
await db.update_user_payment(message.from_user.id, 1.0) # 1 Telegram Star
await database.save_user(message.from_user, "successful_payment")
await database.update_user_payment(message.from_user.id, 1.0) # 1 Telegram Star
payload = message.successful_payment.invoice_payload
@ -196,7 +222,7 @@ async def successful_payment_handler(message: Message, db: OracleDatabase):
try:
# Get detailed information from database
detailed_info = await db.fetch_detailed_vin_info(vin)
detailed_info = await database.fetch_detailed_vin_info(vin)
if detailed_info and detailed_info['all_params']:
params = detailed_info['all_params']
@ -357,7 +383,10 @@ async def successful_payment_handler(message: Message, db: OracleDatabase):
async def on_startup():
await oracle_db.connect()
# Регистрируем middleware для всех типов событий
dp.message.middleware(DbSessionMiddleware(oracle_db))
dp.callback_query.middleware(DbSessionMiddleware(oracle_db))
dp.pre_checkout_query.middleware(DbSessionMiddleware(oracle_db))
async def on_shutdown():

View File

@ -1,34 +0,0 @@
🚗 **{{ year }} {{ make }} {{ model }}**
{{ trim if trim else '' }}
📋 **BASIC INFO**
• **Make:** {{ make }}
• **Model:** {{ model }}
• **Year:** {{ model_year }}
• **Type:** {{ vehicle_type }}
• **Body:** {{ body_class }}
{% if doors %}• **Doors:** {{ doors }}{% endif %}
🔧 **ENGINE**
{% if engine_cylinders %}• **Engine:** {{ displacement_l }}L V{{ engine_cylinders }}{% endif %}
{% if displacement_l %}• **Displacement:** {{ displacement_l }}L ({{ displacement_ci }} CI){% endif %}
{% if engine_configuration %}• **Config:** {{ engine_configuration }}{% endif %}
{% if engine_brake_hp %}• **Power:** {{ engine_brake_hp }} HP{% if engine_brake_hp_range %} (up to {{ engine_brake_hp_range }} HP){% endif %}{% endif %}
{% if engine_power_kw %}• **Power (kW):** {{ engine_power_kw }} kW{% endif %}
{% if fuel_type_primary %}• **Fuel:** {{ fuel_type_primary }}{% endif %}
{% if valve_train_design %}• **Valve Train:** {{ valve_train_design }}{% endif %}
{% if engine_manufacturer %}• **Engine Mfg:** {{ engine_manufacturer }}{% endif %}
{% if seat_belts_type %}🛡️ **SAFETY**
• **Seat Belts:** {{ seat_belts_type }}
{% endif %}
🏭 **MANUFACTURING**
{% if manufacturer_name %}• **Manufacturer:** {{ manufacturer_name }}{% endif %}
{% if plant_city and plant_state %}• **Made in:** {{ plant_city }}, {{ plant_state }}{% endif %}
{% if plant_country %}• **Country:** {{ plant_country }}{% endif %}
{% if error_code and error_code == "0" %}✅ **No errors found**{% endif %}
---
📊 **Quick Specs:** {{ displacement_l }}L V{{ engine_cylinders if engine_cylinders else 'X' }} • {{ engine_brake_hp if engine_brake_hp else 'N/A' }} HP • {{ fuel_type_primary if fuel_type_primary else 'N/A' }} • {{ doors if doors else 'N/A' }}-door