Size: a a a

pyTelegramBotAPI.talks.ru

2020 September 29

НШ

Никита Шаповалов... in pyTelegramBotAPI.talks.ru
Всем привет))
Вопрос по недокументированному poll_answer_handler

Как можно по-человечески переключаться между ним и другими message_handler, если функции под декоратором @bot.poll_answer_handler() не понимают аргумент message? То есть bot.register_next_step_handler нельзя использовать.


У меня получилось продолжать беседу, как только юзер проголосует (без доп. сообщений) с помощью объявления глобальной переменной в функции answer-handler, НО

Вместе с опросом я присылаю юзеру кнопку «Назад». И вернувшись на пару шагов и снова придя к этому опросу (я даже использую forward_message, а не высылаю новый опрос) - poll_answer_handler не хочет срабатывать категорически.
Как можно его уверенно вызвать из функции message_handler и желательно вернуться из него к след. message_handler?
источник

ダーリン (Darling)... in pyTelegramBotAPI.talks.ru
Никита Шаповалов
Всем привет))
Вопрос по недокументированному poll_answer_handler

Как можно по-человечески переключаться между ним и другими message_handler, если функции под декоратором @bot.poll_answer_handler() не понимают аргумент message? То есть bot.register_next_step_handler нельзя использовать.


У меня получилось продолжать беседу, как только юзер проголосует (без доп. сообщений) с помощью объявления глобальной переменной в функции answer-handler, НО

Вместе с опросом я присылаю юзеру кнопку «Назад». И вернувшись на пару шагов и снова придя к этому опросу (я даже использую forward_message, а не высылаю новый опрос) - poll_answer_handler не хочет срабатывать категорически.
Как можно его уверенно вызвать из функции message_handler и желательно вернуться из него к след. message_handler?
А я просто использую шаги в базе данных а не register next step :D
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Никита Шаповалов
Всем привет))
Вопрос по недокументированному poll_answer_handler

Как можно по-человечески переключаться между ним и другими message_handler, если функции под декоратором @bot.poll_answer_handler() не понимают аргумент message? То есть bot.register_next_step_handler нельзя использовать.


У меня получилось продолжать беседу, как только юзер проголосует (без доп. сообщений) с помощью объявления глобальной переменной в функции answer-handler, НО

Вместе с опросом я присылаю юзеру кнопку «Назад». И вернувшись на пару шагов и снова придя к этому опросу (я даже использую forward_message, а не высылаю новый опрос) - poll_answer_handler не хочет срабатывать категорически.
Как можно его уверенно вызвать из функции message_handler и желательно вернуться из него к след. message_handler?
Просто степхендлеры говно, юзай стейты
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Хотя я не до конца прочитал твое сообщение...
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Но ответ универсален, когда заходит речь о степхендлерах...
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Переслано от George Forse
I wouldn't recommend using step handlers at all, btw, it's better to use fsm
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Переслано от Kirill
What is “fsm”?
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Переслано от George Forse
Finite state machine.
As basic explanation:
For example, bot needs to get from user his age and sends him message "write your age?", now logically next message from him is interpreted as his age, sooo for example you have a storage, as basic possibility let's make it just a dictionary with name my_fsm, you save a state to it my_fsm[chat_id][user_id]["current_state"] = "waiting_for_age", and you have a handler in your code:
@bot.message_handler(func=lambda m: my_fsm[m.chat.id][m.from_user.id]["current_state"] == "waiting_for_age")
def get_age(m):
   ...


It is really a very simple example, which you shouldn't use just as it is, because it will cause problems.
(Also you could use aiogram, it already has a very good implementation of fsm, it is not a must however)
There is an implementation of fsm in this repository, if you want to learn more about it.
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Переслано от Nima Faraji
why you don't write someThing like this ?

...
bot.send_message(msg.chat.id,"send age")
bot.register_next_step_handler (msg, age_input)

def age_input(msg):
    age = msg.text
...

in
some other way to ask my question :
why next step handler is not recomended ?
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Переслано от George Forse
Because step handlers have many limitations.

