Ожидание нового сообщение от пользователя в TelegramBot
пытаюсь сделать некий "чат" через бота (просто хочу познать азы в этом всём)
Вот весь код:
using Telegram.Bot.Polling;
using Telegram.Bot.Types.Enums;
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Types;
using System.IO;
using System.Diagnostics;
public class DoWork
{
// Это клиент для работы с Telegram Bot API, который позволяет отправлять сообщения, управлять ботом, подписываться на обновления и многое другое.
private static ITelegramBotClient _botClient;
// Это объект с настройками работы бота. Здесь мы будем указывать, какие типы Update мы будем получать, Timeout бота и так далее.
private static ReceiverOptions _receiverOptions;
static async Task Main()
{
_botClient = new TelegramBotClient("токен"); // Присваиваем нашей переменной значение, в параметре передаем Token, полученный от BotFather
_receiverOptions = new ReceiverOptions // Также присваем значение настройкам бота
{
AllowedUpdates = new[] // Тут указываем типы получаемых Update`ов, о них подробнее расказано тут https://core.telegram.org/bots/api#update
{
UpdateType.Message, // Сообщения (текст, фото/видео, голосовые/видео сообщения и т.д.)
},
// Параметр, отвечающий за обработку сообщений, пришедших за то время, когда ваш бот был оффлайн
// True - не обрабатывать, False (стоит по умолчанию) - обрабаывать
ThrowPendingUpdates = true,
};
using var cts = new CancellationTokenSource();
// UpdateHander - обработчик приходящих Update`ов
// ErrorHandler - обработчик ошибок, связанных с Bot API
_botClient.StartReceiving(UpdateHandler, ErrorHandler, _receiverOptions, cts.Token); // Запускаем бота
var me = await _botClient.GetMeAsync(); // Создаем переменную, в которую помещаем информацию о нашем боте.
Console.WriteLine($"{me.FirstName} запущен!");
await Task.Delay(-1); // Устанавливаем бесконечную задержку, чтобы наш бот работал постоянно
}
private static async Task UpdateHandler(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
// Обязательно ставим блок try-catch, чтобы наш бот не "падал" в случае каких-либо ошибок
try
{
// Сразу же ставим конструкцию switch, чтобы обрабатывать приходящие Update
switch (update.Type)
{
case UpdateType.Message:
{
// эта переменная будет содержать в себе все связанное с сообщениями
var message = update.Message;
// From - это от кого пришло сообщение (или любой другой Update)
var user = message.From;
// Выводим на экран то, что пишут нашему боту, а также небольшую информацию об отправителе
Console.WriteLine($"{user.FirstName} ({user.Id}) написал сообщение: {message.Text}");
// Chat - содержит всю информацию о чате
var chat = message.Chat;
if (message.Type == MessageType.Photo)
{
var fileId = update.Message.Photo.Last().FileId;
var fileInfo = await botClient.GetFileAsync(fileId);
var filePath = fileInfo.FilePath;
string path = $"{Directory.GetCurrentDirectory()}/test.file";
if (!System.IO.File.Exists(path))
{
System.IO.File.Create(path);
}
using (FileStream fs = System.IO.File.OpenWrite(path))
{
await botClient.DownloadFileAsync(filePath, fs, cancellationToken);
fs.Close();
}
FileStream files = System.IO.File.OpenRead(path);
await botClient.SendPhotoAsync(
chat.Id,
photo: InputFile.FromStream(files),
replyToMessageId: message.MessageId
);
files.Close();
}
else if (message.Type == MessageType.Text)
{
string pathId = $"{Directory.GetCurrentDirectory()}/DATA";
if (message.Text == "Получить личную ссылку")
{
await botClient.SendTextMessageAsync(chat.Id, $"Твоя новая ссылка для получения сообщений: \n https://t.me/randon_name?start={chat.Id}");
if (!Directory.Exists($"{Directory.GetCurrentDirectory()}/DATA"))
{
Directory.CreateDirectory($"{Directory.GetCurrentDirectory()}/DATA");
}
else
{
using (StreamWriter sw = new StreamWriter($"{pathId}/IDs.txt", true))
{
sw.WriteLine(chat.Id);
sw.Close();
}
}
}
else
{
using (StreamReader sr = new StreamReader($"{pathId}/IDs.txt"))
{
List<string> idss = new List<string>();
while (true)
{
string line = sr.ReadLine();
if (line == null) break;
idss.Add(line);
}
for (int i = 0; i < idss.Count; i++)
{
if (message.Text == $"/start {idss[i]}")
{
string acceptMsg = message.Text;
char[] chars = new char[]
{
'/',
's',
't',
'r',
'a',
' ',
};
string formated = acceptMsg.TrimStart(chars);
string idMes = idss[i];
await botClient.SendTextMessageAsync(chat.Id, "Введите анонимное сообщение пользователю:");
string mesUser = message.Text;
await botClient.SendTextMessageAsync(idMes , $"Получено новое анонимное сообщение: \n {mesUser} ");
}
else
{
await botClient.SendTextMessageAsync(chat.Id, "Непонятен запрос");
}
}
}
}
}
return;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
private static Task ErrorHandler(ITelegramBotClient botClient, Exception error, CancellationToken cancellationToken)
{
// Тут создадим переменную, в которую поместим код ошибки и её сообщение
var ErrorMessage = error switch
{
ApiRequestException apiRequestException
=> $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}",
_ => error.ToString()
};
Console.WriteLine(ErrorMessage);
return Task.CompletedTask;
}
}
Мне нужно понять, как получить уже новое сообщение от пользователя. Ошибка в этом блоке:
await botClient.SendTextMessageAsync(chat.Id, "Введите анонимное сообщение пользователю:");
string mesUser = message.Text;
await botClient.SendTextMessageAsync(idMes , $"Получено новое анонимное сообщение: \n {mesUser} ");
}
else
{
await botClient.SendTextMessageAsync(chat.Id, "Непонятен запрос");
}
Человеку даже не нужно отправлять сообщение, потому что тупо отправляется прошлое, древнее сообщение.
Если кратко, то человеку, как минимум нужно ввести /start. И когда дело доходит уже до введения сообщение, то что бы человек не написал, всё равно бот отправит то старое сообщение "/start".
Вопрос: Как проверять на новый сообщения, а не на старые? Ведь например, в той же консоли есть Console.ReadLine()
, но однако, там сообщения постоянно меняются, а тут нет. Что делать?