示例#1
0
        private async Task <List <Person> > ResolvePerson(string name, ITurnContext turnContext, CancellationToken cancellationToken)
        {
            List <Person> result = null;

            IEnumerable <TeamsChannelAccount> members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            result = members.Where((w) => w.Name.ToLower().Contains(name.ToLower()))
                     .Select((w) => new Person
            {
                name  = w.Name,
                email = w.Email
            })
                     .ToList();
            result.Sort((p, q) => string.Compare(p.name, q.name));

            if (result == null || result.Count == 0)
            {
                result = new List <Person> {
                    new Person {
                        name = name, email = ""
                    }
                };
            }

            return(result);
        }
        // Called when the task module is fetched for an action
        public async Task <MessagingExtensionActionResponse> HandleMessagingExtensionFetchTaskAsync(ITurnContext turnContext, MessagingExtensionAction query)
        {
            var emptyRequest = new ConsultingRequestDetails();
            ConsultingDataService dataService = new ConsultingDataService();

            emptyRequest.possibleProjects = await dataService.GetProjects("");

            IEnumerable <TeamsChannelAccount> members = await TeamsInfo.GetMembersAsync(turnContext);

            emptyRequest.possiblePersons = members.Select((w) => new Person
            {
                name  = w.Name,
                email = w.Email
            })
                                           .ToList();

            var card = await AddToProjectCard.GetCardAsync(turnContext, emptyRequest);

            var response = new Microsoft.Bot.Schema.Teams.TaskModuleContinueResponse()
            {
                Type  = "continue",
                Value = new TaskModuleTaskInfo()
                {
                    Title = "Select a sample",
                    Card  = card.ToAttachment()
                }
            };

            return(new MessagingExtensionActionResponse
            {
                Task = response
            });
        }
        public async Task StartNewGame(ITurnContext <IMessageActivity> turnContext,
                                       CancellationToken cancellationToken)
        {
            var game = _gameFactory.CreateNewGame();

            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken).ConfigureAwait(false);

            foreach (var member in members)
            {
                if (member.Id == turnContext.Activity.Recipient.Id)
                {
                    continue;
                }

                var player   = game.AddNewPlayer(member.Name, member.Id);
                var gameCard = _cardsFactory.CreateGameCardAttachment(member.Name, game.GameId);
                var activity = MessageFactory.Attachment(gameCard);

                await MessageMembersAsync(turnContext,
                                          player,
                                          member,
                                          activity,
                                          cancellationToken).ConfigureAwait(false);
            }
            await turnContext.SendActivityAsync(MessageFactory.Text(InvitationSent),
                                                cancellationToken).ConfigureAwait(false);
        }
示例#4
0
        private async Task HydrateTeamsData(List <AzureDevOpsWorkItem> workItems, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            // Get the roster one time in the current team and look up people inside it as needed
            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            foreach (var wi in workItems)
            {
                // Plug the Team user-id for assigned-to
                if (wi.Fields.AssignedTo != null)
                {
                    wi.Fields.AssignedTo.TeamsUserId = members.Where(m =>
                                                                     m.UserPrincipalName.Equals(wi.Fields.AssignedTo.Uniquename, StringComparison.InvariantCultureIgnoreCase))
                                                       .FirstOrDefault()?.Id
                                                       ?? turnContext.Activity.From.Id;
                }

                // Plug the Team user-id for EM owner
                if (wi.Fields.EMOwner != null)
                {
                    wi.Fields.EMOwner.TeamsUserId = members.Where(m =>
                                                                  m.UserPrincipalName.Equals(wi.Fields.EMOwner.Uniquename, StringComparison.InvariantCultureIgnoreCase))
                                                    .FirstOrDefault()?.Id
                                                    ?? turnContext.Activity.From.Id;
                }

                // Plug the Team user-id for PM owner
                if (wi.Fields.PMOwner != null)
                {
                    wi.Fields.PMOwner.TeamsUserId = members.Where(m =>
                                                                  m.UserPrincipalName.Equals(wi.Fields.PMOwner.Uniquename, StringComparison.InvariantCultureIgnoreCase))
                                                    .FirstOrDefault()?.Id
                                                    ?? turnContext.Activity.From.Id;
                }
            }
        }
        private async Task <List <Entity> > GetPeopleToMention(ITurnContext turnContext, CancellationToken cancellationToken)
        {
            IEnumerable <TeamsChannelAccount> members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            List <Entity> entities = new List <Entity>();

            foreach (TeamsChannelAccount member in members)
            {
                foreach (string upn in dataFromRequest.Mentions)
                {
                    if (String.Compare(member.UserPrincipalName, upn, true) == 0)
                    {
                        // Construct a ChannelAccount Object.
                        ChannelAccount mentionedUser = new ChannelAccount(member.Id, member.Name, member.Role, member.AadObjectId);
                        // Construct a Mention object.
                        var mentionObject = new Mention
                        {
                            Mentioned = mentionedUser,
                            Text      = $"<at>{XmlConvert.EncodeName(member.Name)}</at>",
                        };
                        entities.Add(mentionObject);
                    }
                }
            }
            return(entities);
        }
示例#6
0
        private async Task PairingProgrammingAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var teamsChannelId = turnContext.Activity.TeamsGetChannelId();

            if (teamsChannelId != _MMDTeamGenaralChannelID)
            {
                await turnContext.SendActivityAsync("No permission for this command");

                return;
            }
            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            var membersList = members.ToList();
            var mentionText = "Hello every, here is weekly pairing programing. Next is God's choice: \n\r";
            var mentionList = new List <Entity> {
            };
            Random rd       = new Random();

            while (membersList.Count > 1)
            {
                var firstIndex   = rd.Next(membersList.Count);
                var firstMember  = membersList[firstIndex];
                var firstMention = new Mention
                {
                    Mentioned = firstMember,
                    Text      = $"<at>{XmlConvert.EncodeName(firstMember.Name)}</at>",
                };
                membersList.RemoveAt(firstIndex);
                var secondIndex   = rd.Next(membersList.Count);
                var secondMember  = membersList[secondIndex];
                var secondMention = new Mention
                {
                    Mentioned = secondMember,
                    Text      = $"<at>{XmlConvert.EncodeName(secondMember.Name)}</at>",
                };
                membersList.RemoveAt(secondIndex);
                mentionText += firstMention.Text + " & " + secondMention.Text + "\n\r";
                mentionList.Add(firstMention);
                mentionList.Add(secondMention);
            }

            if (membersList.Count == 1)
            {
                var lastMember  = membersList[0];
                var lastMention = new Mention
                {
                    Mentioned = lastMember,
                    Text      = $"<at>{XmlConvert.EncodeName(lastMember.Name)}</at>",
                };
                mentionText += "And " + lastMention.Text + ", feel free to join each group of them.";
                mentionList.Add(lastMention);
            }

            var replyActivity = MessageFactory.Text(mentionText);

            replyActivity.Entities = mentionList;

            await turnContext.SendActivityAsync(replyActivity, cancellationToken);
        }
