@Vrtop

Как сделать динамическую клавиатуру в tg-боте?

Я пытаюсь это сделать, есть база данных mysql, в которой записаны идентификатор пользователя, имя пользователя и его роль. При запуске скрипта все нормально, кнопки для каждого пользователя распределяются по мере необходимости, но когда я меняю роль одного из пользователей, в tg-боте ничего не меняется(не обновляется клавиатура у пользователя в зависимости от роли). Все это происходит до перезапуска самого скрипта. Есть ли какой-нибудь способ решить эту проблему? Код:
from aiogram import Bot, Dispatcher, executor, types
    import mysql.connector

    # Initialization of the bot and the dispatcher
    bot = Bot(token="Bot_token")
    dp = Dispatcher(bot)

    # Connecting to the MySQL database
    db = mysql.connector.connect(
        host="localhost",
        user="Goose",
        password="password",
database="users" # It is assumed that you have a "users" table with a "role" column
)
    cursor = db.cursor()

    # Function to get all users from the database
    def get_all_users():
        query = "SELECT id, name, role FROM users"
        cursor.execute(query)
        return cursor.fetchall()

    # Let's define a function for getting buttons depending on the user's role
    def get_buttons_for_role(role):
        if role == "admin":
            buttons = ["All users"]
elif role =="manager":
            buttons = ["Applications", "Moderation", "Suppliers"]
elif role == "members":
buttons = ["Send a post", "Posts", "Layout"]
elif role == "user":
            buttons = ["I want to cooperate", "Help"]
else:
buttons = []  # There are no buttons by default

        return buttons

    # Handler function for the "Show users" button
    async def show_users(message: types.Message, users):
response = "List of users:\n"
        for user in users:
            response += f"Name: {user[1]}, ID: {user[0]}, Role: {user[2]}\n"
await message.answer(response)

    # Handler for the /start command
    @dp.message_handler(commands=['start'])
    async def start(message: types.Message):
        user_id = message.from_user.id
# Getting the user role from the database
        cursor.execute("SELECT role FROM users WHERE id = %s", (user_id,))
        user_role = cursor.fetchone()[0]

        keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True, selective=True)

        # We get buttons depending on the user's role
        role_buttons = get_buttons_for_role(user_role)

        for button_text in role_buttons:
            keyboard.add(types.KeyboardButton(button_text))

        await message.answer("Select action:", reply_markup=keyboard)

    # Handler for the "All users" button
    @dp.message_handler(text="All users")
    async def handle_show_all_users(message: types.Message):
users = get_all_users() # Getting all users from the database
        await show_users(message, users)

    # Launching the bot
    if __name__ == '__main__':
        executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
nki
@nki
bezkart.ru готовая система лояльности
После смены роли пользователь выполнял команду /start?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы