Пользователю отображаются кнопки, при нажатии на которые текст этих кнопок используется следующим способом. Поскольку методы создают клавиатуру, на которой обрабатываются кнопки, я не могу передавать переменные напрямую и использовать глобальные переменные. При использовании бота несколькими пользователями переменные перезаписываются каждым пользователем. Как можно уйти от этого? Желательно не переписывая весь код. (Код 4 тыс. строк).
Пример кода:
def count_procedure_client_new_schedule(message):
bot.delete_message(message.chat.id, message.message_id)
current_user_id = message.chat.id
connect = sqlite3.connect(f"{name_db}")
cursor = connect.cursor()
cursor.execute(f"SELECT * FROM (Writer_for_services) WHERE Status_procedure != \'deactivated\' AND ID_user == {current_user_id}")
count_records_client = cursor.fetchall()
if len(count_records_client) > 20:
bot.send_message(message.chat.id, "too many entries! You have 3 or more active accounts.")
return
else:
connect = sqlite3.connect(f"{name_db}")
cursor = connect.cursor()
cursor.execute(f"SELECT * FROM (Price_procedures_master) WHERE Price_procedure != \'-1\'")
find_procedure = cursor.fetchall()
list_repetition_price = []
if len(find_procedure) != 0:
for procedure in find_procedure:
price_procedures = re.findall(r'\b\d+\b', procedure[3])
price_procedures = int(price_procedures[0])
if price_procedures > 0:
if procedure[2] in list_repetition_price:
print("This service is already there!")
else:
list_repetition_price.append(procedure[2])
cursor.execute(f"SELECT * FROM (Times_procedures_masters) WHERE
Time_procedure_master != \'-1\'")
find_procedure = cursor.fetchall()
list_repetition_time = []
if len(find_procedure) != 0:
for procedure in find_procedure:
time_procedures = procedure[3]
time_procedures = int(time_procedures)
if time_procedures > 0:
if procedure[2] in list_repetition_time:
print("This service is already there!")
else:
list_repetition_time.append(procedure[2])
cursor.execute(f"SELECT * FROM (Type_procedures) WHERE Status_procedure != \'deactivated\'")
find_name_procedure = cursor.fetchall()
buttom_markup_name = ''
markup_choice_procedure = types.InlineKeyboardMarkup()
no_error_find = 0
for index, name_procedure in enumerate(find_name_procedure):
if name_procedure[0] in list_repetition_time and name_procedure[0] in list_repetition_price:
buttom_markup_name = f"button_choice_procedure_{index+1}"
buttom_markup_name = (types.InlineKeyboardButton(f"{name_procedure[1]}",callback_data = f"choice_procedure_client{name_procedure[0]}" ))
markup_choice_procedure.row(buttom_markup_name)
no_error_find += 1
if no_error_find != 0:
bot.send_message(message.chat.id, "Select the service you want to sign up for
:", reply_markup=markup_choice_procedure)
else:
print(f"Error: The price list or service delivery time is not set.")
bot.send_message(message.chat.id, "The recording is currently closed! Contact the administrator.")
else:
bot.send_message(message.chat.id, "There is not a single procedure!")
@bot.callback_query_handler(func=lambda callback: True)
def callback_message(callback):
# RUNNING MATCHES ON THE MASTER'S NAME
bot.delete_message(callback.message.chat.id, callback.message.message_id)
print(callback.data)
connect = sqlite3.connect(f"{name_db}")
procedure = callback.data
reverse_search_id_procedure = ''
check_procedure = re.sub(r'\d+', '', procedure)
....
if check_procedure == "choice_procedure_client":
reverse_procedure = procedure[::-1]
for symbol in reverse_procedure:
if symbol != "t":
reverse_search_id_procedure += symbol
else:
break
search_id_procedure = reverse_search_id_procedure[::-1]
search_id_procedure = int(search_id_procedure)
count_master_client_new_schedule(search_id_procedure, callback.message)
def count_master_client_new_schedule(id_procedure, message):
connect = sqlite3.connect(f"{name_db}")
cursor = connect.cursor()
global choice_id_procedure_for_record
choice_id_procedure_for_record = int(id_procedure)
cursor.execute(f"SELECT * FROM (Price_procedures_master) WHERE Price_procedure != \'-1\' AND ID_procedures == {choice_id_procedure_for_record}")
find_all_master = cursor.fetchall()
print(find_all_master)
list_repetition = []
for price in find_all_master:
price_procedures = re.findall(r'\b\d+\b', price[3])
price_procedures = int(price_procedures[0])
if price_procedures > 0:
if price[1] in list_repetition:
print("This service is already there!")
else:
list_repetition.append(price[1])
cursor.execute(f"SELECT * FROM (Times_procedures_masters) WHERE Time_procedure_master != \'-1\' AND ID_procedures == {choice_id_procedure_for_record}")
find_master = cursor.fetchall()
list_repetition_time = []
if len(find_master) != 0:
for procedure in find_master:
time_procedures = procedure[3]
time_procedures = int(time_procedures)
if time_procedures > 0:
if procedure[2] in list_repetition_time:
print("This service is already there!")
else:
list_repetition_time.append(procedure[1])
cursor.execute(f"SELECT * FROM (Masters) WHERE Status_master != \'deactivated\'")
find_name_master = cursor.fetchall()
buttom_markup_name = ''
markup_choice_master = types.InlineKeyboardMarkup()
for index, name_master in enumerate(find_name_master):
if name_master[0] in list_repetition and name_master[0] in list_repetition_time:
buttom_markup_name = f"button_choice_master_{index+1}"
buttom_markup_name = (types.InlineKeyboardButton(f"{name_master[1]}",callback_data = f"choice_master_client{name_master[0]}" ))
markup_choice_master.row(buttom_markup_name)
buttom_markup_name_step_back = (types.InlineKeyboardButton(f"--- Back ---",callback_data = f"choice_master_client_step_back" ))
markup_choice_master.row(buttom_markup_name_step_back)
buttom_markup_name_cancel = (types.InlineKeyboardButton(f"--- Cancel ---",callback_data = f"confirmation_end_record_no" ))
markup_choice_master.row(buttom_markup_name_cancel)
и так несколько раз, как от этого уйти?
Нашел информацию, что в библиотеке python есть телеграм-бот, там для этого существует специальная платформа Telegram.ext.
Пользователю отображаются кнопки, при нажатии на которые текст этих кнопок используется следующим способом. Поскольку методы создают клавиатуру, на которой обрабатываются кнопки, я не могу передавать переменные напрямую и использовать глобальные переменные. При использовании бота несколькими пользователями переменные перезаписываются каждым пользователем. Как можно уйти от этого? Желательно не переписывая весь код. (Код 4 тыс. строк). Пример кода: [code]def count_procedure_client_new_schedule(message): bot.delete_message(message.chat.id, message.message_id) current_user_id = message.chat.id connect = sqlite3.connect(f"{name_db}") cursor = connect.cursor() cursor.execute(f"SELECT * FROM (Writer_for_services) WHERE Status_procedure != \'deactivated\' AND ID_user == {current_user_id}") count_records_client = cursor.fetchall() if len(count_records_client) > 20: bot.send_message(message.chat.id, "too many entries! You have 3 or more active accounts.") return else: connect = sqlite3.connect(f"{name_db}") cursor = connect.cursor() cursor.execute(f"SELECT * FROM (Price_procedures_master) WHERE Price_procedure != \'-1\'") find_procedure = cursor.fetchall() list_repetition_price = [] if len(find_procedure) != 0: for procedure in find_procedure: price_procedures = re.findall(r'\b\d+\b', procedure[3]) price_procedures = int(price_procedures[0]) if price_procedures > 0: if procedure[2] in list_repetition_price: print("This service is already there!") else: list_repetition_price.append(procedure[2]) cursor.execute(f"SELECT * FROM (Times_procedures_masters) WHERE
Time_procedure_master != \'-1\'") find_procedure = cursor.fetchall() list_repetition_time = [] if len(find_procedure) != 0: for procedure in find_procedure: time_procedures = procedure[3] time_procedures = int(time_procedures) if time_procedures > 0: if procedure[2] in list_repetition_time: print("This service is already there!") else: list_repetition_time.append(procedure[2])
cursor.execute(f"SELECT * FROM (Type_procedures) WHERE Status_procedure != \'deactivated\'") find_name_procedure = cursor.fetchall() buttom_markup_name = '' markup_choice_procedure = types.InlineKeyboardMarkup() no_error_find = 0 for index, name_procedure in enumerate(find_name_procedure): if name_procedure[0] in list_repetition_time and name_procedure[0] in list_repetition_price: buttom_markup_name = f"button_choice_procedure_{index+1}" buttom_markup_name = (types.InlineKeyboardButton(f"{name_procedure[1]}",callback_data = f"choice_procedure_client{name_procedure[0]}" )) markup_choice_procedure.row(buttom_markup_name) no_error_find += 1 if no_error_find != 0: bot.send_message(message.chat.id, "Select the service you want to sign up for :", reply_markup=markup_choice_procedure) else: print(f"Error: The price list or service delivery time is not set.") bot.send_message(message.chat.id, "The recording is currently closed! Contact the administrator.") else: bot.send_message(message.chat.id, "There is not a single procedure!")
@bot.callback_query_handler(func=lambda callback: True) def callback_message(callback): # RUNNING MATCHES ON THE MASTER'S NAME bot.delete_message(callback.message.chat.id, callback.message.message_id) print(callback.data) connect = sqlite3.connect(f"{name_db}")
if check_procedure == "choice_procedure_client": reverse_procedure = procedure[::-1] for symbol in reverse_procedure: if symbol != "t": reverse_search_id_procedure += symbol else: break
def count_master_client_new_schedule(id_procedure, message): connect = sqlite3.connect(f"{name_db}") cursor = connect.cursor() global choice_id_procedure_for_record choice_id_procedure_for_record = int(id_procedure) cursor.execute(f"SELECT * FROM (Price_procedures_master) WHERE Price_procedure != \'-1\' AND ID_procedures == {choice_id_procedure_for_record}") find_all_master = cursor.fetchall() print(find_all_master) list_repetition = [] for price in find_all_master: price_procedures = re.findall(r'\b\d+\b', price[3]) price_procedures = int(price_procedures[0]) if price_procedures > 0: if price[1] in list_repetition: print("This service is already there!") else: list_repetition.append(price[1]) cursor.execute(f"SELECT * FROM (Times_procedures_masters) WHERE Time_procedure_master != \'-1\' AND ID_procedures == {choice_id_procedure_for_record}") find_master = cursor.fetchall() list_repetition_time = [] if len(find_master) != 0: for procedure in find_master: time_procedures = procedure[3] time_procedures = int(time_procedures) if time_procedures > 0: if procedure[2] in list_repetition_time: print("This service is already there!") else: list_repetition_time.append(procedure[1]) cursor.execute(f"SELECT * FROM (Masters) WHERE Status_master != \'deactivated\'") find_name_master = cursor.fetchall() buttom_markup_name = '' markup_choice_master = types.InlineKeyboardMarkup() for index, name_master in enumerate(find_name_master): if name_master[0] in list_repetition and name_master[0] in list_repetition_time: buttom_markup_name = f"button_choice_master_{index+1}" buttom_markup_name = (types.InlineKeyboardButton(f"{name_master[1]}",callback_data = f"choice_master_client{name_master[0]}" )) markup_choice_master.row(buttom_markup_name) buttom_markup_name_step_back = (types.InlineKeyboardButton(f"--- Back ---",callback_data = f"choice_master_client_step_back" )) markup_choice_master.row(buttom_markup_name_step_back) buttom_markup_name_cancel = (types.InlineKeyboardButton(f"--- Cancel ---",callback_data = f"confirmation_end_record_no" )) markup_choice_master.row(buttom_markup_name_cancel) [/code] и так несколько раз, как от этого уйти? Нашел информацию, что в библиотеке python есть телеграм-бот, там для этого существует специальная платформа Telegram.ext.