@maximblock

(aiogram) Как запретить доступ к инлайн кнопке другим пользователям кроме указанного?

Сразу извиняюсь за глупый вопрос. Смотрите в чем проблема: пишу бота "Русская рулетка", после команды надо ставить никнейм своего соперника, после чего в чат показывается сообщение с двумя кнопками. Одна "Принять", другая "Не принимать". Надо сделать так, чтобы при нажатии кнопки бот проверял айди и сравнивал его с указанным. Нужная строка вот:
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor

from config import TOKEN

bot = Bot(token=TOKEN)
dp = Dispatcher(bot)


@dp.message_handler(commands="ruletkaid")
async def inlinebtn(message: types.Message):
    user1 = str(message.get_args())
    user2 = str(message.from_user.username)
    return user1
    keyboard = types.InlineKeyboardMarkup()
    keyboard.add(types.InlineKeyboardButton(text="Принять", callback_data="random_value"))
    keyboard.add(types.InlineKeyboardButton(text="Не принимать", callback_data="da", ))
    await message.answer(user1 + ', вас вызывает на дуэль ' + user2, reply_markup=keyboard)


@dp.callback_query_handler(text="random_value")
async def send_random_value(call: types.CallbackQuery):
    global user1
    userid = call.message.from_user.username
    if userid != user1:
        await call.answer(text="Не тебе адресовано.", show_alert=True)
        return False
    await call.answer(text="Код сработал.", show_alert=True)


@dp.callback_query_handler(text="da")
async def send_random_value(call: types.CallbackQuery):
    await call.reply.edit(text="Вы не приняли предложение противника.")

Вот. Надеюсь, что вы поможете. Заранее спасибо.
  • Вопрос задан
  • 837 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
return user1
вот это вообще не понял

Помещаете username пользователей в callback_data. В обработчике достаете их username из data и сравниваете с нажавшим кнопку.

@dp.message_handler(commands="ruletkaid")
async def inlinebtn(message: types.Message):
    user1 = message.get_args()
    user2 = message.from_user.username
    keyboard = types.InlineKeyboardMarkup()
    keyboard.add(types.InlineKeyboardButton(text="Принять", callback_data=f"accept_{user1}:{user2}"))
    keyboard.add(types.InlineKeyboardButton(text="Не принимать", callback_data=f"decline_{user1}:{user2}"))
    await message.answer(user1 + ', вас вызывает на дуэль ' + user2, reply_markup=keyboard)


@dp.callback_query_handler(lambda call: call.data.startswith('accept_'))
async def accept_duel(call: types.CallbackQuery):

    user1, user2 = call.data.replace('accept_', '', 1).split(':')

    if call.from_user.username != user1:
        await call.answer(text="Не тебе адресовано.", show_alert=True)


Не проверял, но, по идее, работает
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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