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 + +

+ + + + + + + + + @if(_raidReminders.Where(r => r.Type == RaidReminder.ReminderType.Channel).Any()) + { + + + } + else + { + + + } + + + @foreach( DynamicRaidReminder reminder in _raidReminders) + { + bool hidden = reminder.Type == RaidReminder.ReminderType.User; + + + + + + + + + + + } +
DaysHoursMinutesTypeServerChannelMessage
+ + @foreach(RaidReminder.ReminderType type in Enum.GetValues(typeof(RaidReminder.ReminderType))) + { + + } + + + + + + + +
+

+ + +@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 @@

+ - @if(_raid.Reminders.Where(r => r.Type == RaidReminder.ReminderType.Channel).Any()) + @if(_raidReminders.Where(r => r.Type == RaidReminder.ReminderType.Channel).Any()) { @@ -24,12 +25,20 @@ } - @foreach( RaidReminder reminder in _raid.Reminders) + @foreach( StaticRaidReminder reminder in _raidReminders) { bool hidden = reminder.Type == RaidReminder.ReminderType.User; + +
Date Time TypeServer ChannelMessage
- TODO: Time + + + @@ -72,7 +81,7 @@ @code { [Parameter] - public Raid _raid { get; set; } + public List _raidReminders { get; set; } [Parameter] public List _discordServers {get; set; } @@ -82,19 +91,18 @@ async Task AddReminderClicked() { - _raid.Reminders.Add(new RaidReminder() + _raidReminders.Add(new StaticRaidReminder() { - RaidId = _raid.RaidId, Type = RaidReminder.ReminderType.User }); } - async Task DeleteReminderClicked(RaidReminder reminder) + async Task DeleteReminderClicked(StaticRaidReminder reminder) { if(reminder.RaidReminderId != 0) { _remindersToDelete.Add(reminder); } - _raid.Reminders.Remove(reminder); + _raidReminders.Remove(reminder); } } \ No newline at end of file