Exemple #1
0
    public static void Main(string[] args)
    {
        int totalSecs;
        System.Console.Write("Enter the number of seconds to be converted: ");
        totalSecs = int.Parse(System.Console.ReadLine());

        TimeConverter time1 = new TimeConverter();
        time1.convertSecsToTime(totalSecs);
    }
Exemple #2
0
        public async Task <DialogTurnResult> ReadEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context);

                var luisResult = state.LuisResult;
                var topIntent  = luisResult?.TopIntent().intent;

                if (topIntent == null)
                {
                    return(await sc.EndDialogAsync(true));
                }

                var eventItem = state.ReadOutEvents.FirstOrDefault();

                sc.Context.Activity.Properties.TryGetValue("OriginText", out var content);
                var userInput = content != null?content.ToString() : sc.Context.Activity.Text;

                var generalLuisResult = state.GeneralLuisResult;
                var generalTopIntent  = generalLuisResult?.TopIntent().intent;

                var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale);
                if (promptRecognizerResult.Succeeded && promptRecognizerResult.Value == false)
                {
                    await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(CalendarSharedResponses.CancellingMessage));

                    return(await sc.EndDialogAsync(true));
                }
                else if ((promptRecognizerResult.Succeeded && promptRecognizerResult.Value == true) || (topIntent == Luis.Calendar.Intent.ReadAloud && eventItem == null))
                {
                    return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(SummaryResponses.ReadOutPrompt), }));
                }
                else if (eventItem != null)
                {
                    string speakString = string.Empty;
                    if (eventItem.IsAllDay == true)
                    {
                        speakString = $"{eventItem.Title} at {TimeConverter.ConvertUtcToUserTime(eventItem.StartTime, state.GetUserTimeZone()).ToString("MMMM dd all day")}";
                    }
                    else
                    {
                        speakString = $"{eventItem.Title} at {TimeConverter.ConvertUtcToUserTime(eventItem.StartTime, state.GetUserTimeZone()).ToString("h:mm tt")}";
                    }

                    var replyMessage = sc.Context.Activity.CreateAdaptiveCardReply(SummaryResponses.ReadOutMessage, eventItem.OnlineMeetingUrl == null ? "Dialogs/Shared/Resources/Cards/CalendarCardNoJoinButton.json" : "Dialogs/Shared/Resources/Cards/CalendarCard.json", eventItem.ToAdaptiveCardData(state.GetUserTimeZone()), null, new StringDictionary()
                    {
                        { "MeetingDetails", speakString }
                    });
                    await sc.Context.SendActivityAsync(replyMessage);

                    return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = sc.Context.Activity.CreateReply(SummaryResponses.ReadOutMorePrompt) }));
                }
                else
                {
                    return(await sc.NextAsync());
                }
            }
            catch (Exception)
            {
                await HandleDialogExceptions(sc);

                throw;
            }
        }
        public async Task <DialogTurnResult> ShowNextEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context);

                var askParameter = new AskParameterModel(state.AskParameterContent);
                if (string.IsNullOrEmpty(state.APIToken))
                {
                    return(await sc.EndDialogAsync(true));
                }

                var calendarService = ServiceManager.InitCalendarService(state.APIToken, state.EventSource);

                var eventList = await calendarService.GetUpcomingEvents();

                var nextEventList = new List <EventModel>();
                foreach (var item in eventList)
                {
                    if (item.IsCancelled != true && (nextEventList.Count == 0 || nextEventList[0].StartTime == item.StartTime))
                    {
                        nextEventList.Add(item);
                    }
                }

                if (nextEventList.Count == 0)
                {
                    await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowNoMeetingMessage));
                }
                else
                {
                    if (nextEventList.Count == 1)
                    {
                        // if user asked for specific details
                        if (askParameter.NeedDetail)
                        {
                            var tokens = new StringDictionary()
                            {
                                { "EventName", nextEventList[0].Title },
                                { "EventStartTime", TimeConverter.ConvertUtcToUserTime(nextEventList[0].StartTime, state.GetUserTimeZone()).ToString("h:mm tt") },
                                { "EventEndTime", TimeConverter.ConvertUtcToUserTime(nextEventList[0].EndTime, state.GetUserTimeZone()).ToString("h:mm tt") },
                                { "EventDuration", nextEventList[0].ToSpeechDurationString() },
                                { "EventLocation", nextEventList[0].Location },
                            };

                            await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.BeforeShowEventDetails, tokens));

                            if (askParameter.NeedTime)
                            {
                                await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ReadTime, tokens));
                            }

                            if (askParameter.NeedDuration)
                            {
                                await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ReadDuration, tokens));
                            }

                            if (askParameter.NeedLocation)
                            {
                                // for some event there might be no localtion.
                                if (string.IsNullOrEmpty(tokens["EventLocation"]))
                                {
                                    await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ReadNoLocation));
                                }
                                else
                                {
                                    await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ReadLocation, tokens));
                                }
                            }
                        }

                        var speakParams = new StringDictionary()
                        {
                            { "EventName", nextEventList[0].Title },
                            { "PeopleCount", nextEventList[0].Attendees.Count.ToString() },
                        };

                        speakParams.Add("EventTime", SpeakHelper.ToSpeechMeetingDateTime(TimeConverter.ConvertUtcToUserTime(nextEventList[0].StartTime, state.GetUserTimeZone()), nextEventList[0].IsAllDay == true));

                        if (string.IsNullOrEmpty(nextEventList[0].Location))
                        {
                            await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowNextMeetingNoLocationMessage, speakParams));
                        }
                        else
                        {
                            speakParams.Add("Location", nextEventList[0].Location);
                            await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowNextMeetingMessage, speakParams));
                        }
                    }
                    else
                    {
                        await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMultipleNextMeetingMessage));
                    }

                    var reply = await GetGeneralMeetingListResponseAsync(sc, CalendarCommonStrings.UpcommingMeeting, nextEventList, null, null);

                    await sc.Context.SendActivityAsync(reply);
                }

                state.Clear();
                return(await sc.EndDialogAsync(true));
            }
            catch (SkillException ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
        public async Task <DialogTurnResult> ShowEventsList(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var tokenResponse = sc.Result as TokenResponse;

                var state = await Accessor.GetAsync(sc.Context);

                var options = sc.Options as ShowMeetingsDialogOptions;
                if (state.SummaryEvents == null)
                {
                    // this will lead to error when test
                    if (string.IsNullOrEmpty(state.APIToken))
                    {
                        state.Clear();
                        return(await sc.EndDialogAsync(true));
                    }

                    var calendarService = ServiceManager.InitCalendarService(state.APIToken, state.EventSource);

                    var searchDate = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, state.GetUserTimeZone());

                    if (state.StartDate.Any())
                    {
                        searchDate = state.StartDate.Last();
                    }

                    var results = await GetEventsByTime(new List <DateTime>() { searchDate }, state.StartTime, state.EndDate, state.EndTime, state.GetUserTimeZone(), calendarService);

                    var searchedEvents     = new List <EventModel>();
                    var searchTodayMeeting = SearchesTodayMeeting(state);
                    foreach (var item in results)
                    {
                        if (!searchTodayMeeting || item.StartTime >= DateTime.UtcNow)
                        {
                            searchedEvents.Add(item);
                        }
                    }

                    if (searchedEvents.Count == 0)
                    {
                        await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowNoMeetingMessage));

                        state.Clear();
                        return(await sc.EndDialogAsync(true));
                    }
                    else
                    {
                        if (options != null && options.Reason == ShowMeetingReason.ShowOverviewAgain)
                        {
                            var responseParams = new StringDictionary()
                            {
                                { "Count", searchedEvents.Count.ToString() },
                                { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower }
                            };
                            if (searchedEvents.Count == 1)
                            {
                                await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowOneMeetingSummaryAgainMessage, responseParams));
                            }
                            else
                            {
                                await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMeetingSummaryAgainMessage, responseParams));
                            }
                        }
                        else
                        {
                            var responseParams = new StringDictionary()
                            {
                                { "Count", searchedEvents.Count.ToString() },
                                { "EventName1", searchedEvents[0].Title },
                                { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower },
                                { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(searchedEvents[0].StartTime, state.GetUserTimeZone()), searchedEvents[0].IsAllDay == true) },
                                { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(searchedEvents[0].Attendees, 1) }
                            };

                            if (searchedEvents.Count == 1)
                            {
                                await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowOneMeetingSummaryMessage, responseParams));
                            }
                            else
                            {
                                responseParams.Add("EventName2", searchedEvents[searchedEvents.Count - 1].Title);
                                responseParams.Add("EventTime2", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(searchedEvents[searchedEvents.Count - 1].StartTime, state.GetUserTimeZone()), searchedEvents[searchedEvents.Count - 1].IsAllDay == true));
                                responseParams.Add("Participants2", DisplayHelper.ToDisplayParticipantsStringSummary(searchedEvents[searchedEvents.Count - 1].Attendees, 1));

                                await sc.Context.SendActivityAsync(ResponseManager.GetResponse(SummaryResponses.ShowMultipleMeetingSummaryMessage, responseParams));
                            }
                        }
                    }

                    // add conflict flag
                    for (var i = 0; i < searchedEvents.Count - 1; i++)
                    {
                        for (var j = i + 1; j < searchedEvents.Count; j++)
                        {
                            if (searchedEvents[i].StartTime <= searchedEvents[j].StartTime &&
                                searchedEvents[i].EndTime > searchedEvents[j].StartTime)
                            {
                                searchedEvents[i].IsConflict = true;
                                searchedEvents[j].IsConflict = true;
                            }
                            else
                            {
                                break;
                            }
                        }
                    }

                    // count the conflict meetings
                    var totalConflictCount = 0;
                    foreach (var eventItem in searchedEvents)
                    {
                        if (eventItem.IsConflict)
                        {
                            totalConflictCount++;
                        }
                    }

                    state.TotalConflictCount = totalConflictCount;

                    await sc.Context.SendActivityAsync(await GetOverviewMeetingListResponseAsync(
                                                           sc,
                                                           GetCurrentPageMeetings(searchedEvents, state, out var firstIndex, out var lastIndex),
                                                           firstIndex,
                                                           lastIndex,
                                                           searchedEvents.Count,
                                                           totalConflictCount,
                                                           null,
                                                           null));

                    state.SummaryEvents = searchedEvents;
                    if (state.SummaryEvents.Count == 1)
                    {
                        return(await sc.PromptAsync(Actions.Prompt, new PromptOptions()));
                    }
                }
                else
                {
                    var currentPageMeetings = GetCurrentPageMeetings(state.SummaryEvents, state);
                    if (options != null && (
                            options.Reason == ShowMeetingReason.ShowFilteredByTitleMeetings ||
                            options.Reason == ShowMeetingReason.ShowFilteredByTimeMeetings ||
                            options.Reason == ShowMeetingReason.ShowFilteredByParticipantNameMeetings))
                    {
                        string meetingListTitle = null;

                        if (options.Reason == ShowMeetingReason.ShowFilteredByTitleMeetings)
                        {
                            meetingListTitle = string.Format(CalendarCommonStrings.MeetingsAbout, state.FilterMeetingKeyWord);
                        }
                        else if (options.Reason == ShowMeetingReason.ShowFilteredByTimeMeetings)
                        {
                            meetingListTitle = string.Format(CalendarCommonStrings.MeetingsAt, state.FilterMeetingKeyWord);
                        }
                        else if (options.Reason == ShowMeetingReason.ShowFilteredByParticipantNameMeetings)
                        {
                            meetingListTitle = string.Format(CalendarCommonStrings.MeetingsWith, state.FilterMeetingKeyWord);
                        }

                        var reply = await GetGeneralMeetingListResponseAsync(
                            sc,
                            meetingListTitle,
                            state.SummaryEvents,
                            SummaryResponses.ShowMultipleFilteredMeetings,
                            new StringDictionary()
                        {
                            { "Count", state.SummaryEvents.Count.ToString() }
                        });

                        await sc.Context.SendActivityAsync(reply);
                    }
                    else
                    {
                        var responseParams = new StringDictionary()
                        {
                            { "Count", state.SummaryEvents.Count.ToString() },
                            { "EventName1", currentPageMeetings[0].Title },
                            { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower },
                            { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(currentPageMeetings[0].StartTime, state.GetUserTimeZone()), currentPageMeetings[0].IsAllDay == true) },
                            { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(currentPageMeetings[0].Attendees, 1) }
                        };
                        var reply = await GetOverviewMeetingListResponseAsync(
                            sc,
                            GetCurrentPageMeetings(state.SummaryEvents, state, out var firstIndex, out var lastIndex),
                            firstIndex,
                            lastIndex,
                            state.SummaryEvents.Count,
                            state.TotalConflictCount,
                            SummaryResponses.ShowMeetingSummaryNotFirstPageMessage,
                            responseParams);

                        await sc.Context.SendActivityAsync(reply);
                    }
                }

                return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = ResponseManager.GetResponse(SummaryResponses.ReadOutMorePrompt) }));
            }
            catch (SkillException ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
        protected async Task <List <EventModel> > GetEventsByTime(List <DateTime> startDateList, List <DateTime> startTimeList, List <DateTime> endDateList, List <DateTime> endTimeList, TimeZoneInfo userTimeZone, ICalendar calendarService)
        {
            // todo: check input datetime is utc
            var rawEvents    = new List <EventModel>();
            var resultEvents = new List <EventModel>();

            DateTime?startDate = null;

            if (startDateList.Any())
            {
                startDate = startDateList.Last();
            }

            DateTime?endDate = null;

            if (endDateList.Any())
            {
                endDate = endDateList.Last();
            }

            bool searchByStartTime = startTimeList.Any() && endDate == null && !endTimeList.Any();

            startDate = startDate ?? TimeConverter.ConvertUtcToUserTime(DateTime.UtcNow, userTimeZone);
            endDate   = endDate ?? startDate ?? TimeConverter.ConvertUtcToUserTime(DateTime.UtcNow, userTimeZone);

            var searchStartTimeList = new List <DateTime>();
            var searchEndTimeList   = new List <DateTime>();

            if (startTimeList.Any())
            {
                foreach (var time in startTimeList)
                {
                    searchStartTimeList.Add(TimeZoneInfo.ConvertTimeToUtc(
                                                new DateTime(startDate.Value.Year, startDate.Value.Month, startDate.Value.Day, time.Hour, time.Minute, time.Second),
                                                userTimeZone));
                }
            }
            else
            {
                searchStartTimeList.Add(TimeZoneInfo.ConvertTimeToUtc(
                                            new DateTime(startDate.Value.Year, startDate.Value.Month, startDate.Value.Day), userTimeZone));
            }

            if (endTimeList.Any())
            {
                foreach (var time in endTimeList)
                {
                    searchEndTimeList.Add(TimeZoneInfo.ConvertTimeToUtc(
                                              new DateTime(endDate.Value.Year, endDate.Value.Month, endDate.Value.Day, time.Hour, time.Minute, time.Second),
                                              userTimeZone));
                }
            }
            else
            {
                searchEndTimeList.Add(TimeZoneInfo.ConvertTimeToUtc(
                                          new DateTime(endDate.Value.Year, endDate.Value.Month, endDate.Value.Day, 23, 59, 59), userTimeZone));
            }

            DateTime?searchStartTime = null;

            if (searchByStartTime)
            {
                foreach (var startTime in searchStartTimeList)
                {
                    rawEvents = await calendarService.GetEventsByStartTime(startTime);

                    if (rawEvents.Any())
                    {
                        searchStartTime = startTime;
                        break;
                    }
                }
            }
            else
            {
                for (var i = 0; i < searchStartTimeList.Count(); i++)
                {
                    rawEvents = await calendarService.GetEventsByTime(
                        searchStartTimeList[i],
                        searchEndTimeList.Count() > i?searchEndTimeList[i] : searchEndTimeList[0]);

                    if (rawEvents.Any())
                    {
                        searchStartTime = searchStartTimeList[i];
                        break;
                    }
                }
            }

            foreach (var item in rawEvents)
            {
                if (item.StartTime >= searchStartTime && item.IsCancelled != true)
                {
                    resultEvents.Add(item);
                }
            }

            return(resultEvents);
        }
        public async Task <DialogTurnResult> AfterUpdateStartTimeForCreate(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken);

                if (sc.Result != null && !state.StartTime.Any())
                {
                    IList <DateTimeResolution> dateTimeResolutions = sc.Result as List <DateTimeResolution>;
                    foreach (var resolution in dateTimeResolutions)
                    {
                        var dateTimeConvertType = resolution?.Timex;
                        var dateTimeValue       = resolution?.Value;
                        if (dateTimeValue != null)
                        {
                            try
                            {
                                var dateTime = DateTime.Parse(dateTimeValue);

                                if (dateTime != null)
                                {
                                    var isRelativeTime = IsRelativeTime(sc.Context.Activity.Text, dateTimeValue, dateTimeConvertType);
                                    state.StartTime.Add(isRelativeTime ? TimeZoneInfo.ConvertTime(dateTime, TimeZoneInfo.Local, state.GetUserTimeZone()) : dateTime);
                                }
                            }
                            catch (FormatException ex)
                            {
                                await HandleExpectedDialogExceptions(sc, ex);
                            }
                        }
                    }
                }

                var userNow   = TimeConverter.ConvertUtcToUserTime(DateTime.UtcNow, state.GetUserTimeZone());
                var startDate = state.StartDate.Last();
                foreach (var startTime in state.StartTime)
                {
                    var startDateTime = new DateTime(
                        startDate.Year,
                        startDate.Month,
                        startDate.Day,
                        startTime.Hour,
                        startTime.Minute,
                        startTime.Second);
                    if (state.StartDateTime == null)
                    {
                        state.StartDateTime = startDateTime;
                    }

                    if (startDateTime >= userNow)
                    {
                        state.StartDateTime = startDateTime;
                        break;
                    }
                }

                state.StartDateTime = TimeZoneInfo.ConvertTimeToUtc(state.StartDateTime.Value, state.GetUserTimeZone());
                return(await sc.EndDialogAsync(cancellationToken : cancellationToken));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
Exemple #7
0
        public async Task <DialogTurnResult> AfterGetNewEventTime(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context);

                if (state.NewStartDate.Any() || state.NewStartTime.Any() || state.MoveTimeSpan != 0)
                {
                    var originalEvent         = state.Events[0];
                    var originalStartDateTime = TimeConverter.ConvertUtcToUserTime(originalEvent.StartTime, state.GetUserTimeZone());
                    var userNow = TimeConverter.ConvertUtcToUserTime(DateTime.UtcNow, state.GetUserTimeZone());

                    if (state.NewStartDate.Any() || state.NewStartTime.Any())
                    {
                        var newStartDate = state.NewStartDate.Any() ?
                                           state.NewStartDate.Last() :
                                           originalStartDateTime;

                        var newStartTime = new List <DateTime>();
                        if (state.NewStartTime.Any())
                        {
                            foreach (var time in state.NewStartTime)
                            {
                                var newStartDateTime = new DateTime(
                                    newStartDate.Year,
                                    newStartDate.Month,
                                    newStartDate.Day,
                                    time.Hour,
                                    time.Minute,
                                    time.Second);

                                if (state.NewStartDateTime == null)
                                {
                                    state.NewStartDateTime = newStartDateTime;
                                }

                                if (newStartDateTime >= userNow)
                                {
                                    state.NewStartDateTime = newStartDateTime;
                                    break;
                                }
                            }
                        }
                    }
                    else if (state.MoveTimeSpan != 0)
                    {
                        state.NewStartDateTime = originalStartDateTime.AddSeconds(state.MoveTimeSpan);
                    }
                    else
                    {
                        return(await sc.BeginDialogAsync(Actions.UpdateNewStartTime, new UpdateDateTimeDialogOptions(UpdateDateTimeDialogOptions.UpdateReason.NotFound)));
                    }

                    state.NewStartDateTime = TimeZoneInfo.ConvertTimeToUtc(state.NewStartDateTime.Value, state.GetUserTimeZone());

                    return(await sc.ContinueDialogAsync());
                }
                else if (sc.Result != null)
                {
                    IList <DateTimeResolution> dateTimeResolutions = sc.Result as List <DateTimeResolution>;

                    DateTime?newStartTime = null;

                    foreach (var resolution in dateTimeResolutions)
                    {
                        var utcNow = DateTime.UtcNow;
                        var dateTimeConvertTypeString = resolution.Timex;
                        var dateTimeConvertType       = new TimexProperty(dateTimeConvertTypeString);
                        var dateTimeValue             = DateTime.Parse(resolution.Value);
                        if (dateTimeValue == null)
                        {
                            continue;
                        }

                        var isRelativeTime = IsRelativeTime(sc.Context.Activity.Text, resolution.Value, dateTimeConvertTypeString);
                        if (isRelativeTime)
                        {
                            dateTimeValue = DateTime.SpecifyKind(dateTimeValue, DateTimeKind.Local);
                        }

                        dateTimeValue = isRelativeTime ? TimeZoneInfo.ConvertTime(dateTimeValue, TimeZoneInfo.Local, state.GetUserTimeZone()) : dateTimeValue;
                        var originalStartDateTime = TimeConverter.ConvertUtcToUserTime(state.Events[0].StartTime, state.GetUserTimeZone());
                        if (dateTimeConvertType.Types.Contains(Constants.TimexTypes.Date) && !dateTimeConvertType.Types.Contains(Constants.TimexTypes.DateTime))
                        {
                            dateTimeValue = new DateTime(
                                dateTimeValue.Year,
                                dateTimeValue.Month,
                                dateTimeValue.Day,
                                originalStartDateTime.Hour,
                                originalStartDateTime.Minute,
                                originalStartDateTime.Second);
                        }
                        else if (dateTimeConvertType.Types.Contains(Constants.TimexTypes.Time) && !dateTimeConvertType.Types.Contains(Constants.TimexTypes.DateTime))
                        {
                            dateTimeValue = new DateTime(
                                originalStartDateTime.Year,
                                originalStartDateTime.Month,
                                originalStartDateTime.Day,
                                dateTimeValue.Hour,
                                dateTimeValue.Minute,
                                dateTimeValue.Second);
                        }

                        dateTimeValue = TimeZoneInfo.ConvertTimeToUtc(dateTimeValue, state.GetUserTimeZone());

                        if (newStartTime == null)
                        {
                            newStartTime = dateTimeValue;
                        }

                        if (dateTimeValue >= utcNow)
                        {
                            newStartTime = dateTimeValue;
                            break;
                        }
                    }

                    if (newStartTime != null)
                    {
                        state.NewStartDateTime = newStartTime;

                        return(await sc.ContinueDialogAsync());
                    }
                    else
                    {
                        return(await sc.BeginDialogAsync(Actions.UpdateNewStartTime, new UpdateDateTimeDialogOptions(UpdateDateTimeDialogOptions.UpdateReason.NotADateTime)));
                    }
                }
                else
                {
                    return(await sc.BeginDialogAsync(Actions.UpdateNewStartTime, new UpdateDateTimeDialogOptions(UpdateDateTimeDialogOptions.UpdateReason.NotADateTime)));
                }
            }
            catch (Exception ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
Exemple #8
0
        /// <summary>
        /// Initializes a new instance of the FatFileSystem class.
        /// </summary>
        /// <param name="data">The stream containing the file system.</param>
        /// <param name="ownsData">Indicates if the new instance should take ownership
        /// of <paramref name="data"/>.</param>
        /// <param name="parameters">The parameters for the file system.</param>
        public FatFileSystem(Stream data, Ownership ownsData, FileSystemParameters parameters)
            : base(new FatFileSystemOptions(parameters))
        {
            _dirCache = new Dictionary<uint, Directory>();

            if (parameters != null && parameters.TimeConverter != null)
            {
                _timeConverter = parameters.TimeConverter;
            }
            else
            {
                _timeConverter = DefaultTimeConverter;
            }

            Initialize(data);
            _ownsData = ownsData;
        }
        public static MidiFile ConvertToMidiFile(Stream stream, MidiFileCsvConversionSettings settings)
        {
            var midiFile = new MidiFile();
            var events   = new Dictionary <int, List <TimedMidiEvent> >();

            using (var csvReader = new CsvReader(stream, settings.CsvDelimiter))
            {
                var    lineNumber = 0;
                Record record;

                while ((record = ReadRecord(csvReader, lineNumber, settings)) != null)
                {
                    var recordType = GetRecordType(record.RecordType, settings);
                    if (recordType == null)
                    {
                        CsvError.ThrowBadFormat(lineNumber, "Unknown record.");
                    }

                    switch (recordType)
                    {
                    case RecordType.Header:
                    {
                        var headerChunk = ParseHeader(record, settings);
                        midiFile.TimeDivision   = headerChunk.TimeDivision;
                        midiFile.OriginalFormat = (MidiFileFormat)headerChunk.FileFormat;
                    }
                    break;

                    case RecordType.TrackChunkStart:
                    case RecordType.TrackChunkEnd:
                    case RecordType.FileEnd:
                        break;

                    case RecordType.Event:
                    {
                        var midiEvent        = ParseEvent(record, settings);
                        var trackChunkNumber = record.TrackNumber.Value;

                        AddTimedEvents(events, trackChunkNumber, new TimedMidiEvent(record.Time, midiEvent));
                    }
                    break;

                    case RecordType.Note:
                    {
                        var noteEvents       = ParseNote(record, settings);
                        var trackChunkNumber = record.TrackNumber.Value;

                        AddTimedEvents(events, trackChunkNumber, noteEvents);
                    }
                    break;
                    }

                    lineNumber = record.LineNumber + 1;
                }
            }

            if (!events.Keys.Any())
            {
                return(midiFile);
            }

            var tempoMap = GetTempoMap(events.Values.SelectMany(e => e), midiFile.TimeDivision);

            var trackChunks = new TrackChunk[events.Keys.Max() + 1];

            for (int i = 0; i < trackChunks.Length; i++)
            {
                List <TimedMidiEvent> timedMidiEvents;
                trackChunks[i] = events.TryGetValue(i, out timedMidiEvents)
                    ? timedMidiEvents.Select(e => new TimedEvent(e.Event, TimeConverter.ConvertFrom(e.Time, tempoMap))).ToTrackChunk()
                    : new TrackChunk();
            }

            midiFile.Chunks.AddRange(trackChunks);

            return(midiFile);
        }
    private void SetPassTime()
    {
        int curUsedTime = InstanceManager.CurUsedTime;

        this.battleTimeText.set_text(GameDataUtils.GetChineseContent(501004, false) + " " + TimeConverter.GetTime(curUsedTime, TimeFormat.HHMMSS));
    }
        private async Task <DialogTurnResult> AfterGetNewEventTimePromptAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken);

                if (state.UpdateMeetingInfo.NewStartDate.Any() || state.UpdateMeetingInfo.NewStartTime.Any() || state.UpdateMeetingInfo.MoveTimeSpan != 0)
                {
                    var originalEvent         = state.ShowMeetingInfo.FocusedEvents[0];
                    var originalStartDateTime = TimeConverter.ConvertUtcToUserTime(originalEvent.StartTime, state.GetUserTimeZone());
                    var userNow = TimeConverter.ConvertUtcToUserTime(DateTime.UtcNow, state.GetUserTimeZone());

                    if (state.UpdateMeetingInfo.NewStartDate.Any() || state.UpdateMeetingInfo.NewStartTime.Any())
                    {
                        var newStartDate = state.UpdateMeetingInfo.NewStartDate.Any() ?
                                           state.UpdateMeetingInfo.NewStartDate.Last() :
                                           originalStartDateTime;

                        var newStartTime = new List <DateTime>();
                        if (state.UpdateMeetingInfo.NewStartTime.Any())
                        {
                            newStartTime.AddRange(state.UpdateMeetingInfo.NewStartTime);
                        }
                        else
                        {
                            newStartTime.Add(originalStartDateTime);
                        }

                        foreach (var time in newStartTime)
                        {
                            var newStartDateTime = new DateTime(
                                newStartDate.Year,
                                newStartDate.Month,
                                newStartDate.Day,
                                time.Hour,
                                time.Minute,
                                time.Second);

                            if (state.UpdateMeetingInfo.NewStartDateTime == null)
                            {
                                state.UpdateMeetingInfo.NewStartDateTime = newStartDateTime;
                            }

                            if (newStartDateTime >= userNow)
                            {
                                state.UpdateMeetingInfo.NewStartDateTime = newStartDateTime;
                                break;
                            }
                        }
                    }
                    else if (state.UpdateMeetingInfo.MoveTimeSpan != 0)
                    {
                        state.UpdateMeetingInfo.NewStartDateTime = originalStartDateTime.AddSeconds(state.UpdateMeetingInfo.MoveTimeSpan);
                    }
                    else
                    {
                        return(await sc.BeginDialogAsync(Actions.GetNewStartTime, new UpdateDateTimeDialogOptions(UpdateDateTimeDialogOptions.UpdateReason.NotFound), cancellationToken));
                    }

                    state.UpdateMeetingInfo.NewStartDateTime = TimeZoneInfo.ConvertTimeToUtc(state.UpdateMeetingInfo.NewStartDateTime.Value, state.GetUserTimeZone());

                    return(await sc.EndDialogAsync(cancellationToken : cancellationToken));
                }
                else if (sc.Result != null)
                {
                    IList <DateTimeResolution> dateTimeResolutions = sc.Result as List <DateTimeResolution>;

                    DateTime?newStartTime = null;

                    foreach (var resolution in dateTimeResolutions)
                    {
                        var utcNow = DateTime.UtcNow;
                        var dateTimeConvertTypeString = resolution.Timex;
                        var dateTimeConvertType       = new TimexProperty(dateTimeConvertTypeString);
                        var dateTimeValue             = DateTime.Parse(resolution.Value);
                        if (dateTimeValue == null)
                        {
                            continue;
                        }

                        var originalStartDateTime = TimeConverter.ConvertUtcToUserTime(state.ShowMeetingInfo.FocusedEvents[0].StartTime, state.GetUserTimeZone());
                        if (dateTimeConvertType.Types.Contains(Constants.TimexTypes.Date) && !dateTimeConvertType.Types.Contains(Constants.TimexTypes.DateTime))
                        {
                            dateTimeValue = new DateTime(
                                dateTimeValue.Year,
                                dateTimeValue.Month,
                                dateTimeValue.Day,
                                originalStartDateTime.Hour,
                                originalStartDateTime.Minute,
                                originalStartDateTime.Second);
                        }
                        else if (dateTimeConvertType.Types.Contains(Constants.TimexTypes.Time) && !dateTimeConvertType.Types.Contains(Constants.TimexTypes.DateTime))
                        {
                            dateTimeValue = new DateTime(
                                originalStartDateTime.Year,
                                originalStartDateTime.Month,
                                originalStartDateTime.Day,
                                dateTimeValue.Hour,
                                dateTimeValue.Minute,
                                dateTimeValue.Second);
                        }

                        dateTimeValue = TimeZoneInfo.ConvertTimeToUtc(dateTimeValue, state.GetUserTimeZone());

                        if (newStartTime == null)
                        {
                            newStartTime = dateTimeValue;
                        }

                        if (dateTimeValue >= utcNow)
                        {
                            newStartTime = dateTimeValue;
                            break;
                        }
                    }

                    if (newStartTime != null)
                    {
                        state.UpdateMeetingInfo.NewStartDateTime = newStartTime;

                        return(await sc.EndDialogAsync(cancellationToken : cancellationToken));
                    }
                    else
                    {
                        return(await sc.BeginDialogAsync(Actions.GetNewStartTime, new UpdateDateTimeDialogOptions(UpdateDateTimeDialogOptions.UpdateReason.NotADateTime), cancellationToken));
                    }
                }
                else
                {
                    // user has tried 5 times but can't get result
                    var activity = TemplateManager.GenerateActivityForLocale(CalendarSharedResponses.RetryTooManyResponse);
                    await sc.Context.SendActivityAsync(activity, cancellationToken);

                    return(await sc.CancelAllDialogsAsync(cancellationToken));
                }
            }
            catch (Exception ex)
            {
                await HandleDialogExceptionsAsync(sc, ex, cancellationToken);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
Exemple #12
0
        /// <summary>
        /// 为各个属性加权重  选出权重最高的返回
        /// </summary>
        /// <param name="musics"></param>
        /// <param name="music"></param>
        /// <returns></returns>
        public IMusicInfo GetMatchMusic(List <IMusicInfo> musics, IMusicInfo music)
        {
            Dictionary <IMusicInfo, double> weighdic = new Dictionary <IMusicInfo, double>();

            musics.ForEach(item => {
                double w = 0;
                //歌名 权重5
                w += GetCompareResult(music.name, item.name) * 5;
                //专辑 权重2
                w += GetCompareResult(music.album, item.album) * 5;
                //时长权重 5
                w           -= (Math.Abs(TimeConverter.ToSecondDouble(item.time) - TimeConverter.ToSecondDouble(music.time)) / TimeConverter.ToSecondDouble(item.time)) * 5;
                var singer_a = String.Join(",", from a in item.singers select a.name);
                var singer_b = String.Join(",", from a in music.singers select a.name);
                //歌手 权重10
                w += GetCompareResult(singer_b, singer_a) * 10;
                weighdic.Add(item, w);
            });
            return(weighdic.OrderByDescending(w => w.Value).Where(a => a.Value > 0).FirstOrDefault().Key);
        }
 public string Get(string time)
 {
     ITimeConverter timeConverter = new TimeConverter();
     return timeConverter.ConvertTime(time);
 }
Exemple #14
0
 /// <summary>
 /// Retrieves the duration of the recording in the specified format.
 /// </summary>
 /// <typeparam name="TTimeSpan">Type that will represent the duration.</typeparam>
 /// <returns>The duration of the recording as an instance of
 /// <typeparamref name="TTimeSpan"/>.</returns>
 public TTimeSpan GetDuration <TTimeSpan>()
     where TTimeSpan : ITimeSpan
 {
     return(TimeConverter.ConvertTo <TTimeSpan>((MetricTimeSpan)_events.LastOrDefault()?.Time ?? new MetricTimeSpan(), TempoMap));
 }
        private async Task <DialogTurnResult> ShowEventsSummary(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var tokenResponse = sc.Result as TokenResponse;

                var state = await Accessor.GetAsync(sc.Context);

                var options = sc.Options as ShowMeetingsDialogOptions;
                if (state.SummaryEvents == null)
                {
                    // this will lead to error when test
                    if (string.IsNullOrEmpty(state.APIToken))
                    {
                        state.Clear();
                        return(await sc.EndDialogAsync(true));
                    }

                    var calendarService = ServiceManager.InitCalendarService(state.APIToken, state.EventSource);

                    state.SummaryEvents = await GetMeetingToJoin(sc);
                }

                if (state.SummaryEvents.Count == 0)
                {
                    await sc.Context.SendActivityAsync(ResponseManager.GetResponse(JoinEventResponses.MeetingNotFound));

                    state.Clear();
                    return(await sc.EndDialogAsync(true));
                }
                else if (state.SummaryEvents.Count == 1)
                {
                    state.ConfirmedMeeting.Add(state.SummaryEvents.First());
                    return(await sc.ReplaceDialogAsync(Actions.ConfirmNumber, sc.Options));
                }

                // Multiple events
                var firstEvent = GetCurrentPageMeetings(state.SummaryEvents, state).First();

                var responseParams = new StringDictionary()
                {
                    { "EventName1", firstEvent.Title },
                    { "EventTime1", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(firstEvent.StartTime, state.GetUserTimeZone()), firstEvent.IsAllDay == true) },
                    { "Participants1", DisplayHelper.ToDisplayParticipantsStringSummary(firstEvent.Attendees) }
                };

                await sc.Context.SendActivityAsync(ResponseManager.GetResponse(JoinEventResponses.SelectMeeting, responseParams));
                await ShowMeetingList(sc, GetCurrentPageMeetings(state.SummaryEvents, state), false);

                return(await sc.PromptAsync(Actions.Prompt, new PromptOptions()));
            }
            catch (SkillException ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
Exemple #16
0
        /// <summary>
        /// Retrieves the duration of the recording in the specified format.
        /// </summary>
        /// <param name="durationType">Type that will represent the duration.</param>
        /// <returns>The duration of the recording as an instance of time span defined by
        /// <paramref name="durationType"/>.</returns>
        /// <exception cref="InvalidEnumArgumentException"><paramref name="durationType"/>
        /// specified an invalid value.</exception>
        public ITimeSpan GetDuration(TimeSpanType durationType)
        {
            ThrowIfArgument.IsInvalidEnumValue(nameof(durationType), durationType);

            return(TimeConverter.ConvertTo((MetricTimeSpan)_events.LastOrDefault()?.Time ?? new MetricTimeSpan(), durationType, TempoMap));
        }
Exemple #17
0
    /// <summary>
    /// Handle update progress event.
    /// </summary>
    /// <param name="task">Task.</param>
    /// <param name="secondLeft">Second left.</param>
    void OnUpdateProgress(TimeTask task, int secondLeft)
    {
        timelabel.text = TimeConverter.SecondToTimeString(secondLeft);

        progressBar.value = 1.0f - ((float)task.CurrentTaskDuration / (float)task.TaskDuration);
    }
 /// <summary>
 /// Creates a new instance, with a specific timezone
 /// </summary>
 /// <param name="data">The stream containing the file system.</param>
 /// <param name="timeConverter">A delegate to convert to/from the file system's timezone.</param>
 public FatFileSystem(Stream data, TimeConverter timeConverter)
 {
     _dirCache = new Dictionary<uint, Directory>();
     _timeConverter = timeConverter;
     Initialize(data);
 }
Exemple #19
0
        public async Task <DialogTurnResult> AfterUpdateStartTime(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context);

                var events = new List <EventModel>();

                var calendarService  = ServiceManager.InitCalendarService(state.APIToken, state.EventSource);
                var searchByEntities = state.OriginalStartDate.Any() || state.OriginalStartTime.Any() || state.Title != null;

                if (state.Events.Count < 1)
                {
                    if (state.OriginalStartDate.Any() || state.OriginalStartTime.Any())
                    {
                        events = await GetEventsByTime(state.OriginalStartDate, state.OriginalStartTime, state.OriginalEndDate, state.OriginalEndTime, state.GetUserTimeZone(), calendarService);

                        state.OriginalStartDate = new List <DateTime>();
                        state.OriginalStartTime = new List <DateTime>();
                        state.OriginalEndDate   = new List <DateTime>();
                        state.OriginalStartTime = new List <DateTime>();
                    }
                    else if (state.Title != null)
                    {
                        events = await calendarService.GetEventsByTitle(state.Title);

                        state.Title = null;
                    }
                    else
                    {
                        sc.Context.Activity.Properties.TryGetValue("OriginText", out var content);
                        var userInput = content != null?content.ToString() : sc.Context.Activity.Text;

                        try
                        {
                            IList <DateTimeResolution> dateTimeResolutions = sc.Result as List <DateTimeResolution>;
                            if (dateTimeResolutions.Count > 0)
                            {
                                foreach (var resolution in dateTimeResolutions)
                                {
                                    if (resolution.Value == null)
                                    {
                                        continue;
                                    }

                                    var startTimeValue = DateTime.Parse(resolution.Value);
                                    if (startTimeValue == null)
                                    {
                                        continue;
                                    }

                                    var  dateTimeConvertType = resolution.Timex;
                                    bool isRelativeTime      = IsRelativeTime(sc.Context.Activity.Text, dateTimeResolutions.First().Value, dateTimeResolutions.First().Timex);
                                    startTimeValue = isRelativeTime ? TimeZoneInfo.ConvertTime(startTimeValue, TimeZoneInfo.Local, state.GetUserTimeZone()) : startTimeValue;

                                    startTimeValue = TimeConverter.ConvertLuisLocalToUtc(startTimeValue, state.GetUserTimeZone());
                                    events         = await calendarService.GetEventsByStartTime(startTimeValue);

                                    if (events != null && events.Count > 0)
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                        catch
                        {
                        }

                        if (events == null || events.Count <= 0)
                        {
                            state.Title = userInput;
                            events      = await calendarService.GetEventsByTitle(userInput);
                        }
                    }

                    state.Events = events;
                }

                if (state.Events.Count <= 0)
                {
                    if (searchByEntities)
                    {
                        await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(UpdateEventResponses.EventWithStartTimeNotFound));

                        state.Clear();
                        return(await sc.CancelAllDialogsAsync());
                    }
                    else
                    {
                        return(await sc.BeginDialogAsync(Actions.UpdateStartTime, new UpdateDateTimeDialogOptions(UpdateDateTimeDialogOptions.UpdateReason.NoEvent)));
                    }
                }
                else if (state.Events.Count > 1)
                {
                    var options = new PromptOptions()
                    {
                        Choices = new List <Choice>(),
                    };

                    for (var i = 0; i < state.Events.Count; i++)
                    {
                        var item   = state.Events[i];
                        var choice = new Choice()
                        {
                            Value    = string.Empty,
                            Synonyms = new List <string> {
                                (i + 1).ToString(), item.Title
                            },
                        };
                        options.Choices.Add(choice);
                    }

                    var replyToConversation = sc.Context.Activity.CreateReply(UpdateEventResponses.MultipleEventsStartAtSameTime);
                    replyToConversation.AttachmentLayout = AttachmentLayoutTypes.Carousel;
                    replyToConversation.Attachments      = new List <Microsoft.Bot.Schema.Attachment>();

                    var cardsData = new List <CalendarCardData>();
                    foreach (var item in state.Events)
                    {
                        var meetingCard = item.ToAdaptiveCardData(state.GetUserTimeZone());
                        var replyTemp   = sc.Context.Activity.CreateAdaptiveCardReply(CalendarMainResponses.GreetingMessage, item.OnlineMeetingUrl == null ? "Dialogs/Shared/Resources/Cards/CalendarCardNoJoinButton.json" : "Dialogs/Shared/Resources/Cards/CalendarCard.json", meetingCard);
                        replyToConversation.Attachments.Add(replyTemp.Attachments[0]);
                    }

                    options.Prompt = replyToConversation;

                    return(await sc.PromptAsync(Actions.EventChoice, options));
                }
                else
                {
                    return(await sc.EndDialogAsync(true));
                }
            }
            catch (SkillException ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
        public async Task <DialogTurnResult> ConfirmBeforeCreate(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken);

                if (state.Location == null && sc.Result != null && (!state.CreateHasDetail || state.RecreateState == RecreateEventState.Location))
                {
                    sc.Context.Activity.Properties.TryGetValue("OriginText", out var content);
                    var luisResult = state.LuisResult;

                    var userInput = content != null?content.ToString() : sc.Context.Activity.Text;

                    var topIntent = luisResult?.TopIntent().intent.ToString();

                    var promptRecognizerResult = ConfirmRecognizerHelper.ConfirmYesOrNo(userInput, sc.Context.Activity.Locale);

                    // Enable the user to skip providing the location if they say something matching the Cancel intent, say something matching the ConfirmNo recognizer or something matching the NoLocation intent
                    if (CreateEventWhiteList.IsSkip(userInput))
                    {
                        state.Location = string.Empty;
                    }
                    else
                    {
                        state.Location = userInput;
                    }
                }

                var source   = state.EventSource;
                var newEvent = new EventModel(source)
                {
                    Title          = state.Title,
                    Content        = state.Content,
                    Attendees      = state.Attendees,
                    StartTime      = state.StartDateTime.Value,
                    EndTime        = state.EndDateTime.Value,
                    TimeZone       = TimeZoneInfo.Utc,
                    Location       = state.Location,
                    ContentPreview = state.Content
                };

                var attendeeConfirmString = string.Empty;
                if (state.Attendees.Count > 0)
                {
                    var attendeeConfirmResponse = ResponseManager.GetResponse(CreateEventResponses.ConfirmCreateAttendees, new StringDictionary()
                    {
                        { "Attendees", state.Attendees.ToSpeechString(CommonStrings.And, li => li.DisplayName ?? li.Address) }
                    });
                    attendeeConfirmString = attendeeConfirmResponse.Text;
                }

                var subjectConfirmString = string.Empty;
                if (!string.IsNullOrEmpty(state.Title))
                {
                    var subjectConfirmResponse = ResponseManager.GetResponse(CreateEventResponses.ConfirmCreateSubject, new StringDictionary()
                    {
                        { "Subject", string.IsNullOrEmpty(state.Title) ? CalendarCommonStrings.Empty : state.Title }
                    });
                    subjectConfirmString = subjectConfirmResponse.Text;
                }

                var locationConfirmString = string.Empty;
                if (!string.IsNullOrEmpty(state.Location))
                {
                    var subjectConfirmResponse = ResponseManager.GetResponse(CreateEventResponses.ConfirmCreateLocation, new StringDictionary()
                    {
                        { "Location", string.IsNullOrEmpty(state.Location) ? CalendarCommonStrings.Empty : state.Location },
                    });
                    locationConfirmString = subjectConfirmResponse.Text;
                }

                var contentConfirmString = string.Empty;
                if (!string.IsNullOrEmpty(state.Content))
                {
                    var contentConfirmResponse = ResponseManager.GetResponse(CreateEventResponses.ConfirmCreateContent, new StringDictionary()
                    {
                        { "Content", string.IsNullOrEmpty(state.Content) ? CalendarCommonStrings.Empty : state.Content },
                    });
                    contentConfirmString = contentConfirmResponse.Text;
                }

                var startDateTimeInUserTimeZone = TimeConverter.ConvertUtcToUserTime(state.StartDateTime.Value, state.GetUserTimeZone());
                var endDateTimeInUserTimeZone   = TimeConverter.ConvertUtcToUserTime(state.EndDateTime.Value, state.GetUserTimeZone());
                var tokens = new StringDictionary
                {
                    { "AttendeesConfirm", attendeeConfirmString },
                    { "Date", startDateTimeInUserTimeZone.ToSpeechDateString(false) },
                    { "Time", startDateTimeInUserTimeZone.ToSpeechTimeString(false) },
                    { "EndTime", endDateTimeInUserTimeZone.ToSpeechTimeString(false) },
                    { "SubjectConfirm", subjectConfirmString },
                    { "LocationConfirm", locationConfirmString },
                    { "ContentConfirm", contentConfirmString },
                };

                var card = new Card()
                {
                    Name = newEvent.OnlineMeetingUrl == null ? "CalendarCardNoJoinButton" : "CalendarCard",
                    Data = newEvent.ToAdaptiveCardData(state.GetUserTimeZone(), showContent: true)
                };

                var prompt      = ResponseManager.GetCardResponse(CreateEventResponses.ConfirmCreate, card, tokens);
                var retryPrompt = ResponseManager.GetResponse(CreateEventResponses.ConfirmCreateFailed, tokens);
                return(await sc.PromptAsync(Actions.TakeFurtherAction, new PromptOptions { Prompt = prompt, RetryPrompt = retryPrompt }, cancellationToken));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
Exemple #21
0
        internal void AddMessage(object Sender, string Message, logSeverity Severity)
        {
            if (LoggingEnabled && (!OnlyLogErrors || (OnlyLogErrors == true && Severity > logSeverity.Failure)))
            {
                string FormattedMessage = string.Format("[{0}] - [{1}][{2}]: {3}", Severity.ToString(), TimeConverter.GetDateTime().ToString("d-M-yyyy hh:mm"), Sender.ToString(), Message);

                Debug.WriteLine(FormattedMessage);
                LogEntries.Add(FormattedMessage);

                if (LogToConsoleEnabled)
                {
                    Console.WriteLine(FormattedMessage);
                }

                if (LogOutputAction != null)
                {
                    LogOutputAction.Invoke(FormattedMessage);
                }
            }
        }
        public async Task <DialogTurnResult> AfterUpdateDurationForCreate(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken);

                if (state.EndDate.Any() || state.EndTime.Any())
                {
                    var startDate = !state.StartDate.Any() ? TimeConverter.ConvertUtcToUserTime(DateTime.UtcNow, state.GetUserTimeZone()) : state.StartDate.Last();
                    var endDate   = startDate;
                    if (state.EndDate.Any())
                    {
                        endDate = state.EndDate.Last();
                    }

                    if (state.EndTime.Any())
                    {
                        foreach (var endtime in state.EndTime)
                        {
                            var endDateTime = new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endtime.Hour,
                                endtime.Minute,
                                endtime.Second);
                            endDateTime = TimeZoneInfo.ConvertTimeToUtc(endDateTime, state.GetUserTimeZone());
                            if (state.EndDateTime == null || endDateTime >= state.StartDateTime)
                            {
                                state.EndDateTime = endDateTime;
                            }
                        }
                    }
                    else
                    {
                        state.EndDateTime = new DateTime(endDate.Year, endDate.Month, endDate.Day, 23, 59, 59);
                        state.EndDateTime = TimeZoneInfo.ConvertTimeToUtc(state.EndDateTime.Value, state.GetUserTimeZone());
                    }

                    var ts = state.StartDateTime.Value.Subtract(state.EndDateTime.Value).Duration();
                    state.Duration = (int)ts.TotalSeconds;
                }

                if (state.Duration <= 0 && state.CreateHasDetail && state.RecreateState != RecreateEventState.Time && state.RecreateState != RecreateEventState.Duration)
                {
                    state.Duration = 1800;
                }

                if (state.Duration <= 0 && sc.Result != null)
                {
                    sc.Context.Activity.Properties.TryGetValue("OriginText", out var content);

                    IList <DateTimeResolution> dateTimeResolutions = sc.Result as List <DateTimeResolution>;
                    if (dateTimeResolutions.First().Value != null)
                    {
                        int.TryParse(dateTimeResolutions.First().Value, out var duration);
                        state.Duration = duration;
                    }
                }

                if (state.Duration > 0)
                {
                    state.EndDateTime = state.StartDateTime.Value.AddSeconds(state.Duration);
                }
                else
                {
                    // should not go to this part in current logic.
                    // place an error handling for save.
                    await HandleDialogExceptions(sc, new Exception("Unexpect Error On get duration"));
                }

                return(await sc.EndDialogAsync(cancellationToken : cancellationToken));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
Exemple #23
0
        /// <summary>
        /// Retrieves the duration of the playback in the specified format.
        /// </summary>
        /// <param name="durationType">Type that will represent the duration.</param>
        /// <returns>The duration of the playback as an instance of time span defined by
        /// <paramref name="durationType"/>.</returns>
        /// <exception cref="InvalidEnumArgumentException"><paramref name="durationType"/>
        /// specified an invalid value.</exception>
        public ITimeSpan GetDuration(TimeSpanType durationType)
        {
            ThrowIfArgument.IsInvalidEnumValue(nameof(durationType), durationType);

            return(TimeConverter.ConvertTo((MetricTimeSpan)_duration, durationType, TempoMap));
        }
Exemple #24
0
        /// <summary>
        /// Gets points in time of the current grid.
        /// </summary>
        /// <param name="tempoMap">Tempo map used to get grid's times.</param>
        /// <returns>Collection of points in time of the current grid.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="tempoMap"/> is null.</exception>
        public IEnumerable <long> GetTimes(TempoMap tempoMap)
        {
            ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap);

            return(Times.Select(t => TimeConverter.ConvertFrom(t, tempoMap)));
        }
Exemple #25
0
 /// <summary>
 /// Retrieves the duration of the playback in the specified format.
 /// </summary>
 /// <typeparam name="TTimeSpan">Type that will represent the duration.</typeparam>
 /// <returns>The duration of the playback as an instance of
 /// <typeparamref name="TTimeSpan"/>.</returns>
 public TTimeSpan GetDuration <TTimeSpan>()
     where TTimeSpan : ITimeSpan
 {
     return(TimeConverter.ConvertTo <TTimeSpan>((MetricTimeSpan)_duration, TempoMap));
 }
        public async Task <DialogTurnResult> ReadEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context);

                var luisResult = state.LuisResult;
                var topIntent  = luisResult?.TopIntent().intent;

                var eventItem = state.ReadOutEvents.FirstOrDefault();

                if (eventItem != null && topIntent != Luis.CalendarLuis.Intent.ChangeCalendarEntry && topIntent != Luis.CalendarLuis.Intent.DeleteCalendarEntry)
                {
                    var tokens = new StringDictionary()
                    {
                        { "Date", eventItem.StartTime.ToString(CommonStrings.DisplayDateFormat_CurrentYear) },
                        { "Time", SpeakHelper.ToSpeechMeetingTime(TimeConverter.ConvertUtcToUserTime(eventItem.StartTime, state.GetUserTimeZone()), eventItem.IsAllDay == true) },
                        { "Participants", DisplayHelper.ToDisplayParticipantsStringSummary(eventItem.Attendees, 1) },
                        { "Subject", eventItem.Title }
                    };

                    var replyMessage = await GetDetailMeetingResponseAsync(sc, eventItem, SummaryResponses.ReadOutMessage, tokens);

                    await sc.Context.SendActivityAsync(replyMessage);

                    if (eventItem.IsOrganizer)
                    {
                        return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = ResponseManager.GetResponse(SummaryResponses.AskForOrgnizerAction, new StringDictionary()
                            {
                                { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower }
                            }) }));
                    }
                    else if (eventItem.IsAccepted)
                    {
                        return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = ResponseManager.GetResponse(SummaryResponses.AskForAction, new StringDictionary()
                            {
                                { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower }
                            }) }));
                    }
                    else
                    {
                        return(await sc.PromptAsync(Actions.Prompt, new PromptOptions { Prompt = ResponseManager.GetResponse(SummaryResponses.AskForChangeStatus, new StringDictionary()
                            {
                                { "DateTime", state.StartDateString ?? CalendarCommonStrings.TodayLower }
                            }) }));
                    }
                }
                else
                {
                    return(await sc.NextAsync());
                }
            }
            catch (SkillException ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptions(sc, ex);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
Exemple #27
0
        /// <summary>
        /// Retrieves the current time of the playback in the specified format.
        /// </summary>
        /// <param name="timeType">Type that will represent the current time.</param>
        /// <returns>The current time of the playback as an instance of time span defined by
        /// <paramref name="timeType"/>.</returns>
        /// <exception cref="InvalidEnumArgumentException"><paramref name="timeType"/> specified an invalid value.</exception>
        public ITimeSpan GetCurrentTime(TimeSpanType timeType)
        {
            ThrowIfArgument.IsInvalidEnumValue(nameof(timeType), timeType);

            return(TimeConverter.ConvertTo((MetricTimeSpan)_clock.CurrentTime, timeType, TempoMap));
        }
Exemple #28
0
        public async Task <DialogTurnResult> ShowEventsSummary(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var tokenResponse = sc.Result as TokenResponse;

                var state = await Accessor.GetAsync(sc.Context);

                if (state.SummaryEvents == null)
                {
                    // this will lead to error when test
                    if (string.IsNullOrEmpty(state.APIToken))
                    {
                        return(await sc.EndDialogAsync(true));
                    }

                    var calendarAPI     = GraphClientHelper.GetCalendarService(state.APIToken, state.EventSource, ServiceManager.GetGoogleClient());
                    var calendarService = ServiceManager.InitCalendarService(calendarAPI, state.EventSource);

                    var searchDate = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, state.GetUserTimeZone());

                    if (state.StartDate != null)
                    {
                        searchDate = state.StartDate.Value;
                    }

                    var results = await GetEventsByTime(searchDate, state.StartTime, state.EndDate, state.EndTime, state.GetUserTimeZone(), calendarService);

                    var  searchedEvents     = new List <EventModel>();
                    bool searchTodayMeeting = state.StartDate != null &&
                                              state.StartTime == null &&
                                              state.EndDate == null &&
                                              state.EndTime == null &&
                                              EventModel.IsSameDate(state.StartDate.Value, TimeConverter.ConvertUtcToUserTime(DateTime.UtcNow, state.GetUserTimeZone()));
                    foreach (var item in results)
                    {
                        if (!searchTodayMeeting || item.StartTime >= DateTime.UtcNow)
                        {
                            searchedEvents.Add(item);
                        }
                    }

                    if (searchedEvents.Count == 0)
                    {
                        await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowNoMeetingMessage));

                        return(await sc.EndDialogAsync(true));
                    }
                    else
                    {
                        var responseParams = new StringDictionary()
                        {
                            { "Count", searchedEvents.Count.ToString() },
                            { "EventName1", searchedEvents[0].Title },
                            { "EventDuration", searchedEvents[0].ToDurationString() },
                        };

                        if (searchedEvents.Count == 1)
                        {
                            await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowOneMeetingSummaryMessage, ResponseBuilder, responseParams));
                        }
                        else
                        {
                            responseParams.Add("EventName2", searchedEvents[searchedEvents.Count - 1].Title);
                            if (searchedEvents[searchedEvents.Count - 1].IsAllDay == true)
                            {
                                responseParams.Add("EventTime", TimeConverter.ConvertUtcToUserTime(searchedEvents[searchedEvents.Count - 1].StartTime, state.GetUserTimeZone()).ToString("MMMM dd all day"));
                            }
                            else
                            {
                                responseParams.Add("EventTime", TimeConverter.ConvertUtcToUserTime(searchedEvents[searchedEvents.Count - 1].StartTime, state.GetUserTimeZone()).ToString("h:mm tt"));
                            }

                            await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(SummaryResponses.ShowMultipleMeetingSummaryMessage, ResponseBuilder, responseParams));
                        }
                    }

                    await ShowMeetingList(sc, searchedEvents.GetRange(0, Math.Min(CalendarSkillState.PageSize, searchedEvents.Count)), false);

                    state.Clear();
                    state.SummaryEvents = searchedEvents;
                }
                else
                {
                    await ShowMeetingList(sc, state.SummaryEvents.GetRange(state.ShowEventIndex *CalendarSkillState.PageSize, Math.Min(CalendarSkillState.PageSize, state.SummaryEvents.Count - (state.ShowEventIndex *CalendarSkillState.PageSize))), false);
                }

                return(await sc.NextAsync());
            }
            catch
            {
                await HandleDialogExceptions(sc);

                throw;
            }
        }
