protected static void OnExit(object sender, ConsoleCancelEventArgs args) { BOT.StopReceiving(); Json_Data.WriteData(); logger.Info("Exit."); _closing.Set(); }
/// <summary> /// "-nopreload" - prevents loading shedules on start /// </summary> /// <param name="args"></param> static void Main(string[] args) { using (StreamReader file = File.OpenText("markov.json")) { JsonSerializer serializer = new JsonSerializer(); Markov = (NodeChain)serializer.Deserialize(file, typeof(NodeChain)); } //Markov = System.Text.Json.JsonSerializer.Deserialize<NodeChain>(File.ReadAllText("markov.json")); Json_Data.ReadData(); KeyboardInit(); BOT = new Telegram.Bot.TelegramBotClient(ReadToken()); logger.Info("Bot connected."); BOT.OnMessage += BotOnMessageReceived; BOT.StartReceiving(new UpdateType[] { UpdateType.Message }); //Scheduler.RunNotifier().GetAwaiter().GetResult(); logger.Info("Waiting for messages..."); Console.CancelKeyPress += OnExit; _closing.WaitOne(); }
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}"); } }