@TyGGer4ik

Я хочу создать обработчик принятых приглашений. Как я могу это сделать?

При написании бота я столкнулся с тем, что если я использую @bot.message_handler(content_types=['text']) внутри @bot.message_handler(content_types=['text']), то "внутренний" обработчик не исполняет функцию. Чем можно заменить его? Ниже я привел фрагмент кода, нуждающийся в доработке
import telebot
import datetime
import time
import random
from config import TOKEN,  tic_tac_players_usernames,  tic_tac_players_chat_ids
#в config у меня хранятся список username-ов(tic_tac_players_usernames) и словарь с ключами из username-ов и значениями из их chat_id
from telebot import types

bot = telebot.TeleBot(token=TOKEN)
@bot.message_handler(commands=['start'])
def start(message):
    keyboard_1 = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_1 = types.KeyboardButton('Точное время')
    button_2 = types.KeyboardButton('Случайное число')
    button_3 = types.KeyboardButton('Калькулятор')
    button_4 = types.KeyboardButton('Крестики нолики')
    keyboard_1.add(button_1, button_2, button_3, button_4)
    mesage = 'Привет' + ' ' + message.from_user.first_name
    bot.send_message(message.chat.id, mesage, parse_mode='html', reply_markup=keyboard_1)

@bot.message_handler(content_types=['text'])
def random_and_time_and_calc_and_tic_tac(message):
    if message.chat.type == 'private':
        if message.text == 'Точное время':
            datetime_now = datetime.datetime.now()
            time_now = str(datetime_now.time())
            time_now = time_now[:-7]
            bot.send_message(message.chat.id, time_now, parse_mode='html')
        elif message.text == 'Случайное число':
            bot.send_message(message.chat.id, str(random.randint(1, 100)))
#=============================================================== здесь
        elif message.text == 'Калькулятор':
            bot.send_message(message.chat.id, 'Введите любой пример или математическое действие')
            def calc(message):
                if '+' in message.text or '-' in message.text or '/' in message.text or '*' in message.text or '**' in message.text:
                    bot.send_message(message.chat.id, message.text + ' ' + '=' + ' ' +  str(eval(message.text)))
                    print( message.text + ' ' + '=' + ' ' +  str(eval(message.text)))
                else:
                    bot.send_message(message.chat.id, 'Неверный формат')
            bot.register_next_step_handler(message, calc)
        elif message.text == 'Крестики нолики':
            max_players = 2
            reg_players = 0
            keyboard_2 = types.ReplyKeyboardMarkup(resize_keyboard=True)
            button_999 = 'Принять приглашение'
            keyboard_2.add(button_999)
            players_list = []
            for i in tic_tac_players_usernames:
                players_list.append(tic_tac_players_chat_ids.get(i))
            while reg_players < max_players:
                for i in players_list:
                    print(players_list)
                    print(i)
                    print(message.chat.id)
                    bot.send_message(i, message.from_user.first_name + ' ' + 'приглашает вас поиграть в крестики нолики', reply_markup=keyboard_2)
                time.sleep(30)
                for j in players_list:
#я хочу создать список из chat.id принятых игроков(двух игроков, которые нажмут на кнопку button_999) - это главная задача
#и в идеале далее отправить всем пользователям в созданном списке сообщение с матричной клавиатурой 3 на 3 из пустых кнопок и изменять их при нажатии на x если chat_id пользователя в списке имеет индекс 0 и на 0 если индекс 1
  • Вопрос задан
  • 37 просмотров
Пригласить эксперта
Ответы на вопрос 1
i229194964
@i229194964
Веб разработчик
можно использовать словарь, где ключами будут chat_id игроков, а значениями - булевские переменные, показывающие, приняли ли они приглашение или нет. Начальное значение всех значений в словаре можно установить на False.
accepted_invites = {}  # словарь для хранения информации о том, принял ли игрок приглашение или нет

@bot.message_handler(func=lambda message: True)
def handle_all_messages(message):
    chat_id = message.chat.id

    if message.text == "Принять приглашение":
        if chat_id in accepted_invites:
            if accepted_invites[chat_id]:
                bot.send_message(chat_id, "Вы уже приняли приглашение.")
            else:
                bot.send_message(chat_id, "Вы приняли приглашение. Ожидайте начала игры.")
                accepted_invites[chat_id] = True

                # проверяем, приняли ли оба игрока приглашение
                if all(accepted_invites.values()):
                    # начинаем игру
                    start_game()
        else:
            bot.send_message(chat_id, "Вы не получили приглашение на игру.")

def start_game():
    # список chat_id игроков, которые приняли приглашение
    players = [chat_id for chat_id, accepted in accepted_invites.items() if accepted]

    # здесь можно продолжить реализацию логики игры
Ответ написан
Ваш ответ на вопрос

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

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