From 5a5c3df1a99d9cefb83b64708e099bf09a5f9680 Mon Sep 17 00:00:00 2001
From: Sarah Faey
Date: Thu, 17 Nov 2022 21:42:09 +0100
Subject: [PATCH] Added Raid Reminders
---
DiscordBot/Controllers/RaidController.cs | 6 +-
Lieb/Data/DiscordService.cs | 4 +-
Lieb/Data/RaidService.cs | 1 +
Lieb/Models/GuildWars2/Raid/RaidReminder.cs | 73 +++++++++++++
.../Raids/RaidEdit/DynamicReminderEdit.razor | 101 ++++++++++++++++++
Lieb/Pages/Raids/RaidEdit/RaidEdit.razor | 33 +++++-
...derEdit.razor => StaticReminderEdit.razor} | 26 +++--
7 files changed, 232 insertions(+), 12 deletions(-)
create mode 100644 Lieb/Pages/Raids/RaidEdit/DynamicReminderEdit.razor
rename Lieb/Pages/Raids/RaidEdit/{ReminderEdit.razor => StaticReminderEdit.razor} (78%)
diff --git a/DiscordBot/Controllers/RaidController.cs b/DiscordBot/Controllers/RaidController.cs
index df4aa93..f9bd003 100644
--- a/DiscordBot/Controllers/RaidController.cs
+++ b/DiscordBot/Controllers/RaidController.cs
@@ -69,7 +69,11 @@ namespace DiscordBot.Controllers
{
foreach(ulong userId in reminder.UserIds)
{
- await _client.GetUser(userId).SendMessageAsync(reminder.Message);
+ var user = await _client.GetUserAsync(userId);
+ if(user != null)
+ {
+ await user.SendMessageAsync(reminder.Message);
+ }
}
}
diff --git a/Lieb/Data/DiscordService.cs b/Lieb/Data/DiscordService.cs
index 1267ff1..dc17d49 100644
--- a/Lieb/Data/DiscordService.cs
+++ b/Lieb/Data/DiscordService.cs
@@ -272,13 +272,15 @@ namespace Lieb.Data
Message = message
};
apiReminder.UserIds = new List();
+ HashSet userIds = new HashSet();
foreach(RaidSignUp signUp in raid.SignUps)
{
if(signUp.LiebUserId.HasValue)
{
- apiReminder.UserIds.Add(signUp.LiebUserId.Value);
+ userIds.Add(signUp.LiebUserId.Value);
}
}
+ apiReminder.UserIds = userIds.ToList();
return apiReminder;
}
diff --git a/Lieb/Data/RaidService.cs b/Lieb/Data/RaidService.cs
index 971f180..d22fdcb 100644
--- a/Lieb/Data/RaidService.cs
+++ b/Lieb/Data/RaidService.cs
@@ -429,6 +429,7 @@ namespace Lieb.Data
using var context = _contextFactory.CreateDbContext();
List reminders = context.RaidReminders
.Include(r => r.Raid)
+ .ThenInclude(r => r.SignUps)
.Where(r => !r.Sent)
.ToList();
diff --git a/Lieb/Models/GuildWars2/Raid/RaidReminder.cs b/Lieb/Models/GuildWars2/Raid/RaidReminder.cs
index f55437c..87fae64 100644
--- a/Lieb/Models/GuildWars2/Raid/RaidReminder.cs
+++ b/Lieb/Models/GuildWars2/Raid/RaidReminder.cs
@@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations;
+using System;
namespace Lieb.Models.GuildWars2.Raid
{
@@ -10,12 +11,22 @@ namespace Lieb.Models.GuildWars2.Raid
Channel = 2
}
+ public enum ReminderTimeType
+ {
+ Static = 1,
+ Dynamic = 2
+ }
+
public int RaidReminderId { get; set; }
[Required]
[Range(1, 2, ErrorMessage = "Please select a reminder type")]
public ReminderType Type { get; set; }
+ [Required]
+ [Range(1, 2, ErrorMessage = "Please select a reminder type")]
+ public ReminderTimeType TimeType { get; set; }
+
[Required]
[StringLength(1000, ErrorMessage = "Message too long (1000 character limit).")]
public string Message { get; set; } = string.Empty;
@@ -33,4 +44,66 @@ namespace Lieb.Models.GuildWars2.Raid
public Raid Raid { get; set; }
}
+
+ public class StaticRaidReminder : RaidReminder
+ {
+ public DateTimeOffset ReminderDate {get; set; } = DateTime.Now.Date;
+ public DateTimeOffset ReminderTime {get; set; }
+
+
+ public StaticRaidReminder()
+ {
+ TimeType = ReminderTimeType.Static;
+ }
+
+ public StaticRaidReminder(RaidReminder reminder, DateTimeOffset reminderDate, DateTimeOffset remindertime)
+ {
+ var properties = reminder.GetType().GetProperties();
+ properties.ToList().ForEach(property =>
+ {
+ var value = reminder.GetType().GetProperty(property.Name).GetValue(reminder, null);
+ this.GetType().GetProperty(property.Name).SetValue(this, value, null);
+ });
+ ReminderDate = reminderDate;
+ ReminderTime = remindertime;
+ }
+ }
+
+ public class DynamicRaidReminder : RaidReminder
+ {
+ public int DaysBeforeRaid {get; set; }
+ public int HoursBeforeRaid {get; set; }
+ public int MinutesBeforeRaid {get; set; }
+
+ public DynamicRaidReminder()
+ {
+ TimeType = ReminderTimeType.Dynamic;
+ }
+
+ public DynamicRaidReminder(RaidReminder reminder, DateTimeOffset raidStartTimeUTC)
+ {
+ var properties = reminder.GetType().GetProperties();
+ properties.ToList().ForEach(property =>
+ {
+ var value = reminder.GetType().GetProperty(property.Name).GetValue(reminder, null);
+ this.GetType().GetProperty(property.Name).SetValue(this, value, null);
+ });
+ TimeSpan reminderOffset = raidStartTimeUTC - reminder.ReminderTimeUTC;
+ DaysBeforeRaid = (int)reminderOffset.TotalDays;
+ HoursBeforeRaid = (int)(reminderOffset.TotalHours % 24);
+ MinutesBeforeRaid = (int)(reminderOffset.TotalMinutes % 60);
+ }
+
+ public static DynamicRaidReminder Create30MinReminder()
+ {
+ return new DynamicRaidReminder(){
+ DaysBeforeRaid = 0,
+ HoursBeforeRaid = 0,
+ MinutesBeforeRaid = 30,
+ Message = "The raid starts in 30 minutes.",
+ TimeType = ReminderTimeType.Dynamic,
+ Type = ReminderType.User
+ };
+ }
+ }
}
diff --git a/Lieb/Pages/Raids/RaidEdit/DynamicReminderEdit.razor b/Lieb/Pages/Raids/RaidEdit/DynamicReminderEdit.razor
new file mode 100644
index 0000000..7a48671
--- /dev/null
+++ b/Lieb/Pages/Raids/RaidEdit/DynamicReminderEdit.razor
@@ -0,0 +1,101 @@
+@using Lieb.Data
+@using Lieb.Models
+@using Lieb.Models.GuildWars2.Raid
+@using SharedClasses.SharedModels
+
+
+
+
+
+
+ Days |
+ Hours |
+ Minutes |
+ Type |
+ @if(_raidReminders.Where(r => r.Type == RaidReminder.ReminderType.Channel).Any())
+ {
+ Server |
+ Channel |
+ }
+ else
+ {
+ |
+ |
+ }
+ Message |
+
+ @foreach( DynamicRaidReminder reminder in _raidReminders)
+ {
+ bool hidden = reminder.Type == RaidReminder.ReminderType.User;
+
+ |
+ |
+ |
+
+
+ @foreach(RaidReminder.ReminderType type in Enum.GetValues(typeof(RaidReminder.ReminderType)))
+ {
+
+ }
+
+ |
+
+
+ @foreach(DiscordServer item in _discordServers)
+ {
+
+ }
+
+ |
+
+
+ @if(reminder.DiscordServerId > 0)
+ {
+ List channels = _discordServers.Where(s => s.Id == reminder.DiscordServerId).FirstOrDefault(new DiscordServer()).Channels;
+ @foreach(DiscordChannel item in channels)
+ {
+
+ }
+ }
+
+ |
+
+
+ |
+ |
+
+ }
+
+
+
+
+@code {
+
+ [Parameter]
+ public List _raidReminders { get; set; }
+
+ [Parameter]
+ public List _discordServers {get; set; }
+
+ [Parameter]
+ public List _remindersToDelete {get; set; }
+
+ async Task AddReminderClicked()
+ {
+ _raidReminders.Add(new DynamicRaidReminder()
+ {
+ Type = RaidReminder.ReminderType.User
+ });
+ }
+
+ async Task DeleteReminderClicked(DynamicRaidReminder reminder)
+ {
+ if(reminder.RaidReminderId != 0)
+ {
+ _remindersToDelete.Add(reminder);
+ }
+ _raidReminders.Remove(reminder);
+ }
+}
\ No newline at end of file
diff --git a/Lieb/Pages/Raids/RaidEdit/RaidEdit.razor b/Lieb/Pages/Raids/RaidEdit/RaidEdit.razor
index ccbbfc5..b14fe16 100644
--- a/Lieb/Pages/Raids/RaidEdit/RaidEdit.razor
+++ b/Lieb/Pages/Raids/RaidEdit/RaidEdit.razor
@@ -147,7 +147,8 @@
-
+
+
@@ -177,6 +178,9 @@
private List _remindersToDelete = new List();
private List _messagesToDelete = new List();
+ private List _staticReminders = new List();
+ private List _dynamicReminders = new List();
+
private List _discordServers = new List();
@@ -206,15 +210,30 @@
_raidDate = _startTime.Date;
_freeForAllTime = await TimeZoneService.GetLocalDateTime(_raid.FreeForAllTimeUTC);
_freeForAllDate = _freeForAllTime.Date;
+ foreach(RaidReminder reminder in _raid.Reminders)
+ {
+ if(reminder.TimeType == RaidReminder.ReminderTimeType.Static)
+ {
+ DateTimeOffset reminderTime = await TimeZoneService.GetLocalDateTime(reminder.ReminderTimeUTC);
+ DateTimeOffset reminderDate = (await TimeZoneService.GetLocalDateTime(reminder.ReminderTimeUTC)).Date;
+ _staticReminders.Add(new StaticRaidReminder(reminder, reminderDate, reminderTime));
+ }
+ else
+ {
+ _dynamicReminders.Add(new DynamicRaidReminder(reminder, _raid.StartTimeUTC));
+ }
+ }
}
else
{
_raid = new Raid();
+ _dynamicReminders.Add(DynamicRaidReminder.Create30MinReminder());
}
}
else
{
_raid = new Raid();
+ _dynamicReminders.Add(DynamicRaidReminder.Create30MinReminder());
}
_discordServers = await DiscordService.GetServers();
@@ -282,6 +301,18 @@
_raid.RaidOwnerId = _user.Id;
}
+ _raid.Reminders.Clear();
+ foreach(DynamicRaidReminder reminder in _dynamicReminders)
+ {
+ reminder.ReminderTimeUTC = _raid.StartTimeUTC - new TimeSpan(reminder.DaysBeforeRaid, reminder.HoursBeforeRaid, reminder.MinutesBeforeRaid, 0);
+ _raid.Reminders.Add(reminder);
+ }
+ foreach(StaticRaidReminder reminder in _staticReminders)
+ {
+ reminder.ReminderTimeUTC = await TimeZoneService.GetUTCDateTime(reminder.ReminderDate.Date + reminder.ReminderTime.TimeOfDay);
+ _raid.Reminders.Add(reminder);
+ }
+
await RaidService.AddOrEditRaid(_raid, _rolesToDelete, _remindersToDelete, _messagesToDelete);
NavigationManager.NavigateTo("raidoverview");
}
diff --git a/Lieb/Pages/Raids/RaidEdit/ReminderEdit.razor b/Lieb/Pages/Raids/RaidEdit/StaticReminderEdit.razor
similarity index 78%
rename from Lieb/Pages/Raids/RaidEdit/ReminderEdit.razor
rename to Lieb/Pages/Raids/RaidEdit/StaticReminderEdit.razor
index 113be4f..20eedb8 100644
--- a/Lieb/Pages/Raids/RaidEdit/ReminderEdit.razor
+++ b/Lieb/Pages/Raids/RaidEdit/StaticReminderEdit.razor
@@ -5,14 +5,15 @@