Задать вопрос
nosemka
@nosemka
Middle Python Developer

Почему не работает два раза callback_query_handler pyTelegramBotApi?

Здравствуйте, я пишу бота магазин, и столкнулся с проблемой, делал функцию выдачи через register_next_step_handler и использовал inline кнопки. Когда я пытаюсь выдать доступ, всё работает, а когда я пытаюсь выдать рубли не работает. Помогите
import telebot
import configure
import sqlite3
from telebot import types

client = telebot.TeleBot(configure.config['token'])
db = sqlite3.connect('baza.db', check_same_thread=False)
sql = db.cursor()

#database

sql.execute("""CREATE TABLE IF NOT EXISTS users (id BIGINT, nick TEXT, cash INT, access INT, bought INT)""")
sql.execute("""CREATE TABLE IF NOT EXISTS shop (id INT, name TEXT, price INT, tovar TEXT)""")
db.commit()

@client.message_handler(commands=['start'])
def start(message):
	getname = message.from_user.first_name
	cid = message.chat.id
	uid = message.from_user.id

	sql.execute(f"SELECT id FROM users WHERE id = {uid}")
	if sql.fetchone() is None:
		sql.execute(f"INSERT INTO users VALUES ({uid}, '{getname}', 0, 0, 0)")
		client.send_message(cid, f"Добро пожаловать, {getname}!\nТы попал в администраторский магазин Tucson!")
		db.commit()
	else:
		client.send_message(cid, f"Ты уже зарегистрирован! Пропиши /help чтобы узнать команды.")


@client.message_handler(commands=['profile', 'myinfo', 'myprofile'])
def myprofile(message):
	cid = message.chat.id
	uid = message.from_user.id
	sql.execute(f"SELECT * FROM users WHERE id = {uid}")
	getaccess = sql.fetchone()[3]
	if getaccess == 0:
		accessname = 'Пользователь'
	elif getaccess == 1:
		accessname = 'Администратор'
	elif getaccess == 777:
		accessname = 'Разработчик'
	for info in sql.execute(f"SELECT * FROM users WHERE id = {uid}"):
		client.send_message(cid, f"Твой профиль:\n\nВаш ID: {info[0]}\nБаланс: {info[2]}\nУровень доступа: {accessname}\nКуплено товаров: {info[4]}")

@client.message_handler(commands=['access', 'setaccess', 'dostup'])
def setaccess(message):
	cid = message.chat.id
	uid = message.from_user.id
	sql.execute(f"SELECT * FROM users WHERE id = {uid}")
	getaccess = sql.fetchone()[3]
	accessquery = 777
	if getaccess < accessquery:
		client.send_message(cid, f"⚠️ | У вас нет доступа!")
	else:
		for info in sql.execute(f"SELECT * FROM users WHERE id = {uid}"):
			msg = client.send_message(cid, 'Введите ID пользователя:\nПример: 596060542', parse_mode="Markdown")
			client.register_next_step_handler(msg, access_user_id_answer)

def access_user_id_answer(message):
	cid = message.chat.id
	uid = message.from_user.id
	if message.text == message.text:
		global usridaccess
		usridaccess = message.text
		rmk = types.ReplyKeyboardMarkup(resize_keyboard=True)
		rmk.add(types.KeyboardButton('Пользователь'), types.KeyboardButton('Администратор'), types.KeyboardButton('Разработчик'))
		msg = client.send_message(cid, 'Какой уровень доступа Вы хотите выдать?:', reply_markup=rmk, parse_mode="Markdown")
		client.register_next_step_handler(msg, access_user_access_answer)

def access_user_access_answer(message):
	global accessgaved
	global accessgavedname
	cid = message.chat.id
	uid = message.from_user.id
	rmk = types.InlineKeyboardMarkup()
	access_yes = types.InlineKeyboardButton(text='Да',callback_data='setaccessyes')
	access_no = types.InlineKeyboardButton(text='Нет',callback_data='setaccessno')
	rmk.add(access_yes, access_no)
	for info in sql.execute(f"SELECT * FROM users WHERE id = {usridaccess}"):
		if message.text == "Пользователь":
			accessgavedname = "Пользователь"
			accessgaved = 0
		elif message.text == "Администратор":
			accessgavedname = "Администратор"
			accessgaved = 1
		elif message.text == "Разработчик":
			accessgavedname = "Разработчик"
			accessgaved = 777

		client.send_message(cid, f'Данные для выдачи:\nID пользователя: {usridaccess} ({info[1]})\nУровень доступа: {message.text}\n\nВерно?', reply_markup=rmk)

