コード例 #1
0
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)
コード例 #2
0
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, 'Такого адреса не существует, или вы допустили ошибку!')
コード例 #3
0
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)
コード例 #4
0
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)
コード例 #5
0
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')
コード例 #6
0
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)
コード例 #7
0
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')
コード例 #8
0
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, 'Значение параметра успешно обновлено!')
コード例 #9
0
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)
コード例 #10
0
@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)