예제 #1
0
        /// <summary>
        /// "-nopreload" - prevents loading shedules on start
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Json_Data.ReadData();
            KeyboardInit();
            TeachersInit();
            GradeInit();
            if (!(Environment.GetCommandLineArgs().Length > 1 && Environment.GetCommandLineArgs()[1] == "-nopreload"))
            {
                TeachersShedInit();
                GroupShedListInit();
            }
            GetElectives();

            BOT = new Telegram.Bot.TelegramBotClient(ReadToken());
            logger.Info("Подключен бот.");
            BOT.OnMessage += BotOnMessageReceived;

            BOT.StartReceiving(new UpdateType[] { UpdateType.Message });
            Scheduler.RunNotifier().GetAwaiter().GetResult();
            logger.Info("Ожидает сообщений...");

            Console.CancelKeyPress += OnExit;
            _closing.WaitOne();
        }
예제 #2
0
        /// <summary>
        /// Registration of new user in bot's DB
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        static string Registration(Telegram.Bot.Types.Message msg)
        {
            //TODO: Replace switch by msg to switch by user.ident
            string Answer = "Введены неверные данные, повторите попытку.";

            msg.Text = msg.Text.ToLower();

            switch (msg.Text)
            {
            case "/start":
                if (UserList[msg.Chat.Id].ident == 0)
                {
                    UserList[msg.Chat.Id].id = msg.Chat.Id;          //Запись айди

                    logger.Info($"ID: {msg.Chat.Id.ToString()}, регистрация: иницирована.");

                    Answer = "Вы бакалавр, магистр, аспирант или преподаватель?";
                    UserList[msg.Chat.Id].ident++;
                }
                else
                {
                    Answer = "Введены неверные данные, повторите попытку.";
                }
                break;

            case "аспирант":
                if (UserList[msg.Chat.Id].ident == 1)
                {
                    UserList[msg.Chat.Id].Info = User.UserInfo.graduate;     //Запись данных
                    Answer = "Напиши номер курса и группы через точку. (x.x)";

                    logger.Info($"ID: {msg.Chat.Id.ToString()}, регистрация: записан тип пользователя - {UserList[msg.Chat.Id].Info.ToString()}.");

                    UserList[msg.Chat.Id].ident++;
                }
                else
                {
                    Answer = "Введены неверные данные, повторите попытку.";
                }
                break;

            case "бакалавр":
                if (UserList[msg.Chat.Id].ident == 1)
                {
                    UserList[msg.Chat.Id].Info = User.UserInfo.bachelor;      //Запись данных
                    Answer = "Напиши номер курса и группы через точку. (x.x)";

                    logger.Info($"ID: {msg.Chat.Id.ToString()}, регистрация: записан тип пользователя - {UserList[msg.Chat.Id].Info.ToString()}.");

                    UserList[msg.Chat.Id].ident++;
                }
                else
                {
                    Answer = "Введены неверные данные, повторите попытку.";
                }
                break;

            case "магистр":
                if (UserList[msg.Chat.Id].ident == 1)
                {
                    UserList[msg.Chat.Id].Info = User.UserInfo.master;      //Запись данных
                    Answer = "Напиши номер курса и группы через точку. (x.x)";

                    logger.Info($"ID: {msg.Chat.Id.ToString()}, регистрация: записан тип пользователя - {UserList[msg.Chat.Id].Info.ToString()}.");

                    UserList[msg.Chat.Id].ident++;
                }
                else
                {
                    Answer = "Введены неверные данные, повторите попытку.";
                }
                break;

            case "преподаватель":
                if (UserList[msg.Chat.Id].ident == 1)
                {
                    UserList[msg.Chat.Id].Info = User.UserInfo.teacher;      //Запись данных
                    Answer = "Введите вашу фамилию.";

                    logger.Info($"ID: {msg.Chat.Id.ToString()}, регистрация: записан тип пользователя - {UserList[msg.Chat.Id].Info.ToString()}.");

                    UserList[msg.Chat.Id].ident++;
                }
                else
                {
                    Answer = "Введены неверные данные, повторите попытку.";
                }
                break;

            case "/forget":
            case "забудь меня":
                UserList[msg.Chat.Id].ident = 0;
                Answer = "Я вас забыл! Для повторной регистрации пиши /start";
                break;

            default:
                if (UserList[msg.Chat.Id].ident == 2 && UserList[msg.Chat.Id].Info == User.UserInfo.teacher)
                {
                    if (!NameMatches.ContainsKey(msg.Chat.Id))
                    {
                        var lst = ReturnTeachersId(msg.Text);
                        if (lst.Length == 1)
                        {
                            UserList[msg.Chat.Id].teacherId = lst[0].id;
                            logger.Info($"ID: {msg.Chat.Id.ToString()}, регистрация: завершена - {UserList[msg.Chat.Id].Info.ToString()} (teacherID {UserList[msg.Chat.Id].teacherId}).");
                            Answer = "Вы получили доступ к функционалу.\n" + _help;
                            UserList[msg.Chat.Id].ident++;

                            Json_Data.WriteData();
                        }
                        else if (lst.Length > 1)
                        {
                            NameMatches.Add(msg.Chat.Id, lst);
                            var s = $"Найдено несколько совпадений:\n";
                            for (var i = 0; i < lst.Length; i++)
                            {
                                s = s + $"{i + 1}) {lst[i].name}\n";
                            }
                            s      = s + "Ввведите номер вашего ФИО.";
                            Answer = s;
                        }
                        else
                        {
                            Answer = "Ошибка, преподаватель не найден! Попробуйте ещё раз.";
                        }
                    }
                    else
                    {
                        if (int.TryParse(msg.Text, out int n) && n - 1 < NameMatches[msg.Chat.Id].Length && n - 1 >= 0)
                        {
                            UserList[msg.Chat.Id].teacherId = NameMatches[msg.Chat.Id][n - 1].id;
                            logger.Info($"ID: {msg.Chat.Id.ToString()}, регистрация: завершена - {UserList[msg.Chat.Id].Info.ToString()} (teacherID {UserList[msg.Chat.Id].teacherId}).");
                            Answer = "Вы получили доступ к функционалу.\n" + _help;
                            UserList[msg.Chat.Id].ident++;
                            NameMatches.Remove(msg.Chat.Id);

                            Json_Data.WriteData();
                        }
                        else
                        {
                            Answer = "Ошибка, введён некорректный номер.";
                        }
                    }
                }
                else
                {
                    if (UserList[msg.Chat.Id].ident == 2 && IsCourseGroup(msg.Chat.Id, msg.Text))                   //проверка введённого номера курса\группы
                    {
                        UserList[msg.Chat.Id].ident++;
                        Answer = "Вы получили доступ к функционалу.\n" + _help;
                        Json_Data.WriteData();

                        logger.Info($"ID: {msg.Chat.Id.ToString()}, регистрация: завершена - {UserList[msg.Chat.Id].Info.ToString()} (groupID {UserList[msg.Chat.Id].groupid}).");
                    }
                    else
                    {
                        if (UserList[msg.Chat.Id].ident == 0)
                        {
                            Answer = "Для начала работы с ботом пиши /start";
                        }
                        else
                        {
                            Answer = "Введены неверные данные, повторите попытку.";
                        }
                    }
                }
                break;
            }

            return(Answer);
        }
