diff --git a/Lieb/Controllers/DiscordBotController.cs b/Lieb/Controllers/DiscordBotController.cs index 962f2f7..2735983 100644 --- a/Lieb/Controllers/DiscordBotController.cs +++ b/Lieb/Controllers/DiscordBotController.cs @@ -83,7 +83,7 @@ namespace Lieb.Controllers { if(signUp.userId != 0) { - int accountId = _userService.GetMainAccount(signUp.userId).GuildWars2AccountId; + int accountId = _userService.GetSignUpAccount(signUp.userId, signUp.raidId, signUp.gw2AccountId); await _raidService.SignUp(signUp.raidId, signUp.userId, accountId, signUp.roleId, SignUpType.SignedUp, signUp.signedUpByUserId); } else @@ -98,7 +98,7 @@ namespace Lieb.Controllers { if(signUp.userId != 0) { - int accountId = _userService.GetMainAccount(signUp.userId).GuildWars2AccountId; + int accountId = _userService.GetSignUpAccount(signUp.userId, signUp.raidId, signUp.gw2AccountId); await _raidService.SignUp(signUp.raidId, signUp.userId, accountId, signUp.roleId, SignUpType.Maybe, signUp.signedUpByUserId); } else @@ -113,7 +113,7 @@ namespace Lieb.Controllers { if(signUp.userId != 0) { - int accountId = _userService.GetMainAccount(signUp.userId).GuildWars2AccountId; + int accountId = _userService.GetSignUpAccount(signUp.userId, signUp.raidId, signUp.gw2AccountId); await _raidService.SignUp(signUp.raidId, signUp.userId, accountId, signUp.roleId, SignUpType.Backup, signUp.signedUpByUserId); } else @@ -128,7 +128,7 @@ namespace Lieb.Controllers { if(signUp.userId != 0) { - int accountId = _userService.GetMainAccount(signUp.userId).GuildWars2AccountId; + int accountId = _userService.GetSignUpAccount(signUp.userId, signUp.raidId, signUp.gw2AccountId); await _raidService.SignUp(signUp.raidId, signUp.userId, accountId, signUp.roleId, SignUpType.Flex, signUp.signedUpByUserId); } else @@ -202,5 +202,41 @@ namespace Lieb.Controllers return Problem("user not found"); } + + [HttpGet] + [Route("[action]/{userId}/{raidId}")] + public ActionResult> GetSignUpAccounts(ulong userId, int raidId) + { + List accounts = _userService.GetDiscordSignUpAccounts(userId, raidId); + List apiAccounts = new List(); + + foreach(GuildWars2Account account in accounts) + { + apiAccounts.Add(new ApiGuildWars2Account(){ + AccountName = account.AccountName, + GuildWars2AccountId = account.GuildWars2AccountId + }); + } + return Ok(apiAccounts); + } + + [HttpGet] + [Route("[action]/{userId}/{command}")] + public ActionResult IsSlashCommandAllowed(ulong userId, string command) + { + switch(command) + { + case SharedConstants.SlashCommands.RAID: + if(!_raidService.IsRaidSlashCommandAllowed(userId, out string errorMessage)) + { + return Problem(errorMessage); + } + break; + default: + return Problem("command not found on server"); + break; + } + return Ok(); + } } } \ No newline at end of file diff --git a/Lieb/Data/RaidService.cs b/Lieb/Data/RaidService.cs index 1cd45cc..e64999f 100644 --- a/Lieb/Data/RaidService.cs +++ b/Lieb/Data/RaidService.cs @@ -117,6 +117,7 @@ namespace Lieb.Data if (signUpType != SignUpType.Flex && signUps.Where(r => r.SignUpType != SignUpType.Flex).Any()) { await ChangeSignUpType(raidId, liebUserId, plannedRoleId, signUpType); + await ChangeAccount(raidId, liebUserId, guildWars2AccountId); } else if (!signUps.Where(r => r.RaidRoleId == plannedRoleId).Any()) { @@ -417,6 +418,23 @@ namespace Lieb.Data return true; } + public bool IsRaidSlashCommandAllowed(ulong liebUserId, out string errorMessage) + { + errorMessage = string.Empty; + + using var context = _contextFactory.CreateDbContext(); + LiebUser user = context.LiebUsers + .Include(u => u.RoleAssignments) + .ThenInclude(a => a.LiebRole) + .FirstOrDefault(u => u.Id == liebUserId); + if (user != null && user.RoleAssignments.Max(a => a.LiebRole.Level) >= Constants.Roles.RaidLead.PowerLevel) + { + return true; + } + errorMessage = "insufficient permissions"; + return false; + } + private async Task LogSignUp(RaidSignUp signUp, string userName, ulong signedUpBy = 0) { ulong userId = signedUpBy > 0 ? signedUpBy : signUp.LiebUserId.Value; diff --git a/Lieb/Data/UserService.cs b/Lieb/Data/UserService.cs index 7020dec..ec36928 100644 --- a/Lieb/Data/UserService.cs +++ b/Lieb/Data/UserService.cs @@ -1,5 +1,6 @@ using Lieb.Models; using Lieb.Models.GuildWars2; +using Lieb.Models.GuildWars2.Raid; using Microsoft.EntityFrameworkCore; namespace Lieb.Data @@ -185,5 +186,66 @@ namespace Lieb.Data await context.SaveChangesAsync(); } } + + public List GetAllUsableAccounts(ulong userId, RaidType raidType) + { + LiebUser user = GetLiebUserGW2AccountOnly(userId); + return GetAllUsableAccounts(user, raidType); + } + + public List GetAllUsableAccounts(LiebUser user, RaidType raidType) + { + if (raidType == RaidType.Planned) + { + return user.GuildWars2Accounts.ToList(); + } + else + { + return user.GuildWars2Accounts.Where(a => a.EquippedBuilds.Count > 0).ToList(); + } + } + + public List GetDiscordSignUpAccounts(ulong userId, int raidId) + { + using var context = _contextFactory.CreateDbContext(); + LiebUser user = GetLiebUserGW2AccountOnly(userId); + Raid raid = context.Raids + .ToList() + .FirstOrDefault(r => r.RaidId == raidId, new Raid()); + + List accounts = GetAllUsableAccounts(user, raid.RaidType); + if(user.AlwaysSignUpWithMainAccount && accounts.Where(a => a.GuildWars2AccountId == user.MainGW2Account).Any()) + { + return accounts.Where(a => a.GuildWars2AccountId == user.MainGW2Account).ToList(); + } + else + { + return accounts; + } + } + + public int GetSignUpAccount(ulong userId, int raidId, int plannedAccountId) + { + using var context = _contextFactory.CreateDbContext(); + LiebUser user = GetLiebUserGW2AccountOnly(userId); + Raid raid = context.Raids + .ToList() + .FirstOrDefault(r => r.RaidId == raidId, new Raid()); + + List usableAccounts = GetAllUsableAccounts(user, raid.RaidType); + + if(usableAccounts.Where(a => a.GuildWars2AccountId == plannedAccountId).Any()) + { + return plannedAccountId; + } + if(usableAccounts.Where(a => a.GuildWars2AccountId == user.MainGW2Account).Any()) + { + return user.MainGW2Account; + } + else + { + return usableAccounts.First().GuildWars2AccountId; + } + } } } diff --git a/Lieb/Migrations/20221128221654_AddAlwaysSignUpWithMainAccount.Designer.cs b/Lieb/Migrations/20221128221654_AddAlwaysSignUpWithMainAccount.Designer.cs new file mode 100644 index 0000000..fdf449e --- /dev/null +++ b/Lieb/Migrations/20221128221654_AddAlwaysSignUpWithMainAccount.Designer.cs @@ -0,0 +1,698 @@ +// +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("20221128221654_AddAlwaysSignUpWithMainAccount")] + partial class AddAlwaysSignUpWithMainAccount + { + 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("EliteSpecialization") + .HasColumnType("INTEGER"); + + b.Property("Heal") + .HasColumnType("INTEGER"); + + b.Property("Might") + .HasColumnType("INTEGER"); + + b.Property("Quickness") + .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("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.RaidLog", b => + { + b.Property("RaidLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("LogEntry") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RaidId") + .HasColumnType("INTEGER"); + + b.Property("RaidTemplateId") + .HasColumnType("INTEGER"); + + b.Property("Time") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("RaidLogId"); + + b.HasIndex("RaidId"); + + b.HasIndex("RaidTemplateId"); + + b.HasIndex("UserId"); + + b.ToTable("RaidLog", (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("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", "Raid") + .WithMany("DiscordRaidMessages") + .HasForeignKey("RaidId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Lieb.Models.GuildWars2.Raid.RaidTemplate", null) + .WithMany("DiscordRaidMessages") + .HasForeignKey("RaidTemplateId"); + + b.Navigation("Raid"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidLog", b => + { + b.HasOne("Lieb.Models.GuildWars2.Raid.Raid", "Raid") + .WithMany("RaidLogs") + .HasForeignKey("RaidId"); + + b.HasOne("Lieb.Models.GuildWars2.Raid.RaidTemplate", "RaidTemplate") + .WithMany("TemplateLogs") + .HasForeignKey("RaidTemplateId"); + + b.HasOne("Lieb.Models.LiebUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Raid"); + + b.Navigation("RaidTemplate"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Lieb.Models.GuildWars2.Raid.RaidReminder", b => + { + b.HasOne("Lieb.Models.GuildWars2.Raid.Raid", "Raid") + .WithMany("Reminders") + .HasForeignKey("RaidId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Lieb.Models.GuildWars2.Raid.RaidTemplate", null) + .WithMany("Reminders") + .HasForeignKey("RaidTemplateId"); + + b.Navigation("Raid"); + }); + + 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("RaidLogs"); + + 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"); + + b.Navigation("TemplateLogs"); + }); + + 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/20221128221654_AddAlwaysSignUpWithMainAccount.cs b/Lieb/Migrations/20221128221654_AddAlwaysSignUpWithMainAccount.cs new file mode 100644 index 0000000..b8eaf52 --- /dev/null +++ b/Lieb/Migrations/20221128221654_AddAlwaysSignUpWithMainAccount.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Lieb.Migrations +{ + public partial class AddAlwaysSignUpWithMainAccount : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "AlwaysSignUpWithMainAccount", + table: "LiebUser", + type: "INTEGER", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "AlwaysSignUpWithMainAccount", + table: "LiebUser"); + } + } +} diff --git a/Lieb/Migrations/LiebContextModelSnapshot.cs b/Lieb/Migrations/LiebContextModelSnapshot.cs index ec70dda..4c2446f 100644 --- a/Lieb/Migrations/LiebContextModelSnapshot.cs +++ b/Lieb/Migrations/LiebContextModelSnapshot.cs @@ -457,6 +457,9 @@ namespace Lieb.Migrations b.Property("Id") .HasColumnType("INTEGER"); + b.Property("AlwaysSignUpWithMainAccount") + .HasColumnType("INTEGER"); + b.Property("BannedUntil") .HasColumnType("TEXT"); diff --git a/Lieb/Models/GuildWars2/Raid/RaidSignUp.cs b/Lieb/Models/GuildWars2/Raid/RaidSignUp.cs index ea94489..6547896 100644 --- a/Lieb/Models/GuildWars2/Raid/RaidSignUp.cs +++ b/Lieb/Models/GuildWars2/Raid/RaidSignUp.cs @@ -1,4 +1,6 @@ -namespace Lieb.Models.GuildWars2.Raid +using System.Text.Json.Serialization; + +namespace Lieb.Models.GuildWars2.Raid { public enum SignUpType { @@ -21,6 +23,7 @@ public SignUpType SignUpType { get; set; } + [JsonIgnore(Condition = JsonIgnoreCondition.Always)] public Raid Raid { get; set; } public LiebUser? LiebUser { get; set; } public GuildWars2Account? GuildWars2Account { get; set; } diff --git a/Lieb/Models/LiebUser.cs b/Lieb/Models/LiebUser.cs index bcff35f..3d8988e 100644 --- a/Lieb/Models/LiebUser.cs +++ b/Lieb/Models/LiebUser.cs @@ -19,6 +19,7 @@ namespace Lieb.Models public DateTime? Birthday { get; set; } public DateTime? BannedUntil { get; set; } public int MainGW2Account { get; set; } + public bool AlwaysSignUpWithMainAccount { get; set; } = false; public ICollection GuildWars2Accounts { get; set; } = new List(); public ICollection RoleAssignments { get; set; } = new List(); } diff --git a/Lieb/Pages/Raids/RaidOverview/RaidRoles.razor b/Lieb/Pages/Raids/RaidOverview/RaidRoles.razor index 8278f7a..c655a68 100644 --- a/Lieb/Pages/Raids/RaidOverview/RaidRoles.razor +++ b/Lieb/Pages/Raids/RaidOverview/RaidRoles.razor @@ -118,14 +118,7 @@ { if (_user != null) { - if (_raid.RaidType == RaidType.Planned) - { - _usableAccounts = _user.GuildWars2Accounts.ToList(); - } - else - { - _usableAccounts = _user.GuildWars2Accounts.Where(a => a.EquippedBuilds.Count > 0).ToList(); - } + _usableAccounts = UserService.GetAllUsableAccounts(_user.Id, _raid.RaidType); _liebUserId = _user.Id; } _expandableRoles = new List(); @@ -147,6 +140,10 @@ else { int gw2AccountId = UserService.GetMainAccount(_liebUserId).GuildWars2AccountId; + if(!_usableAccounts.Where(a => a.GuildWars2AccountId == gw2AccountId).Any()) + { + gw2AccountId = _usableAccounts.FirstOrDefault().GuildWars2AccountId; + } await RaidService.SignUp(_raid.RaidId, _liebUserId, gw2AccountId, role.RaidRoleId, signUpType); } _Parent.HasChanged(); diff --git a/SharedClasses/SharedModels/ApiGuildWars2Account.cs b/SharedClasses/SharedModels/ApiGuildWars2Account.cs new file mode 100644 index 0000000..88e439f --- /dev/null +++ b/SharedClasses/SharedModels/ApiGuildWars2Account.cs @@ -0,0 +1,9 @@ + +namespace SharedClasses.SharedModels +{ + public class ApiGuildWars2Account + { + public int GuildWars2AccountId { get; set; } + public string AccountName { get; set; } = string.Empty; + } +} \ No newline at end of file diff --git a/SharedClasses/SharedModels/SharedConstants.cs b/SharedClasses/SharedModels/SharedConstants.cs new file mode 100644 index 0000000..15c3b90 --- /dev/null +++ b/SharedClasses/SharedModels/SharedConstants.cs @@ -0,0 +1,10 @@ +namespace SharedClasses.SharedModels +{ + public class SharedConstants + { + public class SlashCommands + { + public const string RAID = "raid"; + } + } +}