コード例 #1
0
 public async Task <NavigationResult> SendToMPA(Message message, CancellationToken cancellationToken, Dictionary <string, string> navigationParameters = null)
 {
     message.Content = PlainText.Parse(Regex.Replace(message.Content.ToString(), @"\r\n?|\n", " "));
     return(await SendToMPA(new List <Message> {
         message
     }, cancellationToken, navigationParameters));
 }
コード例 #2
0
        public async Task ReceiveAsync(Message message, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var userContext = await _contextManager.GetUserContextAsync(message.From, cancellationToken);

                var contact = await GetContact(message, cancellationToken);

                if (message.Content.ToString().Trim().Contains("#DEVACTION#"))
                {
                    await _devActionHandler.HandleAsync(message, cancellationToken);
                }
                else
                {
                    if (message.Content.ToString().Trim().Contains("Main Menu"))
                    {
                        message.Content = PlainText.Parse("#MainMenu_");
                    }
                    await _sender.SendDelayedComposingAsync(message.From, 2000, cancellationToken);
                    await ReceiveMessageAsync(message, contact, userContext, cancellationToken);
                }
            }
            catch (Exception ex)
            {
                await _sender.SendMessageAsync("Oops, something went wrong...", message.From, cancellationToken);
            }
        }
コード例 #3
0
        public async Task OnboardingReceiverUnitTest(bool isFirst, string teamDivision)
        {
            var message = new Message
            {
                From    = UnitTestBuilder.GetUserNode(),
                To      = UnitTestBuilder.GetBotNode(),
                Content = PlainText.Parse("UnitTest_" + teamDivision)
            };
            var userContext = new UserContext
            {
                FirstInteraction = isFirst
            };
            bool success = false;

            try
            {
                success = await flowService.SendOnboardingFlowAsync(userContext, message, CancellationToken.None);

                userContext = await contextManager.GetUserContextAsync(message.From, CancellationToken.None);
            }
            catch (Exception ex)
            {
                ex.ShouldBeNull();
            }
            finally
            {
                success.ShouldBeTrue();
                if (!isFirst)
                {
                    userContext.TeamDivision.ShouldBe(teamDivision);
                }
            }
        }
コード例 #4
0
        public Message GetYesNoQuickReply()
        {
            var YesNo = new Message()
            {
                Content = new Select()
                {
                    Scope   = SelectScope.Immediate,
                    Options = new SelectOption[]
                    {
                        new SelectOption
                        {
                            Text  = PlainText.Parse("Yes"),
                            Value = PlainText.Parse("")
                        },
                        new SelectOption
                        {
                            Text  = PlainText.Parse("No"),
                            Value = PlainText.Parse("")
                        }
                    }
                }
            };

            return(YesNo);
        }
コード例 #5
0
        public async Task SelectMainTeamReceiverUnitTest(string text, string teamTag)
        {
            var message = new Message
            {
                From    = UnitTestBuilder.GetUserNode(),
                To      = UnitTestBuilder.GetBotNode(),
                Content = PlainText.Parse(text + teamTag)
            };
            var context = new UserContext
            {
                MainTeam = ""
            };

            bool success = false;

            try
            {
                success = await flowService.SendSelectMainTeamFlowAsync(message, context, CancellationToken.None);

                context = await contextManager.GetUserContextAsync(message.From, CancellationToken.None);
            }
            catch (Exception ex)
            {
                ex.ShouldBeNull();
            }
            finally
            {
                success.ShouldBeTrue();
                context.MainTeam.ShouldBe(teamTag);
            }
        }
コード例 #6
0
        public async Task SetAndGetResourceUnitTest(string authKey)
        {
            Command   setResponse;
            PlainText getResponse;

            using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)))
            {
                if (authKey.Equals(""))
                {
                    setResponse = await _resourceService.SetAsync("UnitTest", PlainText.Parse("ResourceUnitTest"), _logger, cancellationToken : cts.Token);

                    getResponse = await _resourceService.GetAsync <PlainText>("UnitTest", _logger, cancellationToken : cts.Token);
                }
                else
                {
                    var resourceService = new ResourceService(authKey, Models.BlipProtocol.Tcp);
                    setResponse = await resourceService.SetAsync("UnitTest", PlainText.Parse("ResourceUnitTest"), _logger, cancellationToken : cts.Token);

                    getResponse = await resourceService.GetAsync <PlainText>("UnitTest", _logger, cancellationToken : cts.Token);
                }
            }

            setResponse.Status.ShouldBe(CommandStatus.Success);

            getResponse.ShouldNotBeNull();
            getResponse.Text.ShouldBe("ResourceUnitTest");
            getResponse.GetMediaType().ToString().ShouldBe("text/plain");
        }
