From 6e4dce5b1f320a5d48d2f30344cfe4487917b7b6 Mon Sep 17 00:00:00 2001 From: "t.ruspekhofer" Date: Sun, 13 Mar 2022 17:21:17 +0100 Subject: [PATCH] Reworked random raids to be randomizable multiple times --- Lieb/Data/DbInitializer.cs | 9 +- Lieb/Data/RaidRandomizerService.cs | 31 ++-- Lieb/Data/RaidService.cs | 154 +++++++++++------- .../Models/GuildWars2/Raid/PlannedRaidRole.cs | 2 + Lieb/Models/GuildWars2/Raid/Raid.cs | 2 - Lieb/Pages/Raids/RaidDetails.razor | 4 +- Lieb/Pages/Raids/RaidEdit.razor | 6 +- Lieb/Pages/Raids/RaidRolesRandom.razor | 115 +++++++++++++ Lieb/Pages/Raids/RaidRolesRandom.razor.css | 9 + 9 files changed, 249 insertions(+), 83 deletions(-) create mode 100644 Lieb/Pages/Raids/RaidRolesRandom.razor create mode 100644 Lieb/Pages/Raids/RaidRolesRandom.razor.css diff --git a/Lieb/Data/DbInitializer.cs b/Lieb/Data/DbInitializer.cs index b484a1a..2c15f2b 100644 --- a/Lieb/Data/DbInitializer.cs +++ b/Lieb/Data/DbInitializer.cs @@ -89,6 +89,13 @@ namespace Lieb.Data Name = "Scourge", Spots = 8 }; + PlannedRaidRole randomRole = new PlannedRaidRole() + { + Spots = 10, + Name = "Random", + Description = RaidType.RandomWithBoons.ToString(), + IsRandomSignUpRole = true + }; Raid raid = new Raid() { @@ -101,7 +108,7 @@ namespace Lieb.Data EndTimeUTC = DateTime.UtcNow.AddHours(2), FreeForAllTimeUTC = DateTime.UtcNow.AddHours(-2), VoiceChat = "ts.lieb.games", - Roles = new [] { ele, scourge} + Roles = new [] { randomRole, ele, scourge} }; context.Raids.Add(raid); context.SaveChanges(); diff --git a/Lieb/Data/RaidRandomizerService.cs b/Lieb/Data/RaidRandomizerService.cs index aeec738..98816e1 100644 --- a/Lieb/Data/RaidRandomizerService.cs +++ b/Lieb/Data/RaidRandomizerService.cs @@ -34,26 +34,21 @@ namespace Lieb.Data if (raid == null || raid.RaidType == RaidType.Planned) return; - - if (!raid.IsRandomized) + switch (raid.RaidType) { - switch (raid.RaidType) - { - case RaidType.RandomClasses: - RandomizeClasses(raid); - break; - case RaidType.RandomEliteSpecialization: - RandomizeEliteSpecs(raid); - break; - case RaidType.RandomWithBoons: - RandomizeWithBoons(raid); - break; - } - raid.IsRandomized = true; - await context.SaveChangesAsync(); - CleanUpRoles(raid, context); - await context.SaveChangesAsync(); + case RaidType.RandomClasses: + RandomizeClasses(raid); + break; + case RaidType.RandomEliteSpecialization: + RandomizeEliteSpecs(raid); + break; + case RaidType.RandomWithBoons: + RandomizeWithBoons(raid); + break; } + await context.SaveChangesAsync(); + CleanUpRoles(raid, context); + await context.SaveChangesAsync(); } private void RandomizeClasses(Raid raid) diff --git a/Lieb/Data/RaidService.cs b/Lieb/Data/RaidService.cs index 1e2db22..99c056b 100644 --- a/Lieb/Data/RaidService.cs +++ b/Lieb/Data/RaidService.cs @@ -57,76 +57,54 @@ namespace Lieb.Data } else { - Raid raidToChange = await context.Raids + Raid? raidToChange = await context.Raids .Include(r => r.Roles) .Include(r => r.SignUpHistory) .Include(r => r.Reminders) .Include(r => r.SignUps) .FirstOrDefaultAsync(r => r.RaidId == raid.RaidId); - raidToChange.Title = raid.Title; - raidToChange.Description = raid.Description; - raidToChange.StartTimeUTC = raid.StartTimeUTC; - raidToChange.EndTimeUTC = raid.EndTimeUTC; - raidToChange.Organizer = raid.Organizer; - raidToChange.Guild = raid.Guild; - raidToChange.VoiceChat = raid.VoiceChat; - raidToChange.RaidType = raid.RaidType; - raidToChange.RequiredRole = raid.RequiredRole; - raidToChange.FreeForAllTimeUTC = raid.FreeForAllTimeUTC; - raidToChange.DiscordMessageId = raid.DiscordMessageId; - raidToChange.DiscordChannelId = raid.DiscordChannelId; - raidToChange.DiscordGuildId = raid.DiscordGuildId; - - List rolesToRemove = new List(); - foreach (PlannedRaidRole role in raidToChange.Roles) + if (raidToChange != null) { - PlannedRaidRole? newRole = raid.Roles.FirstOrDefault(r => r.PlannedRaidRoleId == role.PlannedRaidRoleId); - if(newRole != null) + raidToChange.Title = raid.Title; + raidToChange.Description = raid.Description; + raidToChange.StartTimeUTC = raid.StartTimeUTC; + raidToChange.EndTimeUTC = raid.EndTimeUTC; + raidToChange.Organizer = raid.Organizer; + raidToChange.Guild = raid.Guild; + raidToChange.VoiceChat = raid.VoiceChat; + raidToChange.RaidType = raid.RaidType; + raidToChange.RequiredRole = raid.RequiredRole; + raidToChange.FreeForAllTimeUTC = raid.FreeForAllTimeUTC; + raidToChange.DiscordMessageId = raid.DiscordMessageId; + raidToChange.DiscordChannelId = raid.DiscordChannelId; + raidToChange.DiscordGuildId = raid.DiscordGuildId; + + if (raidToChange.RaidType == RaidType.Planned) { - role.Spots = newRole.Spots; - role.Name = newRole.Name; - role.Description = newRole.Description; + EditRoles(raidToChange, raid, context); } else { - rolesToRemove.Add(role); + if(!raidToChange.Roles.Where(r => r.IsRandomSignUpRole).Any()) + { + raidToChange.Roles.Add(raid.Roles.FirstOrDefault(r => r.IsRandomSignUpRole)); + } + int randomRoleId = raidToChange.Roles.FirstOrDefault(r => r.IsRandomSignUpRole).PlannedRaidRoleId; + foreach (RaidSignUp signUp in raidToChange.SignUps) + { + if (randomRoleId == 0) + { + signUp.PlannedRaidRole = raidToChange.Roles.FirstOrDefault(r => r.IsRandomSignUpRole); + } + else + { + signUp.PlannedRaidRoleId = randomRoleId; + } + } + context.PlannedRaidRoles.RemoveRange(raidToChange.Roles.Where(r => !r.IsRandomSignUpRole)); } - } - foreach(PlannedRaidRole role in rolesToRemove) - { - raidToChange.Roles.Remove(role); - context.PlannedRaidRoles.Remove(role); - } - foreach (PlannedRaidRole role in raid.Roles.Where(r => r.PlannedRaidRoleId == 0)) - { - raidToChange.Roles.Add(role); - } - List reminderToRemove = new List(); - foreach (RaidReminder reminder in raidToChange.Reminders) - { - RaidReminder? newReminder = raid.Reminders.FirstOrDefault(r => r.RaidReminderId == reminder.RaidReminderId); - if (newReminder != null) - { - reminder.Type = newReminder.Type; - reminder.Message = newReminder.Message; - reminder.HoursBeforeRaid = newReminder.HoursBeforeRaid; - reminder.ChannelId = newReminder.ChannelId; - reminder.Sent = newReminder.Sent; - } - else - { - reminderToRemove.Add(reminder); - } - } - foreach(RaidReminder reminder in reminderToRemove) - { - raidToChange.Reminders.Remove(reminder); - context.RaidReminders.Remove(reminder); - } - foreach (PlannedRaidRole role in raid.Roles.Where(r => r.PlannedRaidRoleId == 0)) - { - raidToChange.Roles.Add(role); + EditReminders(raidToChange, raid, context); } await context.SaveChangesAsync(); @@ -134,7 +112,65 @@ namespace Lieb.Data } } - public async Task DeleteRaid(int raidId) + private void EditRoles(Raid raidToEdit, Raid raid, LiebContext context) + { + List rolesToRemove = new List(); + foreach (PlannedRaidRole role in raidToEdit.Roles) + { + PlannedRaidRole? newRole = raid.Roles.FirstOrDefault(r => r.PlannedRaidRoleId == role.PlannedRaidRoleId); + if (newRole != null) + { + role.Spots = newRole.Spots; + role.Name = newRole.Name; + role.Description = newRole.Description; + } + else + { + rolesToRemove.Add(role); + } + } + foreach (PlannedRaidRole role in rolesToRemove) + { + raidToEdit.Roles.Remove(role); + context.PlannedRaidRoles.Remove(role); + } + foreach (PlannedRaidRole role in raid.Roles.Where(r => r.PlannedRaidRoleId == 0)) + { + raidToEdit.Roles.Add(role); + } + } + + private void EditReminders(Raid raidToEdit, Raid raid, LiebContext context) + { + List reminderToRemove = new List(); + foreach (RaidReminder reminder in raidToEdit.Reminders) + { + RaidReminder? newReminder = raid.Reminders.FirstOrDefault(r => r.RaidReminderId == reminder.RaidReminderId); + if (newReminder != null) + { + reminder.Type = newReminder.Type; + reminder.Message = newReminder.Message; + reminder.HoursBeforeRaid = newReminder.HoursBeforeRaid; + reminder.ChannelId = newReminder.ChannelId; + reminder.Sent = newReminder.Sent; + } + else + { + reminderToRemove.Add(reminder); + } + } + foreach (RaidReminder reminder in reminderToRemove) + { + raidToEdit.Reminders.Remove(reminder); + context.RaidReminders.Remove(reminder); + } + foreach (PlannedRaidRole role in raid.Roles.Where(r => r.PlannedRaidRoleId == 0)) + { + raidToEdit.Roles.Add(role); + } + } + + public async Task DeleteRaid(int raidId) { using var context = _contextFactory.CreateDbContext(); Raid raid = GetRaid(raidId); diff --git a/Lieb/Models/GuildWars2/Raid/PlannedRaidRole.cs b/Lieb/Models/GuildWars2/Raid/PlannedRaidRole.cs index a148ef2..68cdc42 100644 --- a/Lieb/Models/GuildWars2/Raid/PlannedRaidRole.cs +++ b/Lieb/Models/GuildWars2/Raid/PlannedRaidRole.cs @@ -14,5 +14,7 @@ namespace Lieb.Models.GuildWars2.Raid [Required] [StringLength(200, ErrorMessage = "Description too long (200 character limit).")] public string Description { get; set; } = String.Empty; + + public bool IsRandomSignUpRole { get; set; } = false; } } diff --git a/Lieb/Models/GuildWars2/Raid/Raid.cs b/Lieb/Models/GuildWars2/Raid/Raid.cs index 36046bb..511086b 100644 --- a/Lieb/Models/GuildWars2/Raid/Raid.cs +++ b/Lieb/Models/GuildWars2/Raid/Raid.cs @@ -22,8 +22,6 @@ namespace Lieb.Models.GuildWars2.Raid public DateTimeOffset FreeForAllTimeUTC { get; set; } - public bool IsRandomized { get; set; } = false; - public ICollection SignUps { get; set; } = new HashSet(); public ICollection SignUpHistory { get; set; } = new HashSet(); diff --git a/Lieb/Pages/Raids/RaidDetails.razor b/Lieb/Pages/Raids/RaidDetails.razor index 76a9cd6..7934ad8 100644 --- a/Lieb/Pages/Raids/RaidDetails.razor +++ b/Lieb/Pages/Raids/RaidDetails.razor @@ -49,7 +49,7 @@ } else { - + } } else @@ -65,7 +65,7 @@ Edit - @if(_raid.RaidType != RaidType.Planned && !_raid.IsRandomized) + @if(_raid.RaidType != RaidType.Planned) { } diff --git a/Lieb/Pages/Raids/RaidEdit.razor b/Lieb/Pages/Raids/RaidEdit.razor index 2bdc9ca..fe96727 100644 --- a/Lieb/Pages/Raids/RaidEdit.razor +++ b/Lieb/Pages/Raids/RaidEdit.razor @@ -209,12 +209,16 @@ { if(_raid.RaidType != RaidType.Planned) { + PlannedRaidRole role = _raid.Roles.FirstOrDefault(r => r.IsRandomSignUpRole); + int randomRoleId = role != null ? role.PlannedRaidRoleId : 0; _raid.Roles.Clear(); _raid.Roles.Add(new PlannedRaidRole() { Spots = 10, Name = "Random", - Description = _raid.RaidType.ToString() + Description = _raid.RaidType.ToString(), + IsRandomSignUpRole = true, + PlannedRaidRoleId = randomRoleId }); } diff --git a/Lieb/Pages/Raids/RaidRolesRandom.razor b/Lieb/Pages/Raids/RaidRolesRandom.razor new file mode 100644 index 0000000..1e706d1 --- /dev/null +++ b/Lieb/Pages/Raids/RaidRolesRandom.razor @@ -0,0 +1,115 @@ +@using Lieb.Data +@using Lieb.Models +@using Lieb.Models.GuildWars2 +@using Lieb.Models.GuildWars2.Raid +@inject RaidService RaidService + + + + @{ + RaidSignUp userRole = _raid.SignUps.Where(s => s.LiebUserId == _user.LiebUserId).FirstOrDefault(); + bool isSignedUp = userRole != null; + } + @foreach (PlannedRaidRole role in _raid.Roles) + { + RaidSignUp[] signUps = _raid.SignUps.Where(s => s.PlannedRaidRoleId == role.PlannedRaidRoleId).ToArray(); + int usedSpots = signUps.Where(s => s.SignUpType == SignUpType.SignedUp).Count(); + + + @if (role.IsRandomSignUpRole && _raid.SignUps.Where(s => s.SignUpType == SignUpType.SignedUp).Count() < 10) + { + + + + } + else + { + + + + } + + + + @foreach (var signUp in signUps) + { + @if(signUp.SignUpType != SignUpType.SignedOff) + { + + @{bool isUser = isSignedUp && userRole.PlannedRaidRole.PlannedRaidRoleId == role.PlannedRaidRoleId && signUp.LiebUserId == _user.LiebUserId;} + + + @if(isUser) + { + + } + else + { + + } + @{string signUpStatus = string.Empty;} + @if (signUp.SignUpType != SignUpType.SignedUp) signUpStatus = $" - {signUp.SignUpType}"; + + @if (isUser && _usableAccounts.Count > 1) + { + + } + else + { + + } + + } + } + } + +
@role.Name: @role.Description (@usedSpots /@role.Spots)
@signUp.LiebUser.Name + @signUpStatus @signUp.LiebUser.Name (@signUp.GuildWars2Account.AccountName) @signUpStatus
+ + +@code { + + [Parameter] + public Raid _raid { get; set; } + + [Parameter] + public LiebUser _user { get; set; } + + private List _usableAccounts; + + protected override async Task OnParametersSetAsync() + { + _usableAccounts = _user.GuildWars2Accounts.Where(a => a.EquippedBuilds.Count > 0).ToList(); + } + + async Task SignUpClicked(PlannedRaidRole role, LiebUser liebUser, bool isSignedUp, SignUpType signUpType) + { + if(isSignedUp) + { + await RaidService.ChangeSignUpType(_raid.RaidId, liebUser.LiebUserId, role.PlannedRaidRoleId, signUpType); + } + else + { + await RaidService.SignUp(_raid.RaidId, liebUser.LiebUserId, _usableAccounts.FirstOrDefault().GuildWars2AccountId, role.PlannedRaidRoleId, signUpType); + } + _raid = RaidService.GetRaid(_raid.RaidId); + } + + async Task SignOffClicked(PlannedRaidRole role, LiebUser liebUser) + { + await RaidService.SignOff(_raid.RaidId, liebUser.LiebUserId, role.PlannedRaidRoleId); + _raid = RaidService.GetRaid(_raid.RaidId); + } + + async Task ChangeAccount(LiebUser liebUser, ChangeEventArgs e) + { + int accountId = int.Parse(e.Value.ToString()); + await RaidService.ChangeAccount(_raid.RaidId, liebUser.LiebUserId, accountId); + _raid = RaidService.GetRaid(_raid.RaidId); + } +} diff --git a/Lieb/Pages/Raids/RaidRolesRandom.razor.css b/Lieb/Pages/Raids/RaidRolesRandom.razor.css new file mode 100644 index 0000000..33eccca --- /dev/null +++ b/Lieb/Pages/Raids/RaidRolesRandom.razor.css @@ -0,0 +1,9 @@ +h5 { + color: lightgrey; +} + +table { + column-width: auto; + color: lightgray; + width: max-content; +}