From 1e4d0c3d774b8d135049c7d429e2b6bc91800330 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Thu, 6 Nov 2025 16:47:46 -0500 Subject: Add French translation for new strings --- src/locales/fr.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/locales/fr.json') diff --git a/src/locales/fr.json b/src/locales/fr.json index 7ae6896b..76d3c5c2 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -24,6 +24,16 @@ } } }, + "dm": { + "header": "Messages directs", + "recipientMsg": "Vous envoyez messages nostr à [R].", + "sendMessage": "Envoyez Message", + "expiry": "Expirez messages", + "days": "jours", + "relaysNotFound": "Ne pouvait pas trouvez les relais MD de [R].", + "noRelaysSet": "AVERTISSEMENT: Vous n’avez pas specifié vos relais préferés pour messages directs. Vous ne pouvez pas reçevoir des messages ou voir les messages que vous avez envoyé.", + "nostrSettingsLink": "Spécifiez vos relais en vos préférences Nostr." + }, "error": { "header": "Erreur", "message": "S'il vous plait réessayez ou contactez l'assistance.", @@ -236,6 +246,8 @@ "hours": "heures", "hideSeed": "Cacher la phrase mnémotechnique", "revealSeed": "Montrer la phrase mnémotechnique", + "preferredDM": "Relais MD Préferés", + "preferredDMDescription": "Messages directs destinés à vous seront publiés à ces relais. Pour obtiendre des messages sur plusieurs relais, met chaque URL sur son propre ligne.", "notifications": "Notifications de paiement", "notificationsDesc": "Reçevez un email quand un paiement arrive à votre compte", "seedPhrase": "Phrase mnémotechnique", -- cgit v1.2.3 From 05246ae8d0597ef86f912476ed0a369424d19a72 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Fri, 7 Nov 2025 13:47:47 -0500 Subject: Dim messages near expiry --- src/locales/en.json | 1 + src/locales/fr.json | 1 + src/routes/(app)/dm/[recipient]/+page.svelte | 20 ++++++++++++++++---- 3 files changed, 18 insertions(+), 4 deletions(-) (limited to 'src/locales/fr.json') diff --git a/src/locales/en.json b/src/locales/en.json index a8b8a06a..427c8d96 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -97,6 +97,7 @@ "recipientMsg": "You are sending nostr messages to [R].", "sendMessage": "Send Message", "expiry": "Enable message expiry", + "fadedWarning": "To avoid metadata leaks, messages expire at a random time up to 2 days after you specify; each message has its own random expiry time. Messages which appear faded are close to expiring; nearby messages may be missing.", "days": "days", "relaysNotFound": "Could not find [R]’s DM relays.", "noRelaysSet": "WARNING: You haven't set any preferred relays. You won't be able to receive any messages or see the messages you've sent.", diff --git a/src/locales/fr.json b/src/locales/fr.json index 76d3c5c2..4a096420 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -29,6 +29,7 @@ "recipientMsg": "Vous envoyez messages nostr à [R].", "sendMessage": "Envoyez Message", "expiry": "Expirez messages", + "fadedWarning": "Pour protéger vos métadonées, vos messages expirent à un temps randomée au maximum 2 jours après la date que vous spécifiez; chaque message a son propre temps d’expiration randomée. Les messages qui semble faibles sont proche à expirer; les autres messages autours pouvait avoir déjà disparu.", "days": "jours", "relaysNotFound": "Ne pouvait pas trouvez les relais MD de [R].", "noRelaysSet": "AVERTISSEMENT: Vous n’avez pas specifié vos relais préferés pour messages directs. Vous ne pouvez pas reçevoir des messages ou voir les messages que vous avez envoyé.", diff --git a/src/routes/(app)/dm/[recipient]/+page.svelte b/src/routes/(app)/dm/[recipient]/+page.svelte index c64df7f7..443119fe 100644 --- a/src/routes/(app)/dm/[recipient]/+page.svelte +++ b/src/routes/(app)/dm/[recipient]/+page.svelte @@ -75,6 +75,10 @@ return false; } + const expirationClose = (expiration: number) => { + return expiration <= (Date.now() / 1000 + 2 * 86400); + } + const loadEvents = async (relays: string[]) => { const wrapped = await pool.querySync( relays, { kinds: [1059], "#p": [user.pubkey], limit: DM_FETCH_LIMIT } @@ -86,6 +90,11 @@ if (!expired(event)) { const rumour = await decryptMessage(event); const created = Math.floor(rumour.created_at / 86400); + for (const tag of event.tags) { + if (tag[0] == "expiration") { + rumour.expiration = parseInt(tag[1]); + } + } appendMultimap(decryptedRumours, created, rumour); } else console.log("relay contains expired event", event.id); } @@ -130,9 +139,6 @@ message, sk, recipient.pubkey, user.pubkey, expiry); } - console.log(Date.now() / 1000); - console.log(event2.tags); - const recipientRelays = await getPreferredRelays(recipient.pubkey); const p1 = Promise.any(pool.publish(recipientRelays, event1)); const senderRelays = await getPreferredRelays(user.pubkey); @@ -166,6 +172,10 @@ color: #ff7f00; } + .expiring { + color: #7f7f7f; + } + .link { text-decoration-line: underline; } @@ -205,7 +215,7 @@ @@ -215,6 +225,8 @@ {$t("dm.expiry")}: {$t("dm.days")}. +

{$t("dm.fadedWarning")}

+ sendMessage(text)}> {#if relayWarningShown}

{$t("dm.noRelaysSet")} {$t("dm.nostrSettingsLink")}

-- cgit v1.2.3 From 64f200944f8016725016dfaa0e6db6a6f102b776 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Thu, 13 Nov 2025 17:24:48 -0500 Subject: Only send expiring DMs to compatible relays --- src/locales/en.json | 1 + src/locales/fr.json | 1 + src/routes/(app)/dm/[recipient]/+page.svelte | 40 ++++++++++++++++++++++++---- 3 files changed, 37 insertions(+), 5 deletions(-) (limited to 'src/locales/fr.json') diff --git a/src/locales/en.json b/src/locales/en.json index 427c8d96..869a6beb 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -97,6 +97,7 @@ "recipientMsg": "You are sending nostr messages to [R].", "sendMessage": "Send Message", "expiry": "Enable message expiry", + "cantSendExpiring": "None of [R]'s DM relays support message expiry. You can't send expiring messages to them.", "fadedWarning": "To avoid metadata leaks, messages expire at a random time up to 2 days after you specify; each message has its own random expiry time. Messages which appear faded are close to expiring; nearby messages may be missing.", "days": "days", "relaysNotFound": "Could not find [R]’s DM relays.", diff --git a/src/locales/fr.json b/src/locales/fr.json index 4a096420..d8533bd7 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -29,6 +29,7 @@ "recipientMsg": "Vous envoyez messages nostr à [R].", "sendMessage": "Envoyez Message", "expiry": "Expirez messages", + "cantSendExpiring": "Aucun des relais de [R] expirent les messages expirants. Vous ne pouvez pas leur envoyer des messages expirants.", "fadedWarning": "Pour protéger vos métadonées, vos messages expirent à un temps randomée au maximum 2 jours après la date que vous spécifiez; chaque message a son propre temps d’expiration randomée. Les messages qui semble faibles sont proche à expirer; les autres messages autours pouvait avoir déjà disparu.", "days": "jours", "relaysNotFound": "Ne pouvait pas trouvez les relais MD de [R].", diff --git a/src/routes/(app)/dm/[recipient]/+page.svelte b/src/routes/(app)/dm/[recipient]/+page.svelte index 443119fe..17a8ad23 100644 --- a/src/routes/(app)/dm/[recipient]/+page.svelte +++ b/src/routes/(app)/dm/[recipient]/+page.svelte @@ -2,6 +2,7 @@ import { tick } from "svelte"; import Icon from "$comp/Icon.svelte"; import { hexToBytes, bytesToHex } from '@noble/hashes/utils'; + import { fetchRelayInformation } from 'nostr-tools/nip11'; import * as toolsnip17 from 'nostr-tools/nip17'; import { SimplePool } from 'nostr-tools/pool'; import * as libnip17 from '$lib/nip17'; @@ -25,6 +26,7 @@ let expiryEnabled = $state(false); let expiryDays = $state(7); let canSend = $state(false); + let canSendExpiring = $state(false); const appendMultimap = (map: Map, key: string, value: object) => { if (map.has(key)) { @@ -66,6 +68,20 @@ return relays; } + // Accepts a list of relays, and returns a list of the relays that support all the provided NIPs. + const relaysSupporting = async (relays: string[], nips: number[]) => { + let supportingRelays = []; + + for (const relay of relays) { + const relayInfo = await fetchRelayInformation(relay); + if (nips.every(relay => relayInfo.supported_nips.includes(relay))) { + supportingRelays.push(relay); + } + } + + return supportingRelays; + } + const expired = (event: object) => { for (const tag of event.tags) { if (tag[0] == "expiration") { @@ -120,8 +136,11 @@ relayWarningShown = false; loadEvents(relays); }); - getPreferredRelays(recipient.pubkey) - .then((relays) => canSend = relays && relays.length > 0); + getPreferredRelays(recipient.pubkey).then((relays) => { + canSend = relays && relays.length > 0; + relaysSupporting(relays, [40]) + .then((supporting) => canSendExpiring = supporting.length > 0); + }); const sendMessage = async (message: string) => { const expiry = expiryEnabled ? expiryDays : null; @@ -139,10 +158,18 @@ message, sk, recipient.pubkey, user.pubkey, expiry); } - const recipientRelays = await getPreferredRelays(recipient.pubkey); + let recipientRelays = await getPreferredRelays(recipient.pubkey); + if (expiryEnabled) { + recipientRelays = relaysSupporting(recipientRelays, [40]); + } const p1 = Promise.any(pool.publish(recipientRelays, event1)); - const senderRelays = await getPreferredRelays(user.pubkey); + + let senderRelays = await getPreferredRelays(user.pubkey); + if (expiryEnabled) { + senderRelays = relaysSupporting(senderRelays, [40]); + } const p2 = Promise.any(pool.publish(senderRelays, event2)); + await Promise.all([p1, p2]); getPreferredRelays(user.pubkey).then(loadEvents); } @@ -224,8 +251,11 @@ - {$t("dm.expiry")}: {$t("dm.days")}. + {$t("dm.expiry")}: {$t("dm.days")}.

{$t("dm.fadedWarning")}

+ {#if canSend && !canSendExpiring} +

{$t("dm.cantSendExpiring").replace("[R]", recipient.username)}

+ {/if} sendMessage(text)}> {#if relayWarningShown} -- cgit v1.2.3 From 082429c6ebe4cf78d58e9c0249bb8e83271fc778 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Tue, 18 Nov 2025 11:23:39 -0500 Subject: Only put valid URLs in kind-10050 relay tags --- src/locales/en.json | 1 + src/locales/fr.json | 1 + src/routes/(app)/settings/+layout.svelte | 23 +++++++++++++++++++---- 3 files changed, 21 insertions(+), 4 deletions(-) (limited to 'src/locales/fr.json') diff --git a/src/locales/en.json b/src/locales/en.json index 869a6beb..03579132 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -351,6 +351,7 @@ "revealSeed": "Reveal seed phrase", "preferredDM": "Preferred DM Relays", "preferredDMDescription": "Direct Messages meant for you will be published to these relays. To get DMs on multiple relays, put each relay URL on its own line.", + "noDMURLsWarning": "You haven't set any valid relay URLs. You will not be able to use DMs.", "saveSettings": "Save settings", "bannerImage": "Banner Image", "profileImage": "Profile Image", diff --git a/src/locales/fr.json b/src/locales/fr.json index d8533bd7..c891293d 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -250,6 +250,7 @@ "revealSeed": "Montrer la phrase mnémotechnique", "preferredDM": "Relais MD Préferés", "preferredDMDescription": "Messages directs destinés à vous seront publiés à ces relais. Pour obtiendre des messages sur plusieurs relais, met chaque URL sur son propre ligne.", + "noDMURLsWarning": "Vous n'avez pas specifié aucun URL valide. Vous ne pourrez pas utiliser les messages directs.", "notifications": "Notifications de paiement", "notificationsDesc": "Reçevez un email quand un paiement arrive à votre compte", "seedPhrase": "Phrase mnémotechnique", diff --git a/src/routes/(app)/settings/+layout.svelte b/src/routes/(app)/settings/+layout.svelte index ef4b8abf..24c54a97 100644 --- a/src/routes/(app)/settings/+layout.svelte +++ b/src/routes/(app)/settings/+layout.svelte @@ -1,4 +1,4 @@ -