Added Raid Reminders

This commit is contained in:
Sarah Faey 2022-11-17 21:42:09 +01:00
parent d0ff8251a2
commit 5a5c3df1a9
7 changed files with 232 additions and 12 deletions

View file

@ -69,7 +69,11 @@ namespace DiscordBot.Controllers
{ {
foreach(ulong userId in reminder.UserIds) 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);
}
} }
} }

View file

@ -272,13 +272,15 @@ namespace Lieb.Data
Message = message Message = message
}; };
apiReminder.UserIds = new List<ulong>(); apiReminder.UserIds = new List<ulong>();
HashSet<ulong> userIds = new HashSet<ulong>();
foreach(RaidSignUp signUp in raid.SignUps) foreach(RaidSignUp signUp in raid.SignUps)
{ {
if(signUp.LiebUserId.HasValue) if(signUp.LiebUserId.HasValue)
{ {
apiReminder.UserIds.Add(signUp.LiebUserId.Value); userIds.Add(signUp.LiebUserId.Value);
} }
} }
apiReminder.UserIds = userIds.ToList();
return apiReminder; return apiReminder;
} }

View file

@ -429,6 +429,7 @@ namespace Lieb.Data
using var context = _contextFactory.CreateDbContext(); using var context = _contextFactory.CreateDbContext();
List<RaidReminder> reminders = context.RaidReminders List<RaidReminder> reminders = context.RaidReminders
.Include(r => r.Raid) .Include(r => r.Raid)
.ThenInclude(r => r.SignUps)
.Where(r => !r.Sent) .Where(r => !r.Sent)
.ToList(); .ToList();

View file

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System;
namespace Lieb.Models.GuildWars2.Raid namespace Lieb.Models.GuildWars2.Raid
{ {
@ -10,12 +11,22 @@ namespace Lieb.Models.GuildWars2.Raid
Channel = 2 Channel = 2
} }
public enum ReminderTimeType
{
Static = 1,
Dynamic = 2
}
public int RaidReminderId { get; set; } public int RaidReminderId { get; set; }
[Required] [Required]
[Range(1, 2, ErrorMessage = "Please select a reminder type")] [Range(1, 2, ErrorMessage = "Please select a reminder type")]
public ReminderType Type { get; set; } public ReminderType Type { get; set; }
[Required]
[Range(1, 2, ErrorMessage = "Please select a reminder type")]
public ReminderTimeType TimeType { get; set; }
[Required] [Required]
[StringLength(1000, ErrorMessage = "Message too long (1000 character limit).")] [StringLength(1000, ErrorMessage = "Message too long (1000 character limit).")]
public string Message { get; set; } = string.Empty; public string Message { get; set; } = string.Empty;
@ -33,4 +44,66 @@ namespace Lieb.Models.GuildWars2.Raid
public Raid Raid { get; set; } 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
};
}
}
} }

View file

@ -0,0 +1,101 @@
@using Lieb.Data
@using Lieb.Models
@using Lieb.Models.GuildWars2.Raid
@using SharedClasses.SharedModels
<p>
<label>
Dynamic Raid Reminders:
</label>
<button type=button @onclick="() => AddReminderClicked()">Add reminder</button>
<table>
<tr>
<th>Days</th>
<th>Hours</th>
<th>Minutes</th>
<th>Type</th>
@if(_raidReminders.Where(r => r.Type == RaidReminder.ReminderType.Channel).Any())
{
<th>Server</th>
<th>Channel</th>
}
else
{
<th></th>
<th></th>
}
<th>Message</th>
</tr>
@foreach( DynamicRaidReminder reminder in _raidReminders)
{
bool hidden = reminder.Type == RaidReminder.ReminderType.User;
<tr>
<td><InputNumber @bind-Value="reminder.DaysBeforeRaid" /></td>
<td><InputNumber @bind-Value="reminder.HoursBeforeRaid" /></td>
<td><InputNumber @bind-Value="reminder.MinutesBeforeRaid" /></td>
<td>
<InputSelect @bind-Value="reminder.Type">
@foreach(RaidReminder.ReminderType type in Enum.GetValues(typeof(RaidReminder.ReminderType)))
{
<option value="@type">@type.ToString()</option>
}
</InputSelect>
</td>
<td>
<InputSelect @bind-Value="reminder.DiscordServerId" hidden="@hidden">
@foreach(DiscordServer item in _discordServers)
{
<option value="@item.Id">@item.Name</option>
}
</InputSelect>
</td>
<td>
<InputSelect @bind-Value="reminder.DiscordChannelId" hidden="@hidden">
@if(reminder.DiscordServerId > 0)
{
List<DiscordChannel> channels = _discordServers.Where(s => s.Id == reminder.DiscordServerId).FirstOrDefault(new DiscordServer()).Channels;
@foreach(DiscordChannel item in channels)
{
<option value="@item.Id">@item.Name</option>
}
}
</InputSelect>
</td>
<td>
<InputText @bind-Value="reminder.Message" />
</td>
<td><button type=button @onclick="() => DeleteReminderClicked(reminder)">Delete</button></td>
</tr>
}
</table>
</p>
@code {
[Parameter]
public List<DynamicRaidReminder> _raidReminders { get; set; }
[Parameter]
public List<DiscordServer> _discordServers {get; set; }
[Parameter]
public List<RaidReminder> _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);
}
}

View file

