1parahon, если первое - не проблема, ты можешь сохранять в user_id в глобальную переменную и потом читать её. Но имей ввиду, что если поступит несколько запросов прежде чем ты ответишь - все, кроме последнего, будут потеряны.
Второе - читай пример, разбирайся. Если основные моменты, то:
markup = InlineKeyboardMarkup() # создаём клавиатуру
btn1 = InlineKeyboardButton( # создаём кнопку
"Да", # что будет написано на кнопке
# скрытая строка, которую пользователь не увидит
callback_data=f"yes:{message.chat.id}" # в ней кодируем ответ и id пользователя.
)
btn2 = InlineKeyboardButton( # создаём кнопку
"Нет", # что будет написано на кнопке
# скрытая строка, которую пользователь не увидит
callback_data=f"no:{message.chat.id}" # в ней кодируем ответ и id пользователя.
)
markup.add(btn1, btn2) # довешиваем кнопку на клавиатуру
bot.send_message( # клавиатуру всегда отправляем вместе с сообщением
message.chat.id, # кому?
"Yes/no?", # текст сообщения
reply_markup=markup # прикрепляемая клавиатура
)
А когда нужно будет обработать кнопку:
# говорим, что этот обработчик будет обрабатывать ТОЛЬКО кнопки "Да",
# так как у них всех скрытая строка (call.data) начинается с "yes:"
@bot.callback_query_handler(func=lambda call: call.data.startswith("yes:"))
def callback_yes(call):
user_id = int(call.data[len("yes:"):]) # убираем yes: из начала, оставляя только user_id
... # тут делаешь реакцию на "да"
# а этот обработчик будет обрабатывать ТОЛЬКО кнопки "Нет",
# так как у них всех скрытая строка (call.data) начинается с "no:"
@bot.callback_query_handler(func=lambda call: call.data.startswith("no:"))
def callback_no(call):
user_id = int(call.data[len("no:"):]) # убираем no: из начала, оставляя только user_id
... # тут делаешь реакцию на "нет"
Это в общих чертах, код нужно будет доработать под себя.
1parahon, а, блин. Я тупой. =)
Когда ты нажимаешь на "Да", это отдельное сообщение - отправленное от тебя!
Т.е. server() вызывается дважды, один раз для запустившего (после выбора карты), второй раз для тебя (ответ да или нет). Это, к слову, несёт в себе ещё одну проблему - если два человека попросят запустить сервер одноврнменно, боту будет тяжело понять, на чей запрос ты ответил.
Тебе надо использовать не ReplyKeyboardMarkup, а InlineKeyboardMarkup, так как там можно привязать к кнопке дополнительную инфу (строку), по которой бот сможет потом понять, к какому сообщению относилась кнопка.
1parahon, так, минутку. У меня глупый вопрос: ты проверяешь бота с того же аккаунта (1910413638)? Тогда оба значения будут совпадать "естественно", так как сообщение пришло от тебя.
А как искал? Если искать "а ну сделал мне админ панель в телебот!", то конечно не найдешь.
Ты уже сделал какую-никакую декомпозицию задачи:
1. принять сообщение от пользователя
2. переслать сообщение админу
2.1 добавить к нему кнопки "принять"/"отказать"
3. отреагировать на нажатие кнопки
4. понять, какому сообщению соответстовала нажатая кнопка
5. ответить на это сообщение
Вот и ищи инфу по каждому из пунктов. Какой вызывает затруднение?
dem171, ну можно и упростить всё тоже, например, как выше привели код.
Главная идея - смотри время от времени на свой код со стороны решаемой задачи, и формулируй, какую часть этой задачи должен решать тот или иной метод.
1. Оформляем код по правилам сайта. Кнопка </> в помощь.
2. Описываем русским языком, какую проблему решаем. То, что в заголовке вопроса, не слишком-то понятно.
dvrr, да не в этом проблема-то. У тебя поиск не находит элемент - значит, ты что-то напутал либо в данных для поиска, либо в хранилище. А уж как доставать найденное - дело десятое.
dvrr,
1. Ну так логично. Ты получаешь курсор, его надо перебрать или циклом for, или отправить в list(), если тебе нужны все данные сразу.
2. Я не знаю, что такое message.guild.id, но если это дискордовский id, он вроде и так int. А в базе он тоже как int хранится?
3. У тебя вот прямо гильдия с id 1234567890?
Я не очень понял, почему сроки горят - ИМХО такую ошибку ты поймал бы уже при попытке установить обе либы в одном окружении, т.е. в самом начале разработки.
В общем, единственное, что мне приходит в голову - срочно лепить недосервисную архитектуру и разносить код по двум проектамс разными окружениями. Отдельно - то, что работает с vkbottle, отдельно - то, что работает с aiogram. Связь по какому-нибудь API, например, fastapi на ведомой стороне, и requests/aiohttp на ведущей.
dvrr, повторяю для одарённых: не знаешь как самостоятельно сделать что-то - сначала поищи, как это делается в существующих библиотеках, и сделай по аналогии. Тебе не обязательно их использовать, чтобы на их примере понять, как работать с соответствующим API. Тут я уже за тебя поиск выполнил, разжевал и в рот положил.
Второе - читай пример, разбирайся. Если основные моменты, то:
А когда нужно будет обработать кнопку:
Это в общих чертах, код нужно будет доработать под себя.