retain mission progress

This commit is contained in:
Spirtix 2023-06-21 15:17:57 +02:00
parent 2c195832f5
commit 0e017483f1
3 changed files with 60 additions and 3 deletions

View File

@ -223,7 +223,22 @@ public class ContentController : Controller {
public IActionResult GetUserActiveMissionState([FromForm] string apiToken, [FromForm] string userId) { public IActionResult GetUserActiveMissionState([FromForm] string apiToken, [FromForm] string userId) {
Session? session = ctx.Sessions.FirstOrDefault(s => s.ApiToken == apiToken); Session? session = ctx.Sessions.FirstOrDefault(s => s.ApiToken == apiToken);
UserMissionStateResult result = new UserMissionStateResult { Missions = new List<Mission>() }; UserMissionStateResult result = new UserMissionStateResult { Missions = new List<Mission>() };
result.Missions.Add(XmlUtil.DeserializeXml<Mission>(XmlUtil.ReadResourceXmlString("tutorialmission"))); Mission tutorial = XmlUtil.DeserializeXml<Mission>(XmlUtil.ReadResourceXmlString("tutorialmission"));
// Update the mission with completed tasks
List<Model.TaskStatus> taskStatuses = ctx.TaskStatuses.Where(e => e.VikingId == userId && e.MissionId == tutorial.MissionID).ToList();
foreach (var task in taskStatuses) {
RuleItem? rule = tutorial.MissionRule.Criteria.RuleItems.Find(x => x.ID == task.Id);
if (rule != null && task.Completed) rule.Complete = 1;
Schema.Task? t = tutorial.Tasks.Find(x => x.TaskID == task.Id);
if (t != null) {
if (task.Completed) t.Completed = 1;
t.Payload = task.Payload;
}
}
result.Missions.Add(tutorial);
if (session is null) if (session is null)
return Ok("error"); return Ok("error");
@ -249,8 +264,28 @@ public class ContentController : Controller {
[HttpPost] [HttpPost]
[Produces("application/xml")] [Produces("application/xml")]
[Route("V2/ContentWebService.asmx/SetTaskState")] [Route("V2/ContentWebService.asmx/SetTaskState")]
public IActionResult SetTaskState([FromForm] string apiToken, [FromForm] int missionId, [FromForm] int taskId, [FromForm] bool completed) { public IActionResult SetTaskState([FromForm] string apiToken, [FromForm] string userId, [FromForm] int missionId, [FromForm] int taskId, [FromForm] bool completed, [FromForm] string xmlPayload) {
// TODO Session? session = ctx.Sessions.FirstOrDefault(s => s.ApiToken == apiToken);
if (session is null || session.VikingId != userId)
return Ok(new SetTaskStateResult { Success = false, Status = SetTaskStateStatus.Unknown });
Model.TaskStatus? status = ctx.TaskStatuses.FirstOrDefault(task => task.Id == taskId && task.MissionId == missionId && task.VikingId == userId);
if (status is null) {
status = new Model.TaskStatus {
Id = taskId,
MissionId = missionId,
VikingId = userId,
Payload = xmlPayload,
Completed = completed
};
ctx.TaskStatuses.Add(status);
} else {
status.Payload = xmlPayload;
status.Completed = completed;
}
ctx.SaveChanges();
return Ok(new SetTaskStateResult { Success = true, Status = SetTaskStateStatus.TaskCanBeDone }); return Ok(new SetTaskStateResult { Success = true, Status = SetTaskStateStatus.TaskCanBeDone });
} }
} }

View File

@ -7,6 +7,7 @@ public class DBContext : DbContext {
public DbSet<Session> Sessions { get; set; } = null!; public DbSet<Session> Sessions { get; set; } = null!;
public DbSet<Pair> Pairs { get; set; } = null!; public DbSet<Pair> Pairs { get; set; } = null!;
public DbSet<PairData> PairData { get; set; } = null!; public DbSet<PairData> PairData { get; set; } = null!;
public DbSet<TaskStatus> TaskStatuses { get; set; } = null!;
public string DbPath { get; } public string DbPath { get; }
public DBContext() { public DBContext() {
@ -49,5 +50,11 @@ public class DBContext : DbContext {
.WithMany(pd => pd.Pairs) .WithMany(pd => pd.Pairs)
.HasForeignKey(p => p.MasterId) .HasForeignKey(p => p.MasterId)
.HasPrincipalKey(e => e.Id); .HasPrincipalKey(e => e.Id);
builder.Entity<TaskStatus>().HasKey(e => new { e.Id, e.VikingId, e.MissionId });
builder.Entity<TaskStatus>()
.HasOne(t => t.Viking)
.WithMany();
} }
} }

15
src/Model/TaskStatus.cs Normal file
View File

@ -0,0 +1,15 @@
namespace sodoff.Model {
public class TaskStatus {
public int Id { get; set; }
public int MissionId { get; set; }
public string VikingId { get; set; } = null!;
public virtual Viking? Viking { get; set; }
public string? Payload { get; set; }
public bool Completed { get; set; } = false;
}
}