示例#1
0
        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);
        }
示例#2
0
        public async Task <Chat?> GetChat(long chatId)
        {
            var chat = await _api.GetChatAsync(chatId).ConfigureAwait(false);

            var ownerId = chat.Type switch
            {
                TgChatType.Private => chat.Id,
                _ => (await _api.GetChatAdministratorsAsync(chatId).ConfigureAwait(false))
                .First(u => u.Status == ChatMemberStatus.Creator).User.Id
            };

            return(TgConverter.ToChat(chat, ownerId));
        }
示例#3
0
        private async Task <UpdateContext?> CreateContext(Update update)
        {
            switch (update.Type)
            {
            case UpdateType.Message:
            {
                var message = TgConverter.ToMessage(update.Message);
                var user    = TgConverter.ToUser(update.Message.From);
                // The only way to create chat with ownerId.
                // GetChat can pass ownerId to Converter.ToChat().
                var messenger = _bot.ResolveMessenger(message.MessengerSource);
                var chat      = await messenger.GetChat(update.Message.Chat.Id).ConfigureAwait(false);

                return(new UpdateContext(messenger, chat, user, message));
            }

            default:
                return(null);
            }
        }
示例#4
0
        public async Task <User?> GetUser(long userId)
        {
            var user = await _api.GetChatAsync(userId).ConfigureAwait(false);

            return(TgConverter.ToUser(user));
        }