diff --git a/README.md b/README.md
index 225d9eb..9fc5f15 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,13 @@ A server emulator which allows you to play older versions of warframe,through to
This work is based off of the SpaceNinjaServer project, with additional reverse engineering in order to accommodate the different endpoint structures.
Currently using .net9 and sqlite for persistence, linux and windows are both supported and builds are self contained, so no runtime install is necessary.
+# Getting started
+
+Unzip the pacakge, double click the exec, connect via localhost:5001 (or 5000, I can't remmber). The db is now created for you and migrations should be totally automatic.
+
+
+
+
# Currently Tested Versions
| Version | Build Id | Manifest Id| Items not working? | Notes |
@@ -39,13 +46,13 @@ This is not a comprehensive list of features, just the ones that really seem to
| Initial Training and Warframe Selection | Gameplay || Fully ||
| Complete Mastery Rank Challenges| Gameplay || Fully ||
| Attach system wide artifact| Gameplay || Fully |This is not actually an api endpoint, but instead relies on returnign inventory correctly|
-| Obtain daily login reward| || Fully | This is customizable and uses older documentation for the rewards listing. Current state drop table percentage is not period accurate |
-| Get the world state | || Partially | Can be configured via db, alerts work for the most part. operations are not implemented|
-| Validate daily mission bonus status| || Fully | |
-| purchase more revives || Fully ||
-| update taunt state | ||Fully*| There may be a bug surrounding the initial lotus explanation after completing training |
+| Obtain daily login reward| Gameplay || Fully | This is customizable and uses older documentation for the rewards listing. Current state drop table percentage is not period accurate |
+| Get the world state | Gameplay || Partially | Can be configured via db, alerts work for the most part. operations are not implemented|
+| Validate daily mission bonus status| Gameplay || Fully | |
+| purchase more revives | Economy || Fully ||
+| update taunt state | Gameplay ||Fully*| There may be a bug surrounding the initial lotus explanation after completing training |
| Get updated credits/plat| Economy || Fully ||
-| Purchase Item | ||Some work started||
+| Purchase Item | Economy ||Some work started||
| Craft item in Foundry | Foundry ||Partial|Not all recipes are parsed / available in db|
| Claim Foundry Item|Foundry || Fully ||
| Instantly complete item in foundry| Foundry || Fully ||
@@ -63,16 +70,16 @@ This is not a comprehensive list of features, just the ones that really seem to
| Send friend request| Friends || Fully ||
| Remove friend| Friends || Fully ||
| Approve Friend request | Friends || Fully ||
-| Get friend listing |Friends || Partial / Unknown | More data might need to be returned. but list works.|
+| Get friend listing | Friends || Partial / Unknown | More data might need to be returned. but list works.|
| Set player avatar | Friends || Fully ||
| Get Guild Member Listing |Guild || Very Little | right now has hardcoded return object |
-| Create Guild| ||Nothing||
-| Remove member from Guild | ||Nothing||
-| Donate To Guild | ||Nothing||
-| Customize Guild Ranks | ||Nothing||
-| Invite to guild | ||Nothing||
-| Accept guild invite | ||Nothing||
-| change guild rank | ||Nothing||
+| Create Guild| Guild ||Nothing||
+| Remove member from Guild | Guild ||Nothing||
+| Donate To Guild | Guild ||Nothing||
+| Customize Guild Ranks | Guild ||Nothing||
+| Invite to guild | Guild ||Nothing||
+| Accept guild invite | Guild ||Nothing||
+| change guild rank | Guild ||Nothing||
| Get Messages (Api) | ||Nothing| No idea what this is and it might be a vestigial endpoint|
| Send Messages (Api) | ||Nothing| No idea what this is and it might be a vestigial endpoint|
diff --git a/src/WFClassic.Web/Data/Migrations/20250526203641_AddRewardsSeedData.Designer.cs b/src/WFClassic.Web/Data/Migrations/20250526203641_AddRewardsSeedData.Designer.cs
new file mode 100644
index 0000000..49bb9c5
--- /dev/null
+++ b/src/WFClassic.Web/Data/Migrations/20250526203641_AddRewardsSeedData.Designer.cs
@@ -0,0 +1,1641 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using WFClassic.Web.Data;
+
+#nullable disable
+
+namespace WFClassic.Web.Data.Migrations
+{
+ [DbContext(typeof(ApplicationDbContext))]
+ [Migration("20250526203641_AddRewardsSeedData")]
+ partial class AddRewardsSeedData
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "9.0.4");
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasDatabaseName("RoleNameIndex");
+
+ b.ToTable("AspNetRoles", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ClaimType")
+ .HasColumnType("TEXT");
+
+ b.Property("ClaimValue")
+ .HasColumnType("TEXT");
+
+ b.Property("RoleId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ClaimType")
+ .HasColumnType("TEXT");
+
+ b.Property("ClaimValue")
+ .HasColumnType("TEXT");
+
+ b.Property("UserId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasMaxLength(128)
+ .HasColumnType("TEXT");
+
+ b.Property("ProviderKey")
+ .HasMaxLength(128)
+ .HasColumnType("TEXT");
+
+ b.Property("ProviderDisplayName")
+ .HasColumnType("TEXT");
+
+ b.Property("UserId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("TEXT");
+
+ b.Property("RoleId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("TEXT");
+
+ b.Property("LoginProvider")
+ .HasMaxLength(128)
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .HasMaxLength(128)
+ .HasColumnType("TEXT");
+
+ b.Property("Value")
+ .HasColumnType("TEXT");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens", (string)null);
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.AlertConfiguration", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("AllowReplay")
+ .HasColumnType("INTEGER");
+
+ b.Property("CompleteTag")
+ .HasColumnType("TEXT");
+
+ b.Property("CompletionText")
+ .HasColumnType("TEXT");
+
+ b.Property("Completions")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("Description")
+ .HasColumnType("TEXT");
+
+ b.Property("Difficulty")
+ .HasColumnType("REAL");
+
+ b.Property("EndDate")
+ .HasColumnType("TEXT");
+
+ b.Property("EnemySpec")
+ .HasColumnType("TEXT");
+
+ b.Property("Faction")
+ .HasColumnType("TEXT");
+
+ b.Property("Icon")
+ .HasColumnType("TEXT");
+
+ b.Property("IntroText")
+ .HasColumnType("TEXT");
+
+ b.Property("IsActive")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("LevelOverride")
+ .HasColumnType("TEXT");
+
+ b.Property("Location")
+ .HasColumnType("TEXT");
+
+ b.Property("MaxEnemyLevel")
+ .HasColumnType("INTEGER");
+
+ b.Property("MinEnemyLevel")
+ .HasColumnType("INTEGER");
+
+ b.Property("MissionType")
+ .HasColumnType("TEXT");
+
+ b.Property("Seed")
+ .HasColumnType("INTEGER");
+
+ b.Property("StartDate")
+ .HasColumnType("TEXT");
+
+ b.Property("UniqueName")
+ .HasColumnType("TEXT");
+
+ b.Property("Unlocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("VIPAgent")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("AlertConfigurations");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.AlertEnemyConfiguration", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("AlertConfigurationId")
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("EnemyId")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("MaxSimultaneous")
+ .HasColumnType("INTEGER");
+
+ b.Property("Probability")
+ .HasColumnType("REAL");
+
+ b.Property("Tier")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AlertConfigurationId");
+
+ b.ToTable("AlertEnemyConfigurations");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.AlertRewardConfiguration", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("AlertConfigurationId")
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("Credits")
+ .HasColumnType("INTEGER");
+
+ b.Property("ItemsArray")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("RandomizedItems")
+ .HasColumnType("TEXT");
+
+ b.Property("RewardProvidedAtLocation")
+ .HasColumnType("INTEGER");
+
+ b.Property("Xp")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AlertConfigurationId");
+
+ b.ToTable("AlertRewardConfigurations");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.ApplicationUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("AccessFailedCount")
+ .HasColumnType("INTEGER");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("TEXT");
+
+ b.Property("CurrentNonce")
+ .HasColumnType("INTEGER");
+
+ b.Property("CurrentlyLoggedIn")
+ .HasColumnType("INTEGER");
+
+ b.Property("DisplayName")
+ .HasColumnType("TEXT");
+
+ b.Property("Email")
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.Property("EmailConfirmed")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastLoginTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("LockoutEnabled")
+ .HasColumnType("INTEGER");
+
+ b.Property("LockoutEnd")
+ .HasColumnType("TEXT");
+
+ b.Property("LoginStreak")
+ .HasColumnType("INTEGER");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.Property("PasswordHash")
+ .HasColumnType("TEXT");
+
+ b.Property("PhoneNumber")
+ .HasColumnType("TEXT");
+
+ b.Property("PhoneNumberConfirmed")
+ .HasColumnType("INTEGER");
+
+ b.Property("SecurityStamp")
+ .HasColumnType("TEXT");
+
+ b.Property("SteamId")
+ .HasColumnType("TEXT");
+
+ b.Property("TotalNumberOfDaysLoginCount")
+ .HasColumnType("INTEGER");
+
+ b.Property("TwoFactorEnabled")
+ .HasColumnType("INTEGER");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasDatabaseName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasDatabaseName("UserNameIndex");
+
+ b.ToTable("AspNetUsers", (string)null);
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.BankAccount", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("BankAccountType")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("CurrentBalance")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("PlayerId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlayerId");
+
+ b.ToTable("BankAccounts");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.BankAccountTransaction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("Amount")
+ .HasColumnType("INTEGER");
+
+ b.Property("BankAccountId")
+ .HasColumnType("TEXT");
+
+ b.Property("BankAccountTransactionType")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("MemoCode")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BankAccountId");
+
+ b.ToTable("BankAccountsTransaction");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.DailyRewardDefinition", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("Amount")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("DisplayName")
+ .HasColumnType("TEXT");
+
+ b.Property("Icon")
+ .HasColumnType("TEXT");
+
+ b.Property("ItemType")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("ProductCategory")
+ .HasColumnType("TEXT");
+
+ b.Property("RandLowerBound")
+ .HasColumnType("INTEGER");
+
+ b.Property("RandUpperBound")
+ .HasColumnType("INTEGER");
+
+ b.Property("Rarity")
+ .HasColumnType("TEXT");
+
+ b.Property("RewardType")
+ .HasColumnType("TEXT");
+
+ b.Property("StreakEndDate")
+ .HasColumnType("INTEGER");
+
+ b.Property("StreakStartDate")
+ .HasColumnType("INTEGER");
+
+ b.Property("Tier")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.ToTable("DailyRewardDefinitions");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.FriendshipRequest", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("FriendId")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("RequestAcceptedOrDeclinedOn")
+ .HasColumnType("TEXT");
+
+ b.Property("RequestStatus")
+ .HasColumnType("INTEGER");
+
+ b.Property("RequestorId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FriendId");
+
+ b.HasIndex("RequestorId");
+
+ b.ToTable("FriendshipRequests");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.InventoryBin", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("Extra")
+ .HasColumnType("INTEGER");
+
+ b.Property("InventoryBinType")
+ .HasColumnType("INTEGER");
+
+ b.Property("InventoryId")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("Slots")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InventoryId");
+
+ b.ToTable("InventoryBins");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.InventoryItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("Charge")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("ExpiryDate")
+ .HasColumnType("TEXT");
+
+ b.Property("ExtraCapacity")
+ .HasColumnType("INTEGER");
+
+ b.Property("ExtraRemaining")
+ .HasColumnType("INTEGER");
+
+ b.Property("InternalInventoryItemType")
+ .HasColumnType("INTEGER");
+
+ b.Property("ItemCount")
+ .HasColumnType("INTEGER");
+
+ b.Property("ItemName")
+ .HasColumnType("TEXT");
+
+ b.Property("ItemType")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("PlayerId")
+ .HasColumnType("TEXT");
+
+ b.Property("UnlockLevel")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpgradeFingerprint")
+ .HasColumnType("TEXT");
+
+ b.Property("UpgradeVer")
+ .HasColumnType("INTEGER");
+
+ b.Property("XP")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlayerId");
+
+ b.ToTable("InventoryItems");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.InventoryItemAttachment", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("AttachedInventoryItemId")
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("ParentInventoryItemId")
+ .HasColumnType("TEXT");
+
+ b.Property("Slot")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AttachedInventoryItemId");
+
+ b.HasIndex("ParentInventoryItemId");
+
+ b.ToTable("InventoryItemAttachments");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.LoginTrackingItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("ApplicationUserId")
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("IPAddress")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("LoginTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("LogoutTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("Nonce")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ApplicationUserId");
+
+ b.ToTable("LoginTrackingItems");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.MarketPackageDefinition", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CanBePurchasedMultipleTimes")
+ .HasColumnType("INTEGER");
+
+ b.Property("CanBePurchasedWithCredits")
+ .HasColumnType("INTEGER");
+
+ b.Property("CanBePurchasedWithPlat")
+ .HasColumnType("INTEGER");
+
+ b.Property("CostInCredits")
+ .HasColumnType("INTEGER");
+
+ b.Property("CostInPlat")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("ItemType")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("MarketPackageDefinitions");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.MarketPackageItemDefinition", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("AddInventoryBin")
+ .HasColumnType("INTEGER");
+
+ b.Property("CanBeAddedRepeatedly")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("ExtraCapacity")
+ .HasColumnType("INTEGER");
+
+ b.Property("InternalInventoryItemType")
+ .HasColumnType("INTEGER");
+
+ b.Property("InventoryBinTypeToAdd")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsUniqueItem")
+ .HasColumnType("INTEGER");
+
+ b.Property("ItemCountToBeAdded")
+ .HasColumnType("INTEGER");
+
+ b.Property("ItemName")
+ .HasColumnType("TEXT");
+
+ b.Property("ItemType")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("MarketPackageDefinitionId")
+ .HasColumnType("TEXT");
+
+ b.Property("NumberOfBinsToAdd")
+ .HasColumnType("INTEGER");
+
+ b.Property("UnlockLevel")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpgradeFingerprint")
+ .HasColumnType("TEXT");
+
+ b.Property("UpgradeVer")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MarketPackageDefinitionId");
+
+ b.ToTable("MarketPackageItemDefintions");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.MetricItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("ApplicationUserId")
+ .HasColumnType("TEXT");
+
+ b.Property("AssociatedNonce")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("DisplayName")
+ .HasColumnType("TEXT");
+
+ b.Property("EventName")
+ .HasColumnType("TEXT");
+
+ b.Property("ItemCount")
+ .HasColumnType("INTEGER");
+
+ b.Property("ItemName")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("MetricType")
+ .HasColumnType("INTEGER");
+
+ b.Property("Seconds")
+ .HasColumnType("REAL");
+
+ b.Property("Set")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ApplicationUserId");
+
+ b.ToTable("MetricItems");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.Mission", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("BestRatings")
+ .HasColumnType("REAL");
+
+ b.Property("Completes")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("PlayerId")
+ .HasColumnType("TEXT");
+
+ b.Property("Tag")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlayerId");
+
+ b.ToTable("Missions");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.MissionReport", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("FullReport")
+ .HasColumnType("INTEGER");
+
+ b.Property("HostId")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("MissionName")
+ .HasColumnType("TEXT");
+
+ b.Property("MissionStartTime")
+ .HasColumnType("TEXT");
+
+ b.Property("Nonce")
+ .HasColumnType("INTEGER");
+
+ b.Property("PlayerId")
+ .HasColumnType("TEXT");
+
+ b.Property("ReporterId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlayerId");
+
+ b.ToTable("MissionReports");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.PendingRecipe", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("EndingTime")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("PlayerId")
+ .HasColumnType("TEXT");
+
+ b.Property("RecipeId")
+ .HasColumnType("TEXT");
+
+ b.Property("StartingTime")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlayerId");
+
+ b.HasIndex("RecipeId");
+
+ b.ToTable("PendingRecipes");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.PersonRelationship", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("FriendId")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("PersonRelationshipType")
+ .HasColumnType("INTEGER");
+
+ b.Property("UserId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FriendId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("PersonRelationships");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.Player", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("ActiveAvatarImageType")
+ .HasColumnType("TEXT");
+
+ b.Property("AdditionalPlayerXP")
+ .HasColumnType("INTEGER");
+
+ b.Property("ApplicationUserId")
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("CurrentLoadout")
+ .HasColumnType("TEXT");
+
+ b.Property("Founder")
+ .HasColumnType("TEXT");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("PlayerLevel")
+ .HasColumnType("INTEGER");
+
+ b.Property("PlayerXP")
+ .HasColumnType("INTEGER");
+
+ b.Property("Rating")
+ .HasColumnType("INTEGER");
+
+ b.Property("ReceivedStartingGear")
+ .HasColumnType("INTEGER");
+
+ b.Property("SubscribedToEmails")
+ .HasColumnType("INTEGER");
+
+ b.Property("TrainingDate")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ApplicationUserId");
+
+ b.ToTable("Players");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.PlayerPurchaseRecord", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("CurrencyType")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastModificationTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("MarketPackageDefinitionId")
+ .HasColumnType("TEXT");
+
+ b.Property("PlayerID")
+ .HasColumnType("TEXT");
+
+ b.Property("PurchaseAmount")
+ .HasColumnType("INTEGER");
+
+ b.Property("PurchaseDate")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MarketPackageDefinitionId");
+
+ b.HasIndex("PlayerID");
+
+ b.ToTable("PlayerPurchaseRecord");
+ });
+
+ modelBuilder.Entity("WFClassic.Web.Data.Models.PlayerReport", b =>
+ {
+ b.Property