// 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()); }
private async Task ReplyMessageAsync(object message) { var response = await webClientService.SendMessageAsync(message); }
// 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()); }