示例#7
0
        protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var text = turnContext.Activity.Text;

            // add conversation reference
            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            var upn = members.FirstOrDefault(x => x.Id == turnContext.Activity.From.Id).UserPrincipalName;

            AddConversationReference(turnContext.Activity as Activity, upn);

            // handle regular messages with an echo
            if (turnContext?.Activity?.Value == null)
            {
                await turnContext.SendActivityAsync(MessageFactory.Text($"You sent '{turnContext.Activity.Text}'"), cancellationToken);

                return;
            }

            // handle approval or rejection card actions
            var value = JObject.Parse(turnContext.Activity?.Value?.ToString());
            var pto   = value.ToObject <PtoApproval>();

            if (value?["action"].ToString() == "approve")
            {
                var approvalSuccessful = await _dysilService.SendApprovalAsync(pto, ApprovalType.Approved);

                if (!approvalSuccessful)
                {
                    await turnContext.SendActivityAsync(MessageFactory.Text($"Error occurred while approving the request"), cancellationToken);

                    return;
                }
                await turnContext.SendActivityAsync(MessageFactory.Text($"You have approved the request"), cancellationToken);

                // TODO: update card
                return;
            }
            else if (value?["action"].ToString() == "reject")
            {
                var rejectionSuccessful = await _dysilService.SendApprovalAsync(pto, ApprovalType.Rejected);

                if (!rejectionSuccessful)
                {
                    await turnContext.SendActivityAsync(MessageFactory.Text($"Error occurred while rejecting the request"), cancellationToken);

                    return;
                }
                await turnContext.SendActivityAsync(MessageFactory.Text($"You have rejected the request"), cancellationToken);

                // TODO: update card
                return;
            }
        }
示例#8
0
        protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            // 读取当前群聊中的用户列表
            var members = await TeamsInfo.GetMembersAsync(turnContext);

            // 准备用来访问Microsoft Graph的本地代理
            GraphServiceClient graphClient = new GraphServiceClient(new SimpleAuth(_configuration));

            // 为每个用户发送一个通知,这里解析得到他们的AadObjectId,用来发送
            members.Select(_ => _.AadObjectId).AsParallel().ForAll(async(_) =>
            {
                // 以下代码,其实你可以在官网找到,并且简单地做些修改即可
                // https://docs.microsoft.com/zh-cn/graph/api/chat-sendactivitynotification?view=graph-rest-1.0&tabs=http#example-1-notify-a-user-about-a-task-created-in-a-chat
                var topic = new TeamworkActivityTopic
                {
                    Source = TeamworkActivityTopicSource.EntityUrl,
                    Value  = $"https://graph.microsoft.com/beta/me/chats/{turnContext.Activity.Conversation.Id}/messages/{turnContext.Activity.Id}"
                };
                // 这个是通知的自定义模板(在manifest.json文件中要定义)
                var activityType = "metionall";
                // 预览文字
                var previewText = new ItemBody
                {
                    Content = "有人在群聊中提到你了,请点击查看"
                };
                // 收件人的id
                var recipient = new AadUserNotificationRecipient
                {
                    UserId = _
                };
                // 替换掉模板中的值
                var templateParameters = new List <Microsoft.Graph.KeyValuePair>()
                {
                    new Microsoft.Graph.KeyValuePair
                    {
                        Name  = "from",
                        Value = turnContext.Activity.From.Name
                    },
                    new Microsoft.Graph.KeyValuePair
                    {
                        Name  = "message",
                        Value = turnContext.Activity.RemoveMentionText(turnContext.Activity.Recipient.Id)
                    }
                };
                // 调用接口发送通知
                await graphClient.Chats[turnContext.Activity.Conversation.Id]
                .SendActivityNotification(topic, activityType, null, previewText, templateParameters, recipient)
                .Request()
                .PostAsync();
            });
        }
示例#9
0
        private async Task BotCallback(ITurnContext turnContext, CancellationToken cancellationToken)
        {
            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            var ordersResultJson = JsonConvert.SerializeObject(_OrderDetailServices.GetOrderResults(_OrderId, members));
            var Order            = _OrderService.GetOrder(_OrderId);
            var attachment       = new CreateCardService2().GetResultTotal(_OrderId, Order.StoreName, ordersResultJson, DateTime.Now.ToString("HH:mm"));
            await turnContext.SendActivityAsync(MessageFactory.Attachment(attachment));

            // await turnContext.SendActivityAsync(_Message);

            var memberId = turnContext.Activity.From.Id;
            var card     = new CreateCardService2().ReplyPayment(_paymentService, turnContext);
            await turnContext.SendActivityAsync(MessageFactory.Attachment(card), cancellationToken);
        }
            private async Task CallGroupChatGetMembersAsync(ITurnContext turnContext)
            {
                var members = (await TeamsInfo.GetMembersAsync(turnContext)).ToArray();

                Assert.AreEqual("id-3", members[0].Id);
                Assert.AreEqual("name-3", members[0].Name);
                Assert.AreEqual("givenName-3", members[0].GivenName);
                Assert.AreEqual("surname-3", members[0].Surname);
                Assert.AreEqual("userPrincipalName-3", members[0].UserPrincipalName);

                Assert.AreEqual("id-4", members[1].Id);
                Assert.AreEqual("name-4", members[1].Name);
                Assert.AreEqual("givenName-4", members[1].GivenName);
                Assert.AreEqual("surname-4", members[1].Surname);
                Assert.AreEqual("userPrincipalName-4", members[1].UserPrincipalName);
            }
示例#11
0
        // If you encounter permission-related errors when sending this message, see
        // https://aka.ms/BotTrustServiceUrl
        private async Task MessageAllMembersAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var teamsChannelId = turnContext.Activity.TeamsGetChannelId();
            var serviceUrl     = turnContext.Activity.ServiceUrl;
            var credentials    = new MicrosoftAppCredentials(_appId, _appPassword);
            ConversationReference conversationReference = null;

            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            foreach (var teamMember in members)
            {
                var card             = CreateAdaptiveCardAttachment("statusCard.json", "");
                var proactiveMessage = CreateResponse(turnContext.Activity, card);

                var conversationParameters = new ConversationParameters
                {
                    IsGroup  = false,
                    Bot      = turnContext.Activity.Recipient,
                    Members  = new ChannelAccount[] { teamMember },
                    TenantId = turnContext.Activity.Conversation.TenantId,
                };

                await((BotFrameworkAdapter)turnContext.Adapter).CreateConversationAsync(
                    teamsChannelId,
                    serviceUrl,
                    credentials,
                    conversationParameters,
                    async(t1, c1) =>
                {
                    conversationReference = t1.Activity.GetConversationReference();
                    await((BotFrameworkAdapter)turnContext.Adapter).ContinueConversationAsync(
                        _appId,
                        conversationReference,
                        async(t2, c2) =>
                    {
                        await t2.SendActivityAsync(proactiveMessage, c2);
                    },
                        cancellationToken);
                },
                    cancellationToken);
            }

            await turnContext.SendActivityAsync(MessageFactory.Text("All messages have been sent."), cancellationToken);
        }
示例#12
0
        private async Task MentionNextMemberAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            var iterator     = members.GetEnumerator();
            var operatorName = turnContext.Activity.From.Name;
            // nextMember is the preview element in iterator
            var preMember = iterator.Current;

            while (iterator.MoveNext())
            {
                TeamsChannelAccount current = iterator.Current;
                if (current.Name == operatorName)
                {
                    break;
                }
                preMember = iterator.Current;
            }
            // If preMember is null, that means operator is the first element in iterator. So we need return the last element
            if (preMember == null)
            {
                preMember = iterator.Current;
                while (iterator.MoveNext())
                {
                    preMember = iterator.Current;
                }
            }

            var mention = new Mention
            {
                Mentioned = preMember,
                Text      = $"<at>{XmlConvert.EncodeName(preMember.Name)}</at>",
            };
            var replyActivity = MessageFactory.Text($"It's your turn {mention.Text}.");

            replyActivity.Entities = new List <Entity> {
                mention
            };

            await turnContext.SendActivityAsync(replyActivity, cancellationToken);
        }
示例#13
0
        protected override async Task OnMembersAddedAsync(IList <ChannelAccount> membersAdded, ITurnContext <IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
        {
            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            var upn = members.FirstOrDefault(x => x.Id == turnContext.Activity.From.Id).UserPrincipalName;

            var conversationReference = turnContext.Activity.GetConversationReference();

            conversationReference.User.Properties["upn"] = upn;

            _conversationReferences.AddOrUpdate(conversationReference.User.Id, conversationReference, (key, newValue) => conversationReference);
            var welcomeText = "Welcome to the PTO Bot!";

            foreach (var member in membersAdded)
            {
                if (member.Id != turnContext.Activity.Recipient.Id)
                {
                    await turnContext.SendActivityAsync(MessageFactory.Text(welcomeText, welcomeText), cancellationToken);
                }
            }
        }
        public async Task <IActionResult> Data([FromBody] MessageList notifyMessages)
        {
            var i = 0;

            if (notifyMessages.MessageType == "2")
            {
                foreach (var conversationReference in _conversationReferences.Values)
                {
                    await((BotAdapter)_adapter).ContinueConversationAsync(_appId, conversationReference, async(ITurnContext turnContext, CancellationToken cancellationToken) =>
                    {
                        IEnumerable <TeamsChannelAccount> members = TeamsInfo.GetMembersAsync(turnContext, cancellationToken).Result;
                        foreach (var member in members)
                        {
                            foreach (var notifyMessage in notifyMessages.messages)
                            {
                                if (notifyMessage.AssignedTo == member.UserPrincipalName)
                                {
                                    i++;
                                    SecondMessageType message = new SecondMessageType();
                                    message.AssignedTo        = notifyMessage.AssignedTo;
                                    message.MessageType       = notifyMessage.MessageType;
                                    message.InProgressTasks   = notifyMessage.InProgressTasks;
                                    message.Link           = notifyMessage.Link;
                                    message.TerminateTasks = notifyMessage.TerminateTasks;
                                    message.NewTasks       = notifyMessage.NewTasks;
                                    var cardAttachment     = AdaptiveCardFactory.CreateAdaptiveCardSecondTypeAttachment(member.Name, message);
                                    await turnContext.SendActivityAsync(MessageFactory.Attachment(cardAttachment), cancellationToken);
                                }
                            }
                        }
                    }, default(CancellationToken));
                }
            }
            return(new ContentResult()
            {
                Content = "<html><body><h1>Proactive messages have been sent:" + i + "users" + "</h1></body></html>",
                ContentType = "text/html",
                StatusCode = (int)HttpStatusCode.OK,
            });
        }
示例#15
0
        private async Task <List <UserDetails> > InitUserList(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            if (_settingProvider.UseTeams)
            {
                var members = await TeamsInfo.GetMembersAsync(stepContext.Context, cancellationToken);

                return(members.Select(x => new UserDetails()
                {
                    Id = x.Id,
                    FirstName = x.GivenName,
                    Lastname = x.Surname,
                    Email = x.Email,
                    TeamsUserInfo = x
                }).ToList());
            }
            else
            {
                var users = await _issueTrackingIntegrationService.GetUsers();

                return(users.ToList());
            }
        }
示例#16
0
        private async Task BotCallback(ITurnContext turnContext, CancellationToken cancellationToken)
        {
            // await turnContext.SendActivityAsync(Message);
            var members = new List <TeamsChannelAccount>();

            try
            {
                var data = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

                members = data.ToList();
            }
            catch (Exception e)
            {
                throw e;
            }

            string str = string.Empty;

            str += (Message + "\r\n");

            var mentions = new List <Entity>();

            foreach (var member in members)
            {
                var mention = new Mention
                {
                    Mentioned = member,
                    Text      = $"<at>{XmlConvert.EncodeName(member.Name)}</at>",
                };
                str += (mention.Text + "\r\n");
                mentions.Add(mention);
            }

            var replyActivity = MessageFactory.Text(str);

            replyActivity.Entities = mentions;
            await turnContext.SendActivityAsync(replyActivity, cancellationToken);
        }
示例#17
0
        private async Task MentionRollActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            Random rd = new Random();

            var membersArray = members.ToArray();
            var tt           = rd.Next(membersArray.Length);
            var randomMember = membersArray[tt];

            var mention = new Mention
            {
                Mentioned = randomMember,
                Text      = $"<at>{XmlConvert.EncodeName(randomMember.Name)}</at>",
            };
            var replyActivity = MessageFactory.Text($"就决定是你了,去吧 {mention.Text}.");

            replyActivity.Entities = new List <Entity> {
                mention
            };

            await turnContext.SendActivityAsync(replyActivity, cancellationToken);
        }
