forked from coracle/flotilla
Map messages to rooms using tracker
This commit is contained in:
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
const event = createEvent(MESSAGE, {
|
const event = createEvent(MESSAGE, {
|
||||||
content: $editor.getText(),
|
content: $editor.getText(),
|
||||||
tags: [["-"], ["relay", url], ...topicTags, ...mentionTags, ...imetaTags],
|
tags: [["-"], ...topicTags, ...mentionTags, ...imetaTags],
|
||||||
})
|
})
|
||||||
|
|
||||||
publishThunk(makeThunk({event, relays: [url]}))
|
publishThunk(makeThunk({event, relays: [url]}))
|
||||||
|
|||||||
+24
-15
@@ -24,6 +24,7 @@ import {
|
|||||||
getDefaultAppContext,
|
getDefaultAppContext,
|
||||||
getDefaultNetContext,
|
getDefaultNetContext,
|
||||||
makeRouter,
|
makeRouter,
|
||||||
|
trackerStore,
|
||||||
} from "@welshman/app"
|
} from "@welshman/app"
|
||||||
import type {SubscribeRequestWithHandlers} from "@welshman/net"
|
import type {SubscribeRequestWithHandlers} from "@welshman/net"
|
||||||
import {deriveEvents, deriveEventsMapped, withGetter} from "@welshman/store"
|
import {deriveEvents, deriveEventsMapped, withGetter} from "@welshman/store"
|
||||||
@@ -32,7 +33,7 @@ export const MESSAGE = 209
|
|||||||
|
|
||||||
export const REPLY = 210
|
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/"]
|
export const INDEXER_RELAYS = ["wss://purplepag.es/", "wss://relay.damus.io/", "wss://nos.lol/"]
|
||||||
|
|
||||||
@@ -118,22 +119,16 @@ export const {
|
|||||||
// Messages
|
// Messages
|
||||||
|
|
||||||
export type Message = {
|
export type Message = {
|
||||||
url: string
|
|
||||||
chat: string
|
|
||||||
topic: string
|
topic: string
|
||||||
event: TrustedEvent
|
event: TrustedEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
export const readMessage = (event: TrustedEvent): Maybe<Message[]> => {
|
export const readMessage = (event: TrustedEvent): Maybe<Message> => {
|
||||||
const urls = getRelayTagValues(event.tags)
|
|
||||||
const topics = getTopicTagValues(event.tags)
|
const topics = getTopicTagValues(event.tags)
|
||||||
|
|
||||||
if (topics.length > 1 || urls.length !== 1) return undefined
|
if (topics.length > 1) return undefined
|
||||||
|
|
||||||
const topic = topics[0] || ""
|
return {topic: topics[0] || "", event}
|
||||||
const url = urls[0]
|
|
||||||
|
|
||||||
return urls.map(url => ({url, topic, chat: makeChatId(url, topic), event}))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const messages = deriveEventsMapped<Message>(repository, {
|
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 splitChatId = (id: string) => id.split("'")
|
||||||
|
|
||||||
export const chats = derived(messages, $messages =>
|
export const chats = derived(
|
||||||
Array.from(groupBy($message => $message.chat, $messages).values()).map(messages => {
|
[trackerStore, messages],
|
||||||
const {chat, url, topic} = messages[0]
|
([$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 {
|
export const {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
plaintext,
|
plaintext,
|
||||||
freshness,
|
freshness,
|
||||||
storageAdapters,
|
storageAdapters,
|
||||||
|
tracker,
|
||||||
} from "@welshman/app"
|
} from "@welshman/app"
|
||||||
import * as app from "@welshman/app"
|
import * as app from "@welshman/app"
|
||||||
import {createEventStore} from "@welshman/store"
|
import {createEventStore} from "@welshman/store"
|
||||||
@@ -63,7 +64,7 @@
|
|||||||
|
|
||||||
ready = db
|
ready = db
|
||||||
? Promise.resolve()
|
? Promise.resolve()
|
||||||
: initStorage("flotilla", 2, {
|
: initStorage("flotilla", 3, {
|
||||||
events: {
|
events: {
|
||||||
keyPath: "id",
|
keyPath: "id",
|
||||||
store: createEventStore(repository),
|
store: createEventStore(repository),
|
||||||
@@ -79,6 +80,7 @@
|
|||||||
publishStatus: storageAdapters.fromObjectStore(publishStatusData),
|
publishStatus: storageAdapters.fromObjectStore(publishStatusData),
|
||||||
freshness: storageAdapters.fromObjectStore(freshness),
|
freshness: storageAdapters.fromObjectStore(freshness),
|
||||||
plaintext: storageAdapters.fromObjectStore(plaintext),
|
plaintext: storageAdapters.fromObjectStore(plaintext),
|
||||||
|
tracker: storageAdapters.fromTracker(tracker),
|
||||||
}).then(() => sleep(300)) // Wait an extra few ms because of repository throttle
|
}).then(() => sleep(300)) // Wait an extra few ms because of repository throttle
|
||||||
|
|
||||||
dialog.addEventListener("close", () => {
|
dialog.addEventListener("close", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user