C# TLSharp получить сообщение (TLMessage) из канала
С помощью TLSharp получаю список сообщений с канала, мне нужно взять последнее опубликованное сообщение и получить информацию о нем, а именно:
текст сообщения, тип вложений (фото\видео\аудио и т.д.), количество вложений.
Использую следующий код:
Получаю канал:
public async Task<TLChannel> GetChannel(string username)
{
if (!_authorized)
throw new UnauthorizedAccessException("Not authorized");
TLRequestResolveUsername requestResolveUsername = new TLRequestResolveUsername()
{
Username = username
};
TLResolvedPeer peer = await _client.SendRequestAsync<TLResolvedPeer>(requestResolveUsername);
TLChannel channel = (TLChannel)peer.Chats.First();
return channel;
}
Получаю последнее сообщение в канале:
public async Task<TLMessage> GetLastMessage(TLChannel channelFrom)
{
TLChannelMessages resp = (TLChannelMessages)await _client.GetHistoryAsync(new TLInputPeerChannel()
{
ChannelId = channelFrom.Id,
AccessHash = channelFrom.AccessHash ?? 0,
}, limit: 1000);
TLMessage lastMessage = (TLMessage)resp.Messages?.Where(x => x is TLMessage).First();
return lastMessage;
}
В результате выходит переменная TLMessage.
С помощью lastMessage.Message получаю текст сообщения, lastMessage.Id = ID сообщения.
Как можно узнать есть ли с сообщением прикрепленные файлы (фото\видео и т.д.) и их количество?
Ответы (1 шт):
Я к сожалению не знаю, как это работает, но погуглил, покопался в гитхабе, и думаю, что вот так можно определить конкретный тип TLMessage.Media.
TLMessage message = await GetLastMessage(channel);
switch (message.Media)
{
case TLMessageMediaContact contact:
// это контакт
break;
case TLMessageMediaDocument document:
// это документ
break;
case TLMessageMediaGame game:
// это игра
break;
case TLMessageMediaGeo geo:
// это геолокация
break;
case TLMessageMediaInvoice invoice:
// это деньги
break;
case TLMessageMediaPhoto photo:
// это картинки
break;
case TLMessageMediaVenue venue:
// это место проведения мероприятия
break;
case TLMessageMediaWebPage webPage:
// это веб-страница
break;
case TLMessageMediaUnsupported unsupported:
// TLSharp не понял, что это такое
break;
case TLMessageMediaEmpty empty:
// пусто
break;
case default:
// null или тип, который не перечислен выше
break;
}
После определения типа можно обращаться к конкретному объекту, например photo.Photo. Вам необязательно всё перечисленное обрабатывать, вы можете выкинуть лишнее из кода, и оставить только типы, которые хотите поддерживать. Если выкинуть ветку, то будет срабатывать case default для тех веток, которых нет.
Там еще есть message.Entities, которые тоже могут содержать что-то полезное. Поддержки фотоальбома в одном сообщении я что-то не нашел. В любом случае TLSharp поддерживет возможность реализации остуствующих в самом фреймворке методов на основе родной телеграмовской API.
Кстати, сам TLSharp очень сложно написан, куча пустых абстракций, используемых как интерфейсы, автор явно не особо заморачивался с дизайном этого всего, а просто писал код под какую-то свою задачу, а потом выложил, что получилось. Везде эти повторяющиеся префиксы, у автора явно проблемы с ООП и правилами именования классов. В общем, я сломал себе глаза в гитхабе, и не знаю, как вам еще помочь.