diff --git a/Lieb/Data/DbInitializer.cs b/Lieb/Data/DbInitializer.cs index 5fb4565..e108d00 100644 --- a/Lieb/Data/DbInitializer.cs +++ b/Lieb/Data/DbInitializer.cs @@ -170,11 +170,11 @@ namespace Lieb.Data context.RaidSignUps.AddRange(signUps); context.SaveChanges(); - GuildWars2Build healTempest = new GuildWars2Build() { BuildName = "HealTempest", Class = GuildWars2Class.Elementalist, EliteSpecialization = EliteSpecialization.Tempest, Heal = 5, Might = 5 }; - GuildWars2Build condiScourge = new GuildWars2Build() { BuildName = "CondiScourge", Class = GuildWars2Class.Necromancer, EliteSpecialization = EliteSpecialization.Scourge }; - GuildWars2Build quickBrand = new GuildWars2Build() { BuildName = "QuickBrand", Class = GuildWars2Class.Guard, EliteSpecialization = EliteSpecialization.Firebrand, Heal = 5, Quickness = 5 }; - GuildWars2Build alacregate = new GuildWars2Build() { BuildName = "Alacregate", Class = GuildWars2Class.Revenant, EliteSpecialization = EliteSpecialization.Renegade, Alacrity = 5 }; - GuildWars2Build chrono = new GuildWars2Build() { BuildName = "Chrono", Class = GuildWars2Class.Mesmer, EliteSpecialization = EliteSpecialization.Chronomancer, Alacrity = 5, Quickness = 5 }; + GuildWars2Build healTempest = new GuildWars2Build() { BuildName = "HealTempest", Class = GuildWars2Class.Elementalist, EliteSpecialization = EliteSpecialization.Tempest, Might = true, Alacrity = true, DamageType = DamageType.Heal }; + GuildWars2Build condiScourge = new GuildWars2Build() { BuildName = "CondiScourge", Class = GuildWars2Class.Necromancer, EliteSpecialization = EliteSpecialization.Scourge, DamageType = DamageType.Condition }; + GuildWars2Build quickBrand = new GuildWars2Build() { BuildName = "QuickBrand", Class = GuildWars2Class.Guard, EliteSpecialization = EliteSpecialization.Firebrand, Quickness = true, DamageType = DamageType.Condition }; + GuildWars2Build alacregate = new GuildWars2Build() { BuildName = "Alacregate", Class = GuildWars2Class.Revenant, EliteSpecialization = EliteSpecialization.Renegade, Alacrity = true, DamageType = DamageType.Power }; + GuildWars2Build chrono = new GuildWars2Build() { BuildName = "Chrono", Class = GuildWars2Class.Mesmer, EliteSpecialization = EliteSpecialization.Chronomancer, Alacrity = true, Quickness = true, DamageType = DamageType.Power }; GuildWars2Build daredevil = new GuildWars2Build() { BuildName = "Daredevil", Class = GuildWars2Class.Thief, EliteSpecialization = EliteSpecialization.DareDevil }; context.GuildWars2Builds.AddRange(new List(){healTempest, condiScourge, quickBrand, alacregate, chrono, daredevil }); context.SaveChanges(); diff --git a/Lieb/Data/RaidRandomizerService.cs b/Lieb/Data/RaidRandomizerService.cs index 7269e4d..6102d31 100644 --- a/Lieb/Data/RaidRandomizerService.cs +++ b/Lieb/Data/RaidRandomizerService.cs @@ -97,230 +97,135 @@ namespace Lieb.Data signUp.RaidRole = role; } } - + private void RandomizeWithBoons(Raid raid) { - Dictionary signedUpUsers= new Dictionary(); - foreach (RaidSignUp signUp in raid.SignUps) + int noGroups = (raid.SignUps.Where(s => s.SignUpType != SignUpType.Flex && s.SignUpType != SignUpType.SignedOff).Count() / 5) +1; + + List usedAccounts = raid.SignUps.Where(s => s.GuildWars2Account != null && s.GuildWars2Account.EquippedBuilds.Count > 0).Select(s => s.GuildWars2Account).ToList(); + Dictionary addedAccounts = new Dictionary(); + + List alacHealers = usedAccounts.Where(a => a.EquippedBuilds.Where(b => b.GuildWars2Build.DamageType == DamageType.Heal && b.GuildWars2Build.Alacrity).Any()).ToList(); + List quickHealers = usedAccounts.Where(a => a.EquippedBuilds.Where(b => b.GuildWars2Build.DamageType == DamageType.Heal && b.GuildWars2Build.Quickness).Any()).ToList(); + List alacDps = usedAccounts.Where(a => a.EquippedBuilds.Where(b => b.GuildWars2Build.DamageType != DamageType.Heal && b.GuildWars2Build.Alacrity).Any()).ToList(); + List quickDps = usedAccounts.Where(a => a.EquippedBuilds.Where(b => b.GuildWars2Build.DamageType != DamageType.Heal && b.GuildWars2Build.Quickness).Any()).ToList(); + + List> possibleBoonCombinations = new List>(); + foreach(GuildWars2Account alac in alacHealers) { - if (!signUp.IsExternalUser && signUp.GuildWars2Account.EquippedBuilds.Count > 0) + foreach(GuildWars2Account quick in quickDps) { - signedUpUsers.Add(signUp.LiebUserId.Value, signUp.GuildWars2Account.EquippedBuilds.ToList()[_random.Next(signUp.GuildWars2Account.EquippedBuilds.Count - 1)].GuildWars2Build); + if(alac.GuildWars2AccountId != quick.GuildWars2AccountId) + possibleBoonCombinations.Add(new Tuple(alac.GuildWars2AccountId, quick.GuildWars2AccountId)); } } - BalanceRoles(raid, signedUpUsers); - foreach(var userBuild in signedUpUsers) + foreach(GuildWars2Account quick in quickHealers) { - RaidRole role = new RaidRole(); - role.Spots = 0; - role.Name = userBuild.Value.BuildName; - raid.Roles.Add(role); - RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); - signUp.RaidRole = role; - } - } - - private void BalanceRoles(Raid raid, Dictionary signedUpUsers, int recusrionDepth = 0) - { - int Alac = 0; - int Quick = 0; - int Heal = 0; - int Might = 0; - - signedUpUsers = signedUpUsers.OrderBy(u => _random.Next()).ToDictionary(u => u.Key, u => u.Value); - - foreach(GuildWars2Build build in signedUpUsers.Values) - { - Alac += build.Alacrity; - Quick += build.Quickness; - Heal += build.Heal; - Might += build.Might; - } - if(Alac > 10) - { - ReduceAlac(raid, signedUpUsers, Alac); - } - if(Alac < 10) - { - IncreaseAlac(raid, signedUpUsers, Alac); - } - signedUpUsers = signedUpUsers.OrderBy(u => _random.Next()).ToDictionary(u => u.Key, u => u.Value); - if (Quick > 10) - { - ReduceQuick(raid, signedUpUsers, Quick); - } - if (Quick < 10) - { - IncreaseQuick(raid, signedUpUsers, Quick); - } - signedUpUsers = signedUpUsers.OrderBy(u => _random.Next()).ToDictionary(u => u.Key, u => u.Value); - if (Heal > 10) - { - ReduceHeal(raid, signedUpUsers, Heal); - } - if (Heal < 10) - { - IncreaseHeal(raid, signedUpUsers, Heal); - } - signedUpUsers = signedUpUsers.OrderBy(u => _random.Next()).ToDictionary(u => u.Key, u => u.Value); - if (Might > 10) - { - ReduceMight(raid, signedUpUsers, Might); - } - if (Might < 10) - { - IncreaseMight(raid, signedUpUsers, Might); - } - - if(recusrionDepth < 20) - { - recusrionDepth++; - BalanceRoles(raid, signedUpUsers, recusrionDepth); - } - } - - private void ReduceAlac(Raid raid, Dictionary signedUpUsers, int currentAlac) - { - foreach (var userBuild in signedUpUsers) - { - if(userBuild.Value.Alacrity > 0 && currentAlac > 10) + foreach(GuildWars2Account alac in alacDps) { - RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); - Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Alacrity == 0).OrderBy(u => _random.Next()).FirstOrDefault(); - if (newBuild != null) + if(quick.GuildWars2AccountId != alac.GuildWars2AccountId) + possibleBoonCombinations.Add(new Tuple(quick.GuildWars2AccountId, alac.GuildWars2AccountId)); + } + } + + possibleBoonCombinations = possibleBoonCombinations.OrderBy(u => _random.Next()).ToList(); + List> usedBoonCombinations = new List>(); + foreach(var boonCombination in possibleBoonCombinations) + { + if(!usedBoonCombinations.Where(b => b.Item1 == boonCombination.Item1 || b.Item1 == boonCombination.Item2 + || b.Item2 == boonCombination.Item1 || b.Item2 == boonCombination.Item2).Any() + && usedBoonCombinations.Count < noGroups) + { + usedBoonCombinations.Add(new Tuple(boonCombination.Item1, boonCombination.Item2)); + } + } + + + //TODO: avoid the same GW2 account multiple times in a raid? + foreach(var boonCombination in usedBoonCombinations) + { + GuildWars2Account healer = usedAccounts.First(a => a.GuildWars2AccountId == boonCombination.Item1); + GuildWars2Account boonDps = usedAccounts.First(a => a.GuildWars2AccountId == boonCombination.Item2); + Tuple builds = GetBoonBuilds(healer, boonDps); + AddRole(raid, builds.Item1, raid.SignUps.First(s => s.GuildWars2AccountId == boonCombination.Item1)); + addedAccounts.Add(healer, builds.Item1); + AddRole(raid, builds.Item2, raid.SignUps.First(s => s.GuildWars2AccountId == boonCombination.Item2)); + addedAccounts.Add(boonDps, builds.Item2); + } + + //add aditional healers + if(usedBoonCombinations.Count < noGroups) + { + List additionalHealers = usedAccounts.Where(a => a.EquippedBuilds.Where(b => b.GuildWars2Build.DamageType == DamageType.Heal).Any() + && !addedAccounts.Where(x => x.Key.GuildWars2AccountId == a.GuildWars2AccountId).Any()).ToList(); + additionalHealers = additionalHealers.OrderBy(u => _random.Next()).ToList(); + int neededHealers = noGroups - usedBoonCombinations.Count; + foreach(GuildWars2Account healer in additionalHealers) + { + if(neededHealers > 0) { - currentAlac -= userBuild.Value.Alacrity; - signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; - currentAlac += signedUpUsers[userBuild.Key].Alacrity; + GuildWars2Build build = healer.EquippedBuilds.First(b => b.GuildWars2Build.DamageType == DamageType.Heal).GuildWars2Build; + AddRole(raid, build, raid.SignUps.First(s => s.GuildWars2AccountId == healer.GuildWars2AccountId)); + addedAccounts.Add(healer, build); + neededHealers --; } } } - } - private void IncreaseAlac(Raid raid, Dictionary signedUpUsers, int currentAlac) - { - foreach (var userBuild in signedUpUsers) + //add might + if(addedAccounts.Where(a => a.Value.Might).Count() < noGroups ) { - if (userBuild.Value.Alacrity == 00 && currentAlac < 10) + List additionalMight = usedAccounts.Where(a => a.EquippedBuilds.Where(b => b.GuildWars2Build.DamageType != DamageType.Heal && b.GuildWars2Build.Might).Any() + && !addedAccounts.Where(x => x.Key.GuildWars2AccountId == a.GuildWars2AccountId).Any()).ToList(); + additionalMight = additionalMight.OrderBy(u => _random.Next()).ToList(); + int neededMight = noGroups - addedAccounts.Where(a => a.Value.Might).Count(); + foreach(GuildWars2Account mightAccount in additionalMight) { - RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); - Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Alacrity > 0).OrderBy(u => _random.Next()).FirstOrDefault(); - if (newBuild != null) + if(neededMight > 0) { - currentAlac -= userBuild.Value.Alacrity; - signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; - currentAlac += signedUpUsers[userBuild.Key].Alacrity; + GuildWars2Build build = mightAccount.EquippedBuilds.First(b => b.GuildWars2Build.DamageType != DamageType.Heal && b.GuildWars2Build.Might).GuildWars2Build; + AddRole(raid, build, raid.SignUps.First(s => s.GuildWars2AccountId == mightAccount.GuildWars2AccountId)); + addedAccounts.Add(mightAccount, build); + neededMight --; } } } - } - private void ReduceQuick(Raid raid, Dictionary signedUpUsers, int currentQuick) - { - foreach (var userBuild in signedUpUsers) + //add dps + List dpsPlayers = usedAccounts.Where(a => !addedAccounts.Where(x => x.Key.GuildWars2AccountId == a.GuildWars2AccountId).Any()).ToList(); + foreach(GuildWars2Account dps in dpsPlayers) { - if (userBuild.Value.Quickness > 0 && currentQuick > 10) - { - RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); - Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Quickness == 0).OrderBy(u => _random.Next()).FirstOrDefault(); - if (newBuild != null) - { - currentQuick -= userBuild.Value.Quickness; - signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; - currentQuick += signedUpUsers[userBuild.Key].Quickness; - } - } + GuildWars2Build build = dps.EquippedBuilds.First(b => b.GuildWars2Build.DamageType != DamageType.Heal && !b.GuildWars2Build.Alacrity && !b.GuildWars2Build.Quickness).GuildWars2Build; + AddRole(raid, build, raid.SignUps.First(s => s.GuildWars2AccountId == dps.GuildWars2AccountId)); + addedAccounts.Add(dps, build); } } - private void IncreaseQuick(Raid raid, Dictionary signedUpUsers, int currentQuick) + private Tuple GetBoonBuilds(GuildWars2Account healer, GuildWars2Account boonDps) { - foreach (var userBuild in signedUpUsers) - { - if (userBuild.Value.Quickness == 00 && currentQuick < 10) - { - RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); - Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Quickness > 0).OrderBy(u => _random.Next()).FirstOrDefault(); - if (newBuild != null) - { - currentQuick -= userBuild.Value.Quickness; - signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; - currentQuick += signedUpUsers[userBuild.Key].Quickness; - } - } - } - } + List healBuilds = healer.EquippedBuilds.Where(b => b.GuildWars2Build.DamageType == DamageType.Heal && (b.GuildWars2Build.Alacrity || b.GuildWars2Build.Quickness)).Select(b => b.GuildWars2Build).ToList(); + List boonBuilds = boonDps.EquippedBuilds.Where(b => b.GuildWars2Build.DamageType != DamageType.Heal && (b.GuildWars2Build.Alacrity || b.GuildWars2Build.Quickness)).Select(b => b.GuildWars2Build).ToList(); + healBuilds.OrderBy(u => _random.Next()).ToList(); + boonBuilds.OrderBy(u => _random.Next()).ToList(); - private void ReduceMight(Raid raid, Dictionary signedUpUsers, int currentMight) - { - foreach (var userBuild in signedUpUsers) + foreach(GuildWars2Build healBuild in healBuilds) { - if (userBuild.Value.Might > 0 && currentMight > 10) + if(boonBuilds.Where(b => b.Alacrity != healBuild.Alacrity).Any()) { - RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); - Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Might == 0).OrderBy(u => _random.Next()).FirstOrDefault(); - if (newBuild != null) - { - currentMight -= userBuild.Value.Might; - signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; - currentMight += signedUpUsers[userBuild.Key].Might; - } + GuildWars2Build boonBuild = boonBuilds.First(b => b.Alacrity != healBuild.Alacrity); + return new Tuple(healBuild, boonBuild); } } + return new Tuple(new GuildWars2Build(), new GuildWars2Build()); } - - private void IncreaseMight(Raid raid, Dictionary signedUpUsers, int currentMight) + + private void AddRole(Raid raid, GuildWars2Build usedBuild, RaidSignUp signUp ) { - foreach (var userBuild in signedUpUsers) - { - if (userBuild.Value.Might == 00 && currentMight < 10) - { - RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); - Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Might > 0).OrderBy(u => _random.Next()).FirstOrDefault(); - if (newBuild != null) - { - currentMight -= userBuild.Value.Might; - signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; - currentMight += signedUpUsers[userBuild.Key].Might; - } - } - } - } - - private void ReduceHeal(Raid raid, Dictionary signedUpUsers, int currentHeal) - { - foreach (var userBuild in signedUpUsers) - { - if (userBuild.Value.Heal > 0 && currentHeal > 10) - { - RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); - Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Heal == 0).OrderBy(u => _random.Next()).FirstOrDefault(); - if (newBuild != null) - { - currentHeal -= userBuild.Value.Heal; - signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; - currentHeal += signedUpUsers[userBuild.Key].Heal; - } - } - } - } - - private void IncreaseHeal(Raid raid, Dictionary signedUpUsers, int currentHeal) - { - foreach (var userBuild in signedUpUsers) - { - if (userBuild.Value.Heal == 00 && currentHeal < 10) - { - RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); - Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Heal > 0).OrderBy(u => _random.Next()).FirstOrDefault(); - if (newBuild != null) - { - currentHeal -= userBuild.Value.Heal; - signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; - currentHeal += signedUpUsers[userBuild.Key].Heal; - } - } - } + RaidRole role = new RaidRole(); + role.Spots = 0; + role.Name = usedBuild.BuildName; + raid.Roles.Add(role); + signUp.RaidRole = role; } private void CleanUpRoles(Raid raid, LiebContext context) diff --git a/Lieb/Migrations/20221205213924_ReworkedGW2Build.Designer.cs b/Lieb/Migrations/20221205213924_ReworkedGW2Build.Designer.cs new file mode 100644 index 0000000..30a03fa --- /dev/null +++ b/Lieb/Migrations/20221205213924_ReworkedGW2Build.Designer.cs @@ -0,0 +1,640 @@ +// +using System; +using Lieb.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Lieb.Migrations +{ + [DbContext(typeof(LiebContext))] + [Migration("20221205213924_ReworkedGW2Build")] + partial class ReworkedGW2Build + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.10"); + + modelBuilder.Entity("Lieb.Models.DiscordSettings", b => + { + b.Property("DiscordSettingsId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChangeUserNames") + .HasColumnType("INTEGER"); + + b.Property("DiscordLogChannel") + .HasColumnType("INTEGER"); + + b.HasKey("DiscordSettingsId"); + + b.ToTable("DiscordSettings", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Equipped", b => + { + b.Property("EquippedId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CanTank") + .HasColumnType("INTEGER"); + + b.Property("GuildWars2AccountId") + .HasColumnType("INTEGER"); + + b.Property("GuildWars2BuildId") + .HasColumnType("INTEGER"); + + b.HasKey("EquippedId"); + + b.HasIndex("GuildWars2AccountId"); + + b.HasIndex("GuildWars2BuildId"); + + b.ToTable("Equipped", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.GuildWars2Account", b => + { + b.Property("GuildWars2AccountId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AccountName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ApiKey") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("LiebUserId") + .HasColumnType("INTEGER"); + + b.HasKey("GuildWars2AccountId"); + + b.HasIndex("LiebUserId"); + + b.ToTable("GuildWars2Account", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.GuildWars2Build", b => + { + b.Property("GuildWars2BuildId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Alacrity") + .HasColumnType("INTEGER"); + + b.Property("BuildName") + .IsRequired() + .HasMaxLength(60) + .HasColumnType("TEXT"); + + b.Property("Class") + .HasColumnType("INTEGER"); + + b.Property("DamageType") + .HasColumnType("INTEGER"); + + b.Property("EliteSpecialization") + .HasColumnType("INTEGER"); + + b.Property("Might") + .HasColumnType("INTEGER"); + + b.Property("Quickness") + .HasColumnType("INTEGER"); + + b.Property("Source") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UseInRandomRaid") + .HasColumnType("INTEGER"); + + b.HasKey("GuildWars2BuildId"); + + b.ToTable("GuildWars2Build", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.DiscordRaidMessage", b => + { + b.Property("DiscordRaidMessageId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DiscordChannelId") + .HasColumnType("INTEGER"); + + b.Property("DiscordGuildId") + .HasColumnType("INTEGER"); + + b.Property("DiscordMessageId") + .HasColumnType("INTEGER"); + + b.Property("RaidId") + .HasColumnType("INTEGER"); + + b.Property("RaidTemplateId") + .HasColumnType("INTEGER"); + + b.HasKey("DiscordRaidMessageId"); + + b.HasIndex("RaidId"); + + b.HasIndex("RaidTemplateId"); + + b.ToTable("DiscordRaidMessage", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.Raid", b => + { + b.Property("RaidId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("TEXT"); + + b.Property("EndTimeUTC") + .HasColumnType("TEXT"); + + b.Property("EventType") + .HasColumnType("INTEGER"); + + b.Property("FreeForAllTimeUTC") + .HasColumnType("TEXT"); + + b.Property("Guild") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("MoveFlexUsers") + .HasColumnType("INTEGER"); + + b.Property("Organizer") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("RaidOwnerId") + .HasColumnType("INTEGER"); + + b.Property("RaidType") + .HasColumnType("INTEGER"); + + b.Property("RequiredRole") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StartTimeUTC") + .HasColumnType("TEXT"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("VoiceChat") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.HasKey("RaidId"); + + b.ToTable("Raid", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidReminder", b => + { + b.Property("RaidReminderId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DiscordChannelId") + .HasColumnType("INTEGER"); + + b.Property("DiscordServerId") + .HasColumnType("INTEGER"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("TEXT"); + + b.Property("RaidId") + .HasColumnType("INTEGER"); + + b.Property("RaidTemplateId") + .HasColumnType("INTEGER"); + + b.Property("ReminderTimeUTC") + .HasColumnType("TEXT"); + + b.Property("Sent") + .HasColumnType("INTEGER"); + + b.Property("TimeType") + .HasColumnType("INTEGER"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("RaidReminderId"); + + b.HasIndex("RaidId"); + + b.HasIndex("RaidTemplateId"); + + b.ToTable("RaidReminder", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidRole", b => + { + b.Property("RaidRoleId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("IsRandomSignUpRole") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("TEXT"); + + b.Property("RaidId") + .HasColumnType("INTEGER"); + + b.Property("RaidTemplateId") + .HasColumnType("INTEGER"); + + b.Property("Spots") + .HasColumnType("INTEGER"); + + b.HasKey("RaidRoleId"); + + b.HasIndex("RaidId"); + + b.HasIndex("RaidTemplateId"); + + b.ToTable("RaidRole", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidSignUp", b => + { + b.Property("RaidSignUpId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ExternalUserName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GuildWars2AccountId") + .HasColumnType("INTEGER"); + + b.Property("LiebUserId") + .HasColumnType("INTEGER"); + + b.Property("RaidId") + .HasColumnType("INTEGER"); + + b.Property("RaidRoleId") + .HasColumnType("INTEGER"); + + b.Property("SignUpType") + .HasColumnType("INTEGER"); + + b.HasKey("RaidSignUpId"); + + b.HasIndex("GuildWars2AccountId"); + + b.HasIndex("LiebUserId"); + + b.HasIndex("RaidId"); + + b.HasIndex("RaidRoleId"); + + b.ToTable("RaidSignUp", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidTemplate", b => + { + b.Property("RaidTemplateId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreateDaysBefore") + .HasColumnType("INTEGER"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("TEXT"); + + b.Property("EndTime") + .HasColumnType("TEXT"); + + b.Property("EventType") + .HasColumnType("INTEGER"); + + b.Property("FreeForAllTime") + .HasColumnType("TEXT"); + + b.Property("Guild") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Interval") + .HasColumnType("INTEGER"); + + b.Property("MoveFlexUsers") + .HasColumnType("INTEGER"); + + b.Property("Organizer") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("RaidOwnerId") + .HasColumnType("INTEGER"); + + b.Property("RaidType") + .HasColumnType("INTEGER"); + + b.Property("RequiredRole") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StartTime") + .HasColumnType("TEXT"); + + b.Property("TimeZone") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("VoiceChat") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.HasKey("RaidTemplateId"); + + b.ToTable("RaidTemplate", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.LiebRole", b => + { + b.Property("LiebRoleId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Level") + .HasColumnType("INTEGER"); + + b.Property("LevelToAssign") + .HasColumnType("INTEGER"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("LiebRoleId"); + + b.ToTable("LiebRole", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.LiebUser", b => + { + b.Property("Id") + .HasColumnType("INTEGER"); + + b.Property("AlwaysSignUpWithMainAccount") + .HasColumnType("INTEGER"); + + b.Property("BannedUntil") + .HasColumnType("TEXT"); + + b.Property("Birthday") + .HasColumnType("TEXT"); + + b.Property("MainGW2Account") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("TEXT"); + + b.Property("Pronouns") + .IsRequired() + .HasMaxLength(60) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("LiebUser", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.RoleAssignment", b => + { + b.Property("RoleAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("LiebRoleId") + .HasColumnType("INTEGER"); + + b.Property("LiebUserId") + .HasColumnType("INTEGER"); + + b.HasKey("RoleAssignmentId"); + + b.HasIndex("LiebRoleId"); + + b.HasIndex("LiebUserId"); + + b.ToTable("RoleAssignment", (string)null); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Equipped", b => + { + b.HasOne("Lieb.Models.GuildWars2.GuildWars2Account", "GuildWars2Account") + .WithMany("EquippedBuilds") + .HasForeignKey("GuildWars2AccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Lieb.Models.GuildWars2.GuildWars2Build", "GuildWars2Build") + .WithMany("EquippedRoles") + .HasForeignKey("GuildWars2BuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("GuildWars2Account"); + + b.Navigation("GuildWars2Build"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.GuildWars2Account", b => + { + b.HasOne("Lieb.Models.LiebUser", null) + .WithMany("GuildWars2Accounts") + .HasForeignKey("LiebUserId"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.DiscordRaidMessage", b => + { + b.HasOne("Lieb.Models.GuildWars2.Raid.Raid", null) + .WithMany("DiscordRaidMessages") + .HasForeignKey("RaidId"); + + b.HasOne("Lieb.Models.GuildWars2.Raid.RaidTemplate", null) + .WithMany("DiscordRaidMessages") + .HasForeignKey("RaidTemplateId"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidReminder", b => + { + b.HasOne("Lieb.Models.GuildWars2.Raid.Raid", null) + .WithMany("Reminders") + .HasForeignKey("RaidId"); + + b.HasOne("Lieb.Models.GuildWars2.Raid.RaidTemplate", null) + .WithMany("Reminders") + .HasForeignKey("RaidTemplateId"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidRole", b => + { + b.HasOne("Lieb.Models.GuildWars2.Raid.Raid", null) + .WithMany("Roles") + .HasForeignKey("RaidId"); + + b.HasOne("Lieb.Models.GuildWars2.Raid.RaidTemplate", null) + .WithMany("Roles") + .HasForeignKey("RaidTemplateId"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidSignUp", b => + { + b.HasOne("Lieb.Models.GuildWars2.GuildWars2Account", "GuildWars2Account") + .WithMany() + .HasForeignKey("GuildWars2AccountId"); + + b.HasOne("Lieb.Models.LiebUser", "LiebUser") + .WithMany() + .HasForeignKey("LiebUserId"); + + b.HasOne("Lieb.Models.GuildWars2.Raid.Raid", "Raid") + .WithMany("SignUps") + .HasForeignKey("RaidId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Lieb.Models.GuildWars2.Raid.RaidRole", "RaidRole") + .WithMany() + .HasForeignKey("RaidRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("GuildWars2Account"); + + b.Navigation("LiebUser"); + + b.Navigation("Raid"); + + b.Navigation("RaidRole"); + }); + + modelBuilder.Entity("Lieb.Models.RoleAssignment", b => + { + b.HasOne("Lieb.Models.LiebRole", "LiebRole") + .WithMany("RoleAssignments") + .HasForeignKey("LiebRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Lieb.Models.LiebUser", "LiebUser") + .WithMany("RoleAssignments") + .HasForeignKey("LiebUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("LiebRole"); + + b.Navigation("LiebUser"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.GuildWars2Account", b => + { + b.Navigation("EquippedBuilds"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.GuildWars2Build", b => + { + b.Navigation("EquippedRoles"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.Raid", b => + { + b.Navigation("DiscordRaidMessages"); + + b.Navigation("Reminders"); + + b.Navigation("Roles"); + + b.Navigation("SignUps"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidTemplate", b => + { + b.Navigation("DiscordRaidMessages"); + + b.Navigation("Reminders"); + + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Lieb.Models.LiebRole", b => + { + b.Navigation("RoleAssignments"); + }); + + modelBuilder.Entity("Lieb.Models.LiebUser", b => + { + b.Navigation("GuildWars2Accounts"); + + b.Navigation("RoleAssignments"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Lieb/Migrations/20221205213924_ReworkedGW2Build.cs b/Lieb/Migrations/20221205213924_ReworkedGW2Build.cs new file mode 100644 index 0000000..e41cc4f --- /dev/null +++ b/Lieb/Migrations/20221205213924_ReworkedGW2Build.cs @@ -0,0 +1,47 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Lieb.Migrations +{ + public partial class ReworkedGW2Build : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "Heal", + table: "GuildWars2Build", + newName: "UseInRandomRaid"); + + migrationBuilder.AddColumn( + name: "DamageType", + table: "GuildWars2Build", + type: "INTEGER", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "Source", + table: "GuildWars2Build", + type: "TEXT", + nullable: false, + defaultValue: ""); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "DamageType", + table: "GuildWars2Build"); + + migrationBuilder.DropColumn( + name: "Source", + table: "GuildWars2Build"); + + migrationBuilder.RenameColumn( + name: "UseInRandomRaid", + table: "GuildWars2Build", + newName: "Heal"); + } + } +} diff --git a/Lieb/Migrations/LiebContextModelSnapshot.cs b/Lieb/Migrations/LiebContextModelSnapshot.cs index f6813cb..c64db8c 100644 --- a/Lieb/Migrations/LiebContextModelSnapshot.cs +++ b/Lieb/Migrations/LiebContextModelSnapshot.cs @@ -88,7 +88,7 @@ namespace Lieb.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("Alacrity") + b.Property("Alacrity") .HasColumnType("INTEGER"); b.Property("BuildName") @@ -99,16 +99,23 @@ namespace Lieb.Migrations b.Property("Class") .HasColumnType("INTEGER"); + b.Property("DamageType") + .HasColumnType("INTEGER"); + b.Property("EliteSpecialization") .HasColumnType("INTEGER"); - b.Property("Heal") + b.Property("Might") .HasColumnType("INTEGER"); - b.Property("Might") + b.Property("Quickness") .HasColumnType("INTEGER"); - b.Property("Quickness") + b.Property("Source") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UseInRandomRaid") .HasColumnType("INTEGER"); b.HasKey("GuildWars2BuildId"); diff --git a/Lieb/Migrations/readme.txt b/Lieb/Migrations/readme.txt index 5261ae2..67c4a91 100644 --- a/Lieb/Migrations/readme.txt +++ b/Lieb/Migrations/readme.txt @@ -3,5 +3,8 @@ https://learn.microsoft.com/en-us/aspnet/core/data/ef-rp/migrations?view=aspnetc open ProjectFolder in Terminal dotnet ef migrations add InitialCreate -remove migrations with +remove migrations +1: revert to migration you want to keep +dotnet ef database update RemovedRaidLog +2: remove dotnet ef migrations remove \ No newline at end of file diff --git a/Lieb/Models/GuildWars2/GuildWars2Build.cs b/Lieb/Models/GuildWars2/GuildWars2Build.cs index ce7e645..ced4856 100644 --- a/Lieb/Models/GuildWars2/GuildWars2Build.cs +++ b/Lieb/Models/GuildWars2/GuildWars2Build.cs @@ -2,15 +2,13 @@ namespace Lieb.Models.GuildWars2 { - public enum Role + public enum DamageType { - Might = 0, - Quickness = 1, - Alacrity = 2, - Heal = 3, - Tank = 4, - pDps = 5, - cDps = 6, + Other = 0, + Heal = 1, + Power = 2, + Condition = 3, + Hybrid = 4 } public enum GuildWars2Class @@ -74,10 +72,11 @@ namespace Lieb.Models.GuildWars2 [StringLength(60, ErrorMessage = "BuildName too long (60 character limit).")] public string BuildName { get; set; } = String.Empty; - public short Might { get; set; } - public short Quickness { get; set; } - public short Alacrity { get; set; } - public short Heal { get; set; } + public bool Might { get; set; } + public bool Quickness { get; set; } + public bool Alacrity { get; set; } + public DamageType DamageType {get; set;} + public bool UseInRandomRaid {get; set;} [Required] [Range(1, 9, ErrorMessage = "Please select a class")] @@ -89,5 +88,7 @@ namespace Lieb.Models.GuildWars2 public ICollection EquippedRoles { get; set; } = new List(); + public string Source {get; set;} = string.Empty; + } } diff --git a/Lieb/Pages/GuildWars2/BuildEdit.razor b/Lieb/Pages/GuildWars2/BuildEdit.razor index 02c5508..885d8e9 100644 --- a/Lieb/Pages/GuildWars2/BuildEdit.razor +++ b/Lieb/Pages/GuildWars2/BuildEdit.razor @@ -23,28 +23,40 @@

+

+ +

+

-

-

-

+

+ +

+

+ +

@@ -85,20 +103,12 @@ public GuildWars2Build _build; - private bool _hasMight; - private bool _hasHeal; - private bool _hasQuickness; - private bool _hasAlacrity; protected override async Task OnInitializedAsync() { if(!string.IsNullOrEmpty(buildId) && int.TryParse(buildId, out int parsedId)) { _build = GuildWars2BuildService.GetBuild(parsedId); - _hasMight = _build.Might > 0; - _hasHeal = _build.Heal > 0; - _hasQuickness = _build.Quickness > 0; - _hasAlacrity = _build.Alacrity > 0; } else { @@ -118,11 +128,6 @@ private async Task HandleValidSubmit() { - _build.Might = _hasMight ? (short)5 : (short)0; - _build.Heal = _hasHeal ? (short)5 : (short)0; - _build.Quickness = _hasQuickness ? (short)5 : (short)0; - _build.Alacrity = _hasAlacrity ? (short)5 : (short)0; - await GuildWars2BuildService.AddOrEditBuild(_build); NavigationManager.NavigateTo("buildoverview"); } diff --git a/Lieb/Pages/GuildWars2/BuildOverview.razor b/Lieb/Pages/GuildWars2/BuildOverview.razor index 2caaf90..2cc6363 100644 --- a/Lieb/Pages/GuildWars2/BuildOverview.razor +++ b/Lieb/Pages/GuildWars2/BuildOverview.razor @@ -32,9 +32,15 @@ Class Elite Might - Heal Quick Alac + Heal + Power + Condition + Hybrid + Other + Random + Source @foreach (var build in _buildsToShow.OrderBy(b => b.Class).ThenBy(b => b.EliteSpecialization)) { @@ -45,10 +51,16 @@ @build.Class.ToString() @build.EliteSpecialization.ToString() - - - - + + + + + + + + + + @build.Source } diff --git a/Lieb/Pages/User/ManageGuildWars2Account.razor b/Lieb/Pages/User/ManageGuildWars2Account.razor index 0b79ad0..e0ae6f9 100644 --- a/Lieb/Pages/User/ManageGuildWars2Account.razor +++ b/Lieb/Pages/User/ManageGuildWars2Account.razor @@ -60,9 +60,15 @@ Class Elite Might - Heal Quick Alac + Heal + Power + Condition + Hybrid + Other + Random + Source @foreach (GuildWars2Build build in _buildsToShow.OrderBy(b => b.Class).ThenBy(b => b.EliteSpecialization)) { @@ -80,10 +86,16 @@ @build.BuildName @build.Class.ToString() @build.EliteSpecialization.ToString() - - - - + + + + + + + + + + @build.Source } diff --git a/Lieb/Shared/MainLayout.razor.css b/Lieb/Shared/MainLayout.razor.css index 9aaa1fb..1da0212 100644 --- a/Lieb/Shared/MainLayout.razor.css +++ b/Lieb/Shared/MainLayout.razor.css @@ -11,7 +11,7 @@ main { } .sidebar { - background-image: linear-gradient(180deg, rgb(21 11 181) 0%, #19784c 70%); + background-image: linear-gradient(180deg, rgb(0 0 0) 0%, #932c36 70%); } .loginText {