mirror of
https://github.com/LBPUnion/ProjectLighthouse.git
synced 2025-07-28 07:58:40 +00:00
Allow profile card to be actually moved
This commit is contained in:
parent
b2428b6ba8
commit
af5871c135
2 changed files with 47 additions and 7 deletions
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
|
@ -35,32 +36,71 @@ namespace ProjectLighthouse.Controllers {
|
||||||
if(user == null) return this.BadRequest();
|
if(user == null) return this.BadRequest();
|
||||||
|
|
||||||
XmlReaderSettings settings = new() {
|
XmlReaderSettings settings = new() {
|
||||||
Async = true
|
Async = true // this is apparently not default
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool locationChanged = false;
|
||||||
|
|
||||||
|
// this is an absolute mess, but necessary because LBP only sends what changed
|
||||||
|
//
|
||||||
|
// example for changing profile card location:
|
||||||
|
// <updateUser>
|
||||||
|
// <location>
|
||||||
|
// <x>1234</x>
|
||||||
|
// <y>1234</y>
|
||||||
|
// </location>
|
||||||
|
// </updateUser>
|
||||||
|
//
|
||||||
|
// example for changing biography:
|
||||||
|
// <updateUser>
|
||||||
|
// <biography>biography stuff</biography>
|
||||||
|
// </updateUser>
|
||||||
|
//
|
||||||
|
// if you find a way to make it not stupid feel free to replace this
|
||||||
using(XmlReader reader = XmlReader.Create(Request.Body, settings)) {
|
using(XmlReader reader = XmlReader.Create(Request.Body, settings)) {
|
||||||
string currentElement = "";
|
List<string> path = new(); // you can think of this as a file path in the XML, like <updateUser> -> <location> -> <x>
|
||||||
while(await reader.ReadAsync()) {
|
while(await reader.ReadAsync()) {
|
||||||
switch(reader.NodeType) {
|
switch(reader.NodeType) {
|
||||||
case XmlNodeType.Element:
|
case XmlNodeType.Element:
|
||||||
currentElement = reader.Name;
|
path.Add(reader.Name);
|
||||||
break;
|
break;
|
||||||
case XmlNodeType.Text:
|
case XmlNodeType.Text:
|
||||||
switch(currentElement) {
|
switch(path[1]) {
|
||||||
case "biography": {
|
case "biography": {
|
||||||
user.Biography = await reader.GetValueAsync();
|
user.Biography = await reader.GetValueAsync();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "location": {
|
||||||
|
locationChanged = true; // if we're here then we're probably about to change the location.
|
||||||
|
// ReSharper disable once ConvertIfStatementToSwitchStatement
|
||||||
|
if(path[2] == "x") {
|
||||||
|
user.Location.X = Convert.ToInt32(await reader.GetValueAsync()); // GetValue only returns a string, i guess we just hope its a number lol
|
||||||
|
} else if(path[2] == "y") {
|
||||||
|
user.Location.Y = Convert.ToInt32(await reader.GetValueAsync());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case XmlNodeType.EndElement:
|
case XmlNodeType.EndElement:
|
||||||
currentElement = "";
|
path.RemoveAt(path.Count - 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the way location on a user card works is stupid and will not save with the way below as-is, so we do the following:
|
||||||
|
if(locationChanged) { // only modify the database if we modify here
|
||||||
|
Location l = await database.Locations.Where(l => l.Id == user.LocationId).FirstOrDefaultAsync(); // find the location in the database again
|
||||||
|
|
||||||
if(database.ChangeTracker.HasChanges()) await database.SaveChangesAsync();
|
// set the location in the database to the one we modified above
|
||||||
|
l.X = user.Location.X;
|
||||||
|
l.Y = user.Location.Y;
|
||||||
|
|
||||||
|
// now both are in sync, and will update in the database.
|
||||||
|
}
|
||||||
|
|
||||||
|
if(database.ChangeTracker.HasChanges()) await database.SaveChangesAsync(); // save the user to the database if we changed anything
|
||||||
return this.Ok();
|
return this.Ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,7 +100,7 @@ namespace ProjectLighthouse.Types {
|
||||||
LbpSerializer.StringElement("photosByMeCount", this.PhotosByMeCount) +
|
LbpSerializer.StringElement("photosByMeCount", this.PhotosByMeCount) +
|
||||||
LbpSerializer.StringElement("photosWithMeCount", this.PhotosWithMeCount) +
|
LbpSerializer.StringElement("photosWithMeCount", this.PhotosWithMeCount) +
|
||||||
LbpSerializer.StringElement("commentsEnabled", this.CommentsEnabled) +
|
LbpSerializer.StringElement("commentsEnabled", this.CommentsEnabled) +
|
||||||
this.Location.Serialize() +
|
LbpSerializer.StringElement("location", this.Location.Serialize()) +
|
||||||
LbpSerializer.StringElement("favouriteSlotCount", this.FavouriteSlotCount) +
|
LbpSerializer.StringElement("favouriteSlotCount", this.FavouriteSlotCount) +
|
||||||
LbpSerializer.StringElement("favouriteUserCount", this.FavouriteUserCount) +
|
LbpSerializer.StringElement("favouriteUserCount", this.FavouriteUserCount) +
|
||||||
LbpSerializer.StringElement("lolcatftwCount", this.lolcatftwCount) +
|
LbpSerializer.StringElement("lolcatftwCount", this.lolcatftwCount) +
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue