Beispiel #1
0
        public async Task SendToConverstionData(string converstationId, IActivity activity, Dictionary <string, string> dataToSend)
        {
            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, (IMessageActivity)activity))
            {
                MicrosoftAppCredentials.TrustServiceUrl(ServiceUrl, DateTime.MaxValue);
                var botDataStore = scope.Resolve <IBotDataStore <BotData> >();
                var key          = new AddressKey
                {
                    BotId          = BotId,
                    ChannelId      = ChannelId,
                    ConversationId = converstationId,
                    ServiceUrl     = ServiceUrl
                };

                var conversationData = await botDataStore.LoadAsync(key, BotStoreType.BotConversationData, CancellationToken.None);

                foreach (var data in dataToSend)
                {
                    conversationData.SetProperty(data.Key, data.Value);
                }

                await botDataStore.SaveAsync(key, BotStoreType.BotConversationData, conversationData, CancellationToken.None);

                await botDataStore.FlushAsync(key, CancellationToken.None);
            }
        }
        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task <HttpResponseMessage> Post([FromBody] Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                if (!string.IsNullOrEmpty(activity.Text))
                {
                    //detect language of input text
                    var userLanguage = await TranslateService.DetermineLanguageAsync(activity.Text);

                    //save user's LanguageCode to Azure Table Storage
                    var message = activity as IMessageActivity;
                    try
                    {
                        using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
                        {
                            var botDataStore = scope.Resolve <IBotDataStore <BotData> >();
                            var key          = new AddressKey()
                            {
                                BotId          = message.Recipient.Id,
                                ChannelId      = message.ChannelId,
                                UserId         = message.From.Id,
                                ConversationId = message.Conversation.Id,
                                ServiceUrl     = message.ServiceUrl
                            };


                            var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

                            var storedLanguageCode = userData.GetProperty <string>(AppSettings.UserLanguageKey);

                            //update user's language in Azure Table Storage
                            if (storedLanguageCode != userLanguage)
                            {
                                userData.SetProperty(AppSettings.UserLanguageKey, userLanguage);
                                await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);

                                await botDataStore.FlushAsync(key, CancellationToken.None);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    activity.Text = await TranslateService.TranslateTextToDefaultLanguage(activity, userLanguage);

                    await Conversation.SendAsync(activity, MakeRoot);
                }
            }
            else
            {
                await HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);

            return(response);
        }
            internal string GetAddressValue(AddressKey key, string address)
            {
                var    addresses = GetOrCreateAddressMap(key);
                string value     = string.Empty;

                if (addresses.TryGetValue(address, out value))
                {
                    return(value);
                }
                return(string.Empty);
            }
            private Dictionary <string, string> GetOrCreateAddressMap(AddressKey key)
            {
                Dictionary <string, string> addresses;

                if (m_Addresses.TryGetValue(key, out addresses))
                {
                    return(addresses);
                }
                addresses        = new Dictionary <string, string>();
                m_Addresses[key] = addresses;
                return(addresses);
            }
Beispiel #5
0
        //  private static readonly bool IsSpellCorrectionEnabled = bool.Parse(WebConfigurationManager.AppSettings["IsSpellCorrectionEnabled"]);

        //    private readonly BingSpellCheckService spellService = new BingSpellCheckService();



        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task <HttpResponseMessage> Post([FromBody] Activity activity)
        {
            Trace.TraceInformation($"Incoming Activity is {activity.ToJson()}");
            if (activity.Type == ActivityTypes.Message)
            {
                if (!String.IsNullOrEmpty(activity.Text))
                {
                    //detect language of input text

                    var userLanguage = TranslationHandler.DetectLanguage(activity);


                    // save user´s languagecode
                    var message = activity as IMessageActivity;

                    try
                    {
                        using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
                        {
                            var botDataStore = scope.Resolve <IBotDataStore <BotData> >();
                            var key          = new AddressKey()
                            {
                                BotId          = message.Recipient.Id,
                                ChannelId      = message.ChannelId,
                                UserId         = message.From.Id,
                                ConversationId = message.Conversation.Id,
                                ServiceUrl     = message.ServiceUrl
                            };

                            var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

                            var storedLanguageCode = userData.GetProperty <string>(StringConstants.UserLanguageKey);

                            //update user's language in Azure Table Storage

                            if (storedLanguageCode != userLanguage && !Regex.IsMatch(activity.Text, @"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"))
                            {
                                userData.SetProperty(StringConstants.UserLanguageKey, userLanguage);
                                await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);

                                await botDataStore.FlushAsync(key, CancellationToken.None);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    //translate activity.Text to Spanish before sending to LUIS for intent
                    activity.Text = TranslationHandler.TranslateTextToDefaultLanguage(activity, userLanguage);
                    //   activity.Text = TranslationHandler.TranslateText(String ,"es",userLanguage);

                    // await Conversation.SendAsync(activity, MakeRoot);
                    await Conversation.SendAsync(activity, () => new RootLuisDialog());
                }
            }
            else
            {
                HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);

            return(response);
        }
Beispiel #6
0
        public async Task <HttpResponseMessage> Callback([FromUri] string code, [FromUri] string state, CancellationToken cancellationToken)
        {
            try
            {
                // Use the state parameter to get correct IAuthProvider and ResumptionCookie
                var           decoded      = Encoding.UTF8.GetString(HttpServerUtility.UrlTokenDecode(state));
                var           queryString  = HttpUtility.ParseQueryString(decoded);
                var           assembly     = Assembly.Load(queryString["providerassembly"]);
                var           type         = assembly.GetType(queryString["providertype"]);
                var           providername = queryString["providername"];
                IAuthProvider authProvider;
                if (type.GetConstructor(new Type[] { typeof(string) }) != null)
                {
                    authProvider = (IAuthProvider)Activator.CreateInstance(type, providername);
                }
                else
                {
                    authProvider = (IAuthProvider)Activator.CreateInstance(type);
                }

                // Get the conversation reference
                var conversationRef = UrlToken.Decode <ConversationReference>(queryString["conversationRef"]);

                Activity message = conversationRef.GetPostToBotMessage();
                using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
                {
                    // Get the UserData from the original conversation
                    IBotDataStore <BotData> stateStore = scope.Resolve <IBotDataStore <BotData> >();
                    var key = new AddressKey()
                    {
                        BotId          = message.Recipient.Id,
                        ChannelId      = message.ChannelId,
                        UserId         = message.From.Id,
                        ConversationId = message.Conversation.Id,
                        ServiceUrl     = message.ServiceUrl
                    };
                    var userData = await stateStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

                    // Get Access Token using authorization code
                    var authOptions = userData.GetProperty <AuthenticationOptions>($"{authProvider.Name}{ContextConstants.AuthOptions}");
                    var token       = await authProvider.GetTokenByAuthCodeAsync(authOptions, code);

                    // Generate magic number and attempt to write to userdata
                    int  magicNumber     = GenerateRandomNumber();
                    bool writeSuccessful = false;
                    uint writeAttempts   = 0;
                    while (!writeSuccessful && writeAttempts++ < MaxWriteAttempts)
                    {
                        try
                        {
                            userData.SetProperty($"{authProvider.Name}{ContextConstants.AuthResultKey}", token);
                            if (authOptions.UseMagicNumber)
                            {
                                userData.SetProperty($"{authProvider.Name}{ContextConstants.MagicNumberKey}", magicNumber);
                                userData.SetProperty($"{authProvider.Name}{ContextConstants.MagicNumberValidated}", "false");
                            }

                            await stateStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);

                            await stateStore.FlushAsync(key, CancellationToken.None);

                            writeSuccessful = true;
                        }
                        catch (Exception)
                        {
                            writeSuccessful = false;
                        }
                    }
                    var resp = new HttpResponseMessage(HttpStatusCode.OK);
                    if (!writeSuccessful)
                    {
                        message.Text = String.Empty; // fail the login process if we can't write UserData
                        await Conversation.ResumeAsync(conversationRef, message);

                        resp.Content = new StringContent("<html><body>Could not log you in at this time, please try again later</body></html>", System.Text.Encoding.UTF8, @"text/html");
                    }
                    else
                    {
                        await Conversation.ResumeAsync(conversationRef, message);

                        resp.Content = new StringContent($"<html><body>Almost done! Please copy this number and paste it back to your chat so your authentication can complete:<br/> <h1>{magicNumber}</h1>.</body></html>", System.Text.Encoding.UTF8, @"text/html");
                    }
                    return(resp);
                }
            }
            catch (Exception ex)
            {
                // Callback is called with no pending message as a result the login flow cannot be resumed.
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex));
            }
        }
