예제 #1
0
        protected override async Task OnEventActivityAsync(ITurnContext <IEventActivity> turnContext, CancellationToken cancellationToken)
        {
            var ev    = turnContext.Activity.AsEventActivity();
            var value = ev.Value?.ToString();

            switch (ev.Name)
            {
            case Events.TimezoneEvent:
            {
                var state = await _stateAccessor.GetAsync(turnContext, () => new EmailSkillState());

                state.UserInfo.TimeZone = TimeZoneInfo.FindSystemTimeZoneById(value);

                break;
            }

            case Events.LocationEvent:
            {
                var state = await _stateAccessor.GetAsync(turnContext, () => new EmailSkillState());

                var azureMapsClient = new AzureMapsClient(_settings);
                state.UserInfo.TimeZone = await azureMapsClient.GetTimeZoneInfoByCoordinates(value);

                break;
            }

            default:
            {
                await _dialog.RunAsync(turnContext, _dialogStateAccessor, cancellationToken);

                break;
            }
            }
        }
        private async Task PopulateStateFromActivity(ITurnContext context)
        {
            var activity       = context.Activity;
            var semanticAction = activity.SemanticAction;

            if (semanticAction != null && semanticAction.Entities.ContainsKey(StateProperties.TimeZone))
            {
                var timezone    = semanticAction.Entities[StateProperties.TimeZone];
                var timezoneObj = timezone.Properties[StateProperties.TimeZone].ToObject <TimeZoneInfo>();
                var state       = await _stateAccessor.GetAsync(context, () => new EmailSkillState());

                state.UserInfo.TimeZone = timezoneObj;
            }

            if (semanticAction != null && semanticAction.Entities.ContainsKey(StateProperties.Location))
            {
                var location       = semanticAction.Entities[StateProperties.Location];
                var locationString = location.Properties[StateProperties.Location].ToString();
                var state          = await _stateAccessor.GetAsync(context, () => new EmailSkillState());

                var azureMapsClient = new AzureMapsClient(_settings);
                var timezone        = await azureMapsClient.GetTimeZoneInfoByCoordinates(locationString);

                state.UserInfo.TimeZone = timezone;
            }
        }
        private void GeocodeCsvAddressesFrom(string path, string key)
        {
            var amWebClient = new CookieWebClient();
            var amBasePath  = new ApplicationBasePath(
                protocolPrefix: "https://",
                site: "atlas.microsoft.com",
                applicationPath: "/");

            var amClient = new AzureMapsClient(
                webClient: amWebClient,
                basePath: amBasePath,
                subscriptionKey: key);

            int geocoded       = 0;
            int alreadyGeocode = 0;
            var addresses      = LoadCsvAddresses.LoadFrom(path);

            foreach (var address in addresses)
            {
                if (address.Latitude == null ||
                    address.Longitude == null ||
                    address.Latitude == 0 ||
                    address.Longitude == 0)
                {
                    var coordinates = new AzureMapsmGeocodeAddress(view, amClient)
                                      .Geocode(address);

                    address.Latitude  = coordinates.Latitude;
                    address.Longitude = coordinates.Longitude;

                    geocoded++;
                }
                else
                {
                    alreadyGeocode++;
                }
            }

            view.AppendResultText($"\nTotal Addresses: {(geocoded + alreadyGeocode)}");
            view.AppendResultText($"\nGeocoded: {geocoded}");
            view.AppendResultText($"\nAlready Geocoded (Skipped): {alreadyGeocode}");

            var newPath = view.GetFileNameToSaveAs(path, "csv");

            if (string.IsNullOrWhiteSpace(newPath))
            {
                // Cancelled
                view.AppendResultText($"\nGeocoding not saved.");

                return;
            }

            LoadCsvAddresses.SaveTo(addresses, newPath);

            view.AppendResultText($"\nGeocoding saved to {newPath}");
        }
        // Runs when a new event activity comes in.
        protected override async Task OnEventActivityAsync(DialogContext innerDc, CancellationToken cancellationToken = default)
        {
            var ev    = innerDc.Context.Activity.AsEventActivity();
            var value = ev.Value?.ToString();

            switch (ev.Name)
            {
            case TokenEvents.TokenResponseEventName:
            {
                // Forward the token response activity to the dialog waiting on the stack.
                await innerDc.ContinueDialogAsync();

                break;
            }

            case Events.TimezoneEvent:
            {
                var state = await _stateAccessor.GetAsync(innerDc.Context, () => new EmailSkillState());

                state.UserInfo.TimeZone = TimeZoneInfo.FindSystemTimeZoneById(value);

                break;
            }

            case Events.LocationEvent:
            {
                var state = await _stateAccessor.GetAsync(innerDc.Context, () => new EmailSkillState());

                var azureMapsClient = new AzureMapsClient(_settings);
                state.UserInfo.TimeZone = await azureMapsClient.GetTimeZoneInfoByCoordinates(value);

                break;
            }

            default:
            {
                await innerDc.Context.SendActivityAsync(new Activity(type : ActivityTypes.Trace, text : $"Unknown Event '{ev.Name ?? "undefined"}' was received but not processed."));

                break;
            }
            }
        }
        private async Task PopulateStateFromSemanticAction(ITurnContext context)
        {
            var activity       = context.Activity;
            var semanticAction = activity.SemanticAction;

            if (semanticAction != null && semanticAction.Entities.ContainsKey("timezone"))
            {
                var timezone    = semanticAction.Entities["timezone"];
                var timezoneObj = timezone.Properties["timezone"].ToObject <TimeZoneInfo>();

                var state = await _stateAccessor.GetAsync(context, () => new CalendarSkillState());

                // we have a timezone
                state.UserInfo.Timezone = timezoneObj;
            }

            if (semanticAction != null && semanticAction.Entities.ContainsKey("location"))
            {
                var location       = semanticAction.Entities["location"];
                var locationString = location.Properties["location"].ToString();
                var state          = await _stateAccessor.GetAsync(context, () => new CalendarSkillState());

                var coords = locationString.Split(',');
                if (coords.Length == 2)
                {
                    if (double.TryParse(coords[0], out var lat) && double.TryParse(coords[1], out var lng))
                    {
                        state.UserInfo.Latitude  = lat;
                        state.UserInfo.Longitude = lng;
                    }
                }

                var azureMapsClient = new AzureMapsClient(_settings);
                var timezone        = await azureMapsClient.GetTimeZoneInfoByCoordinates(locationString);

                state.UserInfo.Timezone = timezone;
            }
        }
예제 #6
0
 public AzureMapsmGeocodeAddress(IClientView view, AzureMapsClient client)
 {
     this.view   = view;
     this.client = client;
 }