Exemple #1
0
        public async void Execute()
        {
            while (true)
            {
                MessageEntity message  = null;
                var           channels = await GetChannels();

                var runTime = DateTime.UtcNow;
                do
                {
                    if (channels.Any())
                    {
                        message = await queueProvider.DequeueAsync <MessageEntity>("usertoexpert");

                        if (message != null)
                        {
                            NormalizeQuestion(message);


                            await tableStorageProvider.SendToTableAsync("unansweredquestions", message);

                            var eventToSend = new NewQuestionEvent()
                            {
                                MessageType           = message.MessageType,
                                Question              = message.Question,
                                OriginalAnswer        = message.OriginalAnswer,
                                QuestionCorrelationId = message.QuestionCorrelationId
                            };
                            await eventProvider.SendEventAsync(eventToSend);

                            try
                            {
                                foreach (var channel in channels)
                                {
                                    var messageActivity = Activity.CreateMessageActivity();
                                    messageActivity.Type = ActivityTypes.Message;
                                    if (message.MessageType == MessageType.NOANSWER)
                                    {
                                        messageActivity.Text = string.Format(messageProvider.GetMessage("PostMessageToExpertsNoAnswer"), message.Question);
                                        var conversationId = await channel.SendToChannel(messageActivity);

                                        eventToSend.ConversationId = conversationId;
                                        await channel.SendToConverstionData(conversationId, messageActivity, new Dictionary <string, string>() { { "question", message.Question } });
                                    }
                                    else
                                    {
                                        var actions = new List <CardAction>();
                                        actions.Add(new CardAction
                                        {
                                            Title = messageProvider.GetMessage("KeepOriginalWrong"),
                                            Type  = "imBack",
                                            Value = messageProvider.GetMessage("KeepOriginalWrong"),
                                        });
                                        actions.Add(new CardAction
                                        {
                                            Title = messageProvider.GetMessage("KeepNewWrong"),
                                            Value = messageProvider.GetMessage("KeepNewWrong"),
                                            Type  = "imBack"
                                        });

                                        var normalizedQuestion         = MessageHelper.NormalizeString(message.Question);
                                        var normalizedMatchingQuestion = MessageHelper.NormalizeString(message.OriginalQuestion);

                                        if (string.Compare(normalizedQuestion, normalizedMatchingQuestion, StringComparison.InvariantCultureIgnoreCase) != 0)
                                        {
                                            actions.Add(new CardAction
                                            {
                                                Title = messageProvider.GetMessage("KeepBothWrong"),
                                                Value = messageProvider.GetMessage("KeepBothWrong"),
                                                Type  = "imBack"
                                            });
                                        }

                                        var card = new HeroCard()
                                        {
                                            Text    = string.Format(messageProvider.GetMessage("PostMessageToExpertsWrongAnswerCard"), normalizedQuestion, message.OriginalAnswer, normalizedMatchingQuestion),
                                            Buttons = actions
                                        };
                                        messageActivity.Attachments.Add(card.ToAttachment());

                                        var conversationId = await channel.SendToChannel(messageActivity);

                                        eventToSend.ConversationId = conversationId;
                                        await channel.SendToConverstionData(conversationId, messageActivity, new Dictionary <string, string>() {
                                            { "question", message.Question },
                                            { "originalQuestion", message.OriginalQuestion },
                                            { "originalAnswer", message.OriginalAnswer }
                                        });
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                await eventProvider.SendEventAsync(new TechnicalErrorEvent()
                                {
                                    Exception      = JsonConvert.SerializeObject(e),
                                    ChannelId      = string.Empty,
                                    ConversationId = string.Empty
                                });

                                continue;
                            }
                        }
                    }
                } while (message != null && (DateTime.UtcNow - runTime).TotalMinutes < configurationProvider.GetConfiguration <int>("expertBotChannelsPoll"));
                Thread.Sleep((int)TimeSpan.FromMinutes(configurationProvider.GetConfiguration <int>("ExpertBotQueuePoll")).TotalMilliseconds);
            }
        }