псевдокод:
on("joined")(user_id id)
{
bool passed = co_await user_passed(id);
bool kick_nawhooy = co_await std::chrono::seconds(30);
if (passed)
{
set_chat_permissions(last_states[id]);
}
else
{
post(kickChatMember, id);
}
Ну и + внешней БД, что можешь корутинный стейт хранить в БД и корректно переподниматься, когда сервис упал