Update to profile cards to display now-playing (#427)
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
using System.Data;
|
using System.Data;
|
||||||
|
using gaseous_server.Classes.Metadata;
|
||||||
|
using IGDB.Models;
|
||||||
|
|
||||||
namespace gaseous_server.Classes
|
namespace gaseous_server.Classes
|
||||||
{
|
{
|
||||||
@@ -15,8 +17,9 @@ namespace gaseous_server.Classes
|
|||||||
|
|
||||||
public Models.UserProfile? GetUserProfile(string UserId)
|
public Models.UserProfile? GetUserProfile(string UserId)
|
||||||
{
|
{
|
||||||
|
// build the user profile object
|
||||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||||
string sql = "SELECT Id, DisplayName, Quip, AvatarExtension, ProfileBackgroundExtension, UnstructuredData FROM UserProfiles WHERE Id = @userid;";
|
string sql = "SELECT Id, UserId, DisplayName, Quip, AvatarExtension, ProfileBackgroundExtension, UnstructuredData FROM UserProfiles WHERE Id = @userid;";
|
||||||
Dictionary<string, object> dbDict = new Dictionary<string, object>{
|
Dictionary<string, object> dbDict = new Dictionary<string, object>{
|
||||||
{ "userid", UserId }
|
{ "userid", UserId }
|
||||||
};
|
};
|
||||||
@@ -48,6 +51,24 @@ namespace gaseous_server.Classes
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get now playing game - if available
|
||||||
|
Models.UserProfile.NowPlayingItem? NowPlaying = null;
|
||||||
|
sql = "SELECT * FROM `view_UserTimeTracking` WHERE UserId = @userid AND UTC_TIMESTAMP() BETWEEN SessionTime AND DATE_ADD(SessionEnd, INTERVAL 2 MINUTE) ORDER BY SessionEnd DESC LIMIT 1;";
|
||||||
|
dbDict = new Dictionary<string, object>{
|
||||||
|
{ "userid", data.Rows[0]["UserId"].ToString() }
|
||||||
|
};
|
||||||
|
DataTable nowPlayingData = db.ExecuteCMD(sql, dbDict);
|
||||||
|
if (nowPlayingData.Rows.Count > 0)
|
||||||
|
{
|
||||||
|
NowPlaying = new Models.UserProfile.NowPlayingItem
|
||||||
|
{
|
||||||
|
Game = Games.GetGame((long)nowPlayingData.Rows[0]["GameId"], false, false, false),
|
||||||
|
Platform = Platforms.GetPlatform((long)nowPlayingData.Rows[0]["PlatformId"], false, false),
|
||||||
|
Duration = Convert.ToInt64(nowPlayingData.Rows[0]["SessionLength"])
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the user profile object
|
||||||
return new Models.UserProfile
|
return new Models.UserProfile
|
||||||
{
|
{
|
||||||
UserId = Guid.Parse(data.Rows[0]["Id"].ToString()),
|
UserId = Guid.Parse(data.Rows[0]["Id"].ToString()),
|
||||||
@@ -55,6 +76,7 @@ namespace gaseous_server.Classes
|
|||||||
Quip = data.Rows[0]["Quip"].ToString(),
|
Quip = data.Rows[0]["Quip"].ToString(),
|
||||||
Avatar = Avatar,
|
Avatar = Avatar,
|
||||||
ProfileBackground = ProfileBackground,
|
ProfileBackground = ProfileBackground,
|
||||||
|
NowPlaying = NowPlaying,
|
||||||
Data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(data.Rows[0]["UnstructuredData"].ToString())
|
Data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(data.Rows[0]["UnstructuredData"].ToString())
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -31,7 +31,7 @@ namespace gaseous_server.Controllers
|
|||||||
[Route("{UserId}")]
|
[Route("{UserId}")]
|
||||||
[ProducesResponseType(typeof(Models.UserProfile), StatusCodes.Status200OK)]
|
[ProducesResponseType(typeof(Models.UserProfile), StatusCodes.Status200OK)]
|
||||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
[ResponseCache(CacheProfileName = "5Minute")]
|
[ResponseCache(CacheProfileName = "Default30")]
|
||||||
public ActionResult GetUserProfile(string UserId)
|
public ActionResult GetUserProfile(string UserId)
|
||||||
{
|
{
|
||||||
Classes.UserProfile profile = new Classes.UserProfile();
|
Classes.UserProfile profile = new Classes.UserProfile();
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
using IGDB.Models;
|
||||||
|
|
||||||
namespace gaseous_server.Models
|
namespace gaseous_server.Models
|
||||||
{
|
{
|
||||||
public class UserProfile
|
public class UserProfile
|
||||||
@@ -5,6 +7,13 @@ namespace gaseous_server.Models
|
|||||||
public Guid UserId { get; set; }
|
public Guid UserId { get; set; }
|
||||||
public string DisplayName { get; set; }
|
public string DisplayName { get; set; }
|
||||||
public string Quip { get; set; }
|
public string Quip { get; set; }
|
||||||
|
public NowPlayingItem? NowPlaying { get; set; }
|
||||||
|
public class NowPlayingItem
|
||||||
|
{
|
||||||
|
public Game Game { get; set; }
|
||||||
|
public Platform Platform { get; set; }
|
||||||
|
public long Duration { get; set; }
|
||||||
|
}
|
||||||
public ProfileImageItem? Avatar { get; set; }
|
public ProfileImageItem? Avatar { get; set; }
|
||||||
public ProfileImageItem? ProfileBackground { get; set; }
|
public ProfileImageItem? ProfileBackground { get; set; }
|
||||||
public Dictionary<string, object> Data { get; set; }
|
public Dictionary<string, object> Data { get; set; }
|
||||||
|
@@ -91,3 +91,9 @@ SELECT `Games_Roms`.*, CONCAT(
|
|||||||
FROM
|
FROM
|
||||||
`Games_Roms`
|
`Games_Roms`
|
||||||
JOIN `GameLibraries` ON `Games_Roms`.`LibraryId` = `GameLibraries`.`Id`;
|
JOIN `GameLibraries` ON `Games_Roms`.`LibraryId` = `GameLibraries`.`Id`;
|
||||||
|
|
||||||
|
CREATE VIEW view_UserTimeTracking AS
|
||||||
|
SELECT *, DATE_ADD(
|
||||||
|
SessionTime, INTERVAL SessionLength MINUTE
|
||||||
|
) AS SessionEnd
|
||||||
|
FROM UserTimeTracking;
|
@@ -366,6 +366,18 @@ class ProfileCard {
|
|||||||
this.Quip.classList.add('profile-card-quip');
|
this.Quip.classList.add('profile-card-quip');
|
||||||
this.ProfileBody = document.createElement('div');
|
this.ProfileBody = document.createElement('div');
|
||||||
this.ProfileBody.classList.add('profile-card-body');
|
this.ProfileBody.classList.add('profile-card-body');
|
||||||
|
this.ProfileNowPlaying = document.createElement('div');
|
||||||
|
this.ProfileNowPlaying.classList.add('profile-card-now-playing-body');
|
||||||
|
this.ProfileNowPlayingLabel = document.createElement('div');
|
||||||
|
this.ProfileNowPlayingLabel.classList.add('profile-card-now-playing-label');
|
||||||
|
this.ProfileNowPlayingCover = document.createElement('div');
|
||||||
|
this.ProfileNowPlayingCover.classList.add('profile-card-now-playing-cover');
|
||||||
|
this.ProfileNowPlayingTitle = document.createElement('div');
|
||||||
|
this.ProfileNowPlayingTitle.classList.add('profile-card-now-playing-title');
|
||||||
|
this.ProfileNowPlayingPlatform = document.createElement('div');
|
||||||
|
this.ProfileNowPlayingPlatform.classList.add('profile-card-now-playing-platform');
|
||||||
|
this.ProfileNowPlayingDuration = document.createElement('div');
|
||||||
|
this.ProfileNowPlayingDuration.classList.add('profile-card-now-playing-duration');
|
||||||
this.Avatar = document.createElement('div');
|
this.Avatar = document.createElement('div');
|
||||||
this.Avatar.classList.add('profile-card-avatar');
|
this.Avatar.classList.add('profile-card-avatar');
|
||||||
|
|
||||||
@@ -375,12 +387,28 @@ class ProfileCard {
|
|||||||
this.ProfileBody.appendChild(this.DisplayName);
|
this.ProfileBody.appendChild(this.DisplayName);
|
||||||
this.ProfileBody.appendChild(this.Quip);
|
this.ProfileBody.appendChild(this.Quip);
|
||||||
|
|
||||||
|
// now playing
|
||||||
|
this.ProfileNowPlaying.appendChild(this.ProfileNowPlayingLabel);
|
||||||
|
this.ProfileNowPlaying.appendChild(this.ProfileNowPlayingCover);
|
||||||
|
this.ProfileNowPlaying.appendChild(this.ProfileNowPlayingTitle);
|
||||||
|
this.ProfileNowPlaying.appendChild(this.ProfileNowPlayingPlatform);
|
||||||
|
this.ProfileNowPlaying.appendChild(this.ProfileNowPlayingDuration);
|
||||||
|
|
||||||
// assemble card
|
// assemble card
|
||||||
this.Card.appendChild(this.BackgroundImage);
|
this.Card.appendChild(this.BackgroundImage);
|
||||||
this.Card.appendChild(this.ProfileBody);
|
this.Card.appendChild(this.ProfileBody);
|
||||||
|
this.Card.appendChild(this.ProfileNowPlaying);
|
||||||
this.Card.appendChild(this.Avatar);
|
this.Card.appendChild(this.Avatar);
|
||||||
|
|
||||||
|
this.ProfileData = null;
|
||||||
const response = this.#FetchProfile(this);
|
const response = this.#FetchProfile(this);
|
||||||
|
|
||||||
|
// set timeout to refresh the profile card every 30 seconds
|
||||||
|
let callingObject = this;
|
||||||
|
setInterval(function () {
|
||||||
|
callingObject.#FetchProfile(callingObject);
|
||||||
|
}, 30000);
|
||||||
|
|
||||||
return this.Card;
|
return this.Card;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -392,12 +420,57 @@ class ProfileCard {
|
|||||||
} else {
|
} else {
|
||||||
const profile = await response.json();
|
const profile = await response.json();
|
||||||
if (profile) {
|
if (profile) {
|
||||||
this.Avatar.appendChild(new Avatar(callingObject.ProfileId, 50, 50));
|
let stillUpdateAnyway = false;
|
||||||
if (profile.profileBackground) {
|
if (callingObject.ProfileData === null) {
|
||||||
this.BackgroundImage.style = "background-image: url('/api/v1.1/UserProfile/" + callingObject.ProfileId + "/Background');";
|
callingObject.ProfileData = profile;
|
||||||
|
stillUpdateAnyway = true;
|
||||||
}
|
}
|
||||||
this.DisplayName.innerHTML = profile.displayName;
|
|
||||||
this.Quip.innerHTML = profile.quip;
|
// update avatar if different
|
||||||
|
if (callingObject.ProfileData.avatar !== profile.avatar || stillUpdateAnyway === true) {
|
||||||
|
callingObject.Avatar.innerHTML = "";
|
||||||
|
callingObject.Avatar.appendChild(new Avatar(callingObject.ProfileId, 50, 50));
|
||||||
|
}
|
||||||
|
|
||||||
|
// update profile background if different
|
||||||
|
if (callingObject.ProfileData.profileBackground !== profile.profileBackground || stillUpdateAnyway === true) {
|
||||||
|
if (profile.profileBackground) {
|
||||||
|
callingObject.BackgroundImage.style = "background-image: url('/api/v1.1/UserProfile/" + callingObject.ProfileId + "/Background');";
|
||||||
|
} else {
|
||||||
|
callingObject.BackgroundImage.style = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// update display name if different
|
||||||
|
if (callingObject.ProfileData.displayName !== profile.displayName || stillUpdateAnyway === true) {
|
||||||
|
callingObject.DisplayName.innerHTML = profile.displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update quip if different
|
||||||
|
if (callingObject.ProfileData.quip !== profile.quip || stillUpdateAnyway === true) {
|
||||||
|
callingObject.Quip.innerHTML = profile.quip;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (profile.nowPlaying) {
|
||||||
|
callingObject.ProfileNowPlayingLabel.innerHTML = "Now Playing";
|
||||||
|
if (profile.nowPlaying.game.cover) {
|
||||||
|
callingObject.ProfileNowPlayingCover.style = "background-image: url('/api/v1.1/Games/" + profile.nowPlaying.game.id + "/cover/" + profile.nowPlaying.game.cover.id + "/image/cover_big/" + profile.nowPlaying.game.cover.id + ".jpg');";
|
||||||
|
} else {
|
||||||
|
callingObject.ProfileNowPlayingCover.style = "background-image: url('/images/unknowngame.png');";
|
||||||
|
}
|
||||||
|
callingObject.ProfileNowPlayingTitle.innerHTML = profile.nowPlaying.game.name;
|
||||||
|
callingObject.ProfileNowPlayingPlatform.innerHTML = profile.nowPlaying.platform.name;
|
||||||
|
if (profile.nowPlaying.duration === 1) {
|
||||||
|
callingObject.ProfileNowPlayingDuration.innerHTML = profile.nowPlaying.duration + " minute";
|
||||||
|
} else {
|
||||||
|
callingObject.ProfileNowPlayingDuration.innerHTML = profile.nowPlaying.duration + " minutes";
|
||||||
|
}
|
||||||
|
callingObject.ProfileNowPlaying.style.display = "";
|
||||||
|
} else {
|
||||||
|
callingObject.ProfileNowPlaying.style.display = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
callingObject.ProfileData = profile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -2706,6 +2706,46 @@ button:not(.select2-selection__choice__remove):not(.select2-selection__clear):no
|
|||||||
color: var(--profile-card-quip-text-color);
|
color: var(--profile-card-quip-text-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.profile-card-now-playing-body {
|
||||||
|
position: relative;
|
||||||
|
min-height: 70px;
|
||||||
|
background-color: var(--profile-card-body-background);
|
||||||
|
padding-top: 0px;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-card-now-playing-label {
|
||||||
|
font-style: italic;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-card-now-playing-cover {
|
||||||
|
position: absolute;
|
||||||
|
left: 10px;
|
||||||
|
top: 25px;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-card-now-playing-title {
|
||||||
|
margin-left: 50px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-card-now-playing-platform {
|
||||||
|
margin-left: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-card-now-playing-duration {
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-left: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
.password-rules {
|
.password-rules {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
|
Reference in New Issue
Block a user