/// <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(); }
/// <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); }
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}"); } }