Also they don't save the order of handlers checking.
So, if now bot is waiting for user's age, and user sends "/cancel" it will interpret as user's age, however with fsm you could write a handler for /cancel, sooner then handler to get user's age, and you may simply like that understand that IT IS NOT USER'S AGE, because, obviously, it's a command /cancel... And it's just example, may be your bot needs more other handlers to be over step handlers...
источник

НШ

Никита Шаповалов... in pyTelegramBotAPI.talks.ru
Понял/принял
А сами states же необязательно хранить в БД?
Можно просто создать class  States в программе и писать что-то вроде

@bot.message_handler(func=lambda message: States.currnet_state == "waiting_for_age")
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Никита Шаповалов
Понял/принял
А сами states же необязательно хранить в БД?
Можно просто создать class  States в программе и писать что-то вроде

@bot.message_handler(func=lambda message: States.currnet_state == "waiting_for_age")
Да, можно хранить в памяти спокойно, если ты об этом
источник

F

FBR.ΛɣΘʗAŦʘ in pyTelegramBotAPI.talks.ru
Никита Шаповалов
Всем привет))
Вопрос по недокументированному poll_answer_handler

Как можно по-человечески переключаться между ним и другими message_handler, если функции под декоратором @bot.poll_answer_handler() не понимают аргумент message? То есть bot.register_next_step_handler нельзя использовать.


У меня получилось продолжать беседу, как только юзер проголосует (без доп. сообщений) с помощью объявления глобальной переменной в функции answer-handler, НО

Вместе с опросом я присылаю юзеру кнопку «Назад». И вернувшись на пару шагов и снова придя к этому опросу (я даже использую forward_message, а не высылаю новый опрос) - poll_answer_handler не хочет срабатывать категорически.
Как можно его уверенно вызвать из функции message_handler и желательно вернуться из него к след. message_handler?
Ты можешь юзать *.register_next_step_handler_by_chat_id
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
George Forse
Переслано от George Forse
Finite state machine.
As basic explanation:
For example, bot needs to get from user his age and sends him message "write your age?", now logically next message from him is interpreted as his age, sooo for example you have a storage, as basic possibility let's make it just a dictionary with name my_fsm, you save a state to it my_fsm[chat_id][user_id]["current_state"] = "waiting_for_age", and you have a handler in your code:
@bot.message_handler(func=lambda m: my_fsm[m.chat.id][m.from_user.id]["current_state"] == "waiting_for_age")
def get_age(m):
   ...


It is really a very simple example, which you shouldn't use just as it is, because it will cause problems.
(Also you could use aiogram, it already has a very good implementation of fsm, it is not a must however)
There is an implementation of fsm in this repository, if you want to learn more about it.
Тут в примере так и сделано сбсна
источник

F

FBR.ΛɣΘʗAŦʘ in pyTelegramBotAPI.talks.ru
Можете унаследовать TeleBot и навернуть свою реализацию get_update и некст степов.
источник

НШ

Никита Шаповалов... in pyTelegramBotAPI.talks.ru
George Forse
Да, можно хранить в памяти спокойно, если ты об этом
Тогда правильно понял, что на каждую функцию в идеале писать свой декоратор?)
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Кстати, появилась охуенная идея для разрабов телеги, а то всякую хуйню делают, а вот это хоть немного полезно:
chat_action выборочно для юзеров, и типа, если я выбрал реплай и начал писать, то юзеру, которому реплай такое xxx is replying to you...
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
George Forse
Кстати, появилась охуенная идея для разрабов телеги, а то всякую хуйню делают, а вот это хоть немного полезно:
chat_action выборочно для юзеров, и типа, если я выбрал реплай и начал писать, то юзеру, которому реплай такое xxx is replying to you...
@durov чекай чё придумал, а то говно пилите какое-то, заебали
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Никита Шаповалов
Тогда правильно понял, что на каждую функцию в идеале писать свой декоратор?)
Ээ, чет я не особо-то понял вопрос
источник

GF

George Forse in pyTelegramBotAPI.talks.ru
Декорировать все функции в коде? Да нет, необязательно...
источник