コード例 #7
0
        public async Task DeleteResourceUnitTest()
        {
            bool exceptionThrown = false;

            using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)))
            {
                await _resourceService.SetAsync("DeleteUnitTest", PlainText.Parse("Delete"), _logger, cancellationToken : cts.Token);

                var getResource = await _resourceService.GetAsync <PlainText>("DeleteUnitTest", _logger, cancellationToken : cts.Token);

                getResource.ShouldNotBeNull();

                var deleteResponse = await _resourceService.DeleteAsync("DeleteUnitTest", _logger, cts.Token);

                deleteResponse.ShouldNotBeNull();
                deleteResponse.Status.ShouldBe(CommandStatus.Success);
                try
                {
                    getResource = await _resourceService.GetAsync <PlainText>("DeleteUnitTest", _logger, cancellationToken : cts.Token);
                }
                catch (BlipHttpClientException bex)
                {
                    bex.Reason.Code.ShouldBe(67);
                    bex.Reason.Description.ShouldBe("The requested resource was not found");
                    exceptionThrown = true;
                }
            }
            exceptionThrown.ShouldBeTrue();
        }
コード例 #8
0
        public async Task <bool> SendAgendaFlowAsync(UserContext context, Message message, CancellationToken cancellationToken)
        {
            try
            {
                var carousel = await _carouselBuilder.GetCarousel(context.AlertTeams, cancellationToken);

                carousel.To = message.From;
                var textMessage = new Message()
                {
                    Content = PlainText.Parse("Here's your overview for this week:"),
                    To      = message.From
                };
                await _sender.SendMessageAsync(textMessage, cancellationToken);

                await _sender.SendMessageAsync(carousel, cancellationToken);

                await _sender.SendDelayedComposingAsync(message.From, 2000, cancellationToken);

                await _sender.SendBackQuickReplyAsync(message.From, _quickReplyBuilder, cancellationToken);

                return(true);
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
コード例 #9
0
        private List <DocumentSelect> GetItemList(CompetitorElement[] divisionTeams, Flow flowIdentity)
        {
            var tag              = GetTagFromFlow(flowIdentity);
            var buttonsTexts     = GetButtonTextFromFlow(flowIdentity).Split('|');
            var buttonText       = buttonsTexts[0];
            var secondButtonText = "";

            if (buttonsTexts.Length == 2)
            {
                secondButtonText = buttonsTexts[1];
            }
            var itemList = new List <DocumentSelect>();

            foreach (CompetitorElement c in divisionTeams)
            {
                var item = new DocumentSelect
                {
                    Header = new DocumentContainer
                    {
                        Value = new MediaLink
                        {
                            Title       = c.Competitor.Name,
                            Text        = c.Competitor.HomeLocation,
                            Uri         = new Uri(c.Competitor.Logo),
                            AspectRatio = MyConstants.FacebookCarouselAspectRatio
                        }
                    }
                };
                var options     = new List <DocumentSelectOption>();
                var firstOption = new DocumentSelectOption
                {
                    Label = new DocumentContainer {
                        Value = PlainText.Parse(buttonText)
                    },
                    Value = new DocumentContainer {
                        Value = "Add" + tag + c.Competitor.AbbreviatedName
                    }
                };
                options.Add(firstOption);
                if (!secondButtonText.IsNullOrWhiteSpace())
                {
                    var secondOption = new DocumentSelectOption
                    {
                        Label = new DocumentContainer {
                            Value = PlainText.Parse(secondButtonText)
                        },
                        Value = new DocumentContainer {
                            Value = "Remove" + tag + c.Competitor.AbbreviatedName
                        }
                    };
                    options.Add(secondOption);
                }
                item.Options = options.ToArray();
                itemList.Add(item);
            }
            return(itemList);
        }
コード例 #10
0
 public async Task SendTextAsync(string text, CancellationToken cancellationToken)
 {
     var message = new Message(EnvelopeId.NewId())
     {
         Content = PlainText.Parse(text),
         From    = GetUserNode(),
     };
     await _testHost.DeliverIncomingMessageAsync(message);
 }
コード例 #11
0
        public async Task SendBroadcastLogUnitTest_ShouldSucceed()
        {
            var client           = BuildSenderSubstitute_ReturnsSuccessStatus();
            var broadcastService = new BroadcastService(client);
            var logger           = Substitute.For <ILogger>();
            var task             = broadcastService.SendMessageAsync(FirstListName, PlainText.Parse("UnitTests"), logger);

            await TestInfoLogsWithTwoArgs <string, Document>(task, 2, logger);
        }
コード例 #12
0
        public async Task SetResourceLogUnitTest_ShouldSucceed()
        {
            var document        = PlainText.Parse("LogUnitTest");
            var client          = BuildSenderSubstitute_ReturnsSuccessStatus();
            var resourceService = new ResourceService(client);
            var logger          = Substitute.For <ILogger>();
            await resourceService.SetAsync("LogUnitTest", document, logger : logger, cancellationToken : CancellationToken.None);

            logger.Received(1).Information(Arg.Any <string>(), Arg.Any <string>());
            logger.Received(1).Information(Arg.Any <string>(), Arg.Any <PlainText>(), Arg.Any <string>());
        }
コード例 #13
0
        public async Task <NavigationResult> SendToMPA(string message, Node from, CancellationToken cancellationToken, Dictionary <string, string> navigationParameters = null)
        {
            var plainContent = PlainText.Parse(Regex.Replace(message, @"\r\n?|\n", " "));

            return(await SendToMPA(new List <Message> {
                new Message(EnvelopeId.NewId())
                {
                    Content = plainContent, From = from, To = from, Metadata = new Dictionary <string, string>()
                }
            }, cancellationToken, navigationParameters));
        }
コード例 #14
0
        private async Task Send_Broadcast_UnitTest(string listName)
        {
            var sender = Substitute.For <ISender>();
            var calls  = 0;

            sender.When(x => x.SendMessageAsync(Arg.Any <Message>(), Arg.Any <CancellationToken>())).Do(x => calls++);
            var broadcastService = new BroadcastService(sender);

            await broadcastService.SendMessageAsync(listName, PlainText.Parse("UnitTests"), _logger);

            calls.ShouldBeGreaterThan(0);
        }
コード例 #15
0
        public void PlainText_ToContainer()
        {
            // Arrange
            var plainText = PlainText.Parse("Unit tests");

            // Act
            var container = plainText.ToDocumentContainer();

            // Assert
            container.Value.ShouldBe(plainText);
            container.Type.ShouldBe(PlainText.MediaType);
        }
コード例 #16
0
        public void MessagesUnitTest(string messageText)
        {
            var message = new Message
            {
                Content = PlainText.Parse(messageText)
            };

            var task = _client.SendMessageAsync(message, CancellationToken.None);

            task.Wait();
            task.IsCompleted.ShouldBeTrue();
        }
コード例 #17
0
        private async Task ImportAnswers(List <Intention> intentions)
        {
            var answersMap = new Dictionary <string, List <string> >();

            //Get intentions on file
            var csv = new Chilkat.Csv
            {
                //  Prior to loading the CSV file, indicate that the 1st row
                //  should be treated as column names:
                HasColumnNames = true
            };

            //  Load the CSV records from intentions the file:
            bool success = csv.LoadFile(AnswersFilePath.Value);

            if (!success)
            {
                Console.WriteLine(csv.LastErrorText);
                return;
            }

            //  Display the contents of the 3rd column (i.e. the country names)
            for (int row = 0; row <= csv.NumRows - 1; row++)
            {
                var intentionName = csv.GetCell(row, 0);
                var answer        = csv.GetCell(row, 1);

                var answersList = answersMap.ContainsKey(intentionName) ? answersMap[intentionName] : new List <string>();

                answersList.Add(answer);
                answersMap[intentionName] = answersList;
            }

            var intents = new List <Intention>();

            //Add each intention on BLiP IA model
            foreach (var intentionKey in answersMap.Keys)
            {
                var intention = intentions.FirstOrDefault(i => i.Name == intentionKey);
                if (intention == null)
                {
                    Console.WriteLine($"{intentionKey} not present in intentions list.");
                    continue;
                }

                var answersList  = answersMap[intentionKey];
                var answersArray = answersList.Select(q => new Answer {
                    RawValue = q, Type = PlainText.MediaType, Value = PlainText.Parse(q)
                }).ToArray();

                await _blipAIClient.AddAnswers(intention.Id, answersArray);
            }
        }
コード例 #18
0
        public async Task AgendaReceiverUnitTest()
        {
            var message = new Message
            {
                From    = UnitTestBuilder.GetUserNode(),
                To      = UnitTestBuilder.GetBotNode(),
                Content = PlainText.Parse("UnitTests")
            };

            var context = new UserContext
            {
                AlertTeams = new List <string>()
                {
                    { "DAL" },
                    { "BOS" },
                    { "HOU" },
                    { "NYE" },
                    { "SHD" },
                    { "VAL" },
                    { "GLA" },
                    { "LON" },
                    { "FLA" },
                    { "SEO" },
                    { "PHI" },
                    { "SFS" },
                }
            };

            bool success = false;

            try
            {
                success = await flowService.SendAgendaFlowAsync(context, message, CancellationToken.None);
            }
            catch (Exception ex)
            {
                ex.ShouldBeNull();
            }
            finally
            {
                success.ShouldBeTrue();
            }
        }
コード例 #19
0
        private static ISender BuildSenderSubstitute_ReturnsSuccessStatus()
        {
            var client = Substitute.For <ISender>();

            var responseCommand = new Command()
            {
                Status = CommandStatus.Success,
                Reason = new Reason()
                {
                    Description = "Unit Tests",
                    Code        = 42
                },
                Resource = PlainText.Parse("Unit tests")
            };

            client
            .ProcessCommandAsync(Arg.Any <Command>(), Arg.Any <CancellationToken>())
            .Returns(responseCommand);
            return(client);
        }
コード例 #20
0
        public async Task AlertReceiverUnitTest(string flow, string teamTag)
        {
            var message = new Message
            {
                From    = UnitTestBuilder.GetUserNode(),
                To      = UnitTestBuilder.GetBotNode(),
                Content = PlainText.Parse(flow + teamTag)
            };
            var team        = flow.Contains("Remove") ? teamTag : string.Empty;
            var userContext = new UserContext
            {
                AlertTeams = new List <string>
                {
                    { team }
                }
            };
            bool success = false;

            try
            {
                success = await flowService.SendAlertFlowAsync(userContext, message, CancellationToken.None);

                userContext = await contextManager.GetUserContextAsync(message.From, CancellationToken.None);
            }
            catch (Exception ex)
            {
                ex.ShouldBeNull();
            }
            finally
            {
                success.ShouldBeTrue();
                if (flow.Contains("Remove"))
                {
                    userContext.AlertTeams.ShouldNotContain(teamTag);
                }
                else if (flow.Contains("Add"))
                {
                    userContext.AlertTeams.ShouldContain(teamTag);
                }
            }
        }
コード例 #21
0
        public Message GetBackQuickReply()
        {
            var back = new Message()
            {
                Content = new Select()
                {
                    Text    = "Go back:",
                    Scope   = SelectScope.Immediate,
                    Options = new SelectOption[]
                    {
                        new SelectOption
                        {
                            Text  = PlainText.Parse("🔙"),
                            Value = PlainText.Parse("#MainMenu_")
                        }
                    }
                }
            };

            return(back);
        }
コード例 #22
0
        public async Task SendBroadcastLogUnitTest_ShouldThrowEx()
        {
            var logger           = Substitute.For <ILogger>();
            var client           = BuildSenderSubstitute_ThrowsException();
            var broadcastService = new BroadcastService(client);
            var exceptionThrown  = false;

            try
            {
                await broadcastService.SendMessageAsync(FirstListName, PlainText.Parse("UnitTests"), logger);
            }
            catch (Exception ex)
            {
                logger.Received(1).Error(ex, Arg.Any <string>(), Arg.Any <string>(), Arg.Any <Document>());
                exceptionThrown = true;
            }
            finally
            {
                exceptionThrown.ShouldBe(true);
            }
        }
コード例 #23
0
        public MarkupRoot Parse(string plainText)
        {
            var parsedText = PlainText.Parse(plainText);

            var tagStack = new Stack <Tag>();

            tagStack.Push(new MarkupRoot());

            foreach (var part in parsedText)
            {
                var currentTag = tagStack.Peek();

                if (part.IsPlainText)
                {
                    ParseContent(currentTag, part.ToString());
                }
                else
                {
                    var openingTag = part as OpeningTag;
                    if (openingTag != null)
                    {
                        currentTag = ParseOpeningTag(openingTag, currentTag, tagStack);
                    }
                    else
                    {
                        var closingTag = part as ClosingTag;
                        currentTag = ParseClosingTag(closingTag, currentTag, tagStack);
                    }
                }
            }

            // Auto-close unclosed tags.
            while (tagStack.Count > 1)
            {
                tagStack.Pop();
            }

            return(tagStack.Pop() as MarkupRoot);
        }
コード例 #24
0
        public async Task SetResourceLogUnitTest_ShouldThrowEx()
        {
            var document        = PlainText.Parse("LogUnitTest");
            var logger          = Substitute.For <ILogger>();
            var client          = BuildSenderSubstitute_ThrowsException();
            var resourceService = new ResourceService(client);
            var exceptionThrown = false;

            try
            {
                await resourceService.SetAsync("LogUnitTest", document, logger : logger, cancellationToken : CancellationToken.None);
            }
            catch (Exception ex)
            {
                logger.Received(1).Error(ex, Arg.Any <string>(), Arg.Any <PlainText>(), Arg.Any <string>());
                exceptionThrown = true;
            }
            finally
            {
                exceptionThrown.ShouldBe(true);
            }
        }
コード例 #25
0
        public async Task NewsReceiverUnitTest()
        {
            var message = new Message
            {
                From    = UnitTestBuilder.GetUserNode(),
                To      = UnitTestBuilder.GetBotNode(),
                Content = PlainText.Parse("UnitTests")
            };
            bool success = false;

            try
            {
                success = await flowService.SendNewsFlowAsync(message, CancellationToken.None);
            }
            catch (Exception ex)
            {
                ex.ShouldBeNull();
            }
            finally
            {
                success.ShouldBeTrue();
            }
        }
コード例 #26
0
ファイル: NoActionService.cs プロジェクト: lfmundim/botDAICEx
        public async Task <Document> NoActionPayment(string input, Message messageOriginator, CancellationToken cancellationToken)
        {
            input = input.Replace("\n#noaction#pagamento#", "");
            string[] tokens = input.Split('#');
            int      preco = 0, quantidade = Convert.ToInt32(tokens[2]);
            string   modelo, tipoCamisa = tokens[0], tamanho = tokens[1], estampa = tokens[3], cor = null;

            if (tipoCamisa == "curso")
            {
                cor    = tokens[4];
                preco  = 25;
                modelo = estampa + " " + tamanho + " " + cor;
            }
            else
            {
                modelo = estampa + " " + tamanho;
                if (quantidade == 1)
                {
                    preco = 30;
                }
                else if (quantidade > 1)
                {
                    preco = 25;
                }
            }

            Invoice   invoice   = CreatePaymentMessage(preco, quantidade, modelo);
            var       to        = Node.Parse($"{Uri.EscapeDataString(messageOriginator.From.ToIdentity().ToString())}@pagseguro.gw.msging.net");
            ChatState chatState = new ChatState {
                State = ChatStateEvent.Composing
            };
            await _sender.SendMessageAsync(chatState, messageOriginator.From);

            await _sender.SendMessageAsync(invoice, to, cancellationToken);

            return(PlainText.Parse("Sucess"));
        }
コード例 #27
0
        public void DocumentSelect_ToContainer()
        {
            // Arrange
            var documentSelect = new DocumentSelect
            {
                Header  = PlainText.Parse("Unit tests").ToDocumentContainer(),
                Options = new DocumentSelectOption[]
                {
                    new DocumentSelectOption
                    {
                        Label = PlainText.Parse("Unit test").ToDocumentContainer(),
                        Value = PlainText.Parse("Unit test").ToDocumentContainer()
                    }
                },
                Scope = SelectScope.Immediate
            };

            // Act
            var container = documentSelect.ToDocumentContainer();

            // Assert
            container.Value.ShouldBe(documentSelect);
            container.Type.ShouldBe(DocumentSelect.MediaType);
        }
コード例 #28
0
        private async Task SendCommandToMPAAsync(string commmand, Message messageOriginator, CancellationToken cancellationToken)
        {
            var MessageToMPA = new Message(messageOriginator.Id)
            {
                To       = messageOriginator.From,
                From     = messageOriginator.From,
                Content  = PlainText.Parse(commmand),
                Metadata = messageOriginator.Metadata
            };

            var firstNavResult = await _mpaService.SendToMPA(MessageToMPA, cancellationToken);

            if (firstNavResult.NavigationState == NavigationState.Error)
            {
                _logger.Error($"Error on sending message to MPA. User from: {messageOriginator.From} message: {(MessageToMPA.Content as PlainText).Text}");

                var result = await _mpaService.SendToMPA(GenericErrorCommand, messageOriginator.From, cancellationToken);

                if (result.NavigationState == NavigationState.Error)
                {
                    await _genericErrorService.SendGenericErrorAsync(messageOriginator.From, cancellationToken);
                }
            }
        }
コード例 #29
0
 /// <summary>
 /// Extension that wrappes a text string to DocumentContainer containing a PlainText document with the given text.
 /// </summary>
 /// <param name="text"></param>
 /// <returns></returns>
 public static DocumentContainer ToPlainTextDocumentContainer(this string text)
 {
     return(PlainText.Parse(text).ToDocumentContainer());
 }
コード例 #30
0
        private Document GetDocument(string raw, string type)
        {
            if ("text" == type)
            {
                return(PlainText.Parse(raw));
            }

            if ("menu" == type || "quickreply" == type)
            {
                var parts  = raw.Split('|');
                var select = new Select
                {
                    Text    = parts[0],
                    Options = parts
                              .Where(p => p != parts[0])
                              .Select(o => new SelectOption {
                        Text = o, Value = PlainText.Parse(o)
                    })
                              .ToArray(),
                    Scope = ("quickreply" == type) ? SelectScope.Immediate : SelectScope.Transient
                };
                return(select);
            }

            if ("carousel_img" == type)
            {
                var docColl = new DocumentCollection
                {
                    ItemType = DocumentSelect.MediaType
                };

                var items = new List <DocumentSelect>();
                var cards = raw.Split('%');

                foreach (var item in cards)
                {
                    var parts  = item.Split('|');
                    var header = new List <string>();
                    for (int i = 0; i < parts.Length - 1; i++)
                    {
                        header.Add(parts[i]);
                    }
                    var btns = parts[parts.Length - 1].Split('&');

                    var docSel = new DocumentSelect
                    {
                        Header = new DocumentContainer
                        {
                            Value = new MediaLink
                            {
                                Title = header[1],
                                Text  = header[2],
                                Uri   = new Uri("http://site.com/" + header[0] + ".jpg"),
                                Type  = new MediaType(MediaType.DiscreteTypes.Image, MediaType.SubTypes.JPeg)
                            }
                        },
                        Options = btns.Select(b =>
                                              new DocumentSelectOption
                        {
                            Label = new DocumentContainer
                            {
                                Value = new PlainText {
                                    Text = b
                                }
                            }
                        }
                                              ).ToArray()
                    };
                    items.Add(docSel);
                }

                docColl.Items = items.ToArray();
                docColl.Total = docColl.Items.Length;

                return(docColl);
            }

            if ("carousel_txt" == type)
            {
                var docColl = new DocumentCollection
                {
                    ItemType = DocumentSelect.MediaType,
                };

                var items = new List <DocumentSelect>();
                var cards = raw.Split('%');

                foreach (var item in cards)
                {
                    var parts  = item.Split('|');
                    var header = new List <string>();
                    for (int i = 0; i < parts.Length - 1; i++)
                    {
                        header.Add(parts[i]);
                    }
                    var btns = parts[parts.Length - 1].Split('&');

                    var docSel = new DocumentSelect
                    {
                        Header = new DocumentContainer
                        {
                            Value = new PlainText
                            {
                                Text = header[0],
                            }
                        },
                        Options = btns.Select(b =>
                                              new DocumentSelectOption
                        {
                            Label = new DocumentContainer
                            {
                                Value = new PlainText {
                                    Text = b
                                }
                            }
                        }
                                              ).ToArray()
                    };
                    items.Add(docSel);
                }

                docColl.Items = items.ToArray();
                docColl.Total = docColl.Items.Length;

                return(docColl);
            }

            return(PlainText.Parse(raw));
        }