|
|
|
@ -1,21 +1,19 @@ |
|
|
|
|
using System; |
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
using System.IO; |
|
|
|
|
using Newtonsoft.Json; |
|
|
|
|
using System.Linq; |
|
|
|
|
using System.Xml; |
|
|
|
|
using S22.Xmpp; |
|
|
|
|
|
|
|
|
|
namespace RhinoReminds |
|
|
|
|
{ |
|
|
|
|
public delegate void OnReminderListUpdateHandler(object sender, Reminder newReminder); |
|
|
|
|
|
|
|
|
|
[JsonObject(MemberSerialization.OptIn)] |
|
|
|
|
public class ReminderList |
|
|
|
|
{ |
|
|
|
|
[JsonProperty] |
|
|
|
|
public int NextId { get; private set; } = 0; |
|
|
|
|
private object saveLock = new object(); |
|
|
|
|
private int nextId = 0; |
|
|
|
|
private readonly object saveLock = new object(); |
|
|
|
|
|
|
|
|
|
[JsonProperty] |
|
|
|
|
public SortedList<DateTime, Reminder> Reminders = new SortedList<DateTime, Reminder>(); |
|
|
|
|
|
|
|
|
|
public event OnReminderListUpdateHandler OnReminderListUpdate; |
|
|
|
@ -26,7 +24,7 @@ namespace RhinoReminds |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public Reminder CreateReminder(Jid inJid, DateTime time, string message) { |
|
|
|
|
Reminder result = new Reminder(NextId++, $"{inJid.Node}@{inJid.Domain}", time, message); |
|
|
|
|
Reminder result = new Reminder(nextId++, $"{inJid.Node}@{inJid.Domain}", time, message); |
|
|
|
|
Console.WriteLine($"[Rhino/ReminderList] Created reminder {result}"); |
|
|
|
|
Reminders.Add(time, result); |
|
|
|
|
OnReminderListUpdate(this, result); |
|
|
|
@ -38,7 +36,24 @@ namespace RhinoReminds |
|
|
|
|
// Make sure that the reminder thread doesn't try to save the reminders at the exact same time |
|
|
|
|
// we receive a request for a new reminder |
|
|
|
|
lock (saveLock) { // FUTURE: We could go lockless here with some work, but it's not worth it for the teeny chance & low overhead |
|
|
|
|
File.WriteAllText(filename, JsonConvert.SerializeObject(this)); |
|
|
|
|
XmlWriter xml = XmlWriter.Create( |
|
|
|
|
filename, |
|
|
|
|
new XmlWriterSettings() { Indent = true } |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
xml.WriteStartDocument(); |
|
|
|
|
xml.WriteStartElement("ReminderList"); |
|
|
|
|
|
|
|
|
|
xml.WriteElementString("NextId", nextId.ToString()); |
|
|
|
|
|
|
|
|
|
xml.WriteStartElement("Reminders"); |
|
|
|
|
foreach (Reminder nextReminder in Reminders.Values) |
|
|
|
|
nextReminder.WriteToXml(xml); |
|
|
|
|
xml.WriteEndElement(); |
|
|
|
|
|
|
|
|
|
xml.WriteEndElement(); |
|
|
|
|
xml.WriteEndDocument(); |
|
|
|
|
xml.Close(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -53,5 +68,20 @@ namespace RhinoReminds |
|
|
|
|
public void DeleteReminder(Reminder nextReminder) { |
|
|
|
|
Reminders.Remove(nextReminder.Time); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static ReminderList FromXmlFile(string filepath) |
|
|
|
|
{ |
|
|
|
|
XmlDocument xml = new XmlDocument(); |
|
|
|
|
xml.Load(filepath); |
|
|
|
|
|
|
|
|
|
ReminderList result = new ReminderList(); |
|
|
|
|
result.nextId = int.Parse(xml.GetElementsByTagName("NextId")[0].InnerText); |
|
|
|
|
foreach (XmlNode reminderXML in xml.GetElementsByTagName("Reminders")[0].ChildNodes) { |
|
|
|
|
Reminder nextReminder = Reminder.FromXml(reminderXML); |
|
|
|
|
result.Reminders.Add(nextReminder.Time, nextReminder); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|