예제 #3
0
        static async void BotOnMessageReceived(object sender, MessageEventArgs MessageEventArgs)
        {
            Telegram.Bot.Types.Message msg = MessageEventArgs.Message;
            if (msg == null || msg.Type != MessageType.Text)
            {
                return;
            }

            string Answer = "Server Error";

            if (System.DateTime.UtcNow.Subtract(msg.Date).TotalMinutes > 3)
            {
                await BOT.SendTextMessageAsync(msg.Chat.Id, Answer);

                return;
            }

            if (UserList.ContainsKey(msg.Chat.Id))
            {
                UserList[msg.Chat.Id].LastAccess = DateTime.Now;
            }

            if (!IsRegistered(msg.Chat.Id))
            {
                if (!UserList.ContainsKey(msg.Chat.Id))
                {
                    UserList.Add(msg.Chat.Id, new User());
                }
                Answer = Registration(msg);      //регистрация студента
            }//prev command was /findteacher
            else if (UserList[msg.Chat.Id].ident == 4)
            {
                if (!NameMatches.ContainsKey(msg.Chat.Id))
                {
                    var lst = ReturnTeachersId(msg.Text);
                    if (lst.Length == 1)
                    {
                        Answer = LessonTechToStr(TeacherMethods.GetCurrentLesson(lst[0].id), true);
                        UserList[msg.Chat.Id].ident = 3;
                    }
                    else if (lst.Length > 1)
                    {
                        NameMatches.Add(msg.Chat.Id, lst);
                        var s = $"Найдено несколько совпадений:\n";
                        for (var i = 0; i < lst.Length; i++)
                        {
                            s = s + $"{i + 1}) {lst[i].name}\n";
                        }
                        s      = s + "Ввведи номер выбранного преподавателя.";
                        Answer = s;
                    }
                    else
                    {
                        Answer = "Ошибка, преподаватель не найден! Попробуй ещё раз.";
                    }
                }
                else
                {
                    if (int.TryParse(msg.Text, out int n) && n - 1 < NameMatches[msg.Chat.Id].Length && n - 1 >= 0)
                    {
                        var LCG = TeacherMethods.GetCurrentLesson(NameMatches[msg.Chat.Id][n - 1].id);
                        Answer = LessonTechToStr(LCG, true);
                        UserList[msg.Chat.Id].ident = 3;
                        NameMatches.Remove(msg.Chat.Id);
                    }
                    else
                    {
                        Answer = "Ошибка, введён некорректный номер.";
                    }
                }
            }
            else if (UserList[msg.Chat.Id].ident == 5)
            {
                bool onOrOff = msg.Text.ToLower() == "включить";
                UserList[msg.Chat.Id].eveningNotify = onOrOff;
                UserList[msg.Chat.Id].ident         = 3;
                Json_Data.WriteData();
                string onOrOffMsg = onOrOff ? "включено" : "выключено";
                Answer = $"Вечернее уведомление *{onOrOffMsg}*.";
            }
            else if (UserList[msg.Chat.Id].ident == 6)
            {
                bool onOrOff = msg.Text.ToLower() == "включить";
                UserList[msg.Chat.Id].preLessonNotify = onOrOff;
                UserList[msg.Chat.Id].ident           = 3;
                Json_Data.WriteData();
                string onOrOffMsg = onOrOff ? "включено" : "выключено";
                Answer = $"Уведомление за 15 минут до первой пары *{onOrOffMsg}*.";
            }
            else
            {
                try
                {
                    switch (msg.Text.ToLower())             // Обработка команд боту
                    {
                    case "/next":
                    case "ближайшая пара":
                        if (UserList[msg.Chat.Id].Info != User.UserInfo.teacher)
                        {
                            Answer = LessonToStr(StudentMethods.GetCurrentLesson(UserList[msg.Chat.Id].groupid), true);
                        }
                        else
                        {
                            Answer = LessonTechToStr(TeacherMethods.GetCurrentLesson(UserList[msg.Chat.Id].teacherId), true);
                        }
                        break;

                    case "/findteacher":
                    case "найти преподавателя":
                        Answer = "Введи фамилию преподавателя";
                        UserList[msg.Chat.Id].ident = 4;
                        break;

                    case "/week":
                    case "расписание на неделю":
                        if (UserList[msg.Chat.Id].Info != User.UserInfo.teacher)
                        {
                            Answer = WeekSchToStr(StudentMethods.GetWeekSchedule(UserList[msg.Chat.Id].groupid));
                        }
                        else
                        {
                            Answer = WeekSchTechToStr(TeacherMethods.GetWeekSchedule(UserList[msg.Chat.Id].teacherId));
                        }
                        break;

                    case "/today":
                    case "расписание на сегодня":
                        if (UserList[msg.Chat.Id].Info != User.UserInfo.teacher)
                        {
                            Answer = DaySchToStr(StudentMethods.GetTodaySchedule(UserList[msg.Chat.Id].groupid));
                        }
                        else
                        {
                            Answer = DaySchTechToStr(TeacherMethods.GetTodaySchedule(UserList[msg.Chat.Id].teacherId));
                        }
                        break;

                    case "/tomorrow":
                    case "расписание на завтра":
                        if (UserList[msg.Chat.Id].Info != User.UserInfo.teacher)
                        {
                            Answer = DaySchToStr(StudentMethods.GetTomorrowSchedule(UserList[msg.Chat.Id].groupid));
                        }
                        else
                        {
                            Answer = DaySchTechToStr(TeacherMethods.GetTomorrowSchedule(UserList[msg.Chat.Id].teacherId));
                        }
                        break;

                    case "/knowme":
                    case "знаешь меня?":
                        if (UserList[msg.Chat.Id].Info == User.UserInfo.teacher)
                        {
                            Answer = $"Вы {TeacherList[UserList[msg.Chat.Id].teacherId].name}";         //База старая, так что выводим только ФИО!!!
                        }
                        else
                        {
                            Answer = $"Вы {msg.Chat.FirstName.Replace("`","").Replace("_","").Replace("*","")} из группы {StudentMethods.groupIDToCourseGroup(UserList[msg.Chat.Id].groupid)}";
                        }
                        break;

                    case "/eveningnotify":
                        Answer = $"Сейчас вечернее уведомление о завтрашней первой паре *{(UserList[msg.Chat.Id].eveningNotify? "включено" : "выключено")}*. \nНастройте его.";
                        UserList[msg.Chat.Id].ident = 5;
                        await BOT.SendTextMessageAsync(msg.Chat.Id, Answer, ParseMode.Markdown, replyMarkup : notifierKeyboard);

                        return;

                    case "/prelessonnotify":
                        Answer = $"Сейчас уведомление за 15 минут до первой пары *{(UserList[msg.Chat.Id].preLessonNotify ? "включено" : "выключено")}*. \nНастройте его.";
                        UserList[msg.Chat.Id].ident = 6;
                        await BOT.SendTextMessageAsync(msg.Chat.Id, Answer, ParseMode.Markdown, replyMarkup : notifierKeyboard);

                        return;


                    case "/forget":
                    case "забудь меня":
                        UserList.Remove(msg.Chat.Id);
                        Json_Data.WriteData();
                        Answer = "Я вас забыл! Для повторной регистрации пиши /start";
                        await BOT.SendTextMessageAsync(msg.Chat.Id, Answer, replyMarkup : new ReplyKeyboardRemove());

                        return;

                    case "помощь":
                    case "/help":
                        Answer = _help;
                        break;

                    case "/info":
                    case "информация":
                        Answer = "Меня создали Миша, Дима, Дима, Глеб, Никита, Ира, Максим в рамках проектной деятельности на ФИиИТ в 2018-2019 уч. году.\n" +
                                 "Я предоставляю доступ к интерактивному расписанию мехмата через платформу ботов Telegram.\n" +
                                 "Если обнаружили ошибку в расписании, проверьте, совпадает ли оно с указанным на schedule.sfedu.ru. " +
                                 "При сопададении, для исправления обратитесь в деканат, либо напишите на [email protected], в противном случае напишите [Михаилу](tg://user?id=61026374).";
                        break;

                    case "/optionalcourses":
                    case "факультативы":
                        Answer = electivesStr;
                        break;

                    case "/curweek":
                        Answer = $"Сейчас *{CurrentSubject.GetCurrentWeek().ToString()}* неделя.";
                        break;

                    case "/forceupdate":
                        logger.Info($"Запрошено принудительное обновление расписаний, ID: {msg.Chat.Id}, @{msg.Chat.Username}.");
                        TeachersInit(false);
                        GradeInit(false);
                        GroupShedListInit(false);
                        TeachersShedInit(false);
                        WeekInit(false);
                        logger.Info($"Завершено принудительное обновление расписаний, ID: {msg.Chat.Id}, @{msg.Chat.Username}.");
                        Answer = "Данные расписаний обновлены!";
                        break;

                    default:
                        Answer = "Введены неверные данные, повторите попытку.";
                        break;
                    }
                }
                catch (System.Net.WebException e)
                {
                    logger.Error(e, "Catched exeption:");
                    Answer = "Ошибка! Вероятно, сервер интерактивного расписания недоступен. Пожалуйста, попробуйте повторить запрос позднее.";
                }
            }
            try
            {
                if (IsRegistered(msg.Chat.Id))
                {
                    await BOT.SendTextMessageAsync(msg.Chat.Id, Answer, ParseMode.Markdown, replyMarkup : UserList[msg.Chat.Id].Info == User.UserInfo.teacher?teacherKeyboard : studentKeyboard);
                }
                else if (UserList[msg.Chat.Id].ident == 1)
                {
                    await BOT.SendTextMessageAsync(msg.Chat.Id, Answer, replyMarkup : registrationKeyboard);
                }
                else
                {
                    await BOT.SendTextMessageAsync(msg.Chat.Id, Answer);
                }
            }
            catch (Exception ex) when(ex is System.Net.Http.HttpRequestException && ex.Message.Contains("429"))
            {
                logger.Warn(ex, $"Сетевая ошибка при ответе @{msg.Chat.Username}");
            }
        }