Телеграм бот. Вызов такси
Может есть кто свободен может допилить бота?
import re
import emoji
import sqlite3
token = '###'
bot = telebot.TeleBot(token)
@bot.message_handler(commands=['info'])
def info(message):
bot.send_message(message.chat.id,message)
@bot.message_handler(commands=['start'])
def start(message):
keyboard = telebot.types.ReplyKeyboardMarkup(resize_keyboard = True)
button_1 = telebot.types.KeyboardButton(text = "Сделать заказ ")
button_2 = telebot.types.KeyboardButton(text = 'Мой профиль ')
keyboard.add(button_1)
keyboard.add(button_2)
bot.send_message(message.chat.id,emoji.emojize('Добро пожаловать в такси "Дельта" :taxi: '),reply_markup=keyboard)
bot.send_message(message.chat.id,emoji.emojize('Чтобы начать пользовать нашим сервисом, нужно ввести номер телефона.\nДля этого нажмите на кнопку "Мой профиль"'))
def take_order():
keyboard = telebot.types.InlineKeyboardMarkup()
correct = telebot.types.InlineKeyboardButton("Взять заказ", callback_data="take")
keyboard.row(correct)
return keyboard
def getAddress(conn,message):
c = conn.cursor()
c.execute("SELECT address FROM clients WHERE id = ?", (message.from_user.id, ))
result = c.fetchone()
if result:
return result[0]
def getPhone(conn,message):
c = conn.cursor()
c.execute("SELECT telephone FROM clients WHERE id = ?", (message.from_user.id, ))
result = c.fetchone()
if result:
return result[0]
@bot.message_handler()
def get_button(message):
if message.text == 'Мой профиль':
mydb = sqlite3.connect('taxibd.db')
mycursor = mydb.cursor()
mycursor.execute("SELECT id FROM clients WHERE id = ?", (message.from_user.id, ))
exists = mycursor.fetchall()
mydb.commit()
if not exists:
bot.send_message(message.chat.id,'Введите свой номер телефона для связи с водителем(при необходимости)\nФормат номера - 89*********`',parse_mode='html')
bot.register_next_step_handler(message, get_telephone)
else:
bot.send_message(message.chat.id,f'Вы авторизированы.\nВаш уникальный номер - <b>{message.from_user.id}</b>\nВаше имя - <b>{message.from_user.first_name}</b>\nВаш телефон - <b>{getPhone(mydb,message)}</b>\nМожете делать заказ!',parse_mode='html')
elif message.text == 'Сделать заказ':
mydb = sqlite3.connect('taxibd.db')
mycursor = mydb.cursor()
mycursor.execute("SELECT id FROM clients WHERE id = ?", (message.from_user.id, ))
exists = mycursor.fetchall()
mydb.commit()
if exists:
bot.send_message(message.from_user.id,'Введите адрес:\n(Пример : Освобождения 4, 3 подъезд',parse_mode='html')
bot.register_next_step_handler(message, get_address)
else:
bot.send_message(message.from_user.id,'Сначала пройдите регистрацию!\nДля этого нажмите "Мой профиль"',parse_mode='html')
def get_telephone(message):
temp = message.text
match = re.fullmatch(r"(\+7|7|8)?[\s\-]?\(?[489][0-9]{2}\)?[\s\-]?[0-9]{3}[\s\-]?[0-9]{2}[\s\-]?[0-9]{2}$",temp)
if match:
telephone = temp
mydb = sqlite3.connect('taxibd.db')
mycursor = mydb.cursor()
sqlFormula = "INSERT OR IGNORE INTO clients ('id','telephone') VALUES (?,?)"
mycursor.execute(sqlFormula, (message.from_user.id, telephone))
mydb.commit()
bot.send_message(message.chat.id,'Регистрация завершена!\nМожете делать заказ', reply_markup=None)
else:
bot.send_message(message.chat.id,emoji.emojize(f' :warning: Неправильно введён номер, нажмите на "Мой профиль" и попробуйте еще раз'),parse_mode='html')
def get_address(message):
address = message.text
if len(address) <= 5:
bot.send_message(message.chat.id,'Неточное указание адреса, попробуйте сделать заказ заново!', parse_mode='html')
else:
mydb = sqlite3.connect('taxibd.db')
mycursor = mydb.cursor()
sqlFormula = "UPDATE clients SET address = ? WHERE id = ?"
mycursor.execute(sqlFormula, (address,message.from_user.id ))
mydb.commit()
chatId = '-###'
bot.send_message(chatId, text=emoji.emojize(f'❗️ <b>Получен заказ</b> ❗️\nАдрес : <b>{getAddress(mydb,message)}</b>\nТелефон клиента : <b>{getPhone(mydb,message)}</b>'),parse_mode='html',reply_markup = take_order())
bot.send_message(message.chat.id,'Ваш заказ передан в службу.\nМы оповестим вас, когда найдется водитель!\nЭто не займет много времени',parse_mode='html')
@bot.callback_query_handler(func=lambda call: True)
def callback_query(call):
if call.data == "take":
mydb = sqlite3.connect('taxibd.db')
bot.answer_callback_query(call.id, "Заказ принят!",show_alert = False)
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=emoji.emojize(f'✅ <b>Заказ взят</b> ✅\nАдрес : <b>{getAddress(mydb,call)}</b>\nТелефон клиента : <b>{getPhone(mydb,call)}</b>\nЗаказ принял @{call.from_user.username}'),parse_mode='html', reply_markup=None)
bot.send_message(call.from_user.id,f'✅Ваш заказ был принят, ожидайте!\nЕсли возникнут проблемы, водитель свяжется с вами по номеру <b>{getPhone(mydb,call)}</b>\nid таксиста - {call.from_user.id}',parse_mode='html')
bot.polling(none_stop=True)
Решил написать бота, который спрашивает у пользователя телефон и адрес. После он отправляет это в группу(якобы для таксистов), где уже они принимают заказ и бот нам пишет, что заказ принят. Но клиенту уведомление не приходит что заказ принят, а приходит самому таксисту в бот. Бот отправляет сообщение о заказе в группу. После в группе человек нажимает на кнопку(inline_keyboard) и в группе меняется сообщение на "Заказ принят" с нужным адресом. А клиенту, который отправлял заказ, отсылается подтверждение. Всё отлично, если это делает один пользователь.
Также если 2 пользователя делают заказ, то при нажатие на кнопку подтверждения, оба сообщения отправляются тому клиенту, который последний сделал заказ и само сообщение при изменении на "Заказ принят" меняет 'адрес' на адрес последнего заказа.
Скажите, пожалуйста, как правильно сделать, чтобы все работало корректно?