diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 8d44f84..fc61ba4 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; +using Microsoft.EntityFrameworkCore; using sodoff.Attributes; using sodoff.Model; using sodoff.Schema; @@ -1380,6 +1381,185 @@ public class ContentController : Controller { }); } + [HttpPost] + [Produces("application/xml")] + [Route("ContentWebService.asmx/GetActiveParties")] // used by World Of Jumpstart + public IActionResult GetActiveParties() + { + List allParties = ctx.Parties.ToList(); + List userParties = new List(); + + foreach(var party in allParties) + { + if(DateTime.UtcNow >= party.ExpirationDate) + { + ctx.Parties.Remove(party); + ctx.SaveChanges(); + + continue; + } + + Viking viking = ctx.Vikings.FirstOrDefault(e => e.Id == party.VikingId); + AvatarData avatarData = XmlUtil.DeserializeXml(viking.AvatarSerialized); + UserParty userParty = new UserParty + { + DisplayName = avatarData.DisplayName, + UserName = avatarData.DisplayName, + ExpirationDate = party.ExpirationDate, + Icon = party.LocationIconAsset, + Location = party.Location, + PrivateParty = party.PrivateParty!.Value, + UserID = viking.Uid + }; + + if (party.Location == "MyNeighborhood") userParty.DisplayName = $"{userParty.UserName}'s Block Party"; + if (party.Location == "MyVIPRoomInt") userParty.DisplayName = $"{userParty.UserName}'s VIP Party"; + + userParties.Add(userParty); + } + + return Ok(new UserPartyData { NonBuddyParties = userParties.ToArray() }); + } + + [HttpPost] + [Produces("application/xml")] + [Route("ContentWebService.asmx/GetPartiesByUserID")] // used by World Of Jumpstart + public IActionResult GetPartiesByUserID([FromForm] Guid userId) + { + Viking? viking = ctx.Vikings.FirstOrDefault(e => e.Uid == userId); + List parties = new List(); + if(viking != null) + { + foreach(var party in ctx.Parties) + { + if (DateTime.UtcNow >= party.ExpirationDate) + { + ctx.Parties.Remove(party); + ctx.SaveChanges(); + + continue; + } + + AvatarData avatarData = XmlUtil.DeserializeXml(viking.AvatarSerialized); + if(party.Location == "MyNeighborhood") + { + UserPartyComplete userPartyComplete = new UserPartyComplete + { + DisplayName = avatarData.DisplayName, + UserName = avatarData.DisplayName, + ExpirationDate = party.ExpirationDate, + Icon = party.LocationIconAsset, + Location = party.Location, + PrivateParty = party.PrivateParty!.Value, + UserID = viking.Uid, + AssetBundle = "RS_DATA/PfMyNeighborhoodParty.unity3d/PfMyNeighborhoodParty" + }; + parties.Add(userPartyComplete); + } else if (party.Location == "MyVIPRoomInt") + { + UserPartyComplete userPartyComplete = new UserPartyComplete + { + DisplayName = avatarData.DisplayName, + UserName = avatarData.DisplayName, + ExpirationDate = party.ExpirationDate, + Icon = party.LocationIconAsset, + Location = party.Location, + PrivateParty = party.PrivateParty!.Value, + UserID = viking.Uid, + AssetBundle = "RS_DATA/PfMyVIPRoomIntPartyGroup.unity3d/PfMyVIPRoomIntPartyGroup" + }; + parties.Add(userPartyComplete); + } + } + + return Ok(new ArrayOfUserPartyComplete { UserPartyComplete = parties.ToArray() }); + } else + { + return Ok(new ArrayOfUserPartyComplete()); + } + } + + [HttpPost] + [Produces("application/xml")] + [Route("ContentWebService.asmx/PurchaseParty")] // used by World Of Jumpstart + [VikingSession] + public IActionResult PurchaseParty(Viking viking, [FromForm] int itemId) + { + // create a party based on bought itemid + + Party party = new Party + { + VikingId = viking.Id, + PrivateParty = false + }; + + int coinTakeaway = 0; + + switch (itemId) + { + case 2761: + party.Location = "MyNeighborhood"; + party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyLocationMyNeighborhood"; + party.ExpirationDate = DateTime.UtcNow.AddMinutes(30); + coinTakeaway = 30; + break; + case 6259: + party.Location = "MyNeighborhood"; + party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyLocationMyNeighborhood"; + party.ExpirationDate = DateTime.UtcNow.AddHours(1); + coinTakeaway = 60; + break; + case 6260: + party.Location = "MyNeighborhood"; + party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyLocationMyNeighborhood"; + party.ExpirationDate = DateTime.UtcNow.AddHours(4); + coinTakeaway = 80; + break; + case 6261: + party.Location = "MyNeighborhood"; + party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyLocationMyNeighborhood"; + party.ExpirationDate = DateTime.UtcNow.AddHours(8); + coinTakeaway = 100; + break; + case 6263: + party.Location = "MyVIPRoomInt"; + party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyDefault"; + party.ExpirationDate = DateTime.UtcNow.AddMinutes(30); + coinTakeaway = 30; + break; + case 6264: + party.Location = "MyVIPRoomInt"; + party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyDefault"; + party.ExpirationDate = DateTime.UtcNow.AddHours(1); + coinTakeaway = 60; + break; + case 6265: + party.Location = "MyVIPRoomInt"; + party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyDefault"; + party.ExpirationDate = DateTime.UtcNow.AddHours(4); + coinTakeaway = 80; + break; + case 6266: + party.Location = "MyVIPRoomInt"; + party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyDefault"; + party.ExpirationDate = DateTime.UtcNow.AddHours(8); + coinTakeaway = 100; + break; + } + + // check if party already exists + + if (ctx.Parties.Where(e => e.Location == party.Location).FirstOrDefault(e => e.VikingId == viking.Id) != null) return Ok(null); + + // take away coins + viking.AchievementPoints.FirstOrDefault(e => e.Type == (int)AchievementPointTypes.GameCurrency)!.Value -= coinTakeaway; + + ctx.Parties.Add(party); + ctx.SaveChanges(); + + return Ok(true); + } + [HttpPost] [Produces("application/xml")] [Route("ContentWebService.asmx/GetUserActivityByUserID")] diff --git a/src/Model/DBContext.cs b/src/Model/DBContext.cs index 157603b..900dcd8 100644 --- a/src/Model/DBContext.cs +++ b/src/Model/DBContext.cs @@ -20,6 +20,7 @@ public class DBContext : DbContext { public DbSet GameDataPairs { get; set; } = null!; public DbSet AchievementPoints { get; set; } = null!; public DbSet ProfileAnswers { get; set; } = null!; + public DbSet Parties { get; set; } = null!; private readonly IOptions config; public DBContext(IOptions config) { @@ -118,6 +119,9 @@ public class DBContext : DbContext { builder.Entity().HasMany(v => v.ProfileAnswers) .WithOne(e => e.Viking); + builder.Entity().HasMany(v => v.Parties) + .WithOne(e => e.Viking); + // Dragons builder.Entity().HasOne(d => d.Viking) .WithMany(e => e.Dragons) @@ -214,6 +218,9 @@ public class DBContext : DbContext { .WithMany(v => v.SavedData) .HasForeignKey(e => e.VikingId); + builder.Entity().HasOne(i => i.Viking) + .WithMany(i => i.Parties); + builder.Entity().HasOne(i => i.Viking) .WithMany(i => i.ProfileAnswers) .HasForeignKey(e => e.VikingId); diff --git a/src/Model/Party.cs b/src/Model/Party.cs new file mode 100644 index 0000000..11ea2e9 --- /dev/null +++ b/src/Model/Party.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace sodoff.Model +{ + public class Party + { + [Key] + public int Id { get; set; } + public string Location { get; set; } = null!; + public int VikingId { get; set; } + public DateTime ExpirationDate { get; set; } = DateTime.UtcNow; + public bool? PrivateParty { get; set; } + public string LocationIconAsset { get; set; } = null!; + public virtual Viking? Viking { get; set; } + } +} diff --git a/src/Model/Viking.cs b/src/Model/Viking.cs index f5f0441..0905147 100644 --- a/src/Model/Viking.cs +++ b/src/Model/Viking.cs @@ -33,5 +33,6 @@ public class Viking { public virtual ICollection GameData { get; set; } = null!; public virtual ICollection ProfileAnswers { get; set; } = null!; public virtual ICollection SavedData { get; set; } = null!; + public virtual ICollection Parties { get; set; } = null!; public virtual Dragon? SelectedDragon { get; set; } } diff --git a/src/Schema/ArrayOfUserPartyComplete.cs b/src/Schema/ArrayOfUserPartyComplete.cs new file mode 100644 index 0000000..cd6efb3 --- /dev/null +++ b/src/Schema/ArrayOfUserPartyComplete.cs @@ -0,0 +1,10 @@ +using System; +using System.Xml.Serialization; + +[XmlRoot(ElementName = "ArrayOfUserPartyComplete", Namespace = "http://api.jumpstart.com/")] +[Serializable] +public class ArrayOfUserPartyComplete +{ + [XmlElement(ElementName = "UserPartyComplete")] + public UserPartyComplete[] UserPartyComplete; +} diff --git a/src/Schema/UserParty.cs b/src/Schema/UserParty.cs new file mode 100644 index 0000000..8aa47ef --- /dev/null +++ b/src/Schema/UserParty.cs @@ -0,0 +1,33 @@ +using System.Xml.Serialization; + +namespace sodoff.Schema +{ + [XmlRoot(ElementName = "Party", Namespace = "")] + [Serializable] + public class UserParty + { + [XmlElement(ElementName = "UID")] + public Guid UserID; + + [XmlElement(ElementName = "UserName")] + public string UserName; + + [XmlElement(ElementName = "Name")] + public string DisplayName; + + [XmlElement(ElementName = "Icon")] + public string Icon; + + [XmlElement(ElementName = "Loc")] + public string Location; + + [XmlElement(ElementName = "LocIcon")] + public string LocationIcon; + + [XmlElement(ElementName = "ExpDate")] + public DateTime ExpirationDate; + + [XmlElement(ElementName = "Pvt")] + public bool PrivateParty; + } +} diff --git a/src/Schema/UserPartyComplete.cs b/src/Schema/UserPartyComplete.cs new file mode 100644 index 0000000..af10aff --- /dev/null +++ b/src/Schema/UserPartyComplete.cs @@ -0,0 +1,11 @@ +using sodoff.Schema; +using System; +using System.Xml.Serialization; + +[XmlRoot(ElementName = "PartyComplete", Namespace = "")] +[Serializable] +public class UserPartyComplete : UserParty +{ + [XmlElement(ElementName = "Asset")] + public string AssetBundle; +} diff --git a/src/Schema/UserPartyData.cs b/src/Schema/UserPartyData.cs new file mode 100644 index 0000000..bff1dc2 --- /dev/null +++ b/src/Schema/UserPartyData.cs @@ -0,0 +1,15 @@ +using System.Xml.Serialization; + +namespace sodoff.Schema +{ + [XmlRoot(ElementName = "Party", Namespace = "")] + [Serializable] + public class UserPartyData + { + [XmlElement(ElementName = "BuddyParties")] + public UserParty[] BuddyParties; + + [XmlElement(ElementName = "NonBuddyParties")] + public UserParty[] NonBuddyParties; + } +}