def confirm(message): user_id = message.from_user.id text = message.text if text == "✅ Перейти к оплате": action, payment, rub, btc = db.get_state( user_id, ['Action', 'Payment', 'AmountRUB', 'AmountBTC']) if action == 'buy': comment = create_random_comment() pay_url = qiwi.create_form( own_qiwi_number, rub, comment) # if payment == 'qiwi' else own_card_number markup = types.InlineKeyboardMarkup() if payment == 'yad': markup = wait_for_pay_markup else: markup.row( types.InlineKeyboardButton('Оплатить в браузере', pay_url)) if payment != 'card': text = f'Переведите `{rub}` руб\nна этот номер: `{payments_numbers[payment]}` ' \ f'({reversed_payments[payment]})\nс комментарием `{comment}`\n❗️Важно: не забудьте указать ' \ f'комментарий к платежу, иначе ваши средства не будут засчитаны\n\n' \ f'После оплаты, вам будет переведено {btc} BTC' else: text = f'Для оплаты с помощью карты откройте [форму]({pay_url}) *в браузере* и выберите ' \ f'соответствующий способ.\n\nПосле оплаты, вам будет переведено {btc} BTC' bot.send_message(user_id, text, reply_markup=markup, parse_mode='Markdown') if payment != 'yad': bot.send_message(user_id, 'Подтвердите или отмените оплату', reply_markup=wait_for_pay_markup) else: address, comment = make_address() bot.send_message( user_id, f'Переведите `{btc}` BTC\nна этот адрес: `{address}` (BTC)\n\n' f'После оплаты, вам будет переведено {rub} руб', reply_markup=wait_for_pay_markup, parse_mode='Markdown') db.set_state(user_id, { 'State': 'paying|' + comment, 'Date': datetime.now() }) elif text == 'TestAdminPrivileges': db.set_state(user_id, {'State': 'Admin_menu'}) elif text == "Изменить сумму": db.set_state(user_id, {'State': 'set_amount'}) bot.send_message(user_id, "Укажите новую сумму в BTC или рублях", reply_markup=back_markup)
def admin_send_address(message): user_id = message.from_user.id if payments_validations[db.get_state(message.from_user.id, ['Payment'])[0]](message.text): db.set_state(user_id, {'State': 'Admin_send', 'Address': message.text}) bot.send_message(user_id, 'Введите сумму для перевода (не менее 10 руб)', reply_markup=admin_back_markup) else: bot.send_message( user_id, 'Такого адреса не существует, или вы допустили ошибку!')
def set_payment(message): user_id = message.from_user.id try: payment = payments[message.text] db.set_state(user_id, {'State': 'set_address', 'Payment': payment}) plus_text = 'ваш BTC адрес' if 'buy' in db.get_state( user_id, ['Action']) else address_mes_texts[payment] bot.send_message(user_id, set_address_mes + plus_text, reply_markup=back_markup) except KeyError: bot.send_message(user_id, set_payment_error_mes, reply_markup=payment_markup)
def set_address(message): user_id = message.from_user.id address = message.text action, payment = db.get_state(user_id, ['Action', 'Payment']) if action == 'buy': is_valid = payments_validations['btc'](address) substr = 'адреса' else: is_valid = payments_validations[payment](address) substr = 'номера карты' if 'card' in payment else 'счета' if is_valid: db.set_state(user_id, {'State': 'set_amount', 'Address': address}) bot.send_message(user_id, set_amount_mes, reply_markup=back_markup) else: bot.send_message(user_id, address_error_mes.format(substr), reply_markup=back_markup)
def admin_send(message): user_id = message.from_user.id sub_str = 'BTC' try: amount = float(message.text) except ValueError: bot.send_message(user_id, "Введите число или дробь, разделенную точкой", reply_markup=admin_back_markup) return address, payment = db.get_state(user_id, ['Address', 'Payment']) if payment == 'btc': max_btc, max_rub = get_account_balance() if 10 < amount < max_rub: amount = convert_to_btc(amount) if amount > max_btc: bot.send_message(user_id, 'Недостаточно средств на балансе', reply_markup=admin_back_markup) return else: max_rub = payments_balances[payment]() if 0 < amount < 10: amount = convert_to_rub(amount) amount = int(amount) if amount > max_rub: bot.send_message(user_id, 'Недостаточно средств на балансе', reply_markup=admin_back_markup) return sub_str = 'руб' amount_state = 'AmountRUB' if payment != 'btc' else 'AmountBTC' db.set_state(user_id, { 'State': 'Admin_send_confirm', amount_state: amount }) bot.send_message(user_id, f'Перевести *{amount}* {sub_str} на *{address}* ?', reply_markup=admin_confirm_markup, parse_mode='Markdown')
def admin_send_confirm(message): user_id = message.from_user.id if message.text == 'Да, перевести': address, payment, rub, btc = db.get_state( user_id, ['Address', 'Payment', 'AmountRUB', 'AmountBTC']) amount = rub if payment != 'btc' else btc if payment == 'btc': sent = send_btc(address, amount) elif payment == 'yad': sent = yandexmoney.send_money(address, amount) else: sent = qiwi.send_money(address, amount) text = 'Деньги переведены. Ожидайте поступления средств.' text += f'\nИнформация о транзакции https://www.blockchain.com/btc/tx/{sent}' if payment == 'btc' else '' if sent: bot.send_message(user_id, text, True) else: bot.send_message(user_id, '❗️Возникла какая-то ошибка при переводе❗️') admin_command(message) elif message.text == 'Нет, отменить': admin_command(message)
def set_amount(message): user_id = message.from_user.id try: amount = float(message.text) except ValueError: bot.send_message( user_id, "Необходимо ввести число или дробь, разделенную точкой", reply_markup=back_markup) return try: min_rub_amount = int(get_config_var('MinRubAmount')) except TypeError: min_rub_amount = 100 min_btc_amount = round(convert_to_btc(min_rub_amount), 7) action, payment, address = db.get_state(user_id, ['Action', 'Payment', 'Address']) if action == 'buy': max_btc_amount, max_rub_amount = get_account_balance() else: max_rub_amount = payments_balances[payment]() max_btc_amount = round(convert_to_btc(max_rub_amount), 7) if min_btc_amount <= amount <= max_btc_amount: converted = convert_to_rub(amount) rub_amount = round( add_commission(converted, payment) if action == 'buy' else sub_commission(converted, payment, address)) btc_amount = amount elif min_rub_amount <= amount <= max_rub_amount: rub_amount = int(amount) btc_amount = round( sub_commission(convert_to_btc(amount), payment) if action == 'buy' else convert_to_btc(add_commission(rub_amount, payment, address)), 7) else: bot.send_message(user_id, set_amount_error_mes.format(min_btc_amount, max_btc_amount, min_rub_amount, max_rub_amount), reply_markup=back_markup) return if action == 'buy': to_receive, to_pay = str(btc_amount) + ' BTC', str(rub_amount) + ' руб' else: to_receive, to_pay = str(rub_amount) + ' руб', str(btc_amount) + ' BTC' db.set_state(user_id, { 'State': 'confirm', 'AmountRUB': rub_amount, 'AmountBTC': btc_amount }) commission = get_config_var('Commission') if not commission: commission = 10 bot.send_message(user_id, confirm_mes.format(to_receive, commission, to_pay, reversed_payments[payment], address, round(convert_to_rub(1), 2)), reply_markup=confirm_markup, parse_mode='Markdown')
def update_config(message): user_id = message.from_user.id name = db.get_state(user_id)[0].split('_')[2] db.insert_new_config_var(name, message.text) db.set_state(user_id, {'State': 'Admin_settings'}) bot.send_message(user_id, 'Значение параметра успешно обновлено!')
def paying(message): user_id = message.from_user.id text = message.text if text == '✅ Проверить оплату': date, state, payment, action, rub, btc, address = db.get_state( user_id, [ 'Date', 'State', 'Payment', 'Action', 'AmountRUB', 'AmountBTC', 'Address' ]) if (datetime.now() - date).seconds // 3600 > 24: db.set_state(user_id, {'State': ''}) bot.send_message( user_id, 'Ваша операция просрочена. Вы можете начать новую\n\n' + menu_message.format(*get_rates()), reply_markup=menu_markup) else: comment = state.split('|')[1] admin_username = db.get_config_var('AdminUsername') if action == 'buy': confirmed = payments_checking[payment](comment, rub) else: confirmed = payments_checking['btc'](comment, btc) if confirmed: converted = round(convert_to_rub(btc)) if action == 'buy': tx_hash = send_btc(address, btc) if tx_hash: bot.send_message( user_id, f'Ваш платеж принят. Ожидайте поступления BTC на свой адрес.' ) db.new_transaction(user_id, rub, converted, datetime.now()) bot.send_message( admin_id, f'❇️ Новая операция ❇️\nПользователь @{message.from_user.username} ' f'id:`{user_id}`\nОплачено: {rub}\nПолучено: {converted}' ) else: bot.send_message( user_id, f'Возникла ошибка во время перевода... Возможно вы неверно указали ' f'свой номер\nОбратитесь за помощью к админу {admin_username}' ) else: if payment == 'yad': sent = yandexmoney.send_money(address, rub) else: sent = qiwi.send_money(address, rub) if sent: bot.send_message( user_id, 'Ваш платеж принят. Ожидайте поступления средств.') db.new_transaction(user_id, convert_to_rub(btc), rub, datetime.now()) bot.send_message( admin_id, f'❇️ Новая операция ❇️\nПользователь @{message.from_user.username} ' f'id:`{user_id}`\nОплачено: {converted}\nПолучено: {rub}' ) else: bot.send_message( user_id, f'Возникла ошибка во время перевода... Возможно вы неверно указали ' f'свой номер\nОбратитесь за помощью к админу {admin_username}' ) start_handler(message) else: bot.send_message( user_id, f'Что то пошло не так...\nПопробуйте еще раз через 5-10 минут.\nВ случае ' f'нескольких неудач, обратитесь за помощью к админу {admin_username}' ) elif text == '❌ Отменить операцию': db.set_state(user_id, {'State': ''}) bot.send_message(user_id, menu_message.format(*get_rates()), reply_markup=menu_markup)
@bot.message_handler(regexp="(?:^📥Купить|^📤Продать) BTC") def trade_handler(message): user_id = message.from_user.id action = message.text.split(' ')[0] if action == "📥Купить": action = "buy" payment_text = set_payment_mes + "покупки 🔶 BTC 🔶" else: action = "send" payment_text = set_payment_mes + "продажи 🔶 BTC 🔶" bot.send_message(user_id, payment_text, reply_markup=payment_markup) db.set_state(user_id, {'State': 'set_payment', 'Action': action}) @bot.message_handler( func=lambda message: 'set_payment' in db.get_state(message.from_user.id)) def set_payment(message): user_id = message.from_user.id try: payment = payments[message.text] db.set_state(user_id, {'State': 'set_address', 'Payment': payment}) plus_text = 'ваш BTC адрес' if 'buy' in db.get_state( user_id, ['Action']) else address_mes_texts[payment] bot.send_message(user_id, set_address_mes + plus_text, reply_markup=back_markup) except KeyError: bot.send_message(user_id, set_payment_error_mes, reply_markup=payment_markup)