Пример #1
0
        /// <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));
            }
        }
Пример #2
0
 public void bot()
 {
     grid.transform.position -= new Vector3(3, 0, 0);
     TopButton.SetActive(true);
     if (grid.transform.position.x <= -9)
     {
         BotButton.SetActive(false);
     }
 }
Пример #3
0
 public void top()
 {
     grid.transform.position += new Vector3(3, 0, 0);
     BotButton.SetActive(true);
     if (grid.transform.position.x >= 3)
     {
         TopButton.SetActive(false);
     }
 }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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));
            }
        }
Пример #7
0
        /// <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;
        }
Пример #8
0
        /// <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);
            }
        }