summary refs log tree commit diff
path: root/extra/admin-api/DataMappings/Spacebar.DataMappings.Generic/Member.cs
blob: 040da7d7224d60b201aa3e96639e70c3e13189e2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System.Text.Json;
using Spacebar.Models.Generic;

namespace Spacebar.DataMappings.Generic;

public static class MemberExtensions
{
    public static Member ToPublicMember(this Models.Db.Models.Member member, PartialUser? partialUser = null)
    {
        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()
        };
    }

    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).FirstOrDefault()?.Status ?? "offline",
            GuildId = member.GuildId,
            Activities = onlineSessions.SelectMany(x => x.GetActivities()).ToList(),
            ClientStatus = !onlineSessions.Any() ? new() : 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
        };
    }
}