Пример #1
0
        /// <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);
        }
Пример #2
0
 /// <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);
 }
Пример #3
0
 /// <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);
 }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
 /// <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);
 }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        /// <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);
            }
        }
Пример #11
0
 /// <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);
 }