diff --git a/src/app/app.ts b/src/app/app.ts index b79a940..ca8c339 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -165,14 +165,30 @@ export default class Enclave

{ return; case "Messages": - Object.entries(msg.messages).forEach(([channelId, messages]) => { - if (!server.messages[channelId]) { - server.messages[channelId] = {}; - } + const authors = Object.entries(msg.messages).flatMap( + ([channelId, messages]) => { + if (!server.messages[channelId]) { + server.messages[channelId] = {}; + } - messages.forEach((message) => { - server.messages[channelId][message.id] = message; - }); + return messages.map((message) => { + server.messages[channelId][message.id] = message; + return message.author; + }); + }, + ); + + const dedupedAuthors = Array.from(new Set(authors)); + + this.server?.getUsers(dedupedAuthors); + + this.forceRender(); + + return; + + case "Users": + Object.entries(msg.users).forEach(([pubKey, user]) => { + server.users[pubKey] = user; }); this.forceRender(); diff --git a/src/app/protocol.ts b/src/app/protocol.ts index ed48003..69b5777 100644 --- a/src/app/protocol.ts +++ b/src/app/protocol.ts @@ -15,6 +15,10 @@ export type ClientMethod = | { method: "Messages"; messages: Record; + } + | { + method: "Users"; + users: Record; }; export type ServerMethod = @@ -41,4 +45,8 @@ export type ServerMethod = method: "GetMessages"; channel_id: string; chunk: number; + } + | { + method: "GetUsers"; + pubkeys: string[]; }; diff --git a/src/app/server.ts b/src/app/server.ts index be0d8fe..37ed228 100644 --- a/src/app/server.ts +++ b/src/app/server.ts @@ -3,7 +3,7 @@ import * as ed from "@noble/ed25519"; import EnclaveWebSocket from "./ws"; import { sha512 } from "@noble/hashes/sha2.js"; import { getWSUrl } from "@/lib/serverList"; -import { ServerMeta, StoredMessage } from "@/lib/types"; +import { ClientMeta, ServerMeta, StoredMessage } from "@/lib/types"; ed.hashes.sha512 = sha512; @@ -30,11 +30,13 @@ export default class EnclaveServer { public websocket?: EnclaveWebSocket; public meta?: ServerMeta; public messages: Record>; + public users: Record; public constructor(hostname: string, isSecure: boolean) { this.hostname = hostname; this.isSecure = isSecure; this.messages = {}; + this.users = {}; } public disconnect() { @@ -94,4 +96,14 @@ export default class EnclaveServer { throw Error("Invalid signature"); } } + + public getUsers(pubkeys: string[]) { + const filteredPubkeys = pubkeys.filter((pubkey) => { + const exists = this.users[pubkey] !== undefined; + if (!exists) this.users[pubkey] = null; + return !exists; + }); + + this.websocket?.send({ method: "GetUsers", pubkeys: filteredPubkeys }); + } }