fix: write relays only in relay metadata
This commit is contained in:
@ -9,6 +9,7 @@ import { getRelayName, sanitizeRelayUrl } from "SnortUtils";
|
|||||||
import { removeRelay } from "Login";
|
import { removeRelay } from "Login";
|
||||||
import useLogin from "Hooks/useLogin";
|
import useLogin from "Hooks/useLogin";
|
||||||
import useEventPublisher from "Hooks/useEventPublisher";
|
import useEventPublisher from "Hooks/useEventPublisher";
|
||||||
|
import { saveRelays } from "Pages/settings/Relays";
|
||||||
|
|
||||||
export function NoteBroadcaster({
|
export function NoteBroadcaster({
|
||||||
evs,
|
evs,
|
||||||
@ -49,8 +50,7 @@ export function NoteBroadcaster({
|
|||||||
async function removeRelayFromResult(r: OkResponse) {
|
async function removeRelayFromResult(r: OkResponse) {
|
||||||
if (publisher) {
|
if (publisher) {
|
||||||
removeRelay(login, unwrap(sanitizeRelayUrl(r.relay)));
|
removeRelay(login, unwrap(sanitizeRelayUrl(r.relay)));
|
||||||
const ev = await publisher.contactList(login.follows.item, login.relays.item);
|
await saveRelays(system, publisher, login.relays.item);
|
||||||
await system.BroadcastEvent(ev);
|
|
||||||
setResults(s => s.filter(a => a.relay !== r.relay));
|
setResults(s => s.filter(a => a.relay !== r.relay));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,13 +16,13 @@ export interface FollowButtonProps {
|
|||||||
export default function FollowButton(props: FollowButtonProps) {
|
export default function FollowButton(props: FollowButtonProps) {
|
||||||
const pubkey = parseId(props.pubkey);
|
const pubkey = parseId(props.pubkey);
|
||||||
const { publisher, system } = useEventPublisher();
|
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 isFollowing = follows.item.includes(pubkey);
|
||||||
const baseClassname = props.className ? `${props.className} ` : "";
|
const baseClassname = props.className ? `${props.className} ` : "";
|
||||||
|
|
||||||
async function follow(pubkey: HexKey) {
|
async function follow(pubkey: HexKey) {
|
||||||
if (publisher) {
|
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);
|
system.BroadcastEvent(ev);
|
||||||
await FollowsFeed.backFill(system, [pubkey]);
|
await FollowsFeed.backFill(system, [pubkey]);
|
||||||
}
|
}
|
||||||
@ -30,10 +30,7 @@ export default function FollowButton(props: FollowButtonProps) {
|
|||||||
|
|
||||||
async function unfollow(pubkey: HexKey) {
|
async function unfollow(pubkey: HexKey) {
|
||||||
if (publisher) {
|
if (publisher) {
|
||||||
const ev = await publisher.contactList(
|
const ev = await publisher.contactList(follows.item.filter(a => a !== pubkey).map(a => ["p", a]));
|
||||||
follows.item.filter(a => a !== pubkey),
|
|
||||||
relays.item,
|
|
||||||
);
|
|
||||||
system.BroadcastEvent(ev);
|
system.BroadcastEvent(ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ export default function FollowListBase({
|
|||||||
async function followAll() {
|
async function followAll() {
|
||||||
if (publisher) {
|
if (publisher) {
|
||||||
const newFollows = dedupe([...pubkeys, ...login.follows.item]);
|
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);
|
setFollows(login, newFollows, ev.created_at);
|
||||||
await system.BroadcastEvent(ev);
|
await system.BroadcastEvent(ev);
|
||||||
await FollowsFeed.backFill(system, pubkeys);
|
await FollowsFeed.backFill(system, pubkeys);
|
||||||
|
@ -100,10 +100,20 @@ export async function generateNewLogin(system: SystemInterface, pin: (key: strin
|
|||||||
console.warn(e);
|
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 publicKey = utils.bytesToHex(secp.schnorr.getPublicKey(privateKey));
|
||||||
const publisher = EventPublisher.privateKey(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);
|
LoginStore.loginWithPrivateKey(await pin(privateKey), entropy, newRelays);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { useMemo, useState } from "react";
|
import { useMemo, useState } from "react";
|
||||||
import { FormattedMessage } from "react-intl";
|
import { FormattedMessage } from "react-intl";
|
||||||
import { unixNowMs } from "@snort/shared";
|
import { unixNowMs } from "@snort/shared";
|
||||||
|
import { EventPublisher, FullRelaySettings, RelaySettings, SystemInterface } from "@snort/system";
|
||||||
|
|
||||||
import { randomSample } from "SnortUtils";
|
|
||||||
import Relay from "Element/Relay/Relay";
|
import Relay from "Element/Relay/Relay";
|
||||||
import useEventPublisher from "Hooks/useEventPublisher";
|
import useEventPublisher from "Hooks/useEventPublisher";
|
||||||
import useLogin from "Hooks/useLogin";
|
import useLogin from "Hooks/useLogin";
|
||||||
@ -11,6 +11,18 @@ import AsyncButton from "Element/AsyncButton";
|
|||||||
|
|
||||||
import messages from "./messages";
|
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 RelaySettingsPage = () => {
|
||||||
const { publisher, system } = useEventPublisher();
|
const { publisher, system } = useEventPublisher();
|
||||||
const login = useLogin();
|
const login = useLogin();
|
||||||
@ -21,22 +33,6 @@ const RelaySettingsPage = () => {
|
|||||||
return system.Sockets.filter(a => relays.item[a.address] === undefined);
|
return system.Sockets.filter(a => relays.item[a.address] === undefined);
|
||||||
}, [relays]);
|
}, [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 handleNewRelayChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
const inputValue = event.target.value;
|
const inputValue = event.target.value;
|
||||||
@ -91,7 +87,7 @@ const RelaySettingsPage = () => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex mt10">
|
<div className="flex mt10">
|
||||||
<div className="grow"></div>
|
<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} />
|
<FormattedMessage {...messages.Save} />
|
||||||
</AsyncButton>
|
</AsyncButton>
|
||||||
</div>
|
</div>
|
||||||
|
@ -249,12 +249,9 @@ export class EventPublisher {
|
|||||||
return await this.#sign(eb);
|
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);
|
const eb = this.#eb(EventKind.ContactList);
|
||||||
eb.content(JSON.stringify(relays));
|
tags.forEach(a => eb.tag(a));
|
||||||
|
|
||||||
const temp = new Set(follows.filter(a => a.length === 64).map(a => a.toLowerCase()));
|
|
||||||
temp.forEach(a => eb.tag(["p", a]));
|
|
||||||
return await this.#sign(eb);
|
return await this.#sign(eb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user