Support multiple reminders for the same time
This is done by offsetting duplicate reminders by 1ms
This commit is contained in:
parent
6f598d7520
commit
62c278a639
2 changed files with 38 additions and 18 deletions
|
@ -112,13 +112,16 @@ namespace RhinoReminds
|
|||
case "list":
|
||||
case "show":
|
||||
if (parts.Select((n) => n.ToLower()).Contains("all")) {
|
||||
// TODO: Make sure that you can't see other people's reminders
|
||||
// Filter by reminders for this user.
|
||||
IEnumerable<Reminder> userReminderList = reminderList.Reminders.Values.Where(
|
||||
(Reminder next) => message.From.GetBareJid() == next.JidObj.GetBareJid()
|
||||
);
|
||||
StringBuilder listMessage = new StringBuilder("I've got the following reminders on my list:\n");
|
||||
foreach (Reminder nextReminder in reminderList.Reminders.Values) {
|
||||
foreach (Reminder nextReminder in userReminderList) {
|
||||
listMessage.AppendLine($" - {nextReminder.Message} at {nextReminder.Time}");
|
||||
}
|
||||
listMessage.AppendLine();
|
||||
listMessage.AppendLine($"({reminderList.Reminders.Count} total)");
|
||||
listMessage.AppendLine($"({userReminderList.Count()} total)");
|
||||
sendChatReply(message, listMessage.ToString());
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -23,19 +23,42 @@ namespace RhinoReminds
|
|||
|
||||
}
|
||||
|
||||
|
||||
public Reminder CreateReminder(Jid inJid, DateTime time, string message) {
|
||||
Reminder result = new Reminder(nextId++, $"{inJid.Node}@{inJid.Domain}", time, message);
|
||||
Console.WriteLine($"[Rhino/ReminderList] Created reminder {result}");
|
||||
while (Reminders.ContainsKey(time)) {
|
||||
Console.WriteLine($"[Rhino/ReminderList] Reminder list contained {time}, adding 1ms");
|
||||
time = time.AddMilliseconds(1);
|
||||
}
|
||||
Reminders.Add(time, result);
|
||||
OnReminderListUpdate(this, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public Reminder GetNextReminder()
|
||||
{
|
||||
if (Reminders.Count == 0)
|
||||
return null;
|
||||
|
||||
return Reminders.Values[0];
|
||||
}
|
||||
|
||||
public void DeleteReminder(Reminder nextReminder)
|
||||
{
|
||||
Reminders.Remove(nextReminder.Time);
|
||||
}
|
||||
|
||||
|
||||
#region Persistence
|
||||
|
||||
public void Save(string filename)
|
||||
{
|
||||
// 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
|
||||
lock (saveLock)
|
||||
{ // FUTURE: We could go lockless here with some work, but it's not worth it for the teeny chance & low overhead
|
||||
XmlWriter xml = XmlWriter.Create(
|
||||
filename,
|
||||
new XmlWriterSettings() { Indent = true }
|
||||
|
@ -57,18 +80,6 @@ namespace RhinoReminds
|
|||
}
|
||||
}
|
||||
|
||||
public Reminder GetNextReminder()
|
||||
{
|
||||
if (Reminders.Count == 0)
|
||||
return null;
|
||||
|
||||
return Reminders.Values[0];
|
||||
}
|
||||
|
||||
public void DeleteReminder(Reminder nextReminder) {
|
||||
Reminders.Remove(nextReminder.Time);
|
||||
}
|
||||
|
||||
public static ReminderList FromXmlFile(string filepath)
|
||||
{
|
||||
XmlDocument xml = new XmlDocument();
|
||||
|
@ -76,12 +87,18 @@ namespace RhinoReminds
|
|||
|
||||
ReminderList result = new ReminderList();
|
||||
result.nextId = int.Parse(xml.GetElementsByTagName("NextId")[0].InnerText);
|
||||
foreach (XmlNode reminderXML in xml.GetElementsByTagName("Reminders")[0].ChildNodes) {
|
||||
foreach (XmlNode reminderXML in xml.GetElementsByTagName("Reminders")[0].ChildNodes)
|
||||
{
|
||||
Reminder nextReminder = Reminder.FromXml(reminderXML);
|
||||
result.Reminders.Add(nextReminder.Time, nextReminder);
|
||||
DateTime timeKey = nextReminder.Time;
|
||||
while (result.Reminders.ContainsKey(timeKey))
|
||||
timeKey = timeKey.AddMilliseconds(1);
|
||||
result.Reminders.Add(timeKey, nextReminder);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue