Если просто: создайте базу данных (хоть SQLite), в которой будете хранить текущую "позицию" пользователя в диалоге
В логике приложения будете связывать ID диалога с пользователем в базе данных и получать текущую "позицию"
Затем, получив эту самую позицию, вступает в ход любимый хаос из if'ов или switch-case'ов
Переводя описание в псевдокод:
Пользователь пользователь = базаДанных.Пользователи.Где(пользователь.АйдиДиалога == айдиДиалогаПришедшегоСообщения);
если (пользователь == null)
{
# бла-бла
базаДанных.Пользователи.Добавить(новый Пользователь(айдиДиалогаПришедшегоСообщения));
}
иначе если (пользователь.Позиция == "начало"):
{
# бла-бла
пользователь.Позиция = "синтаксис";
}
иначе если (пользователь.Позиция == "синтаксис")
{
# бла-бла
пользователь.Позиция = "следующая позиция";
}
базаДанных.СохранитьИзменения();