/// <summary> /// Регистрация пользователя /// </summary> /// <param name="item">Сообщение пользователя</param> /// <param name="response">Ответ AI</param> public BotState?RegisterUser(VK.UserLongPoll.Update item, AIResponse response) { // Определение E-mail string email = response.Result.Parameters["email"].ToString(); // Сообщаем пользователю api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, string.Format("Начинаю регистрацию пользователя с адресом {0}", email)); // Поиск студента в базе данных if (db.Students.Where(a => a.Email == email).FirstOrDefault() != null) { api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, string.Format("Пользователь с таким E-mail уже зарегистрирован")); return(null); } // Запрос информации о пользователе VK.Users.Get.Response user = api.Users_Get(Program.Cfg.CommunityID, item.PeerID); // Создание нового объекта var s = new Storage.Student() { ID = Guid.NewGuid(), VKID = item.PeerID, FirstName = user.FirstName, LastName = user.LastName, Email = email }; db.Students.Add(s); // Сохраняем изменение в базе данных db.SaveChanges(); api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, string.Format("Пользователь успешно зарегистрирован")); return(null); }
/// <summary> /// Отправить сообщение, если пользователь прислал документ /// </summary> /// <param name="item"></param> /// <param name="response"></param> /// <returns></returns> public BotState?DocumentSent(VK.UserLongPoll.Update item, AIResponse response) { // Вывод сообщения в соответствии с распознанным действием api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, response.Result.Fulfillment.Speech); //api.Documents_GetById(Program.Cfg.CommunityID, item.DocId); return(null); }
/// <summary> /// Вывод пользователю инструкции по боту /// </summary> /// <param name="item"></param> /// <param name="response"></param> /// <returns></returns> public BotState?SendHelp(VK.UserLongPoll.Update item, AIResponse response) { // Вывод сообщения api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, "Вот команды: \n" + "1) Регистрация - введите свой email, чтобы я Вас запомнил\n" + "2) Отметиться - я запишу, что вы присутствовали на занятии, которое идет в данный момент\n" + "3) Создать лекцию - провести лекцию (только для администраторов!)"); return(null); }
/// <summary> /// Название нового урока /// </summary> /// <param name="item"></param> /// <param name="response"></param> /// <returns></returns> public BotState?addTopic(VK.UserLongPoll.Update item, AIResponse response) { // запись в память бота названия урока BotSession b = state[item.PeerID]; b.Topic = response.Result.Source; // вывод сообщения api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, response.Result.Fulfillment.Speech); return(null); }
/// <summary> /// Отправление боту время начала создаваемого урока /// </summary> /// <param name="item"></param> /// <param name="response"></param> /// <returns></returns> public BotState?AddBeginTime(VK.UserLongPoll.Update item, AIResponse response) { // запись в память бота начала урока string str = response.Result.Parameters["addBeginTime"].ToString(); BotSession b = state[item.PeerID]; b.BeginLesson = DateTime.Parse(str); // вывод сообщения api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, response.Result.Fulfillment.Speech); return(null); }
/// <summary> /// Добавление нового урока /// </summary> /// <param name="item"></param> /// <param name="response"></param> /// <returns></returns> public BotState?AddLesson(VK.UserLongPoll.Update item, AIResponse response) { VK.Groups.GetMembers.Response m = api.Groups_GetMembers(Program.Cfg.CommunityID, Program.Cfg.GroupId); // Вывод сообщения if (!m.items[0].id.ToString().Contains("61835649")) { api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, "Сожалею, но у вас нет прав на это действие"); return(BotState.None); } api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, response.Result.Fulfillment.Speech); return(null); }
/// <summary> /// Проверка наличия регистрации пользователя /// </summary> /// <param name="item">Сообщение пользователя</param> /// <param name="response">Ответ AI</param> public BotState?CheckUser(VK.UserLongPoll.Update item, AIResponse response) { Storage.Student s = db.Students.Where(a => a.VKID == item.PeerID).FirstOrDefault(); if (s != null) { api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, string.Format("{0} {1}, Вы уже зарегистрированы, E-mail: {2}", s.FirstName, s.LastName, s.Email)); // Отмена регистрации пользователя return(BotState.None); } // Вывод сообщения в соответствии с распознанным действием api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, response.Result.Fulfillment.Speech); // Переход к регистрации пользователя return(null); }
/// <summary> /// Отметка пользователя /// </summary> /// <param name="item">Сообщение пользователя</param> /// <param name="response">Ответ AI</param> /// <returns></returns> public BotState?CheckinUser(VK.UserLongPoll.Update item, AIResponse response) { // время отправки запроса DateTime now = DateTime.Now; // проверка на прошедших регистрацию Storage.Student s = db.Students.Where(a => a.VKID == item.PeerID).FirstOrDefault(); if (s == null) { api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, "Вас нет в списке"); return(BotState.None); } // проверка на время занятий Storage.Lesson l = db.Lessons.Where(n => now > n.BeginLesson && now < n.EndLesson).FirstOrDefault(); if (l == null) { api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, "Сейчас не идут занятия"); return(BotState.None); } // проверка на повторное отмечание Storage.Attendance att = db.Attendances.Where(x => x.Lesson.ID == l.ID && x.Attendant.ID == s.ID).FirstOrDefault(); if (att != null) { api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, "Вы уже отметились на занятии!"); return(BotState.None); } // заполнение отметки студентов Storage.Attendance at = new Storage.Attendance() { ID = Guid.NewGuid(), timestamp = now, Attendant = s, Lesson = l }; // сохранение данных в базу db.Attendances.Add(at); db.SaveChanges(); // Вывод сообщения в соответствии с распознанным действием api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, response.Result.Fulfillment.Speech); return(null); }
/// <summary> /// Отправлению боту длительность урока /// </summary> /// <param name="item"></param> /// <param name="response"></param> /// <returns></returns> public BotState?addDuration(VK.UserLongPoll.Update item, AIResponse response) { // запись в память бота длительности урока string str = response.Result.Parameters["number"].ToString(); BotSession b = state[item.PeerID]; b.Durability = Convert.ToInt32(str); Storage.Lesson l = new Storage.Lesson() { ID = Guid.NewGuid(), Topic = b.Topic, BeginLesson = b.BeginLesson, EndLesson = b.BeginLesson.AddHours(b.Durability) }; // сохранение данных в базу db.Lessons.Add(l); db.SaveChanges(); // вывод сообщения api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, response.Result.Fulfillment.Speech); return(BotState.None); }
/// <summary> /// Обработка нового текстового сообщения /// </summary> /// <param name="item">Сообщение от пользователя</param> private void ProcessTextMessage(VK.UserLongPoll.Update item) { AIResponse response; Action action; // Определение текущего состояния пользователя BotState state = GetState(item.PeerID); // специальная обработка добавления названия лекции if (state == BotState.AddLesson) { response = CreateResponse(item.Text, "Введи время проведения лекции", Action.addTopic.ToString()); } else { // Обработка естественной речи искусственным интеллектом if (string.IsNullOrWhiteSpace(item.Text)) { // на входе пустая строка response = CreateResponse(item.Text, "Получен документ", "Document"); } else { response = ai.TextRequest(item.Text); } } // Определение действия пользователя action = (Action)Enum.Parse(typeof(Action), response.Result.Action, true); // Поиск возможного перехода MachineState ms = Program.Cfg.State.Where(a => a.InitialState == state && a.Action == action).FirstOrDefault(); if (ms == null) { string s = String.Format("Не найден переход {0} -> {1}", state, action); api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, s); } else { // Следующее состояние BotState?nextState = null; // Проверка необходимости вызова метода if (!string.IsNullOrEmpty(ms.Method)) { string[] methods = ms.Method.Split(','); foreach (string method in methods) { System.Reflection.MethodInfo info = GetType().GetMethod(method); if (info == null) { api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, "Метод не найден: " + method); } else { // Вызов метода по имени nextState = (BotState?)info.Invoke(this, new object[] { item, response }); } } } // Переход в новое состояние SetState(item.PeerID, nextState ?? ms.NextState); } }
/// <summary> /// Отправить сообщение о непонятном содержимом /// </summary> /// <param name="item">Сообщение пользователя</param> /// <param name="response">Ответ AI</param> public BotState?SendUnknown(VK.UserLongPoll.Update item, AIResponse response) { // Вывод сообщения api.Messages_SendMessage(Program.Cfg.CommunityID, item.PeerID, "Не совсем понятно, зачем мне это сейчас"); return(null); }