Beispiel #7
0
        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        //[ResponseType(typeof(void))]
        public async Task <HttpResponseMessage> Post([FromBody] Activity activity)
        {
            //trust Webchat & SMS channel
            MicrosoftAppCredentials.TrustServiceUrl(@"https://webchat.botframework.com", DateTime.MaxValue);
            MicrosoftAppCredentials.TrustServiceUrl(@"https://sms.botframework.com", DateTime.MaxValue);

            Trace.TraceInformation($"Incoming Activity is {activity.ToJson()}");
            if (activity.Type == ActivityTypes.Message)
            {
                if (!string.IsNullOrEmpty(activity.Text))
                {
                    //detect language of input text
                    var userLanguage = TranslationHandler.DetectLanguage(activity);

                    //save user's LanguageCode to Azure Table Storage
                    var message = activity as IMessageActivity;

                    try
                    {
                        using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
                        {
                            var botDataStore = scope.Resolve <IBotDataStore <BotData> >();
                            var key          = new AddressKey()
                            {
                                BotId          = message.Recipient.Id,
                                ChannelId      = message.ChannelId,
                                UserId         = message.From.Id,
                                ConversationId = message.Conversation.Id,
                                ServiceUrl     = message.ServiceUrl
                            };

                            var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

                            var storedLanguageCode = userData.GetProperty <string>(StringConstants.UserLanguageKey);

                            //update user's language in Azure Table Storage
                            if (storedLanguageCode != userLanguage)
                            {
                                userData.SetProperty(StringConstants.UserLanguageKey, userLanguage);
                                await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);

                                await botDataStore.FlushAsync(key, CancellationToken.None);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    //translate activity.Text to English before sending to LUIS for intent
                    activity.Text = TranslationHandler.TranslateTextToDefaultLanguage(activity, userLanguage);

                    await Conversation.SendAsync(activity, MakeRoot);
                }
            }
            else
            {
                HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);

            return(response);
        }
 internal IReadOnlyList <string> GetAllAddresses(AddressKey key)
 {
     return(m_Addresses[key].Keys.ToArray());
 }
            internal void SetAddressValue(AddressKey key, string address, string value)
            {
                var addresses = GetOrCreateAddressMap(key);

                addresses[address] = value;
            }
            internal void CreateAddressEntry(AddressKey key, string address)
            {
                var addresses = GetOrCreateAddressMap(key);

                addresses[address] = string.Empty;
            }
Beispiel #11
0
 public void DeleteAddress([FromBody] AddressKey key)
 {
     _addressService.Delete(key);
 }
Beispiel #12
0
        public Address GetAddress([FromBody] AddressKey key)
        {
            var address = _addressService.Get(key);

            return(address);
        }
        public virtual async Task <HttpResponseMessage> Post([FromBody] Activity activity)
        {
            var connector = new ConnectorClient(new Uri(activity.ServiceUrl));

            // check if activity is of type message
            if (activity != null && activity.GetActivityType() == ActivityTypes.Message)
            {
                var message = activity as IMessageActivity;
                using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
                {
                    var botDataStore = scope.Resolve <IBotDataStore <BotData> >();

                    var key = new AddressKey()
                    {
                        BotId          = message.Recipient.Id,
                        ChannelId      = message.ChannelId,
                        UserId         = message.From.Id,
                        ConversationId = message.Conversation.Id,
                        ServiceUrl     = message.ServiceUrl
                    };
                    var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

                    userData.SetProperty("key 1", "value1");
                    userData.SetProperty("key 2", "value2");

                    await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);

                    await botDataStore.FlushAsync(key, CancellationToken.None);
                }

                if (activity.Text.ToLower() == BotMessageType.Notification)
                {
                    await HandleNotificationMessages(activity, connector);
                }
                else
                {
                    var authRestService = new AuthRestService();

                    if (activity.ChannelId == Channel.Sms)
                    {
                        int  accessCode;
                        bool isNumeric = int.TryParse(activity.Text, out accessCode);

                        if (isNumeric)
                        {
                            var otpSmsService     = new OTPSmsService();
                            var isAccessCodeValid = await otpSmsService.CheckOneTimePasswordCode(activity.From.Id, accessCode.ToString(), activity.ChannelId);

                            if (!isAccessCodeValid)
                            {
                                Activity reply = activity.CreateReply("el codigo es invalido ");
                                await connector.Conversations.ReplyToActivityAsync(reply);
                            }
                            else
                            {
                                Activity reply = activity.CreateReply("Autenticación realizada con éxito");
                                await connector.Conversations.ReplyToActivityAsync(reply);
                            }
                        }

                        else
                        {
                            var smsUserAuthenticated = await authRestService.CheckSmsUserIsAuthenticated(activity.From.Id);

                            if (!smsUserAuthenticated)
                            {
                                Activity reply = activity.CreateReply(MessagesDialog.SmsUserNotLogged);
                                await connector.Conversations.ReplyToActivityAsync(reply);
                            }
                            else
                            {
                                await HandleSmsMessages(activity, connector);
                            }
                        }
                    }
                    else
                    {
                        var userIsAuthenticated = false;

                        if (activity.ChannelId == "directline")
                        {
                            userIsAuthenticated = await authRestService.CheckDirectLineUserIsAuthenticated(activity.From.Id);
                        }
                        else
                        {
                            userIsAuthenticated = await authRestService.CheckUserIsAuthenticated(activity.From.Name);
                        }

                        if (activity.Text == BotMessageType.Notification)
                        {
                            await HandleNotificationMessages(activity, connector);
                        }

                        if (activity.Text == BotMessageType.Userlogged)
                        {
                            Activity reply = activity.CreateReply(Resources.MessagesDialog.AuthLoginSucceded);
                            await connector.Conversations.ReplyToActivityAsync(reply);
                        }


                        if (userIsAuthenticated)
                        {
                            await Conversation.SendAsync(activity, () => new BotHomeDialog());
                        }
                        else
                        {
                            if (activity.ChannelId == Channel.DirectLine)
                            {
                                //check number
                                int  accessCode;
                                bool isNumeric = int.TryParse(activity.Text, out accessCode);

                                if (isNumeric)
                                {
                                    var otpSmsService     = new OTPSmsService();
                                    var isAccessCodeValid = await otpSmsService.CheckOneTimePasswordCode(activity.From.Id, accessCode.ToString(), activity.ChannelId);

                                    if (!isAccessCodeValid)
                                    {
                                        Activity reply = activity.CreateReply("El código es inválido: " + activity.From.Id);
                                        await connector.Conversations.ReplyToActivityAsync(reply);
                                    }
                                    else
                                    {
                                        Activity reply = activity.CreateReply("Autenticación realizada con éxito");
                                        await connector.Conversations.ReplyToActivityAsync(reply);
                                    }
                                }
                                else
                                {
                                    Activity reply = activity.CreateReply(MessagesDialog.DirectLineMessageLogin);

                                    await connector.Conversations.ReplyToActivityAsync(reply);
                                }
                            }
                            else
                            {
                                var      urlLogin           = WebConfigurationManager.AppSettings["authLoginUrl"];
                                var      codeAccessUrl      = "?codeaccess=" + DateTime.Now.Ticks.ToString();
                                var      channelId          = "&channelId=" + activity.ChannelId;
                                var      definitiveUrlLogin = urlLogin + codeAccessUrl + channelId;
                                Activity reply = activity.CreateReply(MessagesDialog.AuthLoginRequired + activity.From.Name + System.Environment.NewLine + definitiveUrlLogin);

                                await connector.Conversations.ReplyToActivityAsync(reply);
                            }
                        }
                    }
                }
            }
            else
            {
                HandleSystemMessage(activity);
            }

            var response = Request.CreateResponse(HttpStatusCode.OK);

            return(response);
        }