Не могу разобраться с телеграм ботом

Рейтинг: 0Ответов: 0Опубликовано: 01.02.2023

Не очень хорошо понимаю в этом направлении, поэтому прошу указать где что я не так сделал, чтобы код по ТГ нормально работал. Сначала вопросы:

  1. При запуске бота, пишет два раза одну и ту же информацию. Пример: выбрали авторизация, сначала откуда-то пишет /start, потом "Авторизация", потом только проверяет на правильность логин
  2. не доходит до запуска нужных модулей в разных потоках, все время вываливается в неверный логин и пароль Понимаю, что где-то намутил, но где? (350строк кода, если хотите, то помогите - очень нужно)
using DbHelperBase;
using MySql.Data.MySqlClient;
using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Types.ReplyMarkups;
using Telegram.Bot.Types.InputFiles;
using static System.Windows.Forms.AxHost;

namespace ReplyKeyboardMarkup_01
{
    public class TelegramBotHelper
    {
        private const string TEXT_1 = "Директор";
        private const string TEXT_2 = "Аккаунт бухгалтера";
        private const string TEXT_3 = "Аккаунт сотрудника";
        private const string TEXT_4 = "Аккаунт экспедитора";

        private const string SUB_TEXT_1 = "Регистрация";
        private const string SUB_TEXT_2 = "Закупка";
        private const string SUB_TEXT_3 = "Доставка";
        private const string SUB_TEXT_4 = "Отзывы";
        private const string SUB_TEXT_5 = "Наверх";

        private const string TEXT_LOGIN = "Авторизация";
        private readonly string TEXT_AUTHORS_LOGIN = "Отправить";
        private readonly string TEXT_BACK = "Назад";
        private const string TEXT_FEEDBACK = "Отзыв";
        private const string INSTRUCTION = "Инструкция";
        private string _token;
        TelegramBotClient _client;
        private Dictionary<long, UserState> _clientStates = new Dictionary<long, UserState>();

        public string login { get; set; }
        public string pass { get; set; }
        bool nextStep { get; set; }

        public delegate void ThreadStart();

        public class Variables
        {
            public static string userKeywrod { get; set; }
            public static string userLogin { get; set; }
        }

        public TelegramBotHelper(string token)
        {
            _token = token;
        }