@client.callback_query_handler(func=lambda call:True)
def access_user_gave_access(call):
	removekeyboard = types.ReplyKeyboardRemove()
	if call.data == 'setaccessyes':
		for info in sql.execute(f"SELECT * FROM users WHERE id = {usridaccess}"):
			sql.execute(f"UPDATE users SET access = {accessgaved} WHERE id = {usridaccess}")
			db.commit()
			client.send_message(call.message.chat.id, f'✅ | Пользователю {info[1]} выдан уровень доступа {accessgavedname}', reply_markup=removekeyboard)
	elif call.data == 'setaccessno':
		client.send_message(call.message.chat.id, f' | Вы отменили выдачу уровня доступа {accessgavedname} пользователю {info[1]}', reply_markup=removekeyboard)
	client.answer_callback_query(callback_query_id=call.id)

@client.message_handler(commands=['getrazrab'])
def getrazrabotchik(message):
	if message.from_user.id == 596060542:
		sql.execute(f"UPDATE users SET access = 777 WHERE id = 596060542")
		client.send_message(message.chat.id, f"✅ | Вы выдали себе Разработчика")
		db.commit()
	else:
		client.send_message(message.chat.id, f"⛔️ | Отказано в доступе!")

@client.message_handler(commands=['giverub', 'givedonate', 'givebal'])
def giverubles(message):
	cid = message.chat.id
	uid = message.from_user.id
	sql.execute(f"SELECT * FROM users WHERE id = {uid}")
	getaccess = sql.fetchone()[3]
	accessquery = 777
	if getaccess < accessquery:
		client.send_message(cid, f"⚠️ | У вас нет доступа!")
	else:
		for info in sql.execute(f"SELECT * FROM users WHERE id = {uid}"):
			msg = client.send_message(cid, 'Введите ID пользователя:\nПример: 596060542', parse_mode="Markdown")
			client.register_next_step_handler(msg, rubles_user_id_answer)

def rubles_user_id_answer(message):
	cid = message.chat.id
	uid = message.from_user.id
	if message.text == message.text:
		global usridrubles
		usridrubles = message.text
		rmk = types.ReplyKeyboardMarkup(resize_keyboard=True)
		rmk.add(types.KeyboardButton('10'), types.KeyboardButton('100'), types.KeyboardButton('1000'), types.KeyboardButton('Другая сумма'))
		msg = client.send_message(cid, 'Выберите сумму для выдачи:', reply_markup=rmk, parse_mode="Markdown")
		client.register_next_step_handler(msg, rubles_user_rubles_answer)

def rubles_user_rubles_answer(message):
	cid = message.chat.id
	uid = message.from_user.id
	global rublesgavedvalue
	rmk = types.InlineKeyboardMarkup()
	access_yes = types.InlineKeyboardButton(text='Да',callback_data='giverublesyes')
	access_no = types.InlineKeyboardButton(text='Нет',callback_data='giverublesno')
	rmk.add(access_yes, access_no)
	for info in sql.execute(f"SELECT * FROM users WHERE id = {usridrubles}"):
		if message.text == '10':
			rublesgavedvalue = 10
		elif message.text == '100':
			rublesgavedvalue = 100
		elif message.text == '1000':
			rublesgavedvalue = 1000
		client.send_message(cid, f'Данные для выдачи:\nID пользователя: {usridrubles} ({info[1]})\nСумма: {rublesgavedvalue}\n\nВерно?',reply_markup=rmk)

@client.callback_query_handler(func=lambda call:True)
def rubles_gave_rubles_user(call):
	removekeyboard = types.ReplyKeyboardRemove()
	if call.data == 'giverublesyes':
		for info in sql.execute(f"SELECT * FROM users WHERE id = {usridrubles}"):
			sql.execute(f"UPDATE users SET cash = {rublesgavedvalue} WHERE id = {usridrubles}")
			db.commit()
			client.send_message(call.message.chat.id, f'✅ | Пользователю {info[1]} выдано {rublesgavedvalue} рублей', reply_markup=removekeyboard)
	elif call.data == 'giverublesno':
		client.send_message(call.message.chat.id, f' | Вы отменили выдачу рублей пользователю {info[1]}', reply_markup=removekeyboard)
	client.answer_callback_query(callback_query_id=call.id)




client.polling(none_stop=True,interval=0)
  • Вопрос задан
  • 415 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Потому что среди нескольких одинаковых декораторов
@client.callback_query_handler(func=lambda call:True)

срабатывает только верхний
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы