Reworked random raids to be randomizable multiple times

This commit is contained in:
t.ruspekhofer 2022-03-13 17:21:17 +01:00
parent dd79b0e333
commit 6e4dce5b1f
9 changed files with 249 additions and 83 deletions

View file

@ -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();

View file

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

View file

@ -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<PlannedRaidRole> rolesToRemove = new List<PlannedRaidRole>();
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<RaidReminder> reminderToRemove = new List<RaidReminder>();
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<PlannedRaidRole> rolesToRemove = new List<PlannedRaidRole>();
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<RaidReminder> reminderToRemove = new List<RaidReminder>();
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);