コード例 #1
0
 public Event(TeacherPreference preferences, DateTime availabilityStart, DateTime availabilityEnd, int travelDuration = 0)
 {
     this.sortId          = Guid.NewGuid();
     this.preferences     = preferences;
     this.backgroundColor = "#dbd4d3";
     this.textColor       = "#000000";
     this.title           = "Available";
     this.groupId         = "Availability";
     this.start           = availabilityStart;
     this.end             = availabilityEnd;
     this.officialStart   = availabilityStart + SchedService.ConvertIntToTimeSpan(travelDuration);
     this.officialEnd     = availabilityEnd - SchedService.ConvertIntToTimeSpan(travelDuration);
     this.price           = SchedService.CreatePrice(preferences.PerHourRate, this.start, this.end);
 }
コード例 #2
0
        private async Task <bool> KeepAlive()
        {
            try {
                foreach (var(_, sched) in SchedFactory.schedulers)
                {
                    if (!sched.IsMaster)
                    {
                        continue;
                    }

                    var discover_name = GetDiscoverName(sched.GetNameKey());
                    await _redis.HashSetAsync(discover_name, (await SchedService.FromScheduler(sched))?.GetServiceInfo());

                    await _redis.KeyExpireAsync(discover_name, TimeSpan.FromSeconds(7));
                }

                foreach (var actor in ActorFactory.Actors)
                {
                    switch (actor.RunningThread.ThreadState)
                    {
                    case ThreadState.Running:
                    case ThreadState.WaitSleepJoin: break;

                    default: continue;
                    }
                    var discover_name = GetDiscoverName(actor.GetNameKey(actor.ActorID.ToString()));
                    await _redis.HashSetAsync(discover_name, ActorService.FromActor(actor)?.GetServiceInfo());

                    await _redis.KeyExpireAsync(discover_name, TimeSpan.FromSeconds(7));
                }

                return(true);
            } catch (Exception ex) {
                _logger.LogError(ex.Message);
                Console.WriteLine(ex.Message);
            }
            return(false);
        }
コード例 #3
0
        private async Task <List <Event> > GenerateTeacherCalendarView(int teacherIdInt, int travelDuration = 0)
        {
            // arrange
            List <Event> eventList = new List <Event>();

            TeacherPreference preferences = await Task.Run(() => context.Preferences
                                                           .Where(p => p.teacherId == teacherIdInt)
                                                           .SingleOrDefault()
                                                           );

            List <Lesson> lessons = await Task.Run(() => context.Lessons
                                                   .Include("Student")
                                                   .Include("Location")
                                                   // todo: add in other lesson filter constraints
                                                   .Where(lesson => lesson.teacherId == teacherIdInt && lesson.teacherApproval)
                                                   .ToList()
                                                   );

            eventList = SchedService.GenerateEventsFromLessons(preferences, lessons);
            List <Event> lessonEventList = SchedService.GenerateEventsFromLessons(preferences, lessons);

            List <TeacherAvail> availabilities = await Task.Run(() => context.TeacherAvailabilities
                                                                .Where(a => a.PersonId == teacherIdInt)
                                                                .ToList()
                                                                );

            // todo: make calendar views dynamic by changing this per the view
            availabilities = SchedService.AddDatesToAvailabilities(availabilities, DateTime.Today.AddDays(-15), DateTime.Today.AddDays(15));

            double   convertedLessonLength = Convert.ToDouble(preferences.defaultLessonLength);
            TimeSpan timeSpanOfLesson      = TimeSpan.FromMinutes(convertedLessonLength);

            // act on Available Timespans
            foreach (var availableTimeSpan in availabilities)
            {
                // find the lesson events that are inclusive to that time span
                List <Event> filteredLessonList = lessonEventList
                                                  .Where(lessn => lessn.start >= availableTimeSpan.start && lessn.end <= availableTimeSpan.end)
                                                  .ToList();

                if (filteredLessonList.Count == 0)
                {
                    List <Event> listOfAfterEvents = SchedService.CreateNextAvailabilities(preferences, availableTimeSpan.end, availableTimeSpan.start, false, travelDuration);
                    eventList.AddRange(listOfAfterEvents);

                    continue;
                }

                // sort those lesson events
                filteredLessonList.Sort();

                // take the first one and create the new available events before it, checking if it fits in the available slot
                List <Event> listOfPreEvents = SchedService.CreatePriorAvailabilities(preferences, availableTimeSpan.start, filteredLessonList[0].start, travelDuration);
                eventList.AddRange(listOfPreEvents);

                int currentLessonNumber = 0;
                int nextLessonNumber    = 1;

                // fill in the times between the lesson events, evenly
                while (nextLessonNumber < filteredLessonList.Count)
                {
                    TimeSpan timeSpan = filteredLessonList[nextLessonNumber].start - filteredLessonList[currentLessonNumber].end;

                    if (timeSpan.TotalMinutes > Convert.ToDouble(2 * preferences.defaultLessonLength))
                    {
                        // find the mid point between the lessons
                        TimeSpan timeBetweenLessons          = filteredLessonList[nextLessonNumber].start - filteredLessonList[currentLessonNumber].end;
                        Double   timeBetweenLessonsInMinutes = timeBetweenLessons.TotalMinutes;
                        Double   midpointBetweenLessons      = timeBetweenLessonsInMinutes / 2;
                        TimeSpan timeSpanOfMidpointFromEndOfCurrentLesson = TimeSpan.FromMinutes(midpointBetweenLessons);
                        DateTime midpoint = filteredLessonList[currentLessonNumber].end + timeSpanOfMidpointFromEndOfCurrentLesson;

                        List <Event> listOfAfterEvents = SchedService.CreateNextAvailabilities(preferences, midpoint, filteredLessonList[currentLessonNumber].end, true, travelDuration);
                        eventList.AddRange(listOfAfterEvents);

                        List <Event> listOfBeforeEvents = SchedService.CreatePriorAvailabilities(preferences, midpoint, filteredLessonList[nextLessonNumber].start, travelDuration);
                        eventList.AddRange(listOfBeforeEvents);
                    }
                    else
                    {
                        List <Event> listOfAfterEvents = SchedService.CreateNextAvailabilities(preferences, filteredLessonList[nextLessonNumber].start, filteredLessonList[currentLessonNumber].end, true, travelDuration);
                        eventList.AddRange(listOfAfterEvents);
                    }

                    currentLessonNumber += 1;
                    nextLessonNumber    += 1;
                }

                // take the last lesson and fill in afterwards
                List <Event> listOfPostEvents = SchedService.CreateNextAvailabilities(preferences, availableTimeSpan.end, filteredLessonList[filteredLessonList.Count - 1].end, true, travelDuration);
                eventList.AddRange(listOfPostEvents);
            }

            return(eventList);
        }