Не могу разобраться с телеграм ботом
Не очень хорошо понимаю в этом направлении, поэтому прошу указать где что я не так сделал, чтобы код по ТГ нормально работал. Сначала вопросы:
- При запуске бота, пишет два раза одну и ту же информацию. Пример: выбрали авторизация, сначала откуда-то пишет /start, потом "Авторизация", потом только проверяет на правильность логин
- не доходит до запуска нужных модулей в разных потоках, все время вываливается в неверный логин и пароль Понимаю, что где-то намутил, но где? (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;
}
}
}
Источник: Stack Overflow на русском