mirror of
https://github.com/spacebarchat/server.git
synced 2026-07-20 02:40:55 +00:00
Include presence in op14 response
This commit is contained in:
@@ -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}";
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user