@ -147,7 +147,8 @@
<DiscordMessageEdit _raid=@_raid _discordServers=@_discordServers _messagesToDelete=@_messagesToDelete ></DiscordMessageEdit> <DiscordMessageEdit _raid=@_raid _discordServers=@_discordServers _messagesToDelete=@_messagesToDelete ></DiscordMessageEdit>
<ReminderEdit _raid=@_raid _discordServers=@_discordServers _remindersToDelete=@_remindersToDelete ></ReminderEdit> <StaticReminderEdit _raidReminders=@_staticReminders _discordServers=@_discordServers _remindersToDelete=@_remindersToDelete ></StaticReminderEdit>
<DynamicReminderEdit _raidReminders=@_dynamicReminders _discordServers=@_discordServers _remindersToDelete=@_remindersToDelete ></DynamicReminderEdit>
<ValidationSummary /> <ValidationSummary />
<label class="validation-message" >@_errorMessage</label> <label class="validation-message" >@_errorMessage</label>
@ -177,6 +178,9 @@
private List<RaidReminder> _remindersToDelete = new List<RaidReminder>(); private List<RaidReminder> _remindersToDelete = new List<RaidReminder>();
private List<DiscordRaidMessage> _messagesToDelete = new List<DiscordRaidMessage>(); private List<DiscordRaidMessage> _messagesToDelete = new List<DiscordRaidMessage>();
private List<StaticRaidReminder> _staticReminders = new List<StaticRaidReminder>();
private List<DynamicRaidReminder> _dynamicReminders = new List<DynamicRaidReminder>();
private List<DiscordServer> _discordServers = new List<DiscordServer>(); private List<DiscordServer> _discordServers = new List<DiscordServer>();
@ -206,15 +210,30 @@
_raidDate = _startTime.Date; _raidDate = _startTime.Date;
_freeForAllTime = await TimeZoneService.GetLocalDateTime(_raid.FreeForAllTimeUTC); _freeForAllTime = await TimeZoneService.GetLocalDateTime(_raid.FreeForAllTimeUTC);
_freeForAllDate = _freeForAllTime.Date; _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 else
{ {
_raid = new Raid(); _dynamicReminders.Add(new DynamicRaidReminder(reminder, _raid.StartTimeUTC));
}
} }
} }
else else
{ {
_raid = new Raid(); _raid = new Raid();
_dynamicReminders.Add(DynamicRaidReminder.Create30MinReminder());
}
}
else
{
_raid = new Raid();
_dynamicReminders.Add(DynamicRaidReminder.Create30MinReminder());
} }
_discordServers = await DiscordService.GetServers(); _discordServers = await DiscordService.GetServers();
@ -282,6 +301,18 @@
_raid.RaidOwnerId = _user.Id; _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); await RaidService.AddOrEditRaid(_raid, _rolesToDelete, _remindersToDelete, _messagesToDelete);
NavigationManager.NavigateTo("raidoverview"); NavigationManager.NavigateTo("raidoverview");
} }

View file

@ -5,14 +5,15 @@
<p> <p>
<label> <label>
Raid Reminders: Static Raid Reminders:
</label> </label>
<button type=button @onclick="() => AddReminderClicked()">Add reminder</button> <button type=button @onclick="() => AddReminderClicked()">Add reminder</button>
<table> <table>
<tr> <tr>
<th>Date</th>
<th>Time</th> <th>Time</th>
<th>Type</th> <th>Type</th>
@if(_raid.Reminders.Where(r => r.Type == RaidReminder.ReminderType.Channel).Any()) @if(_raidReminders.Where(r => r.Type == RaidReminder.ReminderType.Channel).Any())
{ {
<th>Server</th> <th>Server</th>
<th>Channel</th> <th>Channel</th>
@ -24,12 +25,20 @@
} }
<th>Message</th> <th>Message</th>
</tr> </tr>
@foreach( RaidReminder reminder in _raid.Reminders) @foreach( StaticRaidReminder reminder in _raidReminders)
{ {
bool hidden = reminder.Type == RaidReminder.ReminderType.User; bool hidden = reminder.Type == RaidReminder.ReminderType.User;
<tr> <tr>
<td> <td>
TODO: Time <label>
<InputDate @bind-Value="reminder.ReminderDate" />
</label>
</td>
<td>
<label>
<input type="time" @bind="reminder.ReminderTime" />
</label>
</td> </td>
<td> <td>
<InputSelect @bind-Value="reminder.Type"> <InputSelect @bind-Value="reminder.Type">
@ -72,7 +81,7 @@
@code { @code {
[Parameter] [Parameter]
public Raid _raid { get; set; } public List<StaticRaidReminder> _raidReminders { get; set; }
[Parameter] [Parameter]
public List<DiscordServer> _discordServers {get; set; } public List<DiscordServer> _discordServers {get; set; }
@ -82,19 +91,18 @@
async Task AddReminderClicked() async Task AddReminderClicked()
{ {
_raid.Reminders.Add(new RaidReminder() _raidReminders.Add(new StaticRaidReminder()
{ {
RaidId = _raid.RaidId,
Type = RaidReminder.ReminderType.User Type = RaidReminder.ReminderType.User
}); });
} }
async Task DeleteReminderClicked(RaidReminder reminder) async Task DeleteReminderClicked(StaticRaidReminder reminder)
{ {
if(reminder.RaidReminderId != 0) if(reminder.RaidReminderId != 0)
{ {
_remindersToDelete.Add(reminder); _remindersToDelete.Add(reminder);
} }
_raid.Reminders.Remove(reminder); _raidReminders.Remove(reminder);
} }
} }