        internal void GetUpdates()
        {
            _client = new TelegramBotClient(_token);
            var me = _client.GetMeAsync().Result;
            if (me != null && !string.IsNullOrEmpty(me.Username))
            {
                int offset = 0;
                while (true)
                {
                    try
                    {
                        var updates = _client.GetUpdatesAsync(offset).Result;
                        if (updates != null && updates.Count() > 0)
                        {
                            foreach (var update in updates)
                            {
                                processUpdate(update);
                                offset = update.Id + 1;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }

                    Thread.Sleep(1000);
                }
            }
        }

        void RegStart()
        {
            WB_crowler_with_TG_controll.WB_job.RegJob run = new WB_crowler_with_TG_controll.WB_job.RegJob();
            run.RegistartionProcessAsync();
        }

        void BuyStart()
        {
            WB_crowler_with_TG_controll.WB_job.BuyJob rBuy = new WB_crowler_with_TG_controll.WB_job.BuyJob();
            rBuy.BuysProcessAsync();
        }

        void CheckDevStart()
        {
            WB_crowler_with_TG_controll.WB_job.CheckDelivery checkRun = new WB_crowler_with_TG_controll.WB_job.CheckDelivery();
            checkRun.CheckDeliveryProcess();
        }
        void reviewsStart()
        {
            WB_crowler_with_TG_controll.WB_job.RiviewsPlaceJob revRun = new WB_crowler_with_TG_controll.WB_job.RiviewsPlaceJob();
            revRun.PlaceReviewsProcess();
        }

        private async void processUpdate(Update update)
        {
            DbHelper connect = new DbHelper();
            connect.OpenConnection();

            switch (update.Type)
            {
                case Telegram.Bot.Types.Enums.UpdateType.Message:
                    var textMsg = update.Message.Text;
                    Console.WriteLine("text - " + textMsg);

                    switch (textMsg)
                    {
                        case TEXT_LOGIN:

                            _clientStates[update.Message.Chat.Id] = new UserState { State = State.SearchMusic };
                            await _client.SendTextMessageAsync(update.Message.Chat.Id, "Введите свой логин и пароль, через запятую: ");

                            break;
                        case INSTRUCTION:
                            await _client.SendTextMessageAsync(update.Message.Chat.Id, "1) Нажмитие 'Авторизация' и введите свой логин\n 2) Выберите соответствующий аккаунт\n 3) Получите нужные данные \n 4) Оставьте отзыв");
                            break;
                        case TEXT_FEEDBACK:

                            await _client.SendTextMessageAsync(update.Message.Chat.Id, "Оставьте отзыв на купленный товар. Напишите тут свой отзыв, начиная со слова 'review:'");

                            break;
                        case TEXT_1:
                            _client.SendTextMessageAsync(update.Message.Chat.Id, "Аккаунт директора: " + textMsg, replyMarkup: GetButtons());

                            var cleanQuery = @"TRUNCATE TABLE `TG_response`";
                            var cmdClean = new MySqlCommand(cleanQuery, connect.Connection);
                            cmdClean.ExecuteNonQuery();

                            var query = $@"INSERT INTO `TG_response`(`Cmd_Name`, `Btn_Name`) VALUES ('Yes','Buy')";

                            var command = new MySqlCommand(query, connect.Connection);
                            command.ExecuteNonQuery();

                            // Основное управление - запуск нужного метода

                            break;
                        case TEXT_2:
                            _client.SendTextMessageAsync(update.Message.Chat.Id, "Аккаунт бухгалтера: " + textMsg, replyMarkup: GetButtons());

                            var cleanQuery2 = @"TRUNCATE TABLE `TG_response`";
                            var cmdClean2 = new MySqlCommand(cleanQuery2, connect.Connection);
                            cmdClean2.ExecuteNonQuery();

                            var query2 = $@"INSERT INTO `TG_response`(`Cmd_Name`, `Btn_Name`) VALUES ('Yes','Report')";

                            var command2 = new MySqlCommand(query2, connect.Connection);
                            command2.ExecuteNonQuery();

                            // Запуск метода для выгрузки отчетов

                            break;
                        case TEXT_3:
                            _client.SendTextMessageAsync(update.Message.Chat.Id, "Вход в аккаунт сотрудника: " + textMsg, replyMarkup: GetButtons());

                            var cleanQuery3 = @"TRUNCATE TABLE `TG_response`";
                            var cmdClean3 = new MySqlCommand(cleanQuery3, connect.Connection);
                            cmdClean3.ExecuteNonQuery();

                            var query3 = $@"INSERT INTO `TG_response`(`Cmd_Name`, `Btn_Name`) VALUES ('Yes','Checking')";

                            var command3 = new MySqlCommand(query3, connect.Connection);
                            command3.ExecuteNonQuery();

                            break;
                        case TEXT_4:
                            //_client.SendTextMessageAsync(update.Message.Chat.Id, "Устанавливаем ключевое слово: " + text, replyMarkup: GetButtons());

                            var cleanQuery4 = @"TRUNCATE TABLE `TG_response`";
                            var cmdClean4 = new MySqlCommand(cleanQuery4, connect.Connection);
                            cmdClean4.ExecuteNonQuery();

                            var query4 = $@"INSERT INTO `TG_response`(`Cmd_Name`, `Btn_Name`) VALUES ('Yes','KeyBtn')";

                            var command4 = new MySqlCommand(query4, connect.Connection);
                            command4.ExecuteNonQuery();

                            _client.SendTextMessageAsync(update.Message.Chat.Id, "Введите ключевое слово:");

                            _client.SendTextMessageAsync(update.Message.Chat.Id, "Работаем2...: " + textMsg, replyMarkup: GetButtons());

                            break;
                        default:
                            var query5 = $@"TRUNCATE TABLE `MyKey`";
                            var command5 = new MySqlCommand(query5, connect.Connection);
                            command5.ExecuteNonQuery();

                            // Проверяем тот ли логин или нет

                            _client.SendTextMessageAsync(update.Message.Chat.Id, "Работаем...: " + textMsg, replyMarkup: GetButtons());

                            if (textMsg.Contains("start"))
                            {
                                // Здесь пробовал избежать ошибки, когда бот получает start сообщение, откуда только - не понял
                            }
                            else
                            {
                                nextStep = CheckLogin(textMsg);
                            }

                            if (nextStep)
                            {
                                _client.SendTextMessageAsync(update.Message.Chat.Id, "Пароль верный", replyMarkup: GetButtons());

                                _client.SendTextMessageAsync(update.Message.Chat.Id, "Какой модуль запустить? (выберите один: регистрация профилей, закупка, проверка доставки, оставить отзыв)", replyMarkup: GetSubMenu());

                                textMsg = update.Message.Text;
                                
                                // Здесь пробовал сделать обновление сообщения, которое вводит пользователь
                                //switch (update.Type)
                                //{
                                //    case Telegram.Bot.Types.Enums.UpdateType.Message:
                                //        textMsg = update.Message.Text;
                                //        Console.WriteLine("text - " + textMsg);
                                //        break;
                                //}
                                
                                
                                // Эти модули надо запускать в итоге
                                // Запуск модуля регистрации
                                if (textMsg.Contains("Регистрация"))
                                {
                                    Thread firstThread = new Thread(RegStart);
                                    Console.WriteLine("Старт потока с регистрацией");
                                    firstThread.Start();
                                }
                                // Запуск закупки
                                if (textMsg.Contains("Закупка"))
                                {
                                    Thread secondThread = new Thread(BuyStart);
                                    Console.WriteLine("Старт потока с закупками");
                                    secondThread.Start();
                                }
                                // Запуск проверки доставки
                                if (textMsg.Contains("Доставка"))
                                {
                                    Thread therdThread = new Thread(CheckDevStart);
                                    Console.WriteLine("Старт потока с проверкой доставки");
                                    therdThread.Start();
                                }
                                // Запуск размещения отзывов
                                if (textMsg.Contains("Отзывы"))
                                {
                                    Thread forsThread = new Thread(reviewsStart);
                                    Console.WriteLine("Старт потока с отзывами");
                                    forsThread.Start();
                                }

                            }
                            else
                            {
                                _client.SendTextMessageAsync(update.Message.Chat.Id, "Пароль не верный", replyMarkup: GetButtons());
                            }

                            break;
                    }
                    //_client.SendTextMessageAsync(update.Message.Chat.Id, "Нажали кнопку :" + text, replyMarkup: GetButtons());
                    break;
                default:
                    Console.WriteLine(update.Type + " Not implemented");
                    break;
            }
            connect.CloseConnection();
        }

        private IReplyMarkup getAuthors()
        {
            return new ReplyKeyboardMarkup(new[]
            {
                new[]
                {
                    new KeyboardButton(TEXT_AUTHORS_LOGIN),
                    new KeyboardButton(TEXT_BACK),
                }
            });
        }

        private IReplyMarkup GetButtons()
        {
            return new ReplyKeyboardMarkup(new[]
            {
                new[]
                {
                    new KeyboardButton(TEXT_1),
                    new KeyboardButton(TEXT_2),
                    new KeyboardButton(TEXT_LOGIN),
                    new KeyboardButton(INSTRUCTION),
                },
                new[]
                {
                    new KeyboardButton(TEXT_3),
                    new KeyboardButton(TEXT_4),
                    new KeyboardButton(TEXT_FEEDBACK),
                }
            });
        }

        private IReplyMarkup GetSubMenu()
        {
            return new ReplyKeyboardMarkup(new[]
            {
                new[]
                {
                    new KeyboardButton(SUB_TEXT_1),
                    new KeyboardButton(SUB_TEXT_2),
                    new KeyboardButton(SUB_TEXT_3),
                    new KeyboardButton(SUB_TEXT_4),
                    new KeyboardButton(SUB_TEXT_5),
                }
            });
        }

        public bool CheckLogin(string enterData)
        {
            DbHelper db = new DbHelper();
            db.OpenConnection();

            bool loginYes = false;

            string[] text = enterData.Split(',');
            string entr1 = text[0];
            Console.WriteLine($"Логин: {entr1}");
            string entr2 = text[1];
            Console.WriteLine($"Пароль: {entr2}");

            MySqlCommand readeLogin = new MySqlCommand($@"SELECT `Login`, `password` FROM `Job_Logins` WHERE `Login` = '{entr1}'", db.Connection);
            MySqlDataReader reader = readeLogin.ExecuteReader();

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    login = reader.GetString(0);
                    pass = reader.GetString(1);
                }
            }

            if(login.Trim().Contains(entr1.Trim()) & pass.Trim().Contains(entr2.Trim()))
            {
                Console.WriteLine("Пароль подтвержден");
                loginYes = true;
            }
            else
            {
                Console.WriteLine("Пароль не верный");
            }

            db.CloseConnection();
            return loginYes;
        }
    }
}

Ответы

Ответов пока нет.