Exemple #29
0
 /// <summary>
 /// Retrieves the current time of the playback in the specified format.
 /// </summary>
 /// <typeparam name="TTimeSpan">Type that will represent the current time.</typeparam>
 /// <returns>The current time of the playback as an instance of
 /// <typeparamref name="TTimeSpan"/>.</returns>
 public TTimeSpan GetCurrentTime <TTimeSpan>()
     where TTimeSpan : ITimeSpan
 {
     return(TimeConverter.ConvertTo <TTimeSpan>((MetricTimeSpan)_clock.CurrentTime, TempoMap));
 }
Exemple #30
0
        public async Task <DialogTurnResult> ShowNextEvent(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await _accessor.GetAsync(sc.Context);

                if (string.IsNullOrEmpty(state.APIToken))
                {
                    return(await sc.EndDialogAsync(true));
                }

                var calendarService = _serviceManager.InitCalendarService(state.APIToken, state.EventSource);

                var eventList = await calendarService.GetUpcomingEvents();

                var nextEventList = new List <EventModel>();
                foreach (var item in eventList)
                {
                    if (item.IsCancelled != true && (nextEventList.Count == 0 || nextEventList[0].StartTime == item.StartTime))
                    {
                        nextEventList.Add(item);
                    }
                }

                if (nextEventList.Count == 0)
                {
                    await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(NextMeetingResponses.ShowNoMeetingMessage));
                }
                else
                {
                    if (nextEventList.Count == 1)
                    {
                        var speakParams = new StringDictionary()
                        {
                            { "EventName", nextEventList[0].Title },
                            { "PeopleCount", nextEventList[0].Attendees.Count.ToString() },
                        };
                        if (nextEventList[0].IsAllDay == true)
                        {
                            speakParams.Add("EventTime", TimeConverter.ConvertUtcToUserTime(nextEventList[0].StartTime, state.GetUserTimeZone()).ToString("MMMM dd all day"));
                        }
                        else
                        {
                            speakParams.Add("EventTime", TimeConverter.ConvertUtcToUserTime(nextEventList[0].StartTime, state.GetUserTimeZone()).ToString("h:mm tt"));
                        }

                        if (string.IsNullOrEmpty(nextEventList[0].Location))
                        {
                            await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(NextMeetingResponses.ShowNextMeetingNoLocationMessage, _responseBuilder, speakParams));
                        }
                        else
                        {
                            speakParams.Add("Location", nextEventList[0].Location);
                            await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(NextMeetingResponses.ShowNextMeetingMessage, _responseBuilder, speakParams));
                        }
                    }
                    else
                    {
                        await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(NextMeetingResponses.ShowMultipleNextMeetingMessage));
                    }

                    await ShowMeetingList(sc, nextEventList, true);
                }

                state.Clear();
                return(await sc.EndDialogAsync(true));
            }
            catch
            {
                await HandleDialogExceptions(sc);

                throw;
            }
        }
