Added signed up options for role reminder

Added option to opt out of reminders
This commit is contained in:
Sarah Faey 2022-12-09 22:26:16 +01:00
parent 64ce169094
commit c88bf5b133
18 changed files with 911 additions and 99 deletions

View file

@ -160,16 +160,62 @@ namespace Lieb.Data
}
}
public async Task<bool> SendMessageToRaidUsers(string message, Raid raid)
{
if(raid == null) return false;
HashSet<ulong> userIds = new HashSet<ulong>();
foreach(RaidSignUp signUp in raid.SignUps)
{
if(signUp.LiebUserId.HasValue)
{
userIds.Add(signUp.LiebUserId.Value);
}
}
return await SendMessageToUsers(message, raid.Title, userIds);
}
public async Task SendGroupReminder(RaidReminder reminder, Raid raid)
{
using var context = _contextFactory.CreateDbContext();
HashSet<ulong> groupMembers = context.LiebUsers.Where(u => u.RoleAssignments.Where(r => r.LiebRole.LiebRoleId == reminder.RoleId).Any()).Select(u => u.Id).ToHashSet();
HashSet<ulong> userIds;
switch(reminder.RoleType)
{
case RaidReminder.RoleReminderType.All:
userIds = groupMembers;
break;
case RaidReminder.RoleReminderType.SignedUp:
userIds = groupMembers.Where(m => raid.SignUps.Where(s => s.LiebUserId == m).Any()).ToHashSet();
break;
case RaidReminder.RoleReminderType.NotSignedUp:
userIds = groupMembers.Where(m => !raid.SignUps.Where(s => s.LiebUserId == m).Any()).ToHashSet();
break;
default:
userIds = new HashSet<ulong>();
break;
}
if (await SendMessageToUsers(reminder.Message, raid.Title, userIds))
{
reminder.Sent = true;
context.Update(reminder);
await context.SaveChangesAsync();
}
}
public async Task<bool> SendMessageToUsers(string message, string raidTitle, HashSet<ulong> userIds)
{
try
{
using var context = _contextFactory.CreateDbContext();
HashSet<ulong> userIdsToSendTo = context.LiebUsers
.Where(u => u.ReminderSubscription == userIds.Contains(u.Id))
.Select(u => u.Id)
.ToHashSet();
var httpClient = _httpClientFactory.CreateClient(Constants.HttpClientName);
if(raid == null) return false;
ApiUserReminder apiReminder = ConvertUserReminder(message, raid);
ApiUserReminder apiReminder = CreateUserReminder(message, raidTitle, userIds);
var raidItemJson = new StringContent(
JsonSerializer.Serialize(apiReminder),
@ -184,21 +230,12 @@ namespace Lieb.Data
return false;
}
public static ApiUserReminder ConvertUserReminder(string message, Raid raid)
public static ApiUserReminder CreateUserReminder(string message, string raidTitle, HashSet<ulong> userIds)
{
ApiUserReminder apiReminder = new ApiUserReminder()
{
Message = $"{raid.Title}: {message}"
Message = $"{raidTitle}: {message}"
};
apiReminder.UserIds = new List<ulong>();
HashSet<ulong> userIds = new HashSet<ulong>();
foreach(RaidSignUp signUp in raid.SignUps)
{
if(signUp.LiebUserId.HasValue)
{
userIds.Add(signUp.LiebUserId.Value);
}
}
apiReminder.UserIds = userIds.ToList();
return apiReminder;
}
@ -249,51 +286,6 @@ namespace Lieb.Data
#endregion ChannelReminder
#region GroupReminder
public async Task SendGroupReminder(RaidReminder reminder, string raidTitle)
{
using var context = _contextFactory.CreateDbContext();
HashSet<ulong> groupMembers = context.LiebUsers.Where(u => u.RoleAssignments.Where(r => r.LiebRole.LiebRoleId == reminder.RoleId).Any()).Select(u => u.Id).ToHashSet();
if (await SendMessageToGroup(reminder.Message, raidTitle, groupMembers))
{
reminder.Sent = true;
context.Update(reminder);
await context.SaveChangesAsync();
}
}
public async Task<bool> SendMessageToGroup(string message, string raidTitle, HashSet<ulong> userIds)
{
try
{
var httpClient = _httpClientFactory.CreateClient(Constants.HttpClientName);
ApiUserReminder apiReminder = ConvertGroupReminder(message, raidTitle, userIds);
var raidItemJson = new StringContent(
JsonSerializer.Serialize(apiReminder),
Encoding.UTF8,
Application.Json);
var httpResponseMessage = await httpClient.PostAsync("raid/SendUserReminder", raidItemJson);
return httpResponseMessage.IsSuccessStatusCode;
}
catch {}
return false;
}
public static ApiUserReminder ConvertGroupReminder(string message, string raidTitle, HashSet<ulong> groupIds)
{
ApiUserReminder apiReminder = new ApiUserReminder()
{
Message = $"{raidTitle}: {message}"
};
apiReminder.UserIds = groupIds.ToList();
return apiReminder;
}
#endregion GroupReminder
private async Task UpdateDiscordMessages(IEnumerable<ApiRaid.DiscordMessage> messages, Raid raid)
{
foreach(ApiRaid.DiscordMessage message in messages)
@ -406,5 +398,17 @@ namespace Lieb.Data
}
catch {}
}
public async Task SendReminderOptOutMessage(ulong userId)
{
try
{
var httpClient = _httpClientFactory.CreateClient(Constants.HttpClientName);
var httpResponseMessage = await httpClient.GetAsync($"raid/SendReminderOptOutMessage/{userId}");
httpResponseMessage.EnsureSuccessStatusCode();
}
catch {}
}
}
}

View file

@ -519,7 +519,7 @@ namespace Lieb.Data
await _discordService.SendChannelReminder(reminder, raid.Title);
break;
case RaidReminder.ReminderType.Group:
await _discordService.SendGroupReminder(reminder, raid.Title);
await _discordService.SendGroupReminder(reminder, raid);
break;
}
}

View file

@ -95,6 +95,7 @@ namespace Lieb.Data
context.RoleAssignments.Add(roleAssignment);
await context.SaveChangesAsync();
}
await _discordService.SendReminderOptOutMessage(newUser.Id);
}
public async Task EditUser(LiebUser user)
@ -343,5 +344,17 @@ namespace Lieb.Data
}
}
}
public async Task<bool> ReminderOptOut(ulong userId)
{
using var context = _contextFactory.CreateDbContext();
LiebUser? user = await context.LiebUsers
.FirstOrDefaultAsync(u => u.Id == userId);
if(user == null) return false;
user.ReminderSubscription = false;
await context.SaveChangesAsync();
return true;
}
}
}