/// <summary> /// Поменять состояние. /// </summary> /// <param name="bot"></param> /// <param name="state"></param> /// <param name="hop"></param> public static async void ChangeCurrentStateAndMakeHop(TelegramBotClient bot, long chatId, State state, Hop hop) { if (bot == null || hop == null || string.IsNullOrEmpty(hop.NextStateName)) { return; } //Отправить AnswerOnSuccess. if (state != null && string.IsNullOrEmpty(state.AnswerOnSuccess) == false) { await bot.SendTextMessageAsync(chatId, state.AnswerOnSuccess); } //Поменяем текущее состояние ChangeCurrentChatState(chatId, hop.Type, hop.NextStateName); //Когда состояние в базе поменяли, тогда нужно выслать приветствие в новом состоянии и клавиатуру нового состояния. State st = InitStates.GetStateByName(hop.NextStateName); //Формируем приветственное сообщение (не забываем подключить клавиатуру) OutboxMessage outMes = new OutboxMessage(st.IntroductionString); if (st.ReplyKeyboard != null) { outMes.ReplyMarkup = st.ReplyKeyboard; } else { outMes.ReplyMarkup = new ReplyKeyboardRemove(); } bot.SendOutboxMessage(chatId, outMes); }
/// <summary> /// Метод получения текущего состояния чата по ChatId /// </summary> /// <param name="chatId"></param> /// <returns></returns> public static State GetCurrentUserState(long chatId) { if (InitStates.BotStates?.Count == 0) { return(null); } using (BotDbContext db = new BotDbContext(HelperDataBase.DB_OPTIONS)) { //Выбираем состояние чата. ChatState chatState = (from state in db.ChatState where state.ChatId == chatId select state).FirstOrDefault(); string stateString = chatState.State; //Если состояние чата равно null if (string.IsNullOrEmpty(stateString?.Trim(' ')) == true) { //То записать в пустую ячейку состояния имя первого состояния. //ToDo Пока берем просто первый элемент из состояний, но нужно самому определять первый элемент. stateString = InitStates.BotStates.FirstOrDefault().Name; //ToDo изменить состояние(установить первое состояние, отправить приветствие, отправить клавиатуру через метод ChangeCurrentStateAndMakeHop //Изменить состояние в базе данных и сохранить изменения ChangeCurrentChatState(chatId, HopType.RootLevelHope, stateString); //chatState.State = stateString; //db.SaveChanges(); } //Найти в общем пуле состояний состояние с таким же именем. StateController stateCtrl = new StateController(stateString); return(InitStates.GetStateByName(stateCtrl.GetCurrentStateName())); } }