fix: write relays only in relay metadata

This commit is contained in:
Kieran 2023-11-03 14:30:22 +09:00
parent 9eb029e1dc
commit 930b493a12
Signed by: Kieran
GPG Key ID: DE71CEB3925BE941
6 changed files with 34 additions and 34 deletions

View File

@ -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));
}
}

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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>

View File

@ -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);
}