Python

Помогите пожалуйста - aiogram

Использую такой код:
 class PromoCodesState(StatesGroup): 
waiting_for_promocode = State()

promocodes_list = ['Промокод']

@dp.message_handler(Text(equals='➕Промокод', ignore_case=True))
async def offer_promocode(message: types.Message):
await message.answer("Введите промокод:")
await PromoCodesState.waiting_for_promocode.set()

@dp.message_handler(state=PromoCodesState.waiting_for_promocode)
async def check_promocode(message: types.Message, state: FSMContext):
uid = message.from_user.id
c.execute('SELECT * FROM balances WHERE id = ?', (uid,))
row = c.fetchone()
if row is None:
c.execute('INSERT INTO balances VALUES (?, ?, ?, ?, ?)', (uid, 0, "", 0, 0))
conn.commit()
search_results = []
for promo_code in promocodes_list:
similarity = fuzz.ratio(promo_code.lower(), message.text.lower()) # Вычисляем схожесть
if similarity > 100: # Задаём порог схожести
search_results.append(promo_code)

if search_results:
if 'Промокод' in search_results:
await message.answer('✅Промокод найден! +10 к балансу', reply_markup=kb)
c.execute('UPDATE balances SET balance = balance + 10 WHERE id = ?', (uid,))
conn.commit()
await state.finish()
else:
await message.answer('Ничего не найдено')
await state.finish()

И бот просто игнорит после введения промокода((

помогите!
 class PromoCodesState(StatesGroup):  
waiting_for_promocode = State()

promocodes_list = ['Промокод']

@dp.message_handler(Text(equals='➕Промокод', ignore_case=True))
async def offer_promocode(message: types.Message):
await message.answer("Введите промокод:")
await PromoCodesState.waiting_for_promocode.set()

@dp.message_handler(state=PromoCodesState.waiting_for_promocode)
async def check_promocode(message: types.Message, state: FSMContext):
uid = message.from_user.id
c.execute('SELECT * FROM balances WHERE id = ?', (uid,))
row = c.fetchone()
if row is None:
c.execute('INSERT INTO balances VALUES (?, ?, ?, ?, ?)', (uid, 0, "", 0, 0))
conn.commit()
search_results = []
for promo_code in promocodes_list:
similarity = fuzz.ratio(promo_code.lower(), message.text.lower()) # Вычисляем схожесть
if similarity > 100: # Задаём порог схожести
search_results.append(promo_code)

if search_results:
if 'Промокод' in search_results:
await message.answer('✅Промокод найден! +10 к балансу', reply_markup=kb)
c.execute('UPDATE balances SET balance = balance + 10 WHERE id = ?', (uid,))
conn.commit()
await state.finish()
else:
await message.answer('Ничего не найдено')
await state.finish()
else:
await message.answer('Ничего не найдено')
await state.finish()
я заметил, что если схожесть similarity равна 100, то вы добавляете promo_code в search_results, но на самом деле порог схожести должен быть строго больше 100, так как максимальное значение для fuzz.ratio - это 100. Кроме того, мне не ясно, зачем вы проверяете наличие строки "Промокод" в search_results, если это уже было добавлено в promocodes_list.

Также, я не вижу, где у вас инициализируется соединение с базой данных conn и объект курсора c. Убедитесь, что вы создали соединение с базой данных в другой части вашего кода и передали его в функцию, где вы выполняете SQL-запросы.

Наконец, если в вашей базе данных таблица balances содержит столбец с именем balance, убедитесь, что вы правильно обращаетесь к этому столбцу в вашем SQL-запросе. Выше привел пример кода.
ЛВ
Леонид Воробьев
1 402
Лучший ответ
Алексей Счастье Спасибо, всё понял. Можете подсказать, как сделать промокод одноразовым?
Леонид Воробьев В функции check_promocode вы можете добавить проверку на использование промокода перед начислением баланса. Например, можно модифицировать код следующим образом:

 if 'Промокод' in search_results: 
c.execute('SELECT used FROM promocodes WHERE code = ?', (promo_code,))
used = c.fetchone()[0]
if not used:
await message.answer('✅Промокод найден! +10 к балансу', reply_markup=kb)
c.execute('UPDATE balances SET balance = balance + 10 WHERE id = ?', (uid,))
c.execute('UPDATE promocodes SET used = ? WHERE code = ?', (True, promo_code))
conn.commit()
await state.finish()
else:
await message.answer('Этот промокод уже использован')
await state.finish()
Леонид Воробьев Здесь мы сначала выполняем запрос к таблице promocodes, чтобы проверить значение столбца used для найденного промокода. Если значение used равно True, значит промокод уже был использован и мы выводим соответствующее сообщение. Если значение used равно False, то мы начисляем баланс пользователю, обновляем значение столбца used на True для данного промокода и завершаем состояние.
 if search_results: 
if 'Промокод' in search_results:
await message.answer('✅Промокод найден! +10 к балансу', reply_markup=kb)
c.execute('UPDATE balances SET balance = balance + 10 WHERE id = ?', (uid,))
conn.commit()
await state.finish()
else:
await message.answer('Ничего не найдено')
await state.finish()
else:
await message.answer('Ничего не найдено')
await state.finish()
и еще надо fuzz добавить

 from fuzzywuzzy import fuzz 


Алексей Счастье fuzz уже импортирован. Спасибо, сейчас проверю
Проблема может быть связана с тем, что в строке с условием if similarity > 100 порог схожести задан больше 100. Значение 100 является максимальным для коэффициента сходства, который может быть вычислен библиотекой fuzzywuzzy. Попробуйте изменить это условие на if similarity >= 80, что означает, что промокод будет считаться совпадающим, если его сходство с введенным текстом будет равно или больше 80.

Также убедитесь, что переменная promocodes_list содержит правильные значения и что они записаны точно так же, как и при сравнении введенного промокода в обработчике сообщения.

Кроме того, убедитесь, что соединение с базой данных conn и курсор c настроены правильно и что таблица balances содержит нужные поля. Возможно, также следует добавить обработку исключений для предотвращения ошибок в работе с базой данных.
в прошлом вопросе всё подробно расписал