Как сохранить переменные в методах при использовании чат-бота Telegram несколькими пользователями одновременно? (pytelegPython

Программы на Python
Ответить
Anonymous
 Как сохранить переменные в методах при использовании чат-бота Telegram несколькими пользователями одновременно? (pyteleg

Сообщение Anonymous »

Структура вопроса следующая: Пользователю показываются кнопки, при нажатии на которые текст с этих кнопок используется следующим способом. Поскольку методы создают клавиатуру, на которой обрабатываются кнопки, я не могу передавать переменные напрямую и использовать глобальные переменные. При использовании бота несколькими пользователями переменные перезаписываются каждым пользователем. Как можно уйти от этого? Желательно не переписывая весь код. (Код 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. В этом случае я все еще теряюсь. Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/793 ... ultiple-us
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»