From 648b15a1c45875a19c80a207d8fe8e43e48ff0c7 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Wed, 11 Sep 2024 14:08:04 -0700 Subject: [PATCH] Map messages to rooms using tracker --- src/app/components/ChatCompose.svelte | 2 +- src/app/state.ts | 39 ++++++++++++++++----------- src/routes/+layout.svelte | 4 ++- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/app/components/ChatCompose.svelte b/src/app/components/ChatCompose.svelte index a78879c9..81231c7b 100644 --- a/src/app/components/ChatCompose.svelte +++ b/src/app/components/ChatCompose.svelte @@ -32,7 +32,7 @@ const event = createEvent(MESSAGE, { content: $editor.getText(), - tags: [["-"], ["relay", url], ...topicTags, ...mentionTags, ...imetaTags], + tags: [["-"], ...topicTags, ...mentionTags, ...imetaTags], }) publishThunk(makeThunk({event, relays: [url]})) diff --git a/src/app/state.ts b/src/app/state.ts index f0d2e469..5ae4a280 100644 --- a/src/app/state.ts +++ b/src/app/state.ts @@ -24,6 +24,7 @@ import { getDefaultAppContext, getDefaultNetContext, makeRouter, + trackerStore, } from "@welshman/app" import type {SubscribeRequestWithHandlers} from "@welshman/net" import {deriveEvents, deriveEventsMapped, withGetter} from "@welshman/store" @@ -32,7 +33,7 @@ export const MESSAGE = 209 export const REPLY = 210 -export const MEMBERSHIPS = 30209 +export const MEMBERSHIPS = 10209 export const INDEXER_RELAYS = ["wss://purplepag.es/", "wss://relay.damus.io/", "wss://nos.lol/"] @@ -118,22 +119,16 @@ export const { // Messages export type Message = { - url: string - chat: string topic: string event: TrustedEvent } -export const readMessage = (event: TrustedEvent): Maybe => { - const urls = getRelayTagValues(event.tags) +export const readMessage = (event: TrustedEvent): Maybe => { const topics = getTopicTagValues(event.tags) - if (topics.length > 1 || urls.length !== 1) return undefined + if (topics.length > 1) return undefined - const topic = topics[0] || "" - const url = urls[0] - - return urls.map(url => ({url, topic, chat: makeChatId(url, topic), event})) + return {topic: topics[0] || "", event} } export const messages = deriveEventsMapped(repository, { @@ -155,12 +150,26 @@ export const makeChatId = (url: string, topic: string) => `${url}'${topic}` export const splitChatId = (id: string) => id.split("'") -export const chats = derived(messages, $messages => - Array.from(groupBy($message => $message.chat, $messages).values()).map(messages => { - const {chat, url, topic} = messages[0] +export const chats = derived( + [trackerStore, messages], + ([$tracker, $messages]) => { + const messagesByChatId = new Map() - return {id: chat, url, topic, messages} - }), + for (const message of $messages) { + for (const url of $tracker.getRelays(message.event.id)) { + const chatId = makeChatId(url, message.topic) + + pushToMapKey(messagesByChatId, chatId, message) + } + } + + return Array.from(messagesByChatId.entries()) + .map(([id, messages]) => { + const [url, topic] = splitChatId(id) + + return {id, url, topic, messages} + }) + } ) export const { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 63947aa6..34df8b04 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -19,6 +19,7 @@ plaintext, freshness, storageAdapters, + tracker, } from "@welshman/app" import * as app from "@welshman/app" import {createEventStore} from "@welshman/store" @@ -63,7 +64,7 @@ ready = db ? Promise.resolve() - : initStorage("flotilla", 2, { + : initStorage("flotilla", 3, { events: { keyPath: "id", store: createEventStore(repository), @@ -79,6 +80,7 @@ publishStatus: storageAdapters.fromObjectStore(publishStatusData), freshness: storageAdapters.fromObjectStore(freshness), plaintext: storageAdapters.fromObjectStore(plaintext), + tracker: storageAdapters.fromTracker(tracker), }).then(() => sleep(300)) // Wait an extra few ms because of repository throttle dialog.addEventListener("close", () => {