Exemple #31
0
 public void SetTime(TObject obj, ITimeSpan time, TempoMap tempoMap)
 {
     SetTime(obj, TimeConverter.ConvertFrom(time, tempoMap));
 }
Exemple #32
0
 /// <summary>
 /// Gets MIDI events recorded by the current <see cref="Recording"/>.
 /// </summary>
 /// <returns>MIDI events recorded by the current <see cref="Recording"/>.</returns>
 public IReadOnlyList <TimedEvent> GetEvents()
 {
     return(_events.Select(e => new TimedEvent(e.Event, TimeConverter.ConvertFrom((MetricTimeSpan)e.Time, TempoMap)))
            .ToList()
            .AsReadOnly());
 }
Exemple #33
0
        public async Task <DialogTurnResult> AfterUpdateDurationForCreate(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await Accessor.GetAsync(sc.Context, cancellationToken : cancellationToken);

                if (state.EndDate != null || state.EndTime != null)
                {
                    var startDate = state.StartDate == null?TimeConverter.ConvertUtcToUserTime(DateTime.UtcNow, state.GetUserTimeZone()) : state.StartDate;

                    var endDate = state.EndDate;
                    var endTime = state.EndTime;
                    state.EndDateTime = endDate == null
                        ? new DateTime(
                        startDate.Value.Year,
                        startDate.Value.Month,
                        startDate.Value.Day,
                        endTime.Value.Hour,
                        endTime.Value.Minute,
                        endTime.Value.Second)
                        : new DateTime(
                        endDate.Value.Year,
                        endDate.Value.Month,
                        endDate.Value.Day,
                        23,
                        59,
                        59);
                    state.EndDateTime = TimeZoneInfo.ConvertTimeToUtc(state.EndDateTime.Value, state.GetUserTimeZone());
                    var ts = state.StartDateTime.Value.Subtract(state.EndDateTime.Value).Duration();
                    state.Duration = (int)ts.TotalSeconds;
                }

                if (state.Duration <= 0 && sc.Result != null)
                {
                    sc.Context.Activity.Properties.TryGetValue("OriginText", out var content);

                    IList <DateTimeResolution> dateTimeResolutions = sc.Result as List <DateTimeResolution>;
                    if (dateTimeResolutions.First().Value != null)
                    {
                        int.TryParse(dateTimeResolutions.First().Value, out var duration);
                        state.Duration = duration;
                    }
                }

                if (state.Duration > 0)
                {
                    state.EndDateTime = state.StartDateTime.Value.AddSeconds(state.Duration);
                    return(await sc.EndDialogAsync(cancellationToken : cancellationToken));
                }
                else
                {
                    // TODO: Handle improper duration
                }

                return(await sc.BeginDialogAsync(Actions.UpdateDurationForCreate, new UpdateDateTimeDialogOptions(UpdateDateTimeDialogOptions.UpdateReason.NotADateTime), cancellationToken));
            }
            catch
            {
                await HandleDialogExceptions(sc);

                throw;
            }
        }
