Map messages to rooms using tracker

This commit is contained in:
Jon Staab
2024-09-11 14:08:04 -07:00
parent e0eb37cd04
commit 648b15a1c4
3 changed files with 28 additions and 17 deletions
+1 -1
View File
@@ -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]}))
+24 -15
View File
@@ -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<Message[]> => {
const urls = getRelayTagValues(event.tags)
export const readMessage = (event: TrustedEvent): Maybe<Message> => {
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<Message>(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<string, Message[]>()
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 {
+3 -1
View File
@@ -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", () => {