From d0c8a42603f6e501f954278a685ebc2a338caf47 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 19 May 2023 21:21:46 +0100 Subject: [PATCH] feat: add `User.statusMessage` and `User.presence` --- src/Client.ts | 9 ++++++--- src/classes/Server.ts | 11 +++++++++++ src/classes/User.ts | 21 ++++++++++++++++++++- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/Client.ts b/src/Client.ts index f6cb2fd8..bd17c5ce 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -1,4 +1,4 @@ -import { Accessor, Setter, createSignal } from "solid-js"; +import { Accessor, Setter, batch, createSignal } from "solid-js"; import EventEmitter from "eventemitter3"; import { API, Role } from "revolt-api"; @@ -231,8 +231,11 @@ export class Client extends EventEmitter { this.events.on("state", (state) => { switch (state) { case ConnectionState.Connected: - this.#setConnectionFailureCount(0); - this.emit("connected"); + batch(() => { + this.servers.forEach((server) => server.resetSyncStatus()); + this.#setConnectionFailureCount(0); + this.emit("connected"); + }); break; case ConnectionState.Connecting: this.emit("connecting"); diff --git a/src/classes/Server.ts b/src/classes/Server.ts index e2e3653b..c0f1237a 100644 --- a/src/classes/Server.ts +++ b/src/classes/Server.ts @@ -537,11 +537,15 @@ export class Server { ); } + #synced: undefined | "partial" | "full"; + /** * Optimised member fetch route * @param excludeOffline */ async syncMembers(excludeOffline?: boolean) { + if (this.#synced && (this.#synced === "full" || excludeOffline)) return; + const data = await this.#collection.client.api.get( `/servers/${this.id as ""}/members`, { exclude_offline: excludeOffline } @@ -574,6 +578,13 @@ export class Server { }); } + /** + * Reset member sync status + */ + resetSyncStatus() { + this.#synced = undefined; + } + /** * Fetch a server's members * @returns List of the server's members and their user objects diff --git a/src/classes/User.ts b/src/classes/User.ts index 1190f4dd..ed38e64a 100644 --- a/src/classes/User.ts +++ b/src/classes/User.ts @@ -1,4 +1,4 @@ -import { DataEditUser } from "revolt-api"; +import { DataEditUser, Presence } from "revolt-api"; import { decodeTime } from "ulid"; import { UserCollection } from "../collections"; @@ -127,6 +127,25 @@ export class User { ); } + /** + * Presence + */ + get presence() { + return this.status?.presence ?? (this.online ? "Online" : "Invisible"); + } + + /** + * Generate status message + * @param translate Translation function + * @returns Status message + */ + statusMessage(translate: (presence: Presence) => string = (a) => a) { + return ( + this.status?.text ?? + (this.presence === "Focus" ? translate("Focus") : undefined) + ); + } + /** * Permissions against this user */