Exemple #34
0
 /// <summary>
 /// Initializes a new instance of the FatFileSystem class.
 /// </summary>
 /// <param name="data">The stream containing the file system.</param>
 /// <param name="ownsData">Indicates if the new instance should take ownership
 /// of <paramref name="data"/>.</param>
 /// <param name="timeConverter">A delegate to convert to/from the file system's timezone.</param>
 public FatFileSystem(Stream data, Ownership ownsData, TimeConverter timeConverter)
     : base(new FatFileSystemOptions())
 {
     _dirCache = new Dictionary<uint, Directory>();
     _timeConverter = timeConverter;
     Initialize(data);
     _ownsData = ownsData;
 }
Exemple #35
0
 /// <summary>
 /// Represent instance as a string.
 /// </summary>
 /// <returns>The current person instance represented as a string.</returns>
 public override string ToString()
 {
     return(DbId + "," + Cpr + "," + FirstName + "," + LastName + ", " + PollingTable + ", " + TimeConverter.ConvertFromUnixTimestamp(VotedTime) + ", " + Voted);
 }
Exemple #36
0
 /// <summary>
 /// Initializes a new instance of the FatFileSystem class.
 /// </summary>
 /// <param name="data">The stream containing the file system.</param>
 /// <remarks>
 /// Local time is the effective timezone of the new instance.
 /// </remarks>
 public FatFileSystem(Stream data)
     : base(new FatFileSystemOptions())
 {
     _dirCache = new Dictionary<uint, Directory>();
     _timeConverter = DefaultTimeConverter;
     Initialize(data);
 }
 /// <summary>
 /// Creates a new instance, with local time as effective timezone
 /// </summary>
 /// <param name="data">The stream containing the file system.</param>
 /// <param name="ownsData">Indicates if the new instance should take ownership
 /// of <paramref name="data"/>.</param>
 public FatFileSystem(Stream data, Ownership ownsData)
 {
     _dirCache = new Dictionary<uint, Directory>();
     _timeConverter = DefaultTimeConverter;
     Initialize(data);
     _ownsData = ownsData;
 }