示例#18
0
 private async Task ShowMembersAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
 {
     await ShowMembersAsync(turnContext, await TeamsInfo.GetMembersAsync(turnContext, cancellationToken), cancellationToken);
 }
示例#19
0
        private async Task SendInfoToAllMemberAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken, string sendInfo)
        {
            var teamsChannelId = turnContext.Activity.TeamsGetChannelId();

            if (teamsChannelId is null)
            {
                await turnContext.SendActivityAsync(MessageFactory.Text("This feature can only used in team."), cancellationToken);

                return;
            }
            var teamInfo    = turnContext.Activity.TeamsGetTeamInfo();
            var userName    = turnContext.Activity.From.Name;
            var serviceUrl  = turnContext.Activity.ServiceUrl;
            var credentials = new MicrosoftAppCredentials(_appId, _appPassword);
            ConversationReference conversationReference = null;

            var members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

            foreach (var teamMember in members)
            {
                var memberName    = teamMember.UserPrincipalName;
                var proactiveCard = new HeroCard
                {
                    Title   = "Message from " + userName + " in team " + teamInfo.Name,
                    Text    = sendInfo,
                    Buttons = new List <CardAction>
                    {
                        new CardAction
                        {
                            Type  = ActionTypes.OpenUrl,
                            Title = "Chat with " + userName,
                            Value = "https://teams.microsoft.com/l/chat/0/0?users=" + _authorPrincipalName + "&message=Hi%20there%20"
                        },
                        new CardAction
                        {
                            Type  = ActionTypes.OpenUrl,
                            Title = "Contact the developer",
                            Text  = "Any suggestions, feel free to contact with developer >^<",
                            Value = "https://teams.microsoft.com/l/chat/0/0?users=" + _authorPrincipalName + "&message=Hi%20there%20"
                        },
                    }
                };

                var conversationParameters = new ConversationParameters
                {
                    IsGroup  = false,
                    Bot      = turnContext.Activity.Recipient,
                    Members  = new ChannelAccount[] { teamMember },
                    TenantId = turnContext.Activity.Conversation.TenantId,
                };

                await((BotFrameworkAdapter)turnContext.Adapter).CreateConversationAsync(
                    teamsChannelId,
                    serviceUrl,
                    credentials,
                    conversationParameters,
                    async(t1, c1) =>
                {
                    conversationReference = t1.Activity.GetConversationReference();
                    await((BotFrameworkAdapter)turnContext.Adapter).ContinueConversationAsync(
                        _appId,
                        conversationReference,
                        async(t2, c2) =>
                    {
                        await t2.SendActivityAsync(MessageFactory.Attachment(proactiveCard.ToAttachment()), c2);
                    },
                        cancellationToken);
                },
                    cancellationToken);
            }
            await turnContext.SendActivityAsync(MessageFactory.Text("All messages have been sent."), cancellationToken);
        }
