Проблема с охватом аргуемта текстового сообщения '+ <кол-во денег >
Мне нужно написать переменую которая охватывает аргуемт текстового сообщения '+ <кол-во денег >
Но ,проблема заключается в том , что переменая которую я написал, она работает, но передаёт лишь 1 денежку, а мне нужно написаную мной сколько переводить.
elif '+' in message.text:
if message.text.split()[1].replace(' ', '').isdigit():
transfer_cash = message.text.split()[1].replace(' ', '').isdigit()
if message.reply_to_message is None:
pass
else:
if message.reply_to_message.from_user.is_bot == False:
if message.reply_to_message.from_user.id == id:
pass
else:
for trans_db in sql.execute(f"SELECT Money FROM User WHERE IdUser = {id}"):
me_transfer_money = trans_db[0]
sql.execute(f"SELECT IdUser FROM User WHERE IdUser = {message.reply_to_message.from_user.id}")
if sql.fetchone() is None:
else:
for tr_db in sql.execute(f"SELECT Money FROM User WHERE IdUser = {message.reply_to_message.from_user.id}"):
others_transfer_money = tr_db[0]
if me_transfer_money >= message.text.split()[1].replace(' ', '').isdigit():
sql.execute(f"UPDATE User SET Money = {me_transfer_money - transfer_cash} WHERE IdUser = {id}")
db.commit()
sql.execute(f"UPDATE User SET Money = {others_transfer_money + transfer_cash} WHERE IdUser = {message.reply_to_message.from_user.id}")
db.commit()
await bot.send_message(message.chat.id , 'Чек перевода:\nСтатус: Успешный\nОтправитель: '+ message.from_user.first_name +'\nПолучитель: '+ message.reply_to_message.from_user.first_name +'\nСумма: '+ str(transfer_cash))
Ответы (1 шт):
Для начала пара замечаний:
message.text.split()[1].replace(' ', '')эквивалентнаmessage.text.split()[1], т.к. ни один элемент результатаsplit()не содержит пробеловЕсли вы проводите операции перевода денег, то операции списания и зачисления нужно коммитить одновременно, а не раздельно. Вместо этого фрагмента:
sql.execute(f"UPDATE User SET Money = {me_transfer_money - transfer_cash} WHERE IdUser = {id}")
db.commit()
sql.execute(f"UPDATE User SET Money = {others_transfer_money + transfer_cash} WHERE IdUser = {message.reply_to_message.from_user.id}")
db.commit()
лучше использовать:
sql.execute(f"UPDATE User SET Money = {me_transfer_money - transfer_cash} WHERE IdUser = {id}")
sql.execute(f"UPDATE User SET Money = {others_transfer_money + transfer_cash} WHERE IdUser = {message.reply_to_message.from_user.id}")
db.commit()
В случае ошибки при выполнении запроса коммит будет отменён полностью. А при вашем подходе списание может пройти успешно, а при коммите зачисления произойдёт ошибка, и деньги, получается, исчезли.
3. Если для работы с базами данных вы используете sqlite3, то вместо
sql.execute(f'SELECT .... WHERE id = {id}')
желательно использовать
sql.execute('SELECT .... WHERE id = ?', (id,))
Об этом говорится в документации sqlite3. Такой способ подстановки безопаснее, т.к. проверяет значения на валидность типа данных.
А теперь то, что и стало причиной неверной работы. Вы неправильно задали значение transfer_cash. Метод isdigit() возвращает булево значение, так что для корректной работы вместо:
transfer_cash = message.text.split()[1].replace(' ', '').isdigit()
нужно написать:
transfer_cash = float(message.text.split()[1])
либо, если у вас деньги - целочисленная величина (а вдруг?), то:
transfer_cash = int(message.text.split()[1])