Include presence in op14 response

This commit is contained in:
Rory&
2026-06-23 08:40:03 +02:00
parent 6751174792
commit b327878f92
5 changed files with 72 additions and 5 deletions
@@ -20,4 +20,47 @@ public static class MemberExtensions
Roles = member.Roles.Select(x => x.Id).ToList()
};
}
public static MemberWithPresence ToPublicMemberWithPresence(this Models.Db.Models.Member member, PartialUser? partialUser = null)
{
var onlineSessions = member.IdNavigation.Sessions.Where(x => x.Status is not ("offline" or "invisible" or "unknown")).ToList();
var presence = new Presence()
{
User = partialUser ?? member.IdNavigation.ToPartialUser(),
Status = onlineSessions.OrderByDescending(x => x.LastSeen).First().Status,
GuildId = member.GuildId,
Activities = onlineSessions.SelectMany(x => x.GetActivities()).ToList(),
ClientStatus = onlineSessions.Aggregate(new Presence.ClientStatuses() { }, (res, sess) =>
{
var cs = sess.GetClientStatuses();
string? Maybe(string? source)
{
if (!string.IsNullOrWhiteSpace(source) && source is not ("offline" or "invisible" or "unknown")) return source;
return null;
}
res.Desktop ??= Maybe(cs.Desktop);
res.Embedded ??= Maybe(cs.Embedded);
res.Mobile ??= Maybe(cs.Mobile);
res.Vr ??= Maybe(cs.Vr);
res.Web ??= Maybe(cs.Web);
return res;
})
};
return new()
{
User = partialUser ?? member.IdNavigation.ToPartialUser(),
AvatarDecorationData = member.AvatarDecorationData,
Avatar = string.IsNullOrWhiteSpace(member.Avatar) ? null : member.Avatar,
Banner = string.IsNullOrWhiteSpace(member.Banner) ? null : member.Banner,
Collectibles = member.Collectibles,
DisplayNameStyles = JsonSerializer.Deserialize<DisplayNameStyle>(member.DisplayNameStyles ?? "null"),
Bio = string.IsNullOrWhiteSpace(member.Bio) ? null : member.Bio,
Nick = string.IsNullOrWhiteSpace(member.Nick) ? null : member.Nick,
Roles = member.Roles.Select(x => x.Id).ToList(),
Presence = presence
};
}
}
@@ -0,0 +1,19 @@
using System.Text.Json;
using System.Text.Json.Nodes;
using Spacebar.Models.Generic;
namespace Spacebar.DataMappings.Generic;
public static class Session
{
// TODO activity type
public static List<JsonObject> GetActivities(this Models.Db.Models.Session session)
{
return JsonSerializer.Deserialize<List<JsonObject>>(session.Activities)!;
}
public static Presence.ClientStatuses GetClientStatuses(this Models.Db.Models.Session session)
{
return JsonSerializer.Deserialize<Presence.ClientStatuses>(session.ClientStatus)!;
}
}
@@ -25,4 +25,9 @@ public static class User
System = user.System,
};
}
extension(Models.Db.Models.User user)
{
public string Tag => $"{user.Username}#{user.Discriminator}";
}
}
@@ -142,7 +142,7 @@ public class Op14Controller(ILogger<Op12Controller> logger, SpacebarAspNetAuthen
if (members.Count > 0)
{
memberList.Add(new RoleEntry() { Group = new() { Id = role.ToString(), Count = members.Count } });
memberList.AddRange(members.Select(m => (IMemberListEntry)new MemberEntry() { Member = m.ToPublicMember() }));
memberList.AddRange(members.Select(m => (IMemberListEntry)new MemberEntry() { Member = m.ToPublicMemberWithPresence() }));
}
handledRoles.Add(role);
@@ -167,7 +167,7 @@ public class Op14Controller(ILogger<Op12Controller> logger, SpacebarAspNetAuthen
if (onlineMembers.Count > 0)
{
memberList.Add(new RoleEntry() { Group = new() { Id = "online", Count = onlineMembers.Count } });
memberList.AddRange(onlineMembers.Select(m => (IMemberListEntry)new MemberEntry() { Member = m.ToPublicMember() }));
memberList.AddRange(onlineMembers.Select(m => (IMemberListEntry)new MemberEntry() { Member = m.ToPublicMemberWithPresence() }));
}
if (memberList.Count < 2000)
@@ -194,7 +194,7 @@ public class Op14Controller(ILogger<Op12Controller> logger, SpacebarAspNetAuthen
{
Group = new() { Id = "offline", Count = offlineMembers.Count }
});
memberList.AddRange(offlineMembers.Select(m => (IMemberListEntry)new MemberEntry() { Member = m.ToPublicMember() }));
memberList.AddRange(offlineMembers.Select(m => (IMemberListEntry)new MemberEntry() { Member = m.ToPublicMemberWithPresence() }));
}
}
@@ -226,5 +226,5 @@ internal struct RoleEntry : IMemberListEntry
internal struct MemberEntry : IMemberListEntry
{
[JsonPropertyName("member")]
public Member Member { get; set; }
public MemberWithPresence Member { get; set; }
}
@@ -4,6 +4,6 @@ namespace Spacebar.GatewayOffload.Extensions.Db;
public static class UserExtensions {
extension(User user) {
public string Tag => $"{user.Username}#{user.Discriminator}";
}
}