示例#20
0
        // 1. Will be called when user triggers messaging extension which then calls CreateTaskModuleCommand
        protected override async Task <MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
        {
            // Check if the bot has been installed in the team by getting the team rooster
            try
            {
                var teamsMembers = await TeamsInfo.GetMembersAsync(turnContext);
            }
            catch
            {
                // if not installed we will send out the card instructing the user to install the bot
                string jitCardPath  = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Cards", "jitCard.json");
                var    jitCard      = File.ReadAllText(jitCardPath, Encoding.UTF8);
                string jitCardJson  = jitCard;
                var    jitCardTeams = AdaptiveCard.FromJson(jitCardJson);
                return(await Task.FromResult(new MessagingExtensionActionResponse
                {
                    Task = new TaskModuleContinueResponse
                    {
                        Value = new TaskModuleTaskInfo
                        {
                            Card = new Attachment
                            {
                                Content = jitCardTeams.Card,
                                ContentType = AdaptiveCard.ContentType,
                            },
                            Height = 300,
                            Width = 600,
                            Title = "Install bot",
                        },
                    },
                }));
            }


            var magicCode = string.Empty;
            var state     = (turnContext.Activity.Value as Newtonsoft.Json.Linq.JObject).Value <string>("state");

            if (!string.IsNullOrEmpty(state))
            {
                int parsed = 0;
                if (int.TryParse(state, out parsed))
                {
                    magicCode = parsed.ToString();
                }
            }

            var tokenResponse = await(turnContext.Adapter as IUserTokenProvider).GetUserTokenAsync(turnContext, _connectionName, magicCode, cancellationToken: cancellationToken);

            if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token))
            {
                // There is no token, so the user has not signed in yet.

                // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions
                var signInLink = await(turnContext.Adapter as IUserTokenProvider).GetOauthSignInLinkAsync(turnContext, _connectionName, cancellationToken);

                return(new MessagingExtensionActionResponse
                {
                    ComposeExtension = new MessagingExtensionResult
                    {
                        Type = "auth",
                        SuggestedActions = new MessagingExtensionSuggestedAction
                        {
                            Actions = new List <CardAction>
                            {
                                new CardAction
                                {
                                    Type = ActionTypes.OpenUrl,
                                    Value = signInLink,
                                    Title = "Sign in Please",
                                },
                            },
                        },
                    },
                });
            }
            var accessToken = tokenResponse.Token;

            if (accessToken != null || !string.IsNullOrEmpty(accessToken))
            {
                // Create Graph Client
                var client = new SimpleGraphClient(accessToken);
                // Get Group details
                var channel = turnContext.Activity.TeamsGetChannelId();
                if (channel != null)
                {
                    var    members           = new List <TeamsChannelAccount>();
                    string continuationToken = null;
                    do
                    {
                        var currentPage = await TeamsInfo.GetPagedMembersAsync(turnContext, 100, continuationToken, cancellationToken);

                        continuationToken = currentPage.ContinuationToken;
                        members           = members.Concat(currentPage.Members).ToList();
                    }while (continuationToken != null);
                    TeamDetails teamDetails = await TeamsInfo.GetTeamDetailsAsync(turnContext, turnContext.Activity.TeamsGetTeamInfo().Id, cancellationToken);

                    if (teamDetails != null)
                    {
                        var groupId = teamDetails.AadGroupId;
                        plannerGroupId = groupId;
                        //Get Plans
                        var currentGroupPlan = await client.GetCurrentPlan(groupId);

                        var favoritePlans = await client.GetFavoritePlans();

                        // Fill Adaptive Card data
                        var exampleData = new ExampleData();
                        exampleData.MultiSelect = "false";
                        if (currentGroupPlan.CurrentPage.Count == 0)
                        {
                            exampleData.Option1      = favoritePlans.CurrentPage[4].Title;
                            exampleData.Option1Value = favoritePlans.CurrentPage[4].Id;
                        }
                        else
                        {
                            exampleData.Option1      = currentGroupPlan.CurrentPage[0].Title;
                            exampleData.Option1Value = currentGroupPlan.CurrentPage[0].Id;
                        }
                        exampleData.Option2      = favoritePlans.CurrentPage[0].Title;
                        exampleData.Option3      = favoritePlans.CurrentPage[1].Title;
                        exampleData.Option4      = favoritePlans.CurrentPage[2].Title;
                        exampleData.Option2Value = favoritePlans.CurrentPage[0].Id;
                        exampleData.Option3Value = favoritePlans.CurrentPage[1].Id;
                        exampleData.Option4Value = favoritePlans.CurrentPage[2].Id;
                        // Create and return card
                        var adaptiveCardEditor = AdaptiveCardHelper.CreateAdaptiveCardEditor(exampleData);
                        //var adaptiveCardEditor = CreateAdaptiveCard();

                        return(await Task.FromResult(new MessagingExtensionActionResponse
                        {
                            Task = new TaskModuleContinueResponse
                            {
                                Value = new TaskModuleTaskInfo
                                {
                                    Card = new Microsoft.Bot.Schema.Attachment
                                    {
                                        Content = adaptiveCardEditor,
                                        ContentType = AdaptiveCard.ContentType,
                                    },
                                    Height = 600,
                                    Width = 600,
                                    Title = "Task creation",
                                },
                            },
                        }));
                    }
                }
                else
                {
                    // Return only favorite plans without current plan as in 1:1 or group chat
                    var favoritePlans = await client.GetFavoritePlans();

                    // Fill Adaptive Card data
                    var exampleData = new ExampleData();
                    exampleData.MultiSelect = "false";
                    exampleData.Option1     = favoritePlans.CurrentPage[0].Title;
                    exampleData.Option2     = favoritePlans.CurrentPage[1].Title;
                    exampleData.Option3     = favoritePlans.CurrentPage[2].Title;

                    exampleData.Option1Value = favoritePlans.CurrentPage[0].Id;
                    exampleData.Option3Value = favoritePlans.CurrentPage[1].Id;
                    exampleData.Option4Value = favoritePlans.CurrentPage[2].Id;

                    // Create and return card
                    var adaptiveCardEditor = AdaptiveCardHelper.CreateAdaptiveCardEditor(exampleData);
                    //var adaptiveCardEditor = CreateAdaptiveCard();

                    return(await Task.FromResult(new MessagingExtensionActionResponse
                    {
                        Task = new TaskModuleContinueResponse
                        {
                            Value = new TaskModuleTaskInfo
                            {
                                Card = new Microsoft.Bot.Schema.Attachment
                                {
                                    Content = adaptiveCardEditor,
                                    ContentType = AdaptiveCard.ContentType,
                                },
                                Height = 600,
                                Width = 600,
                                Title = "Task creation",
                            },
                        },
                    }));
                }
            }
            //Needs to be replaced with OAuth Prompt
            return(null);
        }
        public async Task <IActionResult> Post(string userid, [FromBody] NotifyMessage notifyMessage)
        {
            var sb = new StringBuilder();

            bool flag = false;

            if (!string.IsNullOrEmpty(userid))
            {
                foreach (var conversationReference in _conversationReferences.Values)
                {
                    await((BotAdapter)_adapter).ContinueConversationAsync(_appId, conversationReference, async(ITurnContext turnContext, CancellationToken cancellationToken) =>
                    {
                        IEnumerable <TeamsChannelAccount> members = TeamsInfo.GetMembersAsync(turnContext, cancellationToken).Result;
                        //var connector = new ConnectorClient(new Uri(turnContext.Activity.ServiceUrl));
                        // members =  connector.Conversations.GetConversationMembersAsync(conversationReference.Conversation.Id).Result;

                        //// Concatenate information about all the members into a string
                        foreach (var member in members)
                        {
                            sb.AppendLine($"GivenName = {member.Name}, Email = {member.Email}, User Principal Name {member.UserPrincipalName}, TeamsMemberId = {member.Id}, members = {members.ToList().Count},{_conversationReferences.Values.Count}");
                            if (userid == member.UserPrincipalName)
                            {
                                switch (notifyMessage.MessageType)
                                {
                                case "1":
                                case "3":
                                    {
                                        flag = true;

                                        ThirdMessageType message = new ThirdMessageType();
                                        message.AssignedTo       = notifyMessage.AssignedTo;
                                        message.MessageType      = notifyMessage.MessageType;
                                        message.IDCard           = notifyMessage.IDCard;
                                        message.IDTask           = notifyMessage.IDTask;
                                        message.LibDispName      = notifyMessage.LibDispName;
                                        message.TitleTask        = notifyMessage.TitleTask;
                                        message.Link             = notifyMessage.Link;
                                        message.TaskType         = notifyMessage.TaskType;
                                        if (message.TaskType == "LSTaskAppruve" || message.TaskType == "LSTaskExecute")
                                        {
                                            var cardAttachment = AdaptiveCardFactory.CreateAdaptiveCardForSubmitAttachment(message);
                                            var req            = await turnContext.SendActivityAsync(MessageFactory.Attachment(cardAttachment), cancellationToken);
                                            message.Key        = req.Id;
                                            var cardWithId     = AdaptiveCardFactory.CreateAdaptiveCardForSubmitAttachment(message);
                                            var requestWithId  = MessageFactory.Attachment(cardWithId);
                                            requestWithId.Id   = req.Id;
                                            await turnContext.UpdateActivityAsync(requestWithId, cancellationToken);
                                        }
                                        else
                                        {
                                            var cardAttachment = AdaptiveCardFactory.CreateAdaptiveCardThirdTypeAttachment(message);;
                                            if (message.MessageType == "3")
                                            {
                                                cardAttachment = AdaptiveCardFactory.CreateAdaptiveCardThirdTypeAttachment(message);
                                            }
                                            else
                                            {
                                                cardAttachment = AdaptiveCardFactory.CreateAdaptiveCardFirstTypeAttachment(message);
                                            }
                                            await turnContext.SendActivityAsync(MessageFactory.Attachment(cardAttachment), cancellationToken);
                                        }
                                        break;
                                    }

                                case "2":
                                    {
                                        flag = true;

                                        SecondMessageType message = new SecondMessageType();
                                        message.AssignedTo        = notifyMessage.AssignedTo;
                                        message.MessageType       = notifyMessage.MessageType;
                                        message.InProgressTasks   = notifyMessage.InProgressTasks;
                                        message.Link           = notifyMessage.Link;
                                        message.TerminateTasks = notifyMessage.TerminateTasks;
                                        message.NewTasks       = notifyMessage.NewTasks;
                                        var cardAttachment     = AdaptiveCardFactory.CreateAdaptiveCardSecondTypeAttachment(member.Name, message);
                                        await turnContext.SendActivityAsync(MessageFactory.Attachment(cardAttachment), cancellationToken);
                                        break;
                                    }
                                }
                            }
                        }
                    }, default(CancellationToken));
                }
            }
            else
            {
                foreach (var conversationReference in _conversationReferences.Values)
                {
                    await((BotAdapter)_adapter).ContinueConversationAsync(_appId, conversationReference, (ITurnContext turnContext, CancellationToken cancellationToken) => turnContext.SendActivityAsync("withoutUser"), default(CancellationToken));
                }
            }


            // Let the caller know proactive messages have been sent
            return(new ContentResult()
            {
                Content = "<html><body><h1>Proactive messages have been sent:" + userid + "status = " + flag + "data =  " + sb.ToString() + "</h1></body></html>",
                ContentType = "text/html",
                StatusCode = (int)HttpStatusCode.OK,
            });
        }
