sodoff/src/Controllers/Common/AchievementController.cs
2023-08-31 21:01:55 +02:00

181 lines
6.8 KiB
C#

using System.Reflection;
using Microsoft.AspNetCore.Mvc;
using sodoff.Attributes;
using sodoff.Model;
using sodoff.Schema;
using sodoff.Services;
using sodoff.Util;
namespace sodoff.Controllers.Common;
public class AchievementController : Controller {
public readonly DBContext ctx;
private AchievementService achievementService;
public AchievementController(DBContext ctx, AchievementService achievementService) {
this.ctx = ctx;
this.achievementService = achievementService;
}
[HttpPost]
[Produces("application/xml")]
[Route("AchievementWebService.asmx/GetPetAchievementsByUserID")]
[VikingSession(UseLock=false)]
public IActionResult GetPetAchievementsByUserID(Viking viking, [FromForm] string userId) {
List<UserAchievementInfo> dragonsAchievement = new List<UserAchievementInfo>();
foreach (Dragon dragon in viking.Dragons) {
dragonsAchievement.Add(
achievementService.CreateUserAchievementInfo(dragon.EntityId, dragon.PetXP, AchievementPointTypes.DragonXP)
);
}
ArrayOfUserAchievementInfo arrAchievements = new ArrayOfUserAchievementInfo {
UserAchievementInfo = dragonsAchievement.ToArray()
};
return Ok(arrAchievements);
}
[HttpPost]
//[Produces("application/xml")]
[Route("AchievementWebService.asmx/GetAllRanks")]
public IActionResult GetAllRanks() {
// TODO, this is a placeholder
return Ok(XmlUtil.ReadResourceXmlString("allranks"));
}
[HttpPost]
//[Produces("application/xml")]
[Route("AchievementWebService.asmx/GetAchievementTaskInfo")]
public IActionResult GetAchievementTaskInfo() {
// TODO
return Ok(XmlUtil.ReadResourceXmlString("achievementtaskinfo"));
}
[HttpPost]
//[Produces("application/xml")]
[Route("AchievementWebService.asmx/GetAllRewardTypeMultiplier")]
public IActionResult GetAllRewardTypeMultiplier() {
// TODO
return Ok(XmlUtil.ReadResourceXmlString("rewardmultiplier"));
}
[HttpPost]
[Route("AchievementWebService.asmx/SetDragonXP")] // used by dragonrescue-import
[VikingSession]
public IActionResult SetDragonXP(Viking viking, [FromForm] string dragonId, [FromForm] int value) {
Dragon? dragon = viking.Dragons.FirstOrDefault(e => e.EntityId == dragonId);
if (dragon is null) {
return Conflict("Dragon not found");
}
dragon.PetXP = value;
ctx.SaveChanges();
return Ok("OK");
}
[HttpPost]
[Route("AchievementWebService.asmx/SetPlayerXP")] // used by dragonrescue-import
[VikingSession]
public IActionResult SetDragonXP(Viking viking, [FromForm] int type, [FromForm] int value) {
if (!Enum.IsDefined(typeof(AchievementPointTypes), type)) {
return Conflict("Invalid XP type");
}
AchievementPointTypes xpType = (AchievementPointTypes)type;
// TODO: we allow set currencies here, do we want this?
achievementService.SetAchievementPoints(viking, xpType, value);
ctx.SaveChanges();
return Ok("OK");
}
[HttpPost]
[Produces("application/xml")]
[Route("AchievementWebService.asmx/GetAchievementsByUserID")]
public IActionResult GetAchievementsByUserID([FromForm] string userId) {
// TODO: check session
Viking? viking = ctx.Vikings.FirstOrDefault(e => e.Id == userId);
if (viking != null) {
return Ok(new ArrayOfUserAchievementInfo {
UserAchievementInfo = new UserAchievementInfo[]{
achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerXP),
achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerFarmingXP),
achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerFishingXP),
achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.UDTPoints),
}
});
}
Dragon? dragon = ctx.Dragons.FirstOrDefault(e => e.EntityId == userId);
if (dragon != null) {
return Ok(new ArrayOfUserAchievementInfo {
UserAchievementInfo = new UserAchievementInfo[]{
achievementService.CreateUserAchievementInfo(dragon.EntityId, dragon.PetXP, AchievementPointTypes.DragonXP),
}
});
}
return null;
}
[HttpPost]
[Produces("application/xml")]
[Route("AchievementWebService.asmx/SetAchievementAndGetReward")]
[Route("AchievementWebService.asmx/SetUserAchievementAndGetReward")]
[VikingSession(UseLock=true)]
public IActionResult SetAchievementAndGetReward(Viking viking, [FromForm] int achievementID) {
var rewards = achievementService.ApplyAchievementRewardsByID(viking, achievementID);
ctx.SaveChanges();
return Ok(rewards);
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/AchievementWebService.asmx/SetUserAchievementTask")]
[DecryptRequest("achievementTaskSetRequest")]
[VikingSession(UseLock=true)]
public IActionResult SetUserAchievementTask(Viking viking) {
AchievementTaskSetRequest request = XmlUtil.DeserializeXml<AchievementTaskSetRequest>(Request.Form["achievementTaskSetRequest"]);
var response = new List<AchievementTaskSetResponse>();
foreach (var task in request.AchievementTaskSet) {
response.Add(
new AchievementTaskSetResponse {
Success = true,
UserMessage = true, // TODO: placeholder
AchievementName = "Placeholder Achievement", // TODO: placeholder
Level = 1, // TODO: placeholder
AchievementTaskGroupID = 1279, // TODO: placeholder
LastLevelCompleted = true, // TODO: placeholder
AchievementInfoID = 1279, // TODO: placeholder
AchievementRewards = achievementService.ApplyAchievementRewardsByTask(viking, task)
}
);
}
ctx.SaveChanges();
return Ok(new ArrayOfAchievementTaskSetResponse { AchievementTaskSetResponse = response.ToArray() });
}
[HttpPost]
[Produces("application/xml")]
[Route("AchievementWebService.asmx/SetAchievementByEntityIDs")]
[VikingSession]
public IActionResult SetAchievementByEntityIDs(Viking viking, [FromForm] int achievementID) {
// TODO: This is a placeholder
return Ok(new AchievementReward[1] {
new AchievementReward {
Amount = 25,
PointTypeID = AchievementPointTypes.PlayerXP,
EntityID = Guid.Parse(viking.Id),
EntityTypeID = 1,
RewardID = 552
}
});
}
}