diff --git a/src/app/shared/NoteActions.svelte b/src/app/shared/NoteActions.svelte
index 4888ea99..b7642243 100644
--- a/src/app/shared/NoteActions.svelte
+++ b/src/app/shared/NoteActions.svelte
@@ -33,7 +33,7 @@
MembershipLevel,
publishToZeroOrMoreGroups,
publishDeletionForEvent,
- getUserRelayUrls,
+ getUserHints,
getPublishHints,
getSetting,
processZap,
@@ -126,7 +126,7 @@
.open()
const broadcast = () => {
- const relays = getUserRelayUrls("write")
+ const relays = getUserHints("write")
const event = asNostrEvent(note)
Publisher.publish({event, relays})
diff --git a/src/app/shared/NoteOptions.svelte b/src/app/shared/NoteOptions.svelte
index 0cfc2e3d..cd5bc9fc 100644
--- a/src/app/shared/NoteOptions.svelte
+++ b/src/app/shared/NoteOptions.svelte
@@ -13,8 +13,8 @@
import RelayCard from "src/app/shared/RelayCard.svelte"
import GroupSummary from "src/app/shared/GroupSummary.svelte"
import RelaySearch from "src/app/shared/RelaySearch.svelte"
- import {mergeHints, displayRelay, getGroupRelayUrls} from "src/engine"
- import {env, getUserRelayUrls, deriveMembershipLevel, MembershipLevel} from "src/engine"
+ import {getGroupPublishHints, displayRelay} from "src/engine"
+ import {env, deriveMembershipLevel, MembershipLevel} from "src/engine"
export let groupOptions = []
export let hideFields = []
@@ -59,11 +59,7 @@
}
if (!relaysDirty) {
- if (values.groups.length > 0) {
- values.relays = mergeHints(values.groups.map(getGroupRelayUrls))
- } else {
- values.relays = getUserRelayUrls("write")
- }
+ values.relays = getGroupPublishHints(values.groups)
}
}
diff --git a/src/app/shared/PersonActions.svelte b/src/app/shared/PersonActions.svelte
index 03f30ce7..0a80f01d 100644
--- a/src/app/shared/PersonActions.svelte
+++ b/src/app/shared/PersonActions.svelte
@@ -13,7 +13,7 @@
unfollow,
deriveMuted,
deriveFollowing,
- getUserRelayUrls,
+ getUserHints,
} from "src/engine"
import {boot} from "src/app/state"
import {router} from "src/app/router"
@@ -32,8 +32,8 @@
if (!isSelf && $canSign) {
actions.push({
onClick: $muted ? unmutePerson : mutePerson,
- label: $muted ? 'Unmute' : 'Mute',
- icon: $muted ? "microphone-slash" : 'microphone',
+ label: $muted ? "Unmute" : "Mute",
+ icon: $muted ? "microphone-slash" : "microphone",
})
}
@@ -87,7 +87,10 @@
const mutePerson = () => mute("p", pubkey)
const share = () =>
- router.at('qrcode').of(nip19.nprofileEncode({pubkey, relays: getUserRelayUrls('write')})).open()
+ router
+ .at("qrcode")
+ .of(nip19.nprofileEncode({pubkey, relays: getUserHints("write")}))
+ .open()
diff --git a/src/app/views/GroupList.svelte b/src/app/views/GroupList.svelte
index 7f7ba687..299b6ceb 100644
--- a/src/app/views/GroupList.svelte
+++ b/src/app/views/GroupList.svelte
@@ -12,8 +12,7 @@
load,
groups,
canUseGiftWrap,
- getUserRelayUrls,
- selectHints,
+ getUserHints,
mergeHints,
getGroupReqInfo,
deriveMembershipLevel,
@@ -48,12 +47,12 @@
updateCurrentSession(assoc("groups_last_synced", now()))
load({
- relays: mergeHints([relays, getUserRelayUrls("read")]),
+ relays: mergeHints([relays, getUserHints("read")]),
filters: [{kinds: [1059], "#p": recipients, since}],
})
load({
- relays: selectHints(getUserRelayUrls("read")),
+ relays: getUserHints("read"),
filters: [
{kinds: [34550], authors: admins},
{kinds: [34550], limit: 100},
diff --git a/src/app/views/NoteCreate.svelte b/src/app/views/NoteCreate.svelte
index 9328c042..a738bc5f 100644
--- a/src/app/views/NoteCreate.svelte
+++ b/src/app/views/NoteCreate.svelte
@@ -34,9 +34,9 @@
session,
writable,
getEventHints,
- getUserRelayUrls,
publishToZeroOrMoreGroups,
deriveMembershipLevel,
+ getGroupPublishHints,
} from "src/engine"
export let type = "note"
@@ -58,8 +58,8 @@
summary: "",
price: "",
currency: currencyOptions.find(whereEq({code: "SAT"})),
+ relays: getGroupPublishHints(defaultGroups),
groups: defaultGroups,
- relays: getUserRelayUrls("write"),
shouldWrap: true,
anonymous: false,
location: null,
diff --git a/src/engine/channels/requests.ts b/src/engine/channels/requests.ts
index 6e88de5f..37e28b29 100644
--- a/src/engine/channels/requests.ts
+++ b/src/engine/channels/requests.ts
@@ -4,7 +4,7 @@ import {now} from "paravel"
import {sessions} from "src/engine/session/state"
import {session} from "src/engine/session/derived"
import {loadPubkeys, subscribe} from "src/engine/network/utils"
-import {getPubkeyHints, getUserRelayUrls} from "src/engine/relays/utils"
+import {getPubkeyHints, getUserHints} from "src/engine/relays/utils"
import {channels} from "./state"
export const loadAllMessages = () => {
@@ -21,7 +21,7 @@ export const loadAllMessages = () => {
subscribe({
skipCache: true,
timeout: 30_000,
- relays: getUserRelayUrls("read"),
+ relays: getUserHints("read"),
filters: [
{kinds: [4], authors: [pubkey], since},
{kinds: [4, 1059], "#p": [pubkey], since},
diff --git a/src/engine/events/requests.ts b/src/engine/events/requests.ts
index 97ee8538..8afa9456 100644
--- a/src/engine/events/requests.ts
+++ b/src/engine/events/requests.ts
@@ -1,6 +1,6 @@
import {prop} from "ramda"
import {sessions} from "src/engine/session/state"
-import {getUserRelayUrls} from "src/engine/relays/utils"
+import {getUserHints} from "src/engine/relays/utils"
import {load} from "src/engine/network/utils"
import {deletesLastUpdated} from "./state"
@@ -9,7 +9,7 @@ export const loadDeletes = () => {
const authors = Object.values(sessions.get()).map(prop("pubkey"))
return load({
- relays: getUserRelayUrls("write"),
+ relays: getUserHints("write"),
filters: [{kinds: [5], authors, since}],
})
}
diff --git a/src/engine/groups/commands.ts b/src/engine/groups/commands.ts
index e17f8148..8de7b35a 100644
--- a/src/engine/groups/commands.ts
+++ b/src/engine/groups/commands.ts
@@ -12,7 +12,7 @@ import {displayPubkey} from "src/engine/people/utils"
import {publishCommunitiesList} from "src/engine/lists/commands"
import {
getPubkeyHints,
- getUserRelayUrls,
+ getUserHints,
getGroupHints,
getGroupRelayUrls,
mergeHints,
@@ -86,7 +86,7 @@ export const getGroupPublishRelays = (address, overrides = null) => {
export const publishToGroupAdmin = async (address, template) => {
const group = groups.key(address).get()
const {pubkey} = Naddr.fromTagValue(address)
- const relays = group?.relays || getUserRelayUrls("write")
+ const relays = group?.relays || getUserHints("write")
const rumor = await nip59.get().wrap(template, {
wrap: {
author: generatePrivateKey(),
diff --git a/src/engine/groups/requests.ts b/src/engine/groups/requests.ts
index d2c2a508..134154e2 100644
--- a/src/engine/groups/requests.ts
+++ b/src/engine/groups/requests.ts
@@ -1,6 +1,6 @@
import {Naddr} from "src/util/nostr"
import {groups} from "src/engine/groups/state"
-import {getUserRelayUrls} from "src/engine/relays/utils"
+import {getUserHints} from "src/engine/relays/utils"
import {load} from "src/engine/network/utils"
export const attemptedAddrs = new Map()
@@ -33,7 +33,7 @@ export const loadGroups = async (rawAddrs: string[]) => {
const identifiers = naddrs.map(naddr => naddr.identifier)
return load({
- relays: getUserRelayUrls('read'),
- filters: [{kinds: [34550], authors, '#d': identifiers}],
+ relays: getUserHints("read"),
+ filters: [{kinds: [34550], authors, "#d": identifiers}],
})
}
diff --git a/src/engine/groups/utils.ts b/src/engine/groups/utils.ts
index 9fea1456..4a0abfe0 100644
--- a/src/engine/groups/utils.ts
+++ b/src/engine/groups/utils.ts
@@ -5,7 +5,7 @@ import {Naddr} from "src/util/nostr"
import type {GroupStatus} from "src/engine/session/model"
import {pubkey} from "src/engine/session/state"
import {session} from "src/engine/session/derived"
-import {getUserRelayUrls, mergeHints} from "src/engine/relays/utils"
+import {getUserRelayUrls, getGroupHints, mergeHints} from "src/engine/relays/utils"
import {groups, groupSharedKeys, groupAdminKeys} from "./state"
import type {Group} from "./model"
import {MembershipLevel, GroupAccess, MemberAccess} from "./model"
@@ -57,22 +57,16 @@ export const getGroupReqInfo = (address = null) => {
since = Math.max(0, since - seconds(7, "day"))
const admins = []
+ const addresses = []
const recipients = [pubkey.get()]
- const relaysByGroup = []
for (const key of [...$groupSharedKeys, ...$groupAdminKeys]) {
admins.push(Naddr.fromTagValue(key.group).pubkey)
-
+ addresses.push(key.group)
recipients.push(key.pubkey)
-
- const group = groups.key(key.group).get()
-
- if (group?.relays) {
- relaysByGroup[group.address] = group.relays
- }
}
- const relays = mergeHints([getUserRelayUrls("read"), ...Object.values(relaysByGroup)])
+ const relays = mergeHints([getUserRelayUrls("read"), ...addresses.map(getGroupHints)])
return {admins, recipients, relays, since}
}
diff --git a/src/engine/network/utils/dvms.ts b/src/engine/network/utils/dvms.ts
index abaa3983..b880caf4 100644
--- a/src/engine/network/utils/dvms.ts
+++ b/src/engine/network/utils/dvms.ts
@@ -1,7 +1,7 @@
import {now} from "paravel"
import {seconds} from "hurdak"
import {generatePrivateKey} from "nostr-tools"
-import {getUserRelayUrls} from "src/engine/relays/utils"
+import {getUserHints} from "src/engine/relays/utils"
import type {Event} from "src/engine/events/model"
import {createAndPublish} from "./publish"
import {subscribe} from "./subscribe"
@@ -24,7 +24,7 @@ export const dvmRequest = async ({
onProgress = null,
}: DVMRequestOpts): Promise => {
if (!relays) {
- relays = getUserRelayUrls()
+ relays = getUserHints()
}
if (typeof input !== "string") {
diff --git a/src/engine/network/utils/publish.ts b/src/engine/network/utils/publish.ts
index 9e16339a..62d94bba 100644
--- a/src/engine/network/utils/publish.ts
+++ b/src/engine/network/utils/publish.ts
@@ -8,7 +8,7 @@ import {Naddr, isAddressable, getIdAndAddress} from "src/util/nostr"
import type {Event, NostrEvent} from "src/engine/events/model"
import {people} from "src/engine/people/state"
import {displayPerson} from "src/engine/people/utils"
-import {getUserRelayUrls, getEventHints, getPubkeyHint} from "src/engine/relays/utils"
+import {getUserHints, getEventHints, getPubkeyHint} from "src/engine/relays/utils"
import {env} from "src/engine/session/state"
import {signer} from "src/engine/session/derived"
import {projections} from "src/engine/core/projections"
@@ -143,7 +143,7 @@ export type PublishOpts = EventOpts & {
export const publish = async (template, {sk, relays}: PublishOpts) => {
return Publisher.publish({
timeout: 5000,
- relays: relays || getUserRelayUrls("write"),
+ relays: relays || getUserHints("write"),
event: sk
? await signer.get().signWithKey(template, sk)
: await signer.get().signAsUser(template),
diff --git a/src/engine/notes/commands.ts b/src/engine/notes/commands.ts
index 40cda393..056f6880 100644
--- a/src/engine/notes/commands.ts
+++ b/src/engine/notes/commands.ts
@@ -1,6 +1,6 @@
import {createEvent} from "paravel"
-import {getIdAndAddress} from 'src/util/nostr'
-import {getUserRelayUrls} from "src/engine/relays/utils"
+import {getIdAndAddress} from "src/util/nostr"
+import {getUserHints} from "src/engine/relays/utils"
import {createAndPublish, getReplyTags} from "src/engine/network/utils"
export const publishNote = (content, tags = [], relays = null) =>
@@ -8,7 +8,7 @@ export const publishNote = (content, tags = [], relays = null) =>
export const publishDeletion = (ids, relays = null) =>
createAndPublish(5, {
- relays: relays || getUserRelayUrls("write"),
+ relays: relays || getUserHints("write"),
tags: ids.map(id => [id.includes(":") ? "a" : "e", id]),
})
diff --git a/src/engine/people/requests.ts b/src/engine/people/requests.ts
index 1f60f2ed..09499e77 100644
--- a/src/engine/people/requests.ts
+++ b/src/engine/people/requests.ts
@@ -1,6 +1,6 @@
import {debounce} from "throttle-debounce"
import {load} from "src/engine/network/utils"
-import {getUserRelayUrls} from "src/engine/relays/utils"
+import {getUserHints} from "src/engine/relays/utils"
import {searchableRelays} from "src/engine/relays/derived"
import {people} from "./state"
@@ -14,7 +14,7 @@ export const loadPeople = debounce(500, search => {
})
} else if (people.get().length < 50) {
load({
- relays: getUserRelayUrls("read"),
+ relays: getUserHints("read"),
filters: [{kinds: [0], limit: 50}],
})
}
diff --git a/src/engine/relays/utils.ts b/src/engine/relays/utils.ts
index a09f06b5..29eb93c5 100644
--- a/src/engine/relays/utils.ts
+++ b/src/engine/relays/utils.ts
@@ -170,6 +170,12 @@ export const getPubkeyHints = hintSelector(function* (pubkey: string, mode: Rela
export const getPubkeyHint = (pubkey: string): string =>
first(getPubkeyHints(1, pubkey, "write")) || ""
+export const getUserHints = hintSelector(function* (mode: RelayMode) {
+ yield* getUserRelayUrls(mode)
+})
+
+export const getUserHint = (pubkey: string): string => first(getUserHints(1, "write")) || ""
+
export const getEventHints = hintSelector(function* (event: Event) {
yield* getPubkeyRelayUrls(event.pubkey, RelayMode.Write)
yield* event.seen_on.filter(isShareableRelay)
@@ -217,6 +223,12 @@ export const getGroupHints = hintSelector(function* (address: string) {
yield* getPubkeyHints(Naddr.fromTagValue(address).pubkey)
})
+export const getGroupPublishHints = (addresses: string[]) => {
+ const urls = mergeHints(addresses.map(getGroupHints))
+
+ return urls.length === 0 ? getUserRelayUrls("write") : urls
+}
+
export const mergeHints = (groups: string[][], limit: number = null) => {
const scores = {} as Record
diff --git a/src/engine/reports/commands.ts b/src/engine/reports/commands.ts
index 50895e09..88c0a742 100644
--- a/src/engine/reports/commands.ts
+++ b/src/engine/reports/commands.ts
@@ -1,12 +1,12 @@
import {createEvent} from "paravel"
import {generatePrivateKey} from "nostr-tools"
import {signer} from "src/engine/session/derived"
-import {getUserRelayUrls} from "src/engine/relays/utils"
+import {getUserHints} from "src/engine/relays/utils"
import {Publisher} from "src/engine/network/utils"
// Use an ephemeral private key for user privacy
export const publishReport = async (content = "", tags = [], relays = null) =>
Publisher.publish({
- relays: relays || getUserRelayUrls("write"),
+ relays: relays || getUserHints("write"),
event: await signer.get().signWithKey(createEvent(1984, {content, tags}), generatePrivateKey()),
})