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}"); } }
/// <summary> /// Checks if user is already registered /// </summary> /// <param name="id">Telegram user ID</param> /// <returns></returns> static bool IsRegistered(long id) => UserList.ContainsKey(id) && UserList[id].ident > 2;
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 (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)) { UserList.Add(msg.Chat.Id, new User() { ident = 3 }); Json_Data.WriteData(); //регистрация в базе } 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].morningNotify = onOrOff; UserList[msg.Chat.Id].ident = 3; Json_Data.WriteData(); string onOrOffMsg = onOrOff ? "включено" : "выключено"; Answer = $"Уведомление за 15 минут до первой пары *{onOrOffMsg}*."; } else { try { switch (msg.Text.ToLower()) // Обработка команд боту { case "/start": Answer = "Добро пожаловать!\n" + _help; break; case "/joke": case "анекдот": do { Answer = Markov.MakeText(1, random).Replace(" . ", ". "); } while (Answer.Length > 4096); //Search for new joke if it exceeds Telegram text msg limit break; case "/knowme": case "знаешь меня?": Answer = $"Вы {msg.Chat.FirstName.Replace("`", "").Replace("_", "").Replace("*", "")}."; 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 "/morningnotify": Answer = $"Сейчас утреннее уведомление *{(UserList[msg.Chat.Id].morningNotify ? "включено" : "выключено")}*. \nНастройте его."; UserList[msg.Chat.Id].ident = 6; await BOT.SendTextMessageAsync(msg.Chat.Id, Answer, ParseMode.Markdown, replyMarkup : notifierKeyboard); return; case "/stop": 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 = "Прекрасный бот для генерации прекрасного настроения!\n" + "Данный бот, реализованный на марковских цепях, используя базу данных из свыше, чем 100т. анекдотов, способен генерировать новые шедевры комедийного искусства."; break; case "/forceupdate": logger.Info($"Запрошено принудительное обновление, ID: {msg.Chat.Id}, @{msg.Chat.Username}."); 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 { await BOT.SendTextMessageAsync(msg.Chat.Id, Answer, ParseMode.Markdown, replyMarkup : defaultKeyboard); } catch (Exception ex) when(ex is System.Net.Http.HttpRequestException && ex.Message.Contains("429")) { logger.Warn(ex, $"Network error while answering @{msg.Chat.Username}"); } catch (Exception ex) when(ex is Telegram.Bot.Exceptions.ApiRequestException) { logger.Warn(ex, $"Telegram API error while answering @{msg.Chat.Username}"); } }