83 lines
3.2 KiB
C#
83 lines
3.2 KiB
C#
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Ical.Net;
|
|
using Ical.Net.CalendarComponents;
|
|
using Ical.Net.Serialization;
|
|
|
|
namespace director
|
|
{
|
|
public class iCalHoopJumping
|
|
{
|
|
private static DateTime searchStart = DateTime.Now; //is it slower to just call datetime.now every time? /shrug
|
|
private static DateTime searchEnd = DateTime.Now.AddDays(7);
|
|
public static readonly ConcurrentDictionary<string, Calendar> Calendars = new ConcurrentDictionary<string, Calendar>();
|
|
public static void LoadCalendar(string key, string calendarString)
|
|
{
|
|
Calendars[key] = Calendar.Load(calendarString);
|
|
}
|
|
|
|
//I don't understand why the entire .net ecosystem insists on ignoring ToString(). Is it really that much fun writing ThingSerializerFactory? ...java programmers.
|
|
private static EventSerializer ser = new EventSerializer();
|
|
public static CalendarEvent parseEvent(string calendar, string eventStr)
|
|
{
|
|
//return new CalendarEvent(eventStr); //lol no
|
|
//return CalendarEvent.Parse(eventStr); //lol no
|
|
|
|
var cal = Calendar.Load(Program.scratch.Calendars[calendar]);
|
|
foreach (var evt in cal.Events)
|
|
{
|
|
if (ser.SerializeToString(evt) == eventStr)
|
|
{
|
|
return evt;
|
|
}
|
|
foreach (var occ in evt.GetOccurrences(DateTime.Now - TimeSpan.FromDays(365), DateTime.Now + TimeSpan.FromDays(365)))
|
|
{
|
|
var newEvent = occ.Source as Ical.Net.CalendarComponents.CalendarEvent;
|
|
|
|
if (ser.SerializeToString(newEvent) == eventStr)
|
|
{
|
|
return newEvent;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
internal static string Event_ToString(CalendarEvent asEvent)
|
|
{
|
|
//return asEvent.ToString(); //lol no
|
|
return ser.SerializeToString(asEvent);
|
|
}
|
|
public static IEnumerable<CalendarOccurrence> getOccurrences(string calLabel)
|
|
{
|
|
var usefulList = new List<CalendarOccurrence>();
|
|
foreach(var icalOcc in Calendars[calLabel].GetOccurrences(searchStart, searchEnd))
|
|
{
|
|
var asEvent = icalOcc.Source as Ical.Net.CalendarComponents.CalendarEvent;
|
|
var newCO = new CalendarOccurrence();
|
|
newCO.CalendarSourceName = calLabel;
|
|
newCO._event = asEvent;
|
|
newCO.OccurrenceStart = icalOcc.Period.StartTime.AsSystemLocal;
|
|
newCO.OccurrenceEnd = icalOcc.Period.EndTime.AsSystemLocal;
|
|
usefulList.Add(newCO);
|
|
}
|
|
return usefulList;
|
|
}
|
|
public class CalendarOccurrence
|
|
{
|
|
internal string CalendarSourceName { get; set; }
|
|
internal CalendarEvent _event { get; set; }
|
|
public string Event
|
|
{
|
|
get
|
|
{
|
|
return iCalHoopJumping.Event_ToString(_event);
|
|
}
|
|
}
|
|
public DateTime OccurrenceStart { get; set; }
|
|
public DateTime OccurrenceEnd { get; set; }
|
|
}
|
|
}
|
|
} |