Пример #1
0
        // POST api/messages
        public async Task <IHttpActionResult> Post(JObject jsonObject)
        {
            Console.WriteLine($"Message Received: {jsonObject}");

            //var message = new Message();

            //if (jsonObject["type"].Value<string>() == "conversationUpdate")
            //{
            //    message = new Message() { From = "User", To = jsonObject["from"].ToString() };
            //}
            //else
            //{

            //    message = new Message() { Content = jsonObject["text"].Value<string>(), From = "User", To = jsonObject["from"].ToString() };
            //}

            var message = JsonConvert.DeserializeObject <Message>(jsonObject.ToString(), JsonNetSerializer.Settings);

            var plainText = (message.Content as PlainDocument)?.Value ?? (message.Content as PlainText)?.Text;

            var messageContent = plainText;

            var user = await userService.GetUserAsync(new User { Node = message.From });

            if (string.IsNullOrEmpty(messageContent))
            {
                await webClientService.SendMessageAsync(Messages.FirstMessage, message.From);

                await ChangeUserStateAsync(user, Models.SessionState.FirstAccess);

                return(Ok());
            }

            switch (user.Session.State)
            {
            case Models.SessionState.FirstAccess:

                await webClientService.SendMessageAsync(Messages.FirstMessage, message.From);

                await webClientService.SendMessageAsync(Messages.InstructionsMessage, message.From);

                await ChangeUserStateAsync(user, Models.SessionState.FirstNumber);

                break;

            case Models.SessionState.FirstNumber:

                await webClientService.SendMessageAsync(Messages.FirstNumberMessage, message.From);

                await ChangeUserStateAsync(user, Models.SessionState.SecondNumber);

                break;

            case Models.SessionState.SecondNumber:

                user.FirstNumber = double.Parse(message.Content.ToString());

                await webClientService.SendMessageAsync(Messages.SecondNumberMessage, message.From);

                await ChangeUserStateAsync(user, Models.SessionState.Operation, user.FirstNumber);

                break;

            case Models.SessionState.Operation:

                user.SecondNumber = double.Parse(message.Content.ToString());

                await SendMenuOperationsAsync(Messages.OperationMessage, message.From);

                await ChangeUserStateAsync(user, Models.SessionState.Answering, user.FirstNumber, user.SecondNumber);

                break;

            case Models.SessionState.Answering:

                user.Operation = int.Parse(message.Content.ToString());

                var result = ResolveMath(user.FirstNumber, user.SecondNumber, user.Operation);

                await webClientService.SendMessageAsync(string.Format(Messages.ResultMessage, ReturnOperation(user.Operation), result), message.From);

                await SendMenuRestartAsync(Messages.RestartingMessage, message.From);

                await ChangeUserStateAsync(user, Models.SessionState.Restart, user.FirstNumber, user.SecondNumber, user.Operation);

                break;

            case Models.SessionState.Restart:

                if (int.Parse(message.Content.ToString()) == 1)
                {
                    await webClientService.SendMessageAsync(Messages.FirstNumberMessage, message.From);

                    await ChangeUserStateAsync(user, Models.SessionState.SecondNumber);
                }
                else
                {
                    await webClientService.SendMessageAsync(Messages.EndMessage, message.From);

                    await ChangeUserStateAsync(user, Models.SessionState.End);
                }

                break;

            case Models.SessionState.End:

                await ChangeUserStateAsync(user, Models.SessionState.FirstAccess);

                break;
            }

            return(Ok());
        }
Пример #2
0
 private async Task ReplyMessageAsync(object message)
 {
     var response = await webClientService.SendMessageAsync(message);
 }