示例#22
0
        protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            turnContext.Activity.RemoveRecipientMention();

            switch (turnContext.Activity.Text.Trim())
            {
            case "connect":
                var endPointReply = new StringBuilder("Please connect your flow to: ");
                var hostingURL    = _config["BotHostingURL"];
                endPointReply.Append(hostingURL);
                endPointReply.Append("/flow/messages/");

                // encrypt the channelID.
                var protector = _dataProtectionProvider.CreateProtector(_encryptionKey);
                TeamsChannelData channelData        = turnContext.Activity.GetChannelData <TeamsChannelData>();
                string           channelID          = channelData.Team.Id;
                string           protectedChannelID = protector.Protect(channelID);
                endPointReply.Append(protectedChannelID);
                var endpointReplyActivity = MessageFactory.Text(endPointReply.ToString());     // I can tag people on the card.

                await turnContext.SendActivityAsync(endpointReplyActivity, cancellationToken);

                break;

            case "test":
                MockData fakePayload = new MockData("1234", "This is Test", 3, "Active");

                // the below commented code is not needed for the actual
                // case as the information will come as json object.
                //string fakepayloadjson = jsonconvert.serializeobject(fakepayload);
                // if it comes as json, deserializing the json object is needed.
                //var deserializedjsonobject = jsonconvert.deserializeobject(fakepayloadjson);

                var attachmentCard = CreateAdpativeCardAttachment(fakePayload);
                var cardReply      = MessageFactory.Attachment(attachmentCard);
                await turnContext.SendActivityAsync(cardReply);

                IEnumerable <TeamsChannelAccount> members = await TeamsInfo.GetMembersAsync(turnContext, cancellationToken);

                List <Entity> entities = new List <Entity>();
                foreach (TeamsChannelAccount member in members)
                {
                    foreach (string upn in fakePayload.Mentions)
                    {
                        if (String.Compare(member.UserPrincipalName, upn, true) == 0)
                        {
                            // Construct a ChannelAccount Object.
                            ChannelAccount mentionedUser = new ChannelAccount(member.Id, member.Name, member.Role, member.AadObjectId);
                            // Construct a Mention object.
                            var mentionObject = new Mention
                            {
                                Mentioned = mentionedUser,
                                Text      = $"<at>{XmlConvert.EncodeName(member.Name)}</at>",
                            };
                            entities.Add(mentionObject);
                        }
                    }
                }
                // We need to mention everyone in the entities.
                // Construct a string that is going to be passed to a replyActivity.
                var replyActivityTextStingBuilder = new StringBuilder();
                foreach (Mention mentioned in entities)
                {
                    replyActivityTextStingBuilder.AppendFormat("{0} ", mentioned.Text);
                }
                replyActivityTextStingBuilder.Append("Please take a look");

                var replyActivity = MessageFactory.Text(replyActivityTextStingBuilder.ToString());     // I can tag people on the card.
                replyActivity.Entities = entities;
                await turnContext.SendActivityAsync(replyActivity, cancellationToken);

                // updated version
                MockData   fakePayLoadForUpdate  = new MockData("1234", "This is a test for Update", 3, "Closed");
                Attachment updatedAttachmentCard = CreateAdpativeCardAttachment(fakePayLoadForUpdate);
                var        newActivity           = MessageFactory.Attachment(updatedAttachmentCard);
                newActivity.Id = cardReply.Id;
                await turnContext.UpdateActivityAsync(newActivity, cancellationToken);

                break;

            case "setup":
                await AddConversationReference(turnContext.Activity as Activity);

                break;
            }
        }
示例#23
0
        protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            AddConversationReference(turnContext.Activity as Activity);
            if (turnContext.Activity.Value != null)
            {
                JObject jObject     = JObject.Parse(Newtonsoft.Json.JsonConvert.SerializeObject(turnContext.Activity.Value));
                bool    isCommented = false;
                var     json        = JsonConvert.SerializeObject(turnContext.Activity.Value);
                var     desc        = 0;

                var key = jObject["Key"].ToString();

                ThirdMessageType message = new ThirdMessageType();
                message.Type = jObject["Type"].ToString();


                var approve = jObject["Approved"].ToString();
                message.IDCard      = jObject["IDCard"].ToString();
                message.IDTask      = jObject["IDTask"].ToString();
                message.TaskType    = jObject["TaskType"].ToString();
                message.Key         = jObject["Key"].ToString();
                message.AssignedTo  = jObject["AssignedTo"].ToString();
                message.MessageType = jObject["MessageType"].ToString();

                message.LibDispName = jObject["LibDispName"].ToString();
                message.TitleTask   = jObject["TitleTask"].ToString();
                message.Link        = jObject["Link"].ToString();
                message.Comment     = "";

                message.TaskType = jObject["TitleTask"].ToString();
                if (approve == "Rejected")
                {
                    message.Comment = jObject["Comment"].ToString();
                }
                else
                {
                    message.Comment = jObject["ApproveComment"].ToString();
                }
                message.CardType = "submitted";
                var myUpdatedCard = AdaptiveCardFactory.CreateAdaptiveCardAfterSubmitAttachment(message, approve, message.Comment);
                if (approve == "Rejected" && string.IsNullOrEmpty(message.Comment.Trim()))
                {
                    desc             = 1;
                    message.CardType = "comment";
                    isCommented      = true;
                    myUpdatedCard    = AdaptiveCardFactory.CreateAdaptiveCardCommentRequiredAttachment(message);
                }

                else
                {
                    var data = new StringContent(json, Encoding.UTF8, "application/json");

                    var url = "https://prod-67.westeurope.logic.azure.com:443/workflows/5ac4ad090e0e442887e67aa2319ae3ea/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=q1Uz83atZhsoR5aR3eb742pv9tqrhWmAsL5Gj2q2Lv8";
                    myUpdatedCard = AdaptiveCardFactory.CreateAdaptiveCardWaitingAttachment(message);
                    var newActivityForWait = MessageFactory.Attachment(myUpdatedCard);
                    newActivityForWait.Id = key;
                    switch (message.Type)
                    {
                    case "message":
                    {
                        UpdateMessage(turnContext, cancellationToken, newActivityForWait);
                        break;
                    }

                    case "carousel":
                    {
                        message.CardType = "wait";
                        await UpdateCarousel(turnContext, cancellationToken, myUpdatedCard, message, 1);

                        break;
                    }
                    }

                    var response = await client.PostAsync(url, data);

                    var contents = await response.Content.ReadAsStringAsync();

                    JObject jObjectResponse = JObject.Parse(contents);

                    var succesfullApprove = jObjectResponse["Approved"].ToString();
                    var status            = jObjectResponse["Status"].ToString().Trim();
                    status           = status == "Done" ? "Approved" : status == "Back" ? "Rejected" : "Error";
                    message.Approved = status;

                    switch (succesfullApprove)
                    {
                    case "0":
                    {
                        myUpdatedCard = AdaptiveCardFactory.CreateAdaptiveCardAfterSubmitAttachment(message, status, message.Comment);
                        break;
                    }

                    case "1":
                    {
                        myUpdatedCard = AdaptiveCardFactory.CreateAdaptiveCardAlreadySubmitAttachment(message, status);
                        break;
                    }
                    }
                }

                var newActivity = MessageFactory.Attachment(myUpdatedCard);
                newActivity.Id = key;

                // var connector = new ConnectorClient(new Uri(turnContext.Activity.ServiceUrl));
                //await connector.Conversations.DeleteActivityAsync(turnContext.Activity.Conversation.Id, key, cancellationToken);
                switch (message.Type)
                {
                case "message":
                {
                    UpdateMessage(turnContext, cancellationToken, newActivity);
                    break;
                }

                case "carousel":
                {
                    if (!isCommented)
                    {
                        message.CardType = "submitted";
                    }
                    await UpdateCarousel(turnContext, cancellationToken, myUpdatedCard, message, 1);

                    break;
                }
                }
                await Task.Delay(500);

                switch (message.Type)
                {
                case "message":
                {
                    UpdateMessage(turnContext, cancellationToken, newActivity);
                    break;
                }

                case "carousel":
                {
                    if (!isCommented)
                    {
                        message.CardType = "submitted";
                    }
                    await UpdateCarousel(turnContext, cancellationToken, myUpdatedCard, message, desc);

                    break;
                }
                }
                //string approved = jObject["approved"].ToString();
            }
            else
            {
                var userStateAccessors = _userState.CreateProperty <UserProfile>(nameof(UserProfile));
                var userProfile        = await userStateAccessors.GetAsync(turnContext, () => new UserProfile());

                if (userProfile.IsSend == true)
                {
                    turnContext.Activity.RemoveRecipientMention();
                    switch (turnContext.Activity.Text.Trim())
                    {
                    case "Help":

                        await turnContext.SendActivityAsync(MessageFactory.Text($"Я бот для роботи з LSDocs. Мої основні функції: \n\n" +
                                                                                $"- отримання 10 останніх завдань, які можна затвердити (просто напишіть мені 'TopTen'); \n\n " +
                                                                                $"- можливість виконання завдань безпосередньо у боті (Lazy approvals); \n\n" +
                                                                                $"- сповіщення про призначення нової задачі; \n\n" +
                                                                                $"- щоденні сповіщення про поточний статус особистих задач; \n\n" +
                                                                                $"- сповіщення за 24 години про протермінування задач. \n\n" +
                                                                                $"А також я постійно навчаюсь, тому можливостей буде більше.🙂  \n\n" +
                                                                                $" \n\n " +
                                                                                $"Якщо у Вас є питання чи пропозиції щодо моєї роботи зв'яжіться з моєю службою підтримки почтою [email protected] чи за телефоном +38 044 232 95 09. "), cancellationToken);

                        break;

                    case "TopTen":
                    {
                        userProfile.IsSend = false;

                        var credentials                = new MicrosoftAppCredentials("4e2e9e85-b2ba-4557-9082-706d081a64e0", "f+#o^wOr%9SPfaJXrow26^]{");
                        var connector                  = new ConnectorClient(new Uri(turnContext.Activity.ServiceUrl), credentials);
                        var conversationId             = turnContext.Activity.Conversation.Id;
                        var conversationStateAccessors = _conversationState.CreateProperty <ConversationData>(nameof(ConversationData));
                        var conversationData           = await conversationStateAccessors.GetAsync(turnContext, () => new ConversationData());

                        IEnumerable <TeamsChannelAccount> members = TeamsInfo.GetMembersAsync(turnContext, cancellationToken).Result;
                        var user = new RequestBody();
                        foreach (var member in members)
                        {
                            user = new RequestBody()
                            {
                                AssignedTo = member.UserPrincipalName
                            };
                            if (string.IsNullOrEmpty(user.AssignedTo))
                            {
                                throw new Exception("no user");
                            }
                            if (!string.IsNullOrEmpty(userProfile.CarouselId) && userProfile.Count == 1)
                            {
                                userProfile.Count--;
                                await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken);

                                await _userState.SaveChangesAsync(turnContext, false, cancellationToken);

                                await turnContext.DeleteActivityAsync(userProfile.CarouselId, cancellationToken);

                                conversationData.PromptedUserCarousel = false;
                                userProfile.CarouselId = "";
                                userProfile.messagesCarousel.Clear();
                            }

                            List <Attachment>       attachments = new List <Attachment>();
                            IMessageActivity        carousel    = MessageFactory.Carousel(attachments);
                            List <ThirdMessageType> messages    = new List <ThirdMessageType>();

                            var json    = JsonConvert.SerializeObject(user);
                            var waitReq = await turnContext.SendActivityAsync(MessageFactory.Text($"Зачекайте! Вигружаємо задачі з LSDOCS..."), cancellationToken);

                            const string link = "https://prod-10.westeurope.logic.azure.com/workflows/87b2e250b3624ef79777ecfdb37ea0bb/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=jSY4t__HFAn16knFTcmEEqWJl2HZYH4rLHu6rDzdf8U";
                            var          data = new StringContent(json, Encoding.UTF8, "application/json");

                            var response = await client.PostAsync(link, data);



                            var contents = await response.Content.ReadAsStringAsync();

                            JArray  array;
                            JObject jObjectResponse = JObject.Parse(contents);

                            try
                            {
                                array = JArray.Parse(jObjectResponse["messages"].ToString());
                            }
                            catch (Exception ex)
                            {
                                throw (new Exception("Flow return bad top ten"));
                            }
                            if (array.Count == 0)
                            {
                                await turnContext.SendActivityAsync(MessageFactory.Text($"Всі задачі виконані 🙂"), cancellationToken);

                                await turnContext.DeleteActivityAsync(waitReq.Id, cancellationToken);

                                return;
                            }


                            //if (messages.Count != 0)
                            //{
                            //    await turnContext.DeleteActivityAsync(carousel.Id, cancellationToken);
                            //    carousel.Attachments.Clear();
                            //    attachments.Clear();

                            //    messages.Clear();
                            //}

                            foreach (JObject cards in array.Children <JObject>())
                            {
                                var parameters = new Dictionary <string, string>();
                                foreach (JProperty prop in cards.Properties())
                                {
                                    parameters.Add(prop.Name, prop.Value.ToString());
                                }

                                ThirdMessageType message = new ThirdMessageType();
                                message.AssignedTo  = parameters["AssignedTo"].ToString();
                                message.MessageType = parameters["MessageType"].ToString();
                                message.IDCard      = parameters["IDCard"].ToString();
                                message.IDTask      = parameters["IDTask"].ToString();
                                message.LibDispName = parameters["LibDispName"].ToString();
                                //message.TaskType = parameters["TaskType"].ToString();
                                message.TaskType = "";

                                message.TitleTask = parameters["TitleTask"].ToString();
                                message.Link      = parameters["Link"].ToString();
                                message.Approved  = "";

                                message.Key = "carousel";

                                messages.Add(message);

                                var adaptiveCardAttachment = AdaptiveCardFactory.CreateAdaptiveCardForSubmitAttachment(message);
                                carousel.Attachments.Add(adaptiveCardAttachment);
                            }
                            await turnContext.DeleteActivityAsync(waitReq.Id, cancellationToken);

                            if (string.IsNullOrEmpty(userProfile.CarouselId) && userProfile.Count < 1)
                            {
                                userProfile.Count++;
                                await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken);

                                await _userState.SaveChangesAsync(turnContext, false, cancellationToken);

                                var req = await turnContext.SendActivityAsync(carousel, cancellationToken);

                                var newAttachments = new List <Attachment>();
                                newAttachments.AddRange(carousel.Attachments);
                                carousel.Attachments.Clear();
                                attachments.Clear();

                                var newCarousel = MessageFactory.Carousel(attachments);
                                foreach (var message in messages)
                                {
                                    message.Key  = req.Id;
                                    message.Type = "carousel";


                                    var adaptiveCardAttachment = AdaptiveCardFactory.CreateAdaptiveCardForSubmitAttachment(message);
                                    newCarousel.Attachments.Add(adaptiveCardAttachment);
                                }


                                newCarousel.Id = req.Id;

                                userProfile.messagesCarousel = messages;

                                userProfile.CarouselId = req.Id;
                                conversationData.PromptedUserCarousel = true;


                                await turnContext.UpdateActivityAsync(newCarousel, cancellationToken);

                                userProfile.IsSend = true;

                                await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken);

                                await _userState.SaveChangesAsync(turnContext, false, cancellationToken);

                                return;
                            }
                            break;
                        }
                        break;
                    }

                    default:
                        // Echo back what the user said
                        await turnContext.SendActivityAsync(MessageFactory.Text($"Ви ввели комманду, якої я ще не знаю. Спробуйте написати 'Help'"), cancellationToken);

                        break;
                    }
                }
                else
                {
                    return;
                }
            }
        }