Попытка разобраться с Telegram ботом
Цитата: Евгений от 26.12.2023, 15:19Всем доброго времени! В C# я не силён, когда-то давно пытался изучать по урокам Хачатура, в итоге сделал то, что мне надо было и забросил. Сейчас появилась нужда написать не большого ТГ бота, но что-то совсем разобраться не получается...
Смысл бота в следующем:
1. При получении сообщения "старт" бот запускается и ждёт от меня список который содержит (в данный момент просто ":").
2. Далее, при получении того самого ":", бот должен перейти в метод, который должен обработать список и выполняться каждые 5 секунд. То ли таймер нужен, то ли цикл, даже не знаю как тут правильно быть...
3. При получении сообщения "стоп", бот соответственно должен перестать обрабатывать этот список через каждые 5 секунд.
Что у меня в данный момент: бот заходит в цикл в котором есть метод, но после этого он перестаёт слушать все сообщения входящие, ну и соответственно ни какой реакции на команду "стоп" я не могу добиться... Плюс я не правильно использую CancellationToken, тоже не пойму как с ним работать.
P.S. Пробовал несколько вариантов, перечислять их пока не буду, всё равно не работали у меня, потому что делал их наверняка не правильно ))
[spoiler title="Код"]using Telegram.Bot; using Telegram.Bot.Types; namespace Telega { internal class Program { static string _token = "12345"; static ITelegramBotClient _client; static CancellationTokenSource _cts = new CancellationTokenSource(); static void Main(string[] args) { try { _client = new TelegramBotClient(_token); _client.StartReceiving(Update, Error, cancellationToken: _cts.Token); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); Console.ReadLine(); } } async static Task Update(ITelegramBotClient botClient, Update update, CancellationToken myToken) { try { var message = update.Message; if (message.Text != null) { if (message.Text.ToLower().Contains("старт")) { await _client.SendTextMessageAsync(message.Chat.Id, "Бот запущен..."); int num = 1; while (!_cts.Token.IsCancellationRequested) { message = (await _client.GetUpdatesAsync(update.Id + 1)).FirstOrDefault()?.Message; if (message != null) { if (message.Text.Contains(":")) { _ = Test.Iteration(num); await Task.Delay(500); } } num++; await Task.Delay(5000); } if (message.Text.ToLower().Contains("стоп")) { Console.WriteLine("Бот остановлен"); await botClient.SendTextMessageAsync(message.Chat.Id, "Бот остановлен"); _cts.Cancel(); return; } } } } catch (Exception e) { Console.WriteLine(e); Console.ReadLine(); } } private static Task Error(ITelegramBotClient botClient, Exception exception, CancellationToken token) { throw new NotImplementedException(); } } }
[/spoiler]
Всем доброго времени! В C# я не силён, когда-то давно пытался изучать по урокам Хачатура, в итоге сделал то, что мне надо было и забросил. Сейчас появилась нужда написать не большого ТГ бота, но что-то совсем разобраться не получается...
Смысл бота в следующем:
1. При получении сообщения "старт" бот запускается и ждёт от меня список который содержит (в данный момент просто ":").
2. Далее, при получении того самого ":", бот должен перейти в метод, который должен обработать список и выполняться каждые 5 секунд. То ли таймер нужен, то ли цикл, даже не знаю как тут правильно быть...
3. При получении сообщения "стоп", бот соответственно должен перестать обрабатывать этот список через каждые 5 секунд.
Что у меня в данный момент: бот заходит в цикл в котором есть метод, но после этого он перестаёт слушать все сообщения входящие, ну и соответственно ни какой реакции на команду "стоп" я не могу добиться... Плюс я не правильно использую CancellationToken, тоже не пойму как с ним работать.
P.S. Пробовал несколько вариантов, перечислять их пока не буду, всё равно не работали у меня, потому что делал их наверняка не правильно ))
using Telegram.Bot;
using Telegram.Bot.Types;
namespace Telega
{
internal class Program
{
static string _token = "12345";
static ITelegramBotClient _client;
static CancellationTokenSource _cts = new CancellationTokenSource();
static void Main(string[] args)
{
try
{
_client = new TelegramBotClient(_token);
_client.StartReceiving(Update, Error, cancellationToken: _cts.Token);
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
Console.ReadLine();
}
}
async static Task Update(ITelegramBotClient botClient, Update update, CancellationToken myToken)
{
try
{
var message = update.Message;
if (message.Text != null)
{
if (message.Text.ToLower().Contains("старт"))
{
await _client.SendTextMessageAsync(message.Chat.Id, "Бот запущен...");
int num = 1;
while (!_cts.Token.IsCancellationRequested)
{
message = (await _client.GetUpdatesAsync(update.Id + 1)).FirstOrDefault()?.Message;
if (message != null)
{
if (message.Text.Contains(":"))
{
_ = Test.Iteration(num);
await Task.Delay(500);
}
}
num++;
await Task.Delay(5000);
}
if (message.Text.ToLower().Contains("стоп"))
{
Console.WriteLine("Бот остановлен");
await botClient.SendTextMessageAsync(message.Chat.Id, "Бот остановлен");
_cts.Cancel();
return;
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e);
Console.ReadLine();
}
}
private static Task Error(ITelegramBotClient botClient, Exception exception, CancellationToken token)
{
throw new NotImplementedException();
}
}
}
Цитата: Евгений от 05.01.2024, 12:28Тему можно закрывать.
Тему можно закрывать.