Пример #3
0
        // POST api/messages
        public async Task <IHttpActionResult> Post(JObject jsonObject)
        {
            Console.WriteLine($"Message Received: {jsonObject}");

            var message = JsonConvert.DeserializeObject <Message>(jsonObject.ToString(), JsonNetSerializer.Settings);

            var plainText = (message.Content as PlainDocument)?.Value ?? (message.Content as PlainText)?.Text;

            if (plainText == null)
            {
                await webClientService.SendMessageAsync(Strings.FallbackMessage, message.From);

                return(Ok());
            }

            var messageContent = plainText;

            var user = await userService.GetUserAsync(new User { Node = message.From });

            if (Strings.KeepAnsweringActionValue == messageContent.ToLower())
            {
                return(Ok());
            }

            if (Strings.StartActionValues.Contains(messageContent.ToLower()) && user.Session.State != SessionState.Answering)
            {
                await ChangeUserStateAsync(user, Models.SessionState.FirstAccess);
            }

            if (SponsorCommand(messageContent))
            {
                var to = messageContent.Split(' ')[1];

                var mediaLink = new MediaLink
                {
                    PreviewUri  = new Uri(@"https://takenethmgomni.blob.core.windows.net/media-db/vivo_tn.jpg"),
                    PreviewType = new MediaType(MediaType.DiscreteTypes.Image, MediaType.SubTypes.JPeg),
                    Title       = "Patrocinado",
                    Size        = 200,
                    Text        = "[Patrocinado] Pergunta patrocinada!",
                    Type        = new MediaType(MediaType.DiscreteTypes.Image, MediaType.SubTypes.JPeg),
                    Uri         = new Uri(@"https://takenethmgomni.blob.core.windows.net/media-db/vivo.jpg")
                };

                await webClientService.SendMessageAsync(mediaLink, Node.Parse(to));

                Thread.Sleep(500);

                var select = new Select
                {
                    Text    = $"Como você avalia os serviços prestados pela VIVO ?",
                    Options = new[]
                    {
                        new SelectOption
                        {
                            Text  = "Excelente",
                            Value = new PlainText {
                                Text = "Excelente"
                            }
                        },
                        new SelectOption
                        {
                            Text  = "Médio",
                            Value = new PlainText {
                                Text = "Médio"
                            }
                        },
                        new SelectOption
                        {
                            Text  = "Precisa melhorar",
                            Value = new PlainText {
                                Text = "Precisa melhorar"
                            }
                        }
                    }
                };

                var nodeTo = Node.Parse(to);
                await webClientService.SendMessageAsync(select, nodeTo);

                var sponsorUser = await userService.GetUserAsync(new User { Node = nodeTo });

                //2 - change user state
                await ChangeUserStateAsync(sponsorUser, Models.SessionState.Answering, "sponsor");

                return(Ok());
            }

            var questionId = ExtractQuestionIdFromAnswer(messageContent);

            if (!string.IsNullOrEmpty(questionId))
            {
                var question = await questionService.GetQuestionByIdAsync(questionId);
                await SendInitialMenuAsync(string.Format(Strings.ResetMessageByClosing, question.Content), message.From);

                questionService.CloseQuestion(questionId);

                await ChangeUserStateAsync(user, Models.SessionState.Starting);

                return(Ok());
            }

            switch (user.Session.State)
            {
            case Models.SessionState.FirstAccess:
                //Send a initial message and change user state to "Starting"

                //1 - Send a initial message
                await SendInitialMenuAsync(Strings.FirstMessage, message.From);

                //2 - change user state
                await ChangeUserStateAsync(user, Models.SessionState.Starting);

                break;

            case Models.SessionState.Starting:
                //Handle to question or to answer action

                if (UserWouldLikeQuestion(messageContent))
                {
                    //1 - Send "SendQuestion" message
                    await webClientService.SendMessageAsync(Strings.SendQuestion, message.From);

                    //2 - change user state
                    await ChangeUserStateAsync(user, Models.SessionState.Questioning);
                }
                else if (UserWouldLikeAnswer(messageContent))
                {
                    //1 - Send a random question to user. Or if not exist send some default message
                    var question = await SendRandomQuestionOrDefaultMessageAsync(user, message);

                    //2 - change user state
                    await ChangeUserStateAsync(user, Models.SessionState.Answering, question.Id);
                }
                else
                {
                    //Handle a new question
                    await RegisterQuestionAync(user, message);
                }

                break;

            case Models.SessionState.Questioning:
                //Handle a new question
                await RegisterQuestionAync(user, message);

                break;

            case Models.SessionState.Answering:
                //Handle: a new answer or more question

                //1 - Save sent answer or skip current question
                if (UserWouldLikeSkipCurrentQuestion(messageContent))
                {
                    //1 - Send a random question to user. Or if not exist send some default message
                    var question = await SendRandomQuestionOrDefaultMessageAsync(user, message);

                    //2 - change user state
                    await ChangeUserStateAsync(user, Models.SessionState.Answering, question.Id);
                }
                else
                {
                    if (user.Session.QuestionId == "sponsor")
                    {
                        //2.2 - Send "ResetMessageByAnswer" message
                        await SendInitialMenuAsync(Strings.ResetMessageByAnswer, message.From);

                        //3 - change user state
                        await ChangeUserStateAsync(user, Models.SessionState.Starting);

                        break;
                    }

                    var question = await questionService.GetQuestionByIdAsync(user.Session.QuestionId);

                    var questionUser = userService.GetUserByIdAsync(question.UserId);

                    //2.1 - Send to question's user owner this answer
                    await userService.UpdateUserAnswersAsync(user, new Answer { UserId = user.Id, QuestionId = question.Id });

                    var select = new Select
                    {
                        Text    = $"💬 Pergunta: {question.Content}\n\n📩 Resposta: {messageContent} \n\n Você considera sua pergunta:",
                        Options = new[]
                        {
                            new SelectOption
                            {
                                Text  = Strings.KeepAnsweringActionText,
                                Value = new PlainText {
                                    Text = Strings.KeepAnsweringActionValue
                                }
                            },
                            new SelectOption
                            {
                                Text  = Strings.QuestionClosedActionText,
                                Value = new PlainText {
                                    Text = $"{Strings.QuestionClosedActionValue} #{question.Id}#"
                                }
                            }
                        }
                    };
                    await webClientService.SendMessageAsync(select, questionUser.Node);

                    //2.2 - Send "ResetMessageByAnswer" message
                    await SendInitialMenuAsync(Strings.ResetMessageByAnswer, message.From);

                    //3 - change user state
                    await ChangeUserStateAsync(user, Models.SessionState.Starting);
                }

                break;
            }

            return(Ok());
        }