fix: write relays only in relay metadata
This commit is contained in:
parent
9eb029e1dc
commit
930b493a12
@ -9,6 +9,7 @@ import { getRelayName, sanitizeRelayUrl } from "SnortUtils";
|
||||
import { removeRelay } from "Login";
|
||||
import useLogin from "Hooks/useLogin";
|
||||
import useEventPublisher from "Hooks/useEventPublisher";
|
||||
import { saveRelays } from "Pages/settings/Relays";
|
||||
|
||||
export function NoteBroadcaster({
|
||||
evs,
|
||||
@ -49,8 +50,7 @@ export function NoteBroadcaster({
|
||||
async function removeRelayFromResult(r: OkResponse) {
|
||||
if (publisher) {
|
||||
removeRelay(login, unwrap(sanitizeRelayUrl(r.relay)));
|
||||
const ev = await publisher.contactList(login.follows.item, login.relays.item);
|
||||
await system.BroadcastEvent(ev);
|
||||
await saveRelays(system, publisher, login.relays.item);
|
||||
setResults(s => s.filter(a => a.relay !== r.relay));
|
||||
}
|
||||
}
|
||||
|
@ -16,13 +16,13 @@ export interface FollowButtonProps {
|
||||
export default function FollowButton(props: FollowButtonProps) {
|
||||
const pubkey = parseId(props.pubkey);
|
||||
const { publisher, system } = useEventPublisher();
|
||||
const { follows, relays, readonly } = useLogin(s => ({ follows: s.follows, relays: s.relays, readonly: s.readonly }));
|
||||
const { follows, readonly } = useLogin(s => ({ follows: s.follows, readonly: s.readonly }));
|
||||
const isFollowing = follows.item.includes(pubkey);
|
||||
const baseClassname = props.className ? `${props.className} ` : "";
|
||||
|
||||
async function follow(pubkey: HexKey) {
|
||||
if (publisher) {
|
||||
const ev = await publisher.contactList([pubkey, ...follows.item], relays.item);
|
||||
const ev = await publisher.contactList([pubkey, ...follows.item].map(a => ["p", a]));
|
||||
system.BroadcastEvent(ev);
|
||||
await FollowsFeed.backFill(system, [pubkey]);
|
||||
}
|
||||
@ -30,10 +30,7 @@ export default function FollowButton(props: FollowButtonProps) {
|
||||
|
||||
async function unfollow(pubkey: HexKey) {
|
||||
if (publisher) {
|
||||
const ev = await publisher.contactList(
|
||||
follows.item.filter(a => a !== pubkey),
|
||||
relays.item,
|
||||
);
|
||||
const ev = await publisher.contactList(follows.item.filter(a => a !== pubkey).map(a => ["p", a]));
|
||||
system.BroadcastEvent(ev);
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ export default function FollowListBase({
|
||||
async function followAll() {
|
||||
if (publisher) {
|
||||
const newFollows = dedupe([...pubkeys, ...login.follows.item]);
|
||||
const ev = await publisher.contactList(newFollows, login.relays.item);
|
||||
const ev = await publisher.contactList(newFollows.map(a => ["p", a]));
|
||||
setFollows(login, newFollows, ev.created_at);
|
||||
await system.BroadcastEvent(ev);
|
||||
await FollowsFeed.backFill(system, pubkeys);
|
||||
|
@ -100,10 +100,20 @@ export async function generateNewLogin(system: SystemInterface, pin: (key: strin
|
||||
console.warn(e);
|
||||
}
|
||||
|
||||
// connect to new relays
|
||||
await Promise.all(Object.entries(newRelays).map(([k, v]) => system.ConnectToRelay(k, v)));
|
||||
|
||||
const publicKey = utils.bytesToHex(secp.schnorr.getPublicKey(privateKey));
|
||||
const publisher = EventPublisher.privateKey(privateKey);
|
||||
const ev = await publisher.contactList([bech32ToHex(SnortPubKey), publicKey], newRelays);
|
||||
system.BroadcastEvent(ev);
|
||||
|
||||
// Create new contact list following self and site account
|
||||
const ev = await publisher.contactList([bech32ToHex(SnortPubKey), publicKey].map(a => ["p", a]));
|
||||
await system.BroadcastEvent(ev);
|
||||
|
||||
// Create relay metadata event
|
||||
const ev2 = await publisher.relayList(newRelays);
|
||||
await system.BroadcastEvent(ev2);
|
||||
|
||||
LoginStore.loginWithPrivateKey(await pin(privateKey), entropy, newRelays);
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { useMemo, useState } from "react";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import { unixNowMs } from "@snort/shared";
|
||||
import { EventPublisher, FullRelaySettings, RelaySettings, SystemInterface } from "@snort/system";
|
||||
|
||||
import { randomSample } from "SnortUtils";
|
||||
import Relay from "Element/Relay/Relay";
|
||||
import useEventPublisher from "Hooks/useEventPublisher";
|
||||
import useLogin from "Hooks/useLogin";
|
||||
@ -11,6 +11,18 @@ import AsyncButton from "Element/AsyncButton";
|
||||
|
||||
import messages from "./messages";
|
||||
|
||||
const Blasters = [
|
||||
"wss://nostr.mutinywallet.com"
|
||||
];
|
||||
|
||||
export async function saveRelays(system: SystemInterface, publisher: EventPublisher | undefined, relays: Array<FullRelaySettings> | Record<string, RelaySettings>) {
|
||||
if (publisher) {
|
||||
const ev = await publisher.relayList(relays);
|
||||
await system.BroadcastEvent(ev);
|
||||
await Promise.all(Blasters.map(a => system.WriteOnceToRelay(a, ev)));
|
||||
}
|
||||
}
|
||||
|
||||
const RelaySettingsPage = () => {
|
||||
const { publisher, system } = useEventPublisher();
|
||||
const login = useLogin();
|
||||
@ -21,22 +33,6 @@ const RelaySettingsPage = () => {
|
||||
return system.Sockets.filter(a => relays.item[a.address] === undefined);
|
||||
}, [relays]);
|
||||
|
||||
async function saveRelays() {
|
||||
if (publisher) {
|
||||
const ev = await publisher.contactList(login.follows.item, login.relays.item);
|
||||
system.BroadcastEvent(ev);
|
||||
try {
|
||||
const onlineRelays = await fetch("https://api.nostr.watch/v1/online").then(r => r.json());
|
||||
const relayList = await publisher.relayList(login.relays.item);
|
||||
const rs = Object.keys(relays.item).concat(randomSample(onlineRelays, 20));
|
||||
rs.forEach(r => {
|
||||
system.WriteOnceToRelay(r, relayList);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const handleNewRelayChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||
const inputValue = event.target.value;
|
||||
@ -91,7 +87,7 @@ const RelaySettingsPage = () => {
|
||||
</div>
|
||||
<div className="flex mt10">
|
||||
<div className="grow"></div>
|
||||
<AsyncButton type="button" onClick={() => saveRelays()} disabled={login.readonly}>
|
||||
<AsyncButton type="button" onClick={() => saveRelays(system, publisher, relays.item)} disabled={login.readonly}>
|
||||
<FormattedMessage {...messages.Save} />
|
||||
</AsyncButton>
|
||||
</div>
|
||||
|
@ -249,12 +249,9 @@ export class EventPublisher {
|
||||
return await this.#sign(eb);
|
||||
}
|
||||
|
||||
async contactList(follows: Array<HexKey>, relays: Record<string, RelaySettings>) {
|
||||
async contactList(tags: Array<[string, string]>) {
|
||||
const eb = this.#eb(EventKind.ContactList);
|
||||
eb.content(JSON.stringify(relays));
|
||||
|
||||
const temp = new Set(follows.filter(a => a.length === 64).map(a => a.toLowerCase()));
|
||||
temp.forEach(a => eb.tag(["p", a]));
|
||||
tags.forEach(a => eb.tag(a));
|
||||
return await this.#sign(eb);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user