diff --git a/Bot_Funcs.cs b/Bot_Funcs.cs index b0ddfad..b716e17 100644 --- a/Bot_Funcs.cs +++ b/Bot_Funcs.cs @@ -1,16 +1,15 @@ -using System; +using FirehoseFinder.Properties; +using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Telegram.Bot.Polling; -using Telegram.Bot; -using FirehoseFinder.Properties; using System.Threading; -using Telegram.Bot.Types.Enums; +using System.Threading.Tasks; using System.Windows.Forms; +using Telegram.Bot; using Telegram.Bot.Exceptions; +using Telegram.Bot.Polling; using Telegram.Bot.Types; +using Telegram.Bot.Types.Enums; +using Telegram.Bot.Types.ReplyMarkups; namespace FirehoseFinder { @@ -40,7 +39,8 @@ internal static async Task BotWork() _botClient.StartReceiving(UpdateHandler, ErrorHandler, _receiverOptions, cts.Token); // Запускаем бота var me = await _botClient.GetMeAsync(); // Создаем переменную, в которую помещаем информацию о нашем боте. - MessageBox.Show($"{me.FirstName} подключён! Доступно управление авторизацией!"); + MessageBox.Show("Если у вас не получилость автоматически авторизоваться, то вы можете найти в Телеграм бота \"Hoplik-Bot\"" + + " и при запущенном приложении FhF попробовать ввести после команды /start код авторизации:" + Environment.NewLine + Settings.Default.auth_code.ToString(), me.FirstName + " успешно подключён!"); await Task.Delay(-1); } private static async Task UpdateHandler(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) @@ -55,54 +55,132 @@ private static async Task UpdateHandler(ITelegramBotClient botClient, Update upd { // эта переменная будет содержать в себе все связанное с сообщениями var message = update.Message; - // From - это от кого пришло сообщение (или любой другой Update) var user = message.From; - // Chat - содержит всю информацию о чате var chat = message.Chat; - if (message.Text.StartsWith("/start") && message.Text.Length > 7) + // Обрабатываем команду /старт + if (message.Text.StartsWith("/start")) { - if (Settings.Default.userID != 0) - { - await botClient.SendTextMessageAsync( - chat.Id, - "Не надо больше. Вы уже авторизованы", - replyToMessageId: message.MessageId //"ответ" на сообщение - ); - } - else + if (message.Text.Length > 6) //Обрабатываем код авторизации (не забываем про дубликаты!) { - string authcode = message.Text.Remove(0, 7); - bool authok = authcode.Equals(Settings.Default.auth_code); - if (authok) - { - Settings.Default.userID = user.Id; - if (string.IsNullOrEmpty(user.FirstName)) Settings.Default.userFN = string.Empty; else Settings.Default.userFN = user.FirstName; - if (string.IsNullOrEmpty(user.LastName)) Settings.Default.userSN = string.Empty; else Settings.Default.userSN = user.LastName; - if (string.IsNullOrEmpty(user.Username)) Settings.Default.userN = string.Empty; else Settings.Default.userN = user.Username; - //Авторизация прошла удачно. Перегружаемся. - Application.Restart(); - } - else + if (Settings.Default.userID != 0) { await botClient.SendTextMessageAsync( chat.Id, - "Авторизация прошла неудачно. Попробуйте ещё раз, используя приложение FhF.", + "Не надо больше. Вы уже авторизованы", replyToMessageId: message.MessageId //"ответ" на сообщение ); } + else + { + string authcode = message.Text.Substring(6).Trim(' '); + bool authok = authcode.Equals(Settings.Default.auth_code); + if (authok) + { + Settings.Default.userID = user.Id; + if (string.IsNullOrEmpty(user.FirstName)) Settings.Default.userFN = string.Empty; else Settings.Default.userFN = user.FirstName; + if (string.IsNullOrEmpty(user.LastName)) Settings.Default.userSN = string.Empty; else Settings.Default.userSN = user.LastName; + if (string.IsNullOrEmpty(user.Username)) Settings.Default.userN = string.Empty; else Settings.Default.userN = user.Username; + //Авторизация прошла удачно. Перегружаемся. + Application.Restart(); + } + else + { + await botClient.SendTextMessageAsync( + chat.Id, + "Авторизация прошла неудачно. Попробуйте ещё раз, используя приложение FhF.", + replyToMessageId: message.MessageId //"ответ" на сообщение + ); + } + } + } + else //Команда без параметров. Поднимаем клавиатуру, просим ввести код авторизации и пр. + { + // Тут создаем нашу клавиатуру + var inlineKeyboard = new InlineKeyboardMarkup( + new List() // здесь создаем лист (массив), который содрежит в себе массив из класса кнопок + { + // Каждый новый массив - это дополнительные строки, + // а каждая дополнительная кнопка в массиве - это добавление ряда + new InlineKeyboardButton[] // тут создаем массив кнопок + { + InlineKeyboardButton.WithCallbackData("Авторизация", "button_auth"), + InlineKeyboardButton.WithCallbackData("Рейтинг", "button_rate"), + }, + }); + await botClient.SendTextMessageAsync( + chat.Id, + "Пожалуйста, выберите \"Авторизация\", если готовы ввести код из программы FhF или \"Рейтинг\", если хотите посмотреть текущий \"Рейтинг неравнодушных пользователей\"", + replyMarkup: inlineKeyboard); // Все клавиатуры передаются в параметр replyMarkup + return; } } else { - await botClient.SendTextMessageAsync( - chat.Id, - message.Text, // отправляем то, что написал пользователь - replyToMessageId: message.MessageId); + //Код авторизации верен + if (message.Text.Equals(Settings.Default.auth_code)) + { + Settings.Default.userID = user.Id; + if (string.IsNullOrEmpty(user.FirstName)) Settings.Default.userFN = string.Empty; else Settings.Default.userFN = user.FirstName; + if (string.IsNullOrEmpty(user.LastName)) Settings.Default.userSN = string.Empty; else Settings.Default.userSN = user.LastName; + if (string.IsNullOrEmpty(user.Username)) Settings.Default.userN = string.Empty; else Settings.Default.userN = user.Username; + //Авторизация прошла удачно. Перегружаемся. + Application.Restart(); + } + else //Ввели неподдерживаемую команду + { + await botClient.SendTextMessageAsync( + chat.Id, + "Извините, не понимаю о чём вы. Может быть /start?", + replyToMessageId: message.MessageId //"ответ" на сообщение + ); + } } return; } + case UpdateType.CallbackQuery: + { + // Переменная, которая будет содержать в себе всю информацию о кнопке, которую нажали + var callbackQuery = update.CallbackQuery; + // Аналогично и с Message мы можем получить информацию о чате, о пользователе и т.д. + var user = callbackQuery.From; + // Вот тут нужно уже быть немножко внимательным и не путаться! + // Мы пишем не callbackQuery.Chat , а callbackQuery.Message.Chat , так как + // кнопка привязана к сообщению, то мы берем информацию от сообщения. + var chat = callbackQuery.Message.Chat; + // Добавляем блок switch для проверки кнопок + switch (callbackQuery.Data) + { + // Data - это придуманный нами id кнопки, мы его указывали в параметре + // callbackData при создании кнопок. У меня это button1, button2 и button3 + case "button_auth": + { + // В этом типе клавиатуры обязательно нужно использовать следующий метод + await botClient.AnswerCallbackQueryAsync(callbackQuery.Id, "При успешной авторизации ваш экземпляр приложения FhF перезагрузится автоматически!"); + // Для того, чтобы отправить телеграмму запрос, что мы нажали на кнопку + + await botClient.SendTextMessageAsync( + chat.Id, + "Отправьте 4 цифры кода авторизации из приложения FhF в формате ХХ-ХХ"); + return; + } + case "button_rate": + { + // А здесь мы добавляем наш сообственный текст, который заменит слово "загрузка", когда мы нажмем на кнопку + await botClient.AnswerCallbackQueryAsync(callbackQuery.Id, "Готовлю рейтинг..."); + + await botClient.SendTextMessageAsync( + chat.Id, + $"Пока не научился :("); + return; + } + default: + return; + } + } + default: + return; } } catch (Exception ex) diff --git a/Forms/Form1.cs b/Forms/Form1.cs index a3decde..5e70ca1 100644 --- a/Forms/Form1.cs +++ b/Forms/Form1.cs @@ -102,8 +102,6 @@ protected override void WndProc(ref System.Windows.Forms.Message m) /// private void Formfhf_Load(object sender, EventArgs e) { - //Запускаем локального бота - Bot_Funcs.BotWork(); //Загружаем Справочник устройств dataSet1.ReadXml("ForFilter.xml", XmlReadMode.ReadSchema); bindingSource_collection.DataSource = dataSet1.Tables[1]; @@ -2571,8 +2569,9 @@ public async void BotSendMes(string send_message, string version) try { string mess_to_post = CorrectBotString(send_message) + Environment.NewLine + - $"[{version}](https://github.com/hoplik/Firehose-Finder/releases/tag/{version})"; - if (Settings.Default.userID != 0) mess_to_post += Environment.NewLine + $"Спасибо пользователю [{Settings.Default.userFN} {Settings.Default.userSN} ({Settings.Default.userN})](tg://user?id={Settings.Default.userID}) за предоставленные данные."; + $"[FhF Version: {version}](https://github.com/hoplik/Firehose-Finder/releases/tag/{version})"; + if (Settings.Default.userID != 0) mess_to_post += Environment.NewLine + $"Спасибо пользователю [{Settings.Default.userFN} {Settings.Default.userSN} ({Settings.Default.userN})](tg://user?id={Settings.Default.userID}) за предоставленные данные. " + + "Ваша реакция на это сообщение увеличит #Concerned_users_rating"; await Bot_Funcs._botClient.SendTextMessageAsync( botFuncs.channel, mess_to_post, @@ -3307,8 +3306,9 @@ private async void ОтправкаПрограммераToolStripMenuItem_Click { string version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string mess_to_post = CorrectBotString(inputstr.ToString()) + Environment.NewLine + - $"[{version}](https://github.com/hoplik/Firehose-Finder/releases/tag/{version})"; - if (Settings.Default.userID != 0) mess_to_post += Environment.NewLine + $"Спасибо пользователю [{Settings.Default.userFN} {Settings.Default.userSN} ({Settings.Default.userN})](tg://user?id={Settings.Default.userID}) за предоставленные данные."; + $"[FhF Version: {version}](https://github.com/hoplik/Firehose-Finder/releases/tag/{version})"; + if (Settings.Default.userID != 0) mess_to_post += Environment.NewLine + $"Спасибо пользователю [{Settings.Default.userFN} {Settings.Default.userSN} ({Settings.Default.userN})](tg://user?id={Settings.Default.userID}) за предоставленные данные. " + + "Ваша реакция на это сообщение увеличит #Concerned_users_rating"; await Bot_Funcs._botClient.SendDocumentAsync(botFuncs.channel, onlineFile, null, null, mess_to_post, Telegram.Bot.Types.Enums.ParseMode.Markdown); textBox_soft_term.AppendText(LocRes.GetString("sent") + Environment.NewLine); } @@ -3499,6 +3499,10 @@ private void ЗагрузитьССервераToolStripMenuItem_Click(object se private void АвторизоватьсяЧерезТелеграмToolStripMenuItem_Click(object sender, EventArgs e) { + MessageBox.Show("Пожалуйста, дождитесь сообщения об успешном запуске бота!"); + //Запускаем локального бота + Bot_Funcs.BotWork(); + Thread.Sleep(5000); var rand = new Random(); Settings.Default.auth_code = rand.Next(10, 99).ToString() + '\u002D' + rand.Next(10, 99).ToString(); ProcessStartInfo psi = new ProcessStartInfo("https://t.me/Hoplik_Bot?start=" + Settings.Default.auth_code);