From 787cf1a9dd3e7b25b4fe93a5ac506833aefd6ca2 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Thu, 8 Sep 2022 00:46:15 +1000 Subject: Session sorting and invisible members --- src/gateway/opcodes/LazyRequest.ts | 41 ++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/gateway/opcodes/LazyRequest.ts b/src/gateway/opcodes/LazyRequest.ts index ea69779e..f489b2fd 100644 --- a/src/gateway/opcodes/LazyRequest.ts +++ b/src/gateway/opcodes/LazyRequest.ts @@ -38,12 +38,19 @@ async function getMembers(guild_id: string, range: [number, number]) { .map((m) => m.roles) .flat() .unique((r: Role) => r.id); + // add online role + member_roles.push( + member_roles.splice( + member_roles.findIndex((x => x.id == x.guild_id)), + 1 + )[0] + ); const offlineItems = []; for (const role of member_roles) { // @ts-ignore - const [role_members, other_members] = partition(members, (m: Member) => m.roles.find((r) => r.id === role.id)); + const [role_members, other_members]: Member[][] = partition(members, (m: Member) => m.roles.find((r) => r.id === role.id)); const group = { count: role_members.length, id: role.id === guild_id ? "online" : role.id @@ -55,7 +62,19 @@ async function getMembers(guild_id: string, range: [number, number]) { for (const member of role_members) { const roles = member.roles.filter((x: Role) => x.id !== guild_id).map((x: Role) => x.id); - const session = member.user.sessions.first(); + const statusPriority = { + "online": 0, + "idle": 1, + "dnd": 2, + "invisible": 3, + "offline": 4, // for ts, will never be accessed + }; + const sessions = member.user.sessions.sort((a, b) => { + // activities are higher priority than status + return (statusPriority[a.status] - statusPriority[b.status]) + + ((a.activities.length - b.activities.length) * 2); + }); + const session = sessions.first(); // TODO: properly mock/hide offline/invisible status const item = { @@ -71,7 +90,9 @@ async function getMembers(guild_id: string, range: [number, number]) { } }; - if (!member?.user?.sessions || !member.user.sessions.length) { + if (!session || session.status == "invisible") { + item.member.presence.status = "offline"; + item.member.presence.activities = []; offlineItems.push(item); group.count--; continue; @@ -122,12 +143,18 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) { ops.forEach((op) => { op.members.forEach(async (member) => { + if (!member) return; if (this.events[member.user.id]) return; // already subscribed as friend if (this.member_events[member.user.id]) return; // already subscribed in member list this.member_events[member.user.id] = await listenEvent(member.user.id, handlePresenceUpdate.bind(this), this.listen_options); }); }); + const groups = ops + .map((x) => x.groups) + .flat() + .unique(); + return Send(this, { op: OPCODES.Dispatch, s: this.sequence++, @@ -138,14 +165,12 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) { op: "SYNC", range: x.range })), - online_count: member_count, + // remove offline members from count + online_count: member_count - (groups.find(x => x.id == "ofline")?.count ?? 0), member_count, id: "everyone", guild_id, - groups: ops - .map((x) => x.groups) - .flat() - .unique() + groups, } }); } -- cgit 1.5.1 From ad0245f15f0494d152e77f34c4852cc41741f1f6 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Fri, 9 Sep 2022 20:06:02 +1000 Subject: Fix typo --- src/gateway/opcodes/LazyRequest.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gateway/opcodes/LazyRequest.ts b/src/gateway/opcodes/LazyRequest.ts index f489b2fd..129c9ce3 100644 --- a/src/gateway/opcodes/LazyRequest.ts +++ b/src/gateway/opcodes/LazyRequest.ts @@ -76,7 +76,6 @@ async function getMembers(guild_id: string, range: [number, number]) { }); const session = sessions.first(); - // TODO: properly mock/hide offline/invisible status const item = { member: { ...member, @@ -166,7 +165,7 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) { range: x.range })), // remove offline members from count - online_count: member_count - (groups.find(x => x.id == "ofline")?.count ?? 0), + online_count: member_count - (groups.find(x => x.id == "offline")?.count ?? 0), member_count, id: "everyone", guild_id, -- cgit 1.5.1 From 9ea8f1cd206999a2215902493f198bf8acc38671 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Fri, 9 Sep 2022 20:32:41 +1000 Subject: Use status from UserSettings if presence is 'offline' ( mobile ) --- src/gateway/opcodes/LazyRequest.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gateway/opcodes/LazyRequest.ts b/src/gateway/opcodes/LazyRequest.ts index 129c9ce3..d6bcb43d 100644 --- a/src/gateway/opcodes/LazyRequest.ts +++ b/src/gateway/opcodes/LazyRequest.ts @@ -24,6 +24,7 @@ async function getMembers(guild_id: string, range: [number, number]) { .leftJoinAndSelect("member.roles", "role") .leftJoinAndSelect("member.user", "user") .leftJoinAndSelect("user.sessions", "session") + .innerJoinAndSelect("user.settings", "settings") .addSelect("CASE WHEN session.status = 'offline' THEN 0 ELSE 1 END", "_status") .orderBy("role.position", "DESC") .addOrderBy("_status", "DESC") @@ -67,7 +68,7 @@ async function getMembers(guild_id: string, range: [number, number]) { "idle": 1, "dnd": 2, "invisible": 3, - "offline": 4, // for ts, will never be accessed + "offline": 4, }; const sessions = member.user.sessions.sort((a, b) => { // activities are higher priority than status @@ -76,6 +77,11 @@ async function getMembers(guild_id: string, range: [number, number]) { }); const session = sessions.first(); + if (session?.status == "offline") { + // swap out for user settings status + session.status = member.user.settings.status; + } + const item = { member: { ...member, -- cgit 1.5.1 From 2e2ca30d13bee76cd27530b1ad9fc0206f8df55b Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Fri, 9 Sep 2022 20:54:16 +1000 Subject: Handle when status is offline in usersettings --- src/gateway/opcodes/LazyRequest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gateway/opcodes/LazyRequest.ts b/src/gateway/opcodes/LazyRequest.ts index d6bcb43d..95a69a32 100644 --- a/src/gateway/opcodes/LazyRequest.ts +++ b/src/gateway/opcodes/LazyRequest.ts @@ -94,8 +94,8 @@ async function getMembers(guild_id: string, range: [number, number]) { } } }; - - if (!session || session.status == "invisible") { + + if (!session || session.status == "invisible" || session.status == "offline") { item.member.presence.status = "offline"; item.member.presence.activities = []; offlineItems.push(item); -- cgit 1.5.1