@Dmitiy1616

Telegram Bot на C# как настроить последовательность событий?

Господа программисты, Help!
Сильно не ругайтесь на читаемость кода, я прикоснулся к C# как и к программированию совсем недавно.
Обучаюсь на разных мини проектах, бот вроде прикольная тема. Итак, ближе к делу:
1) Любое последующее событие, вызываемое из предыдущего, происходит в 2 раза больше, чем предыдущее (событие 1 вызовется 1 раз, событие 2 вызовется дважды, третье вызовется уже 4 и т.д.). А надо, чтоб всегда по разу.
2) Чтобы перейти к следующему событию на кнопку нужно жать по 2 раза. Опять же, не знаю, как сделать по разу.
3) С 1 стадии событий перескочить на 3 и выше невозможно, однако из более высоких в нижние - без проблем. Голову уже сломал, как это запретить.
4) Как сделать, чтобы дерево событий и прогресс по нему сохранялись за каждым отдельным пользователем?
Нужен нугет Telegram.Bot
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Args;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;
using Telegram.Bot.Types.InlineQueryResults;
namespace NewGameBot
{
class Program
{
static TelegramBotClient Bot;
static void Main(string[] args)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Bot = new TelegramBotClient(""); //токен
Bot.OnMessage += BotOnMessageReceived;
Bot.OnCallbackQuery += BotOnCallbackQueryReceived;
var me = Bot.GetMeAsync().Result;
Console.WriteLine(me.FirstName);
Bot.StartReceiving();
Console.ReadLine();
Bot.StopReceiving();
}
#region Stage_1
private class Stage_1
{
public delegate void BotOnMessageDelegate(object sender, Telegram.Bot.Args.MessageEventArgs e);
public async void Answer_1(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
var message = e.Message;
{
if (message.Text == "/next")
{
var replyKeyboard_1 = new ReplyKeyboardMarkup(new[]
{
new KeyboardButton("Сыграем в игру"),
new KeyboardButton("Сразу к делу")
}
);
await Bot.SendTextMessageAsync(message.From.Id, "Сыграем? Я определю псевдоним по результатам опроса. Клац 2 раза на одну кнопку", replyMarkup: replyKeyboard_1);
return;
}
if (message.Text == "Сыграем в игру")
{
Stage_2 Answer_2 = new Stage_2();
Bot.OnMessage += Answer_2.Answer_2;
await Task.Run(() => Answer_2);
return;
}
else if (message.Text == "Сразу к делу")
{
Stage_2 Answer_2_2 = new Stage_2();
Bot.OnMessage += Answer_2_2.Answer_2_2;
await Task.Run(() => Answer_2_2);
return;
}
else
return;
}
}
}
#endregion
#region Stage_2
private class Stage_2
{
public delegate void BotOnMessageDelegate(object sender, Telegram.Bot.Args.MessageEventArgs e);
public async void Answer_2(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
var message = e.Message;
{
if (message.Text == "Сыграем в игру")
{
var replyKeyboard_2 = new ReplyKeyboardMarkup(new[]
{
new KeyboardButton("до 18"),
new KeyboardButton("от 18 до 32"),
new KeyboardButton("от 32 до 56"),
new KeyboardButton("от 56 и старше")
});
await Bot.SendTextMessageAsync(message.From.Id, "Возраст?", replyMarkup: replyKeyboard_2);
return;
}
if (message.Text == "до 18" || message.Text == "от 18 до 32" || message.Text == "от 32 до 56" || message.Text == "от 56 и старше")
{
Stage_3 Answer_3 = new Stage_3();
Bot.OnMessage += Answer_3.Answer_3;
await Task.Run(() => Answer_3);
return;
}
}
}
public async void Answer_2_2(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
var message = e.Message;
{
if (message.Text == "Сразу к делу")
{
var replyKeyboard_2_2 = new ReplyKeyboardMarkup(new[]
{
new KeyboardButton("ты не туда попал"),
new KeyboardButton("отвали")
});
await Bot.SendTextMessageAsync(message.From.Id, "Ок", replyMarkup: replyKeyboard_2_2);
return;
}
}
}
}
#endregion
#region Stage_3
private class Stage_3
{
public delegate void BotOnMessageDelegate(object sender, Telegram.Bot.Args.MessageEventArgs e);
public async void Answer_3(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
var message = e.Message;
{
if (message.Text == "до 18" || message.Text == "от 18 до 32" || message.Text == "от 32 до 56" || message.Text == "от 56 и старше")
{
var replyKeyboard_3 = new ReplyKeyboardMarkup(new[]
{
new KeyboardButton("мужской"),
new KeyboardButton("женский")
});
await Bot.SendTextMessageAsync(message.From.Id, "Пол?", replyMarkup: replyKeyboard_3);
return;
}
if (message.Text == "мужской")
{
Stage_4 Answer_4_1 = new Stage_4();
Bot.OnMessage += Answer_4_1.Answer_4_1;
await Task.Run(() => Answer_4_1);
return;
}
else if (message.Text == "женский")
{
Stage_4 Answer_4_2 = new Stage_4();
Bot.OnMessage += Answer_4_2.Answer_4_2;
await Task.Run(() => Answer_4_2);
return;
}
else
return;
}
}
}
#endregion
#region Stage_4
private class Stage_4
{
public async void Answer_4_1(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
var message = e.Message;
{
if (message.Text == "мужской")
{
var replyKeyboard_4_1 = new ReplyKeyboardMarkup(new[]
{
new KeyboardButton("да"),
new KeyboardButton("нет"),
});
string[] question1 = new string[3]
{
"rand_quest1_1",
"rand_quest1_2",
"rand_quest1_3"
};
Random rand_question1 = new Random();
int index_q1 = rand_question1.Next(question1.Length);
string q1 = question1[index_q1];
await Bot.SendTextMessageAsync(message.From.Id, $"Ответь честно: {q1}?", replyMarkup: replyKeyboard_4_1);
return;
}
if (message.Text == "да" || message.Text == "нет")
{
Stage_5 Answer_5_1 = new Stage_5();
Bot.OnMessage += Answer_5_1.Answer_5_1;
await Task.Run(() => Answer_5_1);
return;
}
}
}
public async void Answer_4_2(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
var message = e.Message;
{
if (message.Text == "женский")
{
var replyKeyboard_4_2 = new ReplyKeyboardMarkup(new[]
{
new KeyboardButton("да"),
new KeyboardButton("нет"),
});
string[] question2 = new string[3]
{
"rand_quest2_1",
"rand_quest2_2",
"rand_quest2_3"
};
Random rand_question2 = new Random();
int index_q2 = rand_question2.Next(question2.Length);
string q2 = question2[index_q2];
await Bot.SendTextMessageAsync(message.From.Id, $"Ответь честно: {q2}?", replyMarkup: replyKeyboard_4_2);
return;
}
if (message.Text == "да" || message.Text == "нет")
{
Stage_5 Answer_5_2 = new Stage_5();
Bot.OnMessage += Answer_5_2.Answer_5_2;
await Task.Run(() => Answer_5_2);
return;
}
}
}
}
#endregion Stage_5
#region Stage_5
private class Stage_5
{
public delegate void BotOnMessageDelegate(object sender, Telegram.Bot.Args.MessageEventArgs e);
public async void Answer_5_1(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
var message = e.Message;
{
if (message.Text == "да" || message.Text == "нет")
{
{
string text_5_1 =
@"Итого...";
await Bot.SendTextMessageAsync(message.From.Id, text_5_1); //можно добавить задержку
}
var replyKeyboard_5_1 = new ReplyKeyboardMarkup(new[]
{
new KeyboardButton("ок"),
new KeyboardButton("заново!")
}
);
string[] nick1 = new string[3]
{
"Имя1_1",
"Имя1_2",
"Имя1_3"
};
Random rand_nick1 = new Random();
int index_n1 = rand_nick1.Next(nick1.Length);
string n1 = nick1[index_n1];
string[] byname1 = new string[3]
{
"Фамилия1_1",
"Фамилия1_2",
"Фамилия1_3"
};
Random rand_byname1 = new Random();
int index_b1 = rand_byname1.Next(byname1.Length);
string b1 = byname1[index_b1];
await Bot.SendTextMessageAsync(message.From.Id, $"Похоже, что ты {n1} {b1}", replyMarkup: replyKeyboard_5_1);
return;
}
}
}
public async void Answer_5_2(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
var message = e.Message;
{
if (message.Text == "да" || message.Text == "нет")
{
{
string text_5_2 =
@"Итого...";
await Bot.SendTextMessageAsync(message.From.Id, text_5_2); //можно добавить задержку
}
var replyKeyboard_5_2 = new ReplyKeyboardMarkup(new[]
{
new KeyboardButton("ок"),
new KeyboardButton("заново!")
}
);
string[] nick2 = new string[3]
{
"Имя2_1",
"Имя2_2",
"Имя2_3"
};
Random rand_nick2 = new Random();
int index_n2 = rand_nick2.Next(nick2.Length);
string n2 = nick2[index_n2];
string[] byname2 = new string[3]
{
"Фамилия2_1",
"Фамилия2_2",
"Фамилия2_3"
};
Random rand_byname2 = new Random();
int index_b2 = rand_byname2.Next(byname2.Length);
string b2 = byname2[index_b2];
await Bot.SendTextMessageAsync(message.From.Id, $"Похоже, что ты {n2} {b2}", replyMarkup: replyKeyboard_5_2);
return;
}
}
}
}
#endregion
private static async void BotOnCallbackQueryReceived(object sender, Telegram.Bot.Args.CallbackQueryEventArgs e)
{
string buttonText = e.CallbackQuery.Data;
string name = $"{e.CallbackQuery.From.FirstName} {e.CallbackQuery.From.LastName}";
Console.WriteLine($"{name} нажал {buttonText}");
await Bot.AnswerCallbackQueryAsync(e.CallbackQuery.Id, $"Вы нажали кнопку {buttonText}");
}
public static async void BotOnMessageReceived(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
var message = e.Message;
if (message == null || message.Type != MessageType.Text)
return;
else if (message.Text != "/start" && message.Text != "/ref"
&& message.Text != "/next" && message.Text != "Сыграем в игру" && message.Text != "Сразу к делу" && message.Text != "мужской" && message.Text != "женский" && message.Text != "ты не туда попал" && message.Text != "отвали" && message.Text != "до 18" && message.Text != "от 18 до 32" && message.Text != "от 32 до 56" && message.Text != "от 56 и старше" && message.Text != "да" && message.Text != "нет")
{
string text1 =
@"Пожалуйста, воспользуйся
следующим списком команд:
/start - запуск бота
/next - вывод диалога с ботом";
await Bot.SendTextMessageAsync(message.From.Id, text1);
}
string name = $"{message.From.FirstName} {message.From.LastName}";
Console.WriteLine($"{name} отправил сообщение: {message.Text}");
if (message.Text == "/start")
{
string text =
@"Список команд:
/start - запуск бота
/next - вывод диалога с ботом";
await Bot.SendTextMessageAsync(message.From.Id, text);
return;
} 
else if (message.Text == "/next")
{
Stage_1 Answer_1 = new Stage_1();
Bot.OnMessage += Answer_1.Answer_1;
await Task.Run(() => Answer_1);
return;
}
else
return;
}
}
}
  • Вопрос задан
  • 1005 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы