Как записать юзера при нажатии на кнопку
У меня есть две кнопки в лабе и не в лабе мне нужно что бы при нажатии этих кнопок записывал кто в лабе и кто нет, а при нажатии кто в лабе выводил кто там.
Код:
import telebot
from telebot import types
bot = telebot.TeleBot('hide')
@bot.message_handler(commands=['start'])
def welcome(message):
sti = open('static/welcome.webp', 'rb')
bot.send_sticker(message.chat.id, sti)
# Создание кнопок и приветствие
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton("Кто в лабе")
item2 = types.KeyboardButton("подтвердить")
item3 = types.KeyboardButton("? Разработчики ?")
markup.add(item1, item2, item3)
bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>, помогу тебе ворваться в лабу!".format(message.from_user, bot.get_me()),
parse_mode='html', reply_markup=markup)
@bot.message_handler(content_types=['text'])
def lalala(message):
if message.chat.type == 'private':
if message.text == 'подтвердить':
markup = types.InlineKeyboardMarkup(row_width=2)
item1 = types.InlineKeyboardButton("ты в лабе⚡",callback_data='1')
item2 = types.InlineKeyboardButton("ты не в лабе⚡", callback_data='2')
markup.add(item1, item2)
bot.send_message(message.chat.id, 'Добро пожаловать,\n ты в лабе или нет")', reply_markup=markup)
elif message.text == "? Информация ?":
bot.send_message(message.chat.id, " ? Мы работаем в сфере создания треков уже 4 года." +
" Наша профессиональная команда готова помочь вам с любыми музыкальными трудностями, мы обладаем лучшей аппаратурой для выполнений всех" +
" задач в сфере музыкального продюсирования. Наши услуги дают возможность максимально индивидуализировать продукт под себя.")
elif message.text == "? Разработчики ?":
bot.send_message(message.chat.id, '? Данный бот был разработан <b>LimeGeeg Corporation™️</b> & <b>Cat️</b>, || <b>YouTube: LimeGeeg️</b>', parse_mode='html')
else:
bot.send_message(message.chat.id, 'По другим вопросам пишите сюда → @Seapix')
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
try:
if call.message:
# keyboard (Работа с кнопками под текстом)
if call.data == '1':
bot.send_message(call.message.chat.id, '? Пишите сюда → @Seapix')
elif call.data == '2':
bot.send_message(call.message.chat.id, '? Пишите сюда → @Seapix')
elif call.data == '3':
bot.send_message(call.message.chat.id, '? Пишите сюда → @Seapix')
elif call.data == '4':
bot.send_message(call.message.chat.id, '? Пишите сюда → @Seapix')
# remove inline buttons
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Спасибо! ?",
reply_markup=None,)
# show alert
bot.answer_callback_query(callback_query_id=call.id, show_alert=False,
text="Пишите, всегда поможем!")
except Exception as e:
print(repr(e))
bot.polling(none_stop=True)
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
Попробуй
# так как у тебя нет бд обойдемся словарем
# ПыСы. при перезапуске бота данные пропадут.
# Ты либо их записывай в файл либо переходи на aiogram
users = {}
@bot.message_handler(commands=['start'])
def welcome(message: types.Message):
# при нажатии на старт, сделаем запись юзера в нашу "бд"
# PS если юзер нажмет ещё раз, то ничего не произойдет (если юзер записан в бд)
users.setdefault(message.from_user.id, {"in_lab": None})
# не делайте так. Вы не закрываете файл, могут быть тупые ошибки.
# sti = open('static/welcome.webp', 'rb')
# делайте так
with open('static/welcome.webp', 'rb') as sticker:
bot.send_sticker(message.chat.id, sticker=sticker)
# Создание кнопок и приветствие
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
# рекомендую сократить код с этого
# item1 = types.KeyboardButton("Кто в лабе")
# item2 = types.KeyboardButton("подтвердить")
# item3 = types.KeyboardButton("? Разработчики ?")
# markup.add(item1, item2, item3)
# до такого
markup.add("Кто в лабе", "Подтвердить", "? Разработчики ?")
# забудьте про format, юзайе f-строки
# bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>,
# помогу тебе ворваться в лабу!".format( message.from_user, bot.get_me()),
# parse_mode='html', reply_markup=markup)
bot.send_message(chat_id=message.chat.id,
text=f"Добро пожаловать, {message.from_user.first_name}!\n"
f"Я - <b>{bot.get_me().first_name}</b>, помогу тебе ворваться в лабу!",
parse_mode='html',
reply_markup=markup)
# прекратите так делать. Делайте для каждой команды отдельный хендлер
# @bot.message_handler(content_types=['text'])
# PS также смысла писать content_types=['text'] нет, так как это значение по-умолчанию
# и уберите это условие в фильтр декоратора так ведь лучше
# if message.chat.type == 'private':
# а все свои if message.text == '...': также запихните в фильтр декоратора
@bot.message_handler(chat_types='private', func=lambda msg: msg.text == "Подтвердить")
def accept(message: types.Message):
markup = types.InlineKeyboardMarkup(row_width=2)
# я поменял колбеки, чтобы потом их было проще ловить и фильтровать от других
item1 = types.InlineKeyboardButton("Ты в лабе⚡", callback_data='labs:add')
item2 = types.InlineKeyboardButton("Ты не в лабе⚡", callback_data='labs:delete')
markup.add(item1, item2)
bot.send_message(message.chat.id, 'Добро пожаловать,\n ты в лабе или нет")', reply_markup=markup)
@bot.message_handler(chat_types='private', func=lambda msg: msg.text == "? Информация ?")
def info(message: types.Message):
bot.send_message(chat_id=message.chat.id,
text=" ? Мы работаем в сфере создания треков уже 4 года. "
"Наша профессиональная команда готова помочь вам с любыми музыкальными трудностями, мы "
"обладаем лучшей аппаратурой для выполнений всех задач в сфере музыкального продюсирования. "
"Наши услуги дают возможность максимально индивидуализировать продукт под себя.")
@bot.message_handler(chat_types='private', func=lambda msg: msg.text == "? Разработчики ?")
def devs(message: types.Message):
bot.send_message(message.chat.id,
'? Данный бот был разработан <b>LimeGeeg Corporation™️</b> & '
'<b>Cat️</b>, || <b>YouTube: LimeGeeg️</b>',
parse_mode='html')
# делаем хендлер для вывода инфы о том кто в "лабе"
@bot.message_handler(chat_types='private', func=lambda msg: msg.text == "Кто в лабе")
def output_labs_data(message: types.Message):
# перебираем "бд" и записываем тех у кого True
list_labs_users = []
for key, value in users.items():
if isinstance(value, dict):
if value.get("in_lab") is True:
list_labs_users.append(key)
result_text = "В лабе:\n"
for user in list_labs_users:
user_data = bot.get_chat_member(chat_id=user, user_id=user)
print(user_data)
result_text += f"{user_data.user.first_name}\n"
bot.send_message(message.chat.id, text=result_text)
# и вот в конец даешь хендлер который впитывает все, но я бы его убрал - бесполезная нагрузка
@bot.message_handler(chat_types='private')
def take_all_message(message: types.Message):
bot.send_message(message.chat.id, 'По другим вопросам пишите сюда → @Seapix')
# этот хендлер хоть и есть в документации, но делать так не надо
# @bot.callback_query_handler(func=lambda call: True)
@bot.callback_query_handler(func=lambda call: call.data.startswith("labs:"))
def labs_callback(call: types.CallbackQuery):
# всегда в начале делай answer_callback_query, чтобы пропал значок с часами
bot.answer_callback_query(call.id)
data = call.data.split(":")[1]
# вне зависимосте от того жал юзер старт или нет перестрахуемся и еще раз запишем в бд
users.setdefault(call.from_user.id, {"in_lab": None})
# если жмакнул кнопку в лабе то делаем True если нет то False
users[call.from_user.id]["in_lab"] = True if data == "add" else False
if __name__ == '__main__':
bot.infinity_polling(skip_pending=True)