public async Task <IEnumerable <long> > SendMessage(long chatId, OutMessage message) { var result = new List <long>(message.Attachments.Count + 1); GroupAttachments(message.Attachments, out var photos, out var videos, out var others); var photoMediaGroup = photos.Select(TgConverter.ToTgPhoto); var videoMediaGroup = videos.Select(TgConverter.ToTgVideo); if (photos.Count > 0) { result.AddRange((await _api.SendMediaGroupAsync(photoMediaGroup, chatId).ConfigureAwait(false)) .Select(a => (long)a.MessageId)); } if (videos.Count > 0) { result.AddRange((await _api.SendMediaGroupAsync(videoMediaGroup, chatId).ConfigureAwait(false)) .Select(a => (long)a.MessageId)); } foreach (var attachment in others) { switch (attachment.Type) { case AttachmentType.Audio: var sentAudio = await _api.SendAudioAsync(chatId, TgConverter.ToTgMedia(attachment)) .ConfigureAwait(false); result.Add(sentAudio.MessageId); break; case AttachmentType.Voice: var sentVoice = await _api.SendVoiceAsync(chatId, TgConverter.ToTgMedia(attachment)) .ConfigureAwait(false); result.Add(sentVoice.MessageId); break; default: var sendDocument = await _api.SendDocumentAsync(chatId, TgConverter.ToTgMedia(attachment)) .ConfigureAwait(false); result.Add(sendDocument.MessageId); break; } } var keyboard = message.Keyboard switch { InlineKeyboard inlineKeyboard => TgConverter.ToTgKeyboard(inlineKeyboard), ReplyKeyboard replyKeyboard => TgConverter.ToTgKeyboard(replyKeyboard), _ => message.RemoveReplyKeyboard ? new ReplyKeyboardRemove() : null }; var sentMessage = await _api.SendTextMessageAsync(chatId, message.Text, replyMarkup : keyboard) .ConfigureAwait(false); result.Add(sentMessage.MessageId); return(result); }