/// <summary> /// Ответ на нажатие по кнопке инлайн клавиатуры /// </summary> /// <param name="e"></param> private void ResponseOnCallbackQerry(Update update) { string text = $"{DateTime.Now.ToLongTimeString()} | Type: {update.Type.ToString()} | Data: {update.CallbackQuery.Data}"; Console.WriteLine(text); var callbackQuery = update.CallbackQuery; if (callbackQuery.Data == "0") { bot.EditMessageTextAsync( callbackQuery.Message.Chat.Id, callbackQuery.Message.MessageId, "Основное меню", replyMarkup: StartKeyboard()); } else { Int32.TryParse(callbackQuery.Data, out int id); var row = buttons.Where(x => x.ParentId == id).OrderBy(x => x.Row).ThenBy(x => x.Column).GroupBy(x => x.Row).ToList(); var inlineKeyboard = new List <List <InlineKeyboardButton> >(); foreach (var item in row) { var listRowButtons = new List <InlineKeyboardButton>(); foreach (var i in item) { listRowButtons.Add(InlineKeyboardButton.WithCallbackData($"{i.ButtonName}", i.Id.ToString())); } inlineKeyboard.Add(listRowButtons); } //Кнопка возврата в предыдущее меню var parentId = buttons.Where(x => x.Id == id).First().ParentId; BotButton backButton; if (parentId != 0) { backButton = buttons.Where(x => x.Id == parentId).First(); } else { backButton = new BotButton { Id = 0, ParentId = 0, ButtonName = "Оснвоное меню" }; } inlineKeyboard.Add(new List <InlineKeyboardButton>() { InlineKeyboardButton.WithCallbackData($"<< Назад в {backButton.ButtonName}", backButton.Id.ToString()) }); bot.EditMessageTextAsync( callbackQuery.Message.Chat.Id, callbackQuery.Message.MessageId, buttons.Where(x => x.Id == id).First().ButtonName, replyMarkup: new InlineKeyboardMarkup(inlineKeyboard)); } }
public void bot() { grid.transform.position -= new Vector3(3, 0, 0); TopButton.SetActive(true); if (grid.transform.position.x <= -9) { BotButton.SetActive(false); } }
public void top() { grid.transform.position += new Vector3(3, 0, 0); BotButton.SetActive(true); if (grid.transform.position.x >= 3) { TopButton.SetActive(false); } }
/// <summary> /// Удлание кнопки и всех дочерних кнопок /// </summary> /// <param name="botButton"></param> public void DeleteBotButton(BotButton botButton) { //Рекрсивно удаляем все вложенные кнопки var childBotButtons = BotButtons.Where(x => x.ParentId == botButton.Id).ToList(); foreach (var childButton in childBotButtons) { DeleteBotButton(childButton); } BotButtons.Remove(botButton); Debug.WriteLine($"Удалена кнопка с id: {botButton.Id} и именем: {botButton.ButtonName}"); string json = JsonConvert.SerializeObject(BotButtons); System.IO.File.WriteAllText("buttons.json", json); }
/// <summary> /// Добавление кнопки /// </summary> /// <param name="row"></param> /// <param name="column"></param> /// <param name="parentId"></param> /// <param name="buttonName"></param> /// <param name="content"></param> public void AddBotButton(int row, int column, int parentId, string buttonName, string content) { var id = GettId(); BotButton botButton = new BotButton { Id = id, Row = row, Column = column, ParentId = parentId, ButtonName = buttonName, Content = content }; BotButtons.Add(botButton); string json = JsonConvert.SerializeObject(BotButtons); System.IO.File.WriteAllText("buttons.json", json); }
/// <summary> /// Ответ на нажатие по кнопке инлайн клавиатуры /// </summary> /// <param name="e"></param> private void ResponseOnCallbackQerry(Update update) { string text = $"{DateTime.Now.ToLongTimeString()} | Type: {update.Type.ToString()} | Data: {update.CallbackQuery.Data}"; Console.WriteLine(text); var callbackQuery = update.CallbackQuery; if (callbackQuery.Data == "0") { bot.EditMessageTextAsync( callbackQuery.Message.Chat.Id, callbackQuery.Message.MessageId, "Основное меню", replyMarkup: StartKeyboard()); } else { Int32.TryParse(callbackQuery.Data, out int id); var row = BotButtons.Where(x => x.ParentId == id).OrderBy(x => x.Row).ThenBy(x => x.Column).GroupBy(x => x.Row).ToList(); var inlineKeyboard = new List <List <InlineKeyboardButton> >(); foreach (var item in row) { var listRowButtons = new List <InlineKeyboardButton>(); foreach (var i in item) { listRowButtons.Add(InlineKeyboardButton.WithCallbackData($"{i.ButtonName}", i.Id.ToString())); } inlineKeyboard.Add(listRowButtons); } //Кнопка возврата в предыдущее меню //TODO: Сделать проверку parentId на NULL, необходимо для случаев когда кнопки были обновлены через админку, а в телеграмме осталось старое инлайн меню. //Пока что простой костыль int parentId = 0; try { parentId = BotButtons.Where(x => x.Id == id).First().ParentId; } catch (Exception) { return; } //TODO: Так же возможно нужно пересмотреть выдачу идшников для кнопок, например придумать какую-нибудь последовательность. Необходимо для того что бы если в админке изменили кнопки и не провалиться в непонятно какое меню. BotButton backButton; if (parentId != 0) { backButton = BotButtons.Where(x => x.Id == parentId).First(); } else { backButton = new BotButton { Id = 0, ParentId = 0, ButtonName = "Оснвоное меню" }; } inlineKeyboard.Add(new List <InlineKeyboardButton>() { InlineKeyboardButton.WithCallbackData($"<< Назад в {backButton.ButtonName}", backButton.Id.ToString()) }); bot.EditMessageTextAsync( callbackQuery.Message.Chat.Id, callbackQuery.Message.MessageId, BotButtons.Where(x => x.Id == id).First().ButtonName, replyMarkup: new InlineKeyboardMarkup(inlineKeyboard)); } }
/// <summary> /// Метод, загружающий сценарии из JSON файлов /// </summary> public static void LoadScenarios() { //Список сценариев находится в файле с фиксированным именем //В нём заходятся служебные параметры и имена остальных файлов string json = File.ReadAllText("SC-list.json"); //ищем в списке ID стартового сценария и парсим его в static класс Scenarios Scenarios.default_id = JObject.Parse(json)["default_id"].ToString(); //Делаем объект List<Scenario> в который грузим список сценариев Scenarios.scenarios = new List <Scenario>(); var _scenarios = JObject.Parse(json)["scenarios"].ToList(); //Проходим по списку, загружаем указанные в нём файлы //парсим их в объекты индивидуальных сценариев в общем дереве //в результате, получаем возможность перехода между ветками из любого узла в любой //формат файлов и детали реализации приведены в документации "VK-RMEbot script algo.ppt" foreach (var _scenario in _scenarios) { string json2 = File.ReadAllText(_scenario["filename"].ToString()); Scenario scenario = new Scenario(); scenario.scenario_id = JObject.Parse(_scenario.ToString())["scenario_id"].ToString(); // _scenario.scenario_id JObject.Parse(json2)["scenario_id"].ToString(); scenario.scenario_name = JObject.Parse(json2)["scenario_name"].ToString(); scenario.start_id = JObject.Parse(json2)["start_id"].ToString(); scenario.steps = new List <Step>(); var _steps = JObject.Parse(json2)["steps"].ToList(); foreach (var _step in _steps) { Step step = new Step(); step.id = JObject.Parse(_step.ToString())["id"].ToString(); step.text = JObject.Parse(_step.ToString())["text"].ToString(); step.buttons = new List <BotButton>(); var _buttons = JObject.Parse(_step.ToString())["buttons"].ToList(); foreach (var _button in _buttons) { BotButton button = new BotButton(); button.label = JObject.Parse(_button.ToString())["label"].ToString(); button.color = JObject.Parse(_button.ToString())["color"].ToString(); button.next_id = JObject.Parse(_button.ToString())["next_id"].ToString(); if (JObject.Parse(_button.ToString()).ContainsKey("scenario_id")) { button.scenario_id = JObject.Parse(_button.ToString())["scenario_id"].ToString(); } step.buttons.Add(button); } scenario.steps.Add(step); } Scenarios.scenarios.Add(scenario); } string logFileBot = $@"logs\{DateTime.Now.ToString("yyyyMMdd")}_vkbot.log "; string logStringBot = $"\n[{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}]"; Console.WriteLine($"{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")} Scenario Loaded "); logStringBot += $@"[Scenario: Loaded]"; File.AppendAllText(logFileBot, logStringBot); return; }
/// <summary> /// Действие при нажатии на кнопку, типа UpdateType.CallbackQuery /// </summary> /// <param name="callbackQuery"></param> /// <returns></returns> async Task CallbackUpdate(CallbackQuery callbackQuery) { if (callbackQuery == null) { return; } //формирование инлайн клавиатуры if (callbackQuery.Data == "0") { var row = _repository.BotButtons.Where(x => x.ParentId == 0).OrderBy(x => x.Row).ThenBy(x => x.Column).GroupBy(x => x.Row).ToList(); var inlineKeyboard = new List <List <InlineKeyboardButton> >(); foreach (var item in row) { var listRowButtons = new List <InlineKeyboardButton>(); foreach (var i in item) { listRowButtons.Add(InlineKeyboardButton.WithCallbackData($"{i.ButtonName}", i.Id.ToString())); } inlineKeyboard.Add(listRowButtons); } var inlineKeyboardMarkup = new InlineKeyboardMarkup(inlineKeyboard); await _botService.Client.EditMessageTextAsync( callbackQuery.Message.Chat.Id, callbackQuery.Message.MessageId, "Основное меню", replyMarkup : inlineKeyboardMarkup); } else { int id = 0; Int32.TryParse(callbackQuery.Data, out id); var row = _repository.BotButtons.Where(x => x.ParentId == id).OrderBy(x => x.Row).ThenBy(x => x.Column).GroupBy(x => x.Row).ToList(); var inlineKeyboard = new List <List <InlineKeyboardButton> >(); foreach (var item in row) { var listRowButtons = new List <InlineKeyboardButton>(); foreach (var i in item) { listRowButtons.Add(InlineKeyboardButton.WithCallbackData($"{i.ButtonName}", i.Id.ToString())); } inlineKeyboard.Add(listRowButtons); } var parentId = _repository.BotButtons.Where(x => x.Id == id).First().ParentId; BotButton backButton = new BotButton(); //Проверка для возврата в основное меню if (parentId != 0) { backButton = _repository.BotButtons.Where(x => x.Id == parentId).First(); } else { backButton = new BotButton { Id = 0, ParentId = 0, ButtonName = "Оснвоное меню" }; } inlineKeyboard.Add(new List <InlineKeyboardButton>() { InlineKeyboardButton.WithCallbackData($"<< Назад в {backButton.ButtonName}", backButton.Id.ToString()) }); var inlineKeyboardMarkup = new InlineKeyboardMarkup(inlineKeyboard); await _botService.Client.EditMessageTextAsync( callbackQuery.Message.Chat.Id, callbackQuery.Message.MessageId, _repository.BotButtons.Where(x => x.Id == id).First().ButtonName, replyMarkup : inlineKeyboardMarkup); } }