From d39b4863b48d6d474372c28df0ba8287e5a42ecd Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 10 Feb 2025 15:38:49 +0000 Subject: [PATCH 01/10] website: translations (#5614) * Translated using Weblate (Polish) Currently translated at 100.0% (258 of 258 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/pl/ * Translated using Weblate (Polish) Currently translated at 100.0% (258 of 258 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/pl/ --------- Co-authored-by: Jester Hodl --- website/langs/pl.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/website/langs/pl.json b/website/langs/pl.json index d0674e3d8a..a25155e018 100644 --- a/website/langs/pl.json +++ b/website/langs/pl.json @@ -244,15 +244,17 @@ "stable-versions-built-by-f-droid-org": "Wersje stabilne zbudowane przez F-Droid.org", "releases-to-this-repo-are-done-1-2-days-later": "Wydania na tym repo są kilka dni później", "comparison-section-list-point-4a": "Przekaźniki SimpleX nie mogą skompromitować szyfrowania e2e. Zweryfikuj kody bezpieczeństwa aby złagodzić atak na kanał pozapasmowy", - "hero-overlay-3-title": "Ocena bezpieczeństwa", + "hero-overlay-3-title": "Oceny bezpieczeństwa", "hero-overlay-card-3-p-2": "Trail of Bits przejrzał komponenty kryptograficzne i sieciowe platformy SimpleX w listopadzie 2022. Przeczytaj więcej w ogłoszeniach.", "jobs": "Dołącz do zespołu", - "hero-overlay-3-textlink": "Ocena bezpieczeństwa", + "hero-overlay-3-textlink": "Analizy bezpieczeństwa", "hero-overlay-card-3-p-1": "Trail of Bits jest wiodącą firmą konsultingową w zakresie bezpieczeństwa i technologii, której klientami są duże firmy technologiczne, agencje rządowe i główne projekty blockchain.", "docs-dropdown-9": "Pliki do pobrania", "please-enable-javascript": "Prosimy o włączenie JavaScript w celu wyświetlenia kodu QR.", "please-use-link-in-mobile-app": "Prosimy o skorzystanie z linku w aplikacji mobilnej", "docs-dropdown-10": "Przezroczystość", "docs-dropdown-12": "Bezpieczeństwo", - "docs-dropdown-11": "Często zadawane pytania" + "docs-dropdown-11": "Często zadawane pytania", + "hero-overlay-card-3-p-3": "Firma Trail of Bits dokonała analizy projektu kryptograficznego protokołów sieciowych SimpleX w lipcu 2024 roku. Dowiedz się więcej.", + "docs-dropdown-14": "SimpleX dla firm" } From 0e40d4b5ff2745df3c71a52abed872d832a6341c Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Mon, 10 Feb 2025 17:55:35 +0000 Subject: [PATCH 02/10] ios: export localizations --- .../bg.xcloc/Localized Contents/bg.xliff | 56 +++++++++++++-- .../cs.xcloc/Localized Contents/cs.xliff | 56 +++++++++++++-- .../de.xcloc/Localized Contents/de.xliff | 57 +++++++++++++-- .../en.xcloc/Localized Contents/en.xliff | 70 +++++++++++++++++-- .../es.xcloc/Localized Contents/es.xliff | 57 +++++++++++++-- .../fi.xcloc/Localized Contents/fi.xliff | 56 +++++++++++++-- .../fr.xcloc/Localized Contents/fr.xliff | 56 +++++++++++++-- .../hu.xcloc/Localized Contents/hu.xliff | 57 +++++++++++++-- .../it.xcloc/Localized Contents/it.xliff | 57 +++++++++++++-- .../ja.xcloc/Localized Contents/ja.xliff | 56 +++++++++++++-- .../nl.xcloc/Localized Contents/nl.xliff | 57 +++++++++++++-- .../pl.xcloc/Localized Contents/pl.xliff | 56 +++++++++++++-- .../ru.xcloc/Localized Contents/ru.xliff | 56 +++++++++++++-- .../th.xcloc/Localized Contents/th.xliff | 56 +++++++++++++-- .../tr.xcloc/Localized Contents/tr.xliff | 56 +++++++++++++-- .../uk.xcloc/Localized Contents/uk.xliff | 56 +++++++++++++-- .../Localized Contents/zh-Hans.xliff | 56 +++++++++++++-- 17 files changed, 897 insertions(+), 74 deletions(-) diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index 04dd78337f..396232e038 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -823,6 +823,10 @@ Всички профили profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Всички ваши контакти ще останат свързани. @@ -898,6 +902,10 @@ Позволи необратимо изтриване на изпратените съобщения. (24 часа) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Разрешаване на изпращане на SimpleX линкове. @@ -1060,6 +1068,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Архивиране и качване @@ -1078,6 +1094,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Архивирани контакти @@ -1615,6 +1635,10 @@ Изчисти разговора? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3576,6 +3600,10 @@ This is your own one-time link! Поправката не се поддържа от члена на групата No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: servers error @@ -3589,6 +3617,10 @@ This is your own one-time link! For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing No comment provided by engineer. @@ -4497,6 +4529,10 @@ This is your link for group %@! Member inactive item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. No comment provided by engineer. @@ -4530,6 +4566,10 @@ This is your link for group %@! Членовете на групата могат необратимо да изтриват изпратените съобщения. (24 часа) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Членовете на групата могат да изпращат SimpleX линкове. @@ -5638,6 +5678,10 @@ Error: %@ Забрани реакциите на съобщенията. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. Забранете изпращането на SimpleX линкове. @@ -6018,6 +6062,14 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -7271,10 +7323,6 @@ It can happen because of some bug or when the connection is compromised.Профилът се споделя само с вашите контакти. No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index 9b3a40e012..1f417ad85a 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -788,6 +788,10 @@ All profiles profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Všechny vaše kontakty zůstanou připojeny. @@ -859,6 +863,10 @@ Povolit nevratné smazání odeslaných zpráv. (24 hodin) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. No comment provided by engineer. @@ -1013,6 +1021,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload No comment provided by engineer. @@ -1029,6 +1045,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts No comment provided by engineer. @@ -1531,6 +1551,10 @@ Vyčistit konverzaci? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3430,6 +3454,10 @@ This is your own one-time link! Opravit nepodporované členem skupiny No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: servers error @@ -3443,6 +3471,10 @@ This is your own one-time link! For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing No comment provided by engineer. @@ -4317,6 +4349,10 @@ This is your link for group %@! Member inactive item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. No comment provided by engineer. @@ -4350,6 +4386,10 @@ This is your link for group %@! Členové skupiny mohou nevratně mazat odeslané zprávy. (24 hodin) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. No comment provided by engineer. @@ -5420,6 +5460,10 @@ Error: %@ Zakázat reakce na zprávy. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. No comment provided by engineer. @@ -5789,6 +5833,14 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -7018,10 +7070,6 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován Profil je sdílen pouze s vašimi kontakty. No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index f0f1bf84ef..9ab9b2a818 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -840,6 +840,10 @@ Alle Profile profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Alle Ihre Kontakte bleiben verbunden. @@ -915,6 +919,10 @@ Unwiederbringliches löschen von gesendeten Nachrichten erlauben. (24 Stunden) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Das Senden von SimpleX-Links erlauben. @@ -1080,6 +1088,14 @@ Archiv No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Archivieren und Hochladen @@ -1100,6 +1116,10 @@ Meldung archivieren? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Archivierte Kontakte @@ -1657,6 +1677,10 @@ Chat-Inhalte entfernen? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? Gruppe entfernen oder löschen? @@ -3732,6 +3756,10 @@ Das ist Ihr eigener Einmal-Link! Reparatur wird vom Gruppenmitglied nicht unterstützt No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: Für das Chat-Profil %@: @@ -3747,6 +3775,10 @@ Das ist Ihr eigener Einmal-Link! Wenn Ihr Kontakt beispielsweise Nachrichten über einen SimpleX-Chatserver empfängt, wird Ihre App diese über einen der Server von Flux versenden. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing Für privates Routing @@ -4693,6 +4725,10 @@ Das ist Ihr Link für die Gruppe %@! Mitglied inaktiv item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. Die Rolle des Mitglieds wird auf "%@" geändert. Alle Chat-Mitglieder werden darüber informiert. @@ -4728,6 +4764,10 @@ Das ist Ihr Link für die Gruppe %@! Gruppenmitglieder können gesendete Nachrichten unwiederbringlich löschen. (24 Stunden) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Gruppenmitglieder können SimpleX-Links versenden. @@ -5909,6 +5949,10 @@ Fehler: %@ Reaktionen auf Nachrichten nicht erlauben. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. Das Senden von SimpleX-Links nicht erlauben. @@ -6314,6 +6358,14 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Verstoß melden: Nur Gruppenmoderatoren werden es sehen. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports Meldungen @@ -7654,11 +7706,6 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro Das Profil wird nur mit Ihren Kontakten geteilt. No comment provided by engineer. - - The report will be archived for you. - Die Meldung wird für Sie archiviert. - No comment provided by engineer. - The same conditions will apply to operator **%@**. Dieselben Nutzungsbedingungen gelten auch für den Betreiber **%@**. diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index 22d61004ca..f1edf1e8cd 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -843,6 +843,11 @@ All profiles profile dropdown + + All reports will be archived for you. + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. All your contacts will remain connected. @@ -918,6 +923,11 @@ Allow to irreversibly delete sent messages. (24 hours) No comment provided by engineer. + + Allow to report messsages to moderators. + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Allow to send SimpleX links. @@ -1083,6 +1093,16 @@ Archive No comment provided by engineer. + + Archive %lld reports? + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + Archive all reports? + No comment provided by engineer. + Archive and upload Archive and upload @@ -1103,6 +1123,11 @@ Archive report? No comment provided by engineer. + + Archive reports + Archive reports + swipe action + Archived contacts Archived contacts @@ -1660,6 +1685,11 @@ Clear conversation? No comment provided by engineer. + + Clear group? + Clear group? + No comment provided by engineer. + Clear or delete group? Clear or delete group? @@ -3740,6 +3770,11 @@ This is your own one-time link! Fix not supported by group member No comment provided by engineer. + + For all moderators + For all moderators + No comment provided by engineer. + For chat profile %@: For chat profile %@: @@ -3755,6 +3790,11 @@ This is your own one-time link! For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server. No comment provided by engineer. + + For me + For me + No comment provided by engineer. + For private routing For private routing @@ -4706,6 +4746,11 @@ This is your link for group %@! Member inactive item status text + + Member reports + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. Member role will be changed to "%@". All chat members will be notified. @@ -4741,6 +4786,11 @@ This is your link for group %@! Members can irreversibly delete sent messages. (24 hours) No comment provided by engineer. + + Members can report messsages to moderators. + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Members can send SimpleX links. @@ -5930,6 +5980,11 @@ Error: %@ Prohibit messages reactions. No comment provided by engineer. + + Prohibit reporting messages to moderators. + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. Prohibit sending SimpleX links. @@ -6338,6 +6393,16 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports Reports @@ -7680,11 +7745,6 @@ It can happen because of some bug or when the connection is compromised.The profile is only shared with your contacts. No comment provided by engineer. - - The report will be archived for you. - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. The same conditions will apply to operator **%@**. diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index 86043e9fcf..968dd52f13 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -840,6 +840,10 @@ Todos los perfiles profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Todos tus contactos permanecerán conectados. @@ -915,6 +919,10 @@ Se permite la eliminación irreversible de mensajes. (24 horas) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Se permite enviar enlaces SimpleX. @@ -1080,6 +1088,14 @@ Archivar No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Archivar y subir @@ -1100,6 +1116,10 @@ ¿Archivar informe? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Contactos archivados @@ -1657,6 +1677,10 @@ ¿Vaciar conversación? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? ¿Vaciar o eliminar grupo? @@ -3732,6 +3756,10 @@ This is your own one-time link! Corrección no compatible con miembro del grupo No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: Para el perfil de chat %@: @@ -3747,6 +3775,10 @@ This is your own one-time link! Si por ejemplo tu contacto recibe los mensajes a través de un servidor de SimpleX Chat, tu aplicación los entregará a través de un servidor de Flux. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing Para enrutamiento privado @@ -4693,6 +4725,10 @@ This is your link for group %@! Miembro inactivo item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. El rol del miembro cambiará a "%@" y todos serán notificados. @@ -4728,6 +4764,10 @@ This is your link for group %@! Los miembros del grupo pueden eliminar mensajes de forma irreversible. (24 horas) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Los miembros del grupo pueden enviar enlaces SimpleX. @@ -5909,6 +5949,10 @@ Error: %@ No se permiten reacciones a los mensajes. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. No se permite enviar enlaces SimpleX. @@ -6314,6 +6358,14 @@ Actívalo en ajustes de *Servidores y Redes*. Informar de violación: sólo los moderadores del grupo lo verán. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports Informes @@ -7654,11 +7706,6 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. El perfil sólo se comparte con tus contactos. No comment provided by engineer. - - The report will be archived for you. - El informe será archivado para ti. - No comment provided by engineer. - The same conditions will apply to operator **%@**. Las mismas condiciones se aplicarán al operador **%@**. diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index 2a4c3fb9ff..e8113a5553 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -775,6 +775,10 @@ All profiles profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Kaikki kontaktisi pysyvät yhteydessä. @@ -846,6 +850,10 @@ Salli lähetettyjen viestien peruuttamaton poistaminen. (24 tuntia) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. No comment provided by engineer. @@ -999,6 +1007,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload No comment provided by engineer. @@ -1015,6 +1031,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts No comment provided by engineer. @@ -1516,6 +1536,10 @@ Tyhjennä keskustelu? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3412,6 +3436,10 @@ This is your own one-time link! Ryhmän jäsen ei tue korjausta No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: servers error @@ -3425,6 +3453,10 @@ This is your own one-time link! For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing No comment provided by engineer. @@ -4299,6 +4331,10 @@ This is your link for group %@! Member inactive item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. No comment provided by engineer. @@ -4332,6 +4368,10 @@ This is your link for group %@! Ryhmän jäsenet voivat poistaa lähetetyt viestit peruuttamattomasti. (24 tuntia) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. No comment provided by engineer. @@ -5400,6 +5440,10 @@ Error: %@ Estä viestireaktiot. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. No comment provided by engineer. @@ -5769,6 +5813,14 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -6996,10 +7048,6 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.Profiili jaetaan vain kontaktiesi kanssa. No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index c030ccf98b..0c9a87126e 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -833,6 +833,10 @@ Tous les profiles profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Tous vos contacts resteront connectés. @@ -908,6 +912,10 @@ Autoriser la suppression irréversible de messages envoyés. (24 heures) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Autorise l'envoi de liens SimpleX. @@ -1070,6 +1078,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Archiver et téléverser @@ -1088,6 +1104,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Contacts archivés @@ -1642,6 +1662,10 @@ Effacer la conversation ? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3693,6 +3717,10 @@ Il s'agit de votre propre lien unique ! Correction non prise en charge par un membre du groupe No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: Pour le profil de discussion %@ : @@ -3708,6 +3736,10 @@ Il s'agit de votre propre lien unique ! Par exemple, si votre contact reçoit des messages via un serveur SimpleX Chat, votre application les transmettra via un serveur Flux. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing Pour le routage privé @@ -4647,6 +4679,10 @@ Voici votre lien pour le groupe %@ ! Membre inactif item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. Le rôle du membre sera modifié pour « %@ ». Tous les membres du chat seront notifiés. @@ -4682,6 +4718,10 @@ Voici votre lien pour le groupe %@ ! Les membres du groupe peuvent supprimer de manière irréversible les messages envoyés. (24 heures) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Les membres du groupe peuvent envoyer des liens SimpleX. @@ -5851,6 +5891,10 @@ Erreur : %@ Interdire les réactions aux messages. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. Interdire l'envoi de liens SimpleX. @@ -6249,6 +6293,14 @@ Activez-le dans les paramètres *Réseau et serveurs*. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -7584,10 +7636,6 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise. Le profil n'est partagé qu'avec vos contacts. No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. Les mêmes conditions s'appliquent à l'opérateur **%@**. diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index 5b212638e7..14746bfb92 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -840,6 +840,10 @@ Összes profil profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Az összes ismerősével kapcsolatban marad. @@ -915,6 +919,10 @@ Elküldött üzenetek végleges törlésének engedélyezése. (24 óra) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. A SimpleX-hivatkozások küldése engedélyezve van. @@ -1080,6 +1088,14 @@ Archívum No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Archiválás és feltöltés @@ -1100,6 +1116,10 @@ Jelentés archiválása? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Archivált ismerősök @@ -1657,6 +1677,10 @@ Üzenetek kiürítése? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? Csoport kiürítése vagy törlése? @@ -3732,6 +3756,10 @@ Ez az Ön egyszer használható meghívó-hivatkozása! Csoporttag általi javítás nem támogatott No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: A(z) %@ nevű csevegési profilhoz: @@ -3747,6 +3775,10 @@ Ez az Ön egyszer használható meghívó-hivatkozása! Például, ha az Ön ismerőse egy SimpleX Chat-kiszolgálón keresztül fogadja az üzeneteket, az Ön alkalmazása egy Flux-kiszolgálón keresztül fogja azokat kézbesíteni. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing A privát útválasztáshoz @@ -4693,6 +4725,10 @@ Ez az Ön hivatkozása a(z) %@ nevű csoporthoz! Inaktív tag item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. A tag szerepeköre meg fog változni a következőre: "%@". A csevegés tagjai értesítést fognak kapni. @@ -4728,6 +4764,10 @@ Ez az Ön hivatkozása a(z) %@ nevű csoporthoz! A csoport tagjai véglegesen törölhetik az elküldött üzeneteiket. (24 óra) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. A csoport tagjai küldhetnek SimpleX-hivatkozásokat. @@ -5909,6 +5949,10 @@ Hiba: %@ Az üzenetreakciók tiltása. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. A SimpleX-hivatkozások küldése le van tiltva. @@ -6314,6 +6358,14 @@ Engedélyezze a „Beállítások -> Hálózat és kiszolgálók” menüben. Szabálysértés jelentése: csak a csoport moderátorai látják. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports Jelentések @@ -7654,11 +7706,6 @@ Ez valamilyen hiba vagy sérült kapcsolat esetén fordulhat elő. A profilja csak az ismerőseivel van megosztva. No comment provided by engineer. - - The report will be archived for you. - A jelentés archiválva lesz az Ön számára. - No comment provided by engineer. - The same conditions will apply to operator **%@**. Ugyanezek a feltételek lesznek elfogadva a következő üzemeltetőre is: **%@**. diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index 2492edc626..8dd8b44054 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -840,6 +840,10 @@ Tutti gli profili profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Tutti i tuoi contatti resteranno connessi. @@ -915,6 +919,10 @@ Permetti di eliminare irreversibilmente i messaggi inviati. (24 ore) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Consenti di inviare link di SimpleX. @@ -1080,6 +1088,14 @@ Archivia No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Archivia e carica @@ -1100,6 +1116,10 @@ Archiviare la segnalazione? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Contatti archiviati @@ -1657,6 +1677,10 @@ Svuotare la conversazione? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? Svuotare o eliminare il gruppo? @@ -3732,6 +3756,10 @@ Questo è il tuo link una tantum! Correzione non supportata dal membro del gruppo No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: Per il profilo di chat %@: @@ -3747,6 +3775,10 @@ Questo è il tuo link una tantum! Ad esempio, se il tuo contatto riceve messaggi tramite un server di SimpleX Chat, la tua app li consegnerà tramite un server Flux. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing Per l'instradamento privato @@ -4693,6 +4725,10 @@ Questo è il tuo link per il gruppo %@! Membro inattivo item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. Il ruolo del membro verrà cambiato in "%@". Verranno notificati tutti i membri della chat. @@ -4728,6 +4764,10 @@ Questo è il tuo link per il gruppo %@! I membri del gruppo possono eliminare irreversibilmente i messaggi inviati. (24 ore) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. I membri del gruppo possono inviare link di Simplex. @@ -5909,6 +5949,10 @@ Errore: %@ Proibisci le reazioni ai messaggi. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. Vieta l'invio di link di SimpleX. @@ -6314,6 +6358,14 @@ Attivalo nelle impostazioni *Rete e server*. Segnala violazione: solo i moderatori del gruppo lo vedranno. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports Segnalazioni @@ -7654,11 +7706,6 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.Il profilo è condiviso solo con i tuoi contatti. No comment provided by engineer. - - The report will be archived for you. - La segnalazione verrà archiviata per te. - No comment provided by engineer. - The same conditions will apply to operator **%@**. Le stesse condizioni si applicheranno all'operatore **%@**. diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index 913e227f17..9884967d68 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -813,6 +813,10 @@ すべてのプロフィール profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. あなたの連絡先が繋がったまま継続します。 @@ -886,6 +890,10 @@ 送信済みメッセージの永久削除を許可する。(24時間) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. SimpleXリンクの送信を許可。 @@ -1047,6 +1055,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload アーカイブとアップロード @@ -1064,6 +1080,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts No comment provided by engineer. @@ -1569,6 +1589,10 @@ ダイアログのクリアしますか? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3485,6 +3509,10 @@ This is your own one-time link! グループメンバーによる修正はサポートされていません No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: servers error @@ -3498,6 +3526,10 @@ This is your own one-time link! For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing No comment provided by engineer. @@ -4372,6 +4404,10 @@ This is your link for group %@! Member inactive item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. No comment provided by engineer. @@ -4405,6 +4441,10 @@ This is your link for group %@! グループのメンバーがメッセージを完全削除することができます。(24時間) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. No comment provided by engineer. @@ -5478,6 +5518,10 @@ Error: %@ メッセージへのリアクションは禁止されています。 No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. No comment provided by engineer. @@ -5846,6 +5890,14 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -7067,10 +7119,6 @@ It can happen because of some bug or when the connection is compromised.プロフィールは連絡先にしか共有されません。 No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index d8ced23aa4..044ea87cd6 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -840,6 +840,10 @@ Alle profielen profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Al uw contacten blijven verbonden. @@ -915,6 +919,10 @@ Sta toe om verzonden berichten definitief te verwijderen. (24 uur) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Sta toe dat SimpleX-links worden verzonden. @@ -1080,6 +1088,14 @@ Archief No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Archiveren en uploaden @@ -1100,6 +1116,10 @@ Rapport archiveren? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Gearchiveerde contacten @@ -1657,6 +1677,10 @@ Gesprek wissen? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? Groep wissen of verwijderen? @@ -3732,6 +3756,10 @@ Dit is uw eigen eenmalige link! Herstel wordt niet ondersteund door groepslid No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: Voor chatprofiel %@: @@ -3747,6 +3775,10 @@ Dit is uw eigen eenmalige link! Als uw contactpersoon bijvoorbeeld berichten ontvangt via een SimpleX Chat-server, worden deze door uw app via een Flux-server verzonden. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing Voor privé-routering @@ -4693,6 +4725,10 @@ Dit is jouw link voor groep %@! Lid inactief item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. De rol van het lid wordt gewijzigd naar "%@". Alle chatleden worden op de hoogte gebracht. @@ -4728,6 +4764,10 @@ Dit is jouw link voor groep %@! Groepsleden kunnen verzonden berichten onherroepelijk verwijderen. (24 uur) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Groepsleden kunnen SimpleX-links verzenden. @@ -5909,6 +5949,10 @@ Fout: %@ Berichten reacties verbieden. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. Verbied het verzenden van SimpleX-links @@ -6314,6 +6358,14 @@ Schakel dit in in *Netwerk en servers*-instellingen. Rapporteer overtreding: alleen groepsmoderators kunnen dit zien. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports Rapporten @@ -7654,11 +7706,6 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast. Het profiel wordt alleen gedeeld met uw contacten. No comment provided by engineer. - - The report will be archived for you. - Het rapport wordt voor u gearchiveerd. - No comment provided by engineer. - The same conditions will apply to operator **%@**. Dezelfde voorwaarden gelden voor operator **%@**. diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index c410ff46e3..1c39ed50ba 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -838,6 +838,10 @@ Wszystkie profile profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Wszystkie Twoje kontakty pozostaną połączone. @@ -913,6 +917,10 @@ Zezwól na nieodwracalne usunięcie wysłanych wiadomości. (24 godziny) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Zezwól na wysyłanie linków SimpleX. @@ -1075,6 +1083,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Archiwizuj i prześlij @@ -1093,6 +1109,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Zarchiwizowane kontakty @@ -1648,6 +1668,10 @@ Wyczyścić rozmowę? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3678,6 +3702,10 @@ To jest twój jednorazowy link! Naprawa nie jest obsługiwana przez członka grupy No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: servers error @@ -3691,6 +3719,10 @@ To jest twój jednorazowy link! For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing No comment provided by engineer. @@ -4620,6 +4652,10 @@ To jest twój link do grupy %@! Członek nieaktywny item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. No comment provided by engineer. @@ -4653,6 +4689,10 @@ To jest twój link do grupy %@! Członkowie grupy mogą nieodwracalnie usuwać wysłane wiadomości. (24 godziny) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Członkowie grupy mogą wysyłać linki SimpleX. @@ -5801,6 +5841,10 @@ Błąd: %@ Zabroń reakcje wiadomości. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. Zabroń wysyłania linków SimpleX. @@ -6199,6 +6243,14 @@ Włącz w ustawianiach *Sieć i serwery* . Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -7514,10 +7566,6 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom Profil jest udostępniany tylko Twoim kontaktom. No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index d5dc066a9f..9bae61e56d 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -838,6 +838,10 @@ Все профили profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Все контакты, которые соединились через этот адрес, сохранятся. @@ -913,6 +917,10 @@ Разрешить необратимо удалять отправленные сообщения. (24 часа) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Разрешить отправлять ссылки SimpleX. @@ -1077,6 +1085,14 @@ Архивировать No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Архивировать и загрузить @@ -1097,6 +1113,10 @@ Архивировать отчет? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Архивированные контакты @@ -1651,6 +1671,10 @@ Очистить разговор? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3702,6 +3726,10 @@ This is your own one-time link! Починка не поддерживается членом группы No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: Для профиля чата %@: @@ -3717,6 +3745,10 @@ This is your own one-time link! Например, если Ваш контакт получает сообщения через сервер SimpleX Chat, Ваше приложение доставит их через сервер Flux. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing Для доставки сообщений @@ -4655,6 +4687,10 @@ This is your link for group %@! Член неактивен item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. Роль участника будет изменена на "%@". Все участники разговора получат уведомление. @@ -4690,6 +4726,10 @@ This is your link for group %@! Члены группы могут необратимо удалять отправленные сообщения. (24 часа) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Члены группы могут отправлять ссылки SimpleX. @@ -5859,6 +5899,10 @@ Error: %@ Запретить реакции на сообщения. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. Запретить отправку ссылок SimpleX. @@ -6257,6 +6301,14 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -7592,10 +7644,6 @@ It can happen because of some bug or when the connection is compromised.Профиль отправляется только Вашим контактам. No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. Те же самые условия будут приняты для оператора **%@**. diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index ea0ecaa4f0..7239c30b44 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -767,6 +767,10 @@ All profiles profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. ผู้ติดต่อทั้งหมดของคุณจะยังคงเชื่อมต่ออยู่. @@ -838,6 +842,10 @@ อนุญาตให้ลบข้อความที่ส่งไปแล้วอย่างถาวร No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. No comment provided by engineer. @@ -991,6 +999,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload No comment provided by engineer. @@ -1007,6 +1023,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts No comment provided by engineer. @@ -1508,6 +1528,10 @@ ลบการสนทนา? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3397,6 +3421,10 @@ This is your own one-time link! การแก้ไขไม่สนับสนุนโดยสมาชิกกลุ่ม No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: servers error @@ -3410,6 +3438,10 @@ This is your own one-time link! For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing No comment provided by engineer. @@ -4282,6 +4314,10 @@ This is your link for group %@! Member inactive item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. No comment provided by engineer. @@ -4315,6 +4351,10 @@ This is your link for group %@! สมาชิกกลุ่มสามารถลบข้อความที่ส่งแล้วอย่างถาวร No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. No comment provided by engineer. @@ -5379,6 +5419,10 @@ Error: %@ ห้ามแสดงปฏิกิริยาต่อข้อความ No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. No comment provided by engineer. @@ -5746,6 +5790,14 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -6970,10 +7022,6 @@ It can happen because of some bug or when the connection is compromised.โปรไฟล์นี้แชร์กับผู้ติดต่อของคุณเท่านั้น No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index 28befea033..0963a750aa 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -833,6 +833,10 @@ Tüm Profiller profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Konuştuğun kişilerin tümü bağlı kalacaktır. @@ -908,6 +912,10 @@ Gönderilen mesajların kalıcı olarak silinmesine izin ver. (24 saat içinde) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. SimpleX bağlantıları göndilmesine izin ver. @@ -1070,6 +1078,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Arşivle ve yükle @@ -1088,6 +1104,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Arşivli kişiler @@ -1642,6 +1662,10 @@ Sohbet temizlensin mi? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3692,6 +3716,10 @@ Bu senin kendi tek kullanımlık bağlantın! Düzeltme grup üyesi tarafından desteklenmiyor No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: Sohbet profili için %@: @@ -3707,6 +3735,10 @@ Bu senin kendi tek kullanımlık bağlantın! Örneğin, eğer kişiniz SimpleX Sohbet sunucusundan mesajları alıyorsa, uygulamanız bu mesajları Flux sunucusundan iletecektir. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing Gizli yönlendirme için @@ -4646,6 +4678,10 @@ Bu senin grup için bağlantın %@! Üye inaktif item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. Üye rolü "%@" olarak değiştirilecektir. Tüm sohbet üyeleri bilgilendirilecektir. @@ -4680,6 +4716,10 @@ Bu senin grup için bağlantın %@! Grup üyeleri, gönderilen mesajları kalıcı olarak silebilir. (24 saat içinde) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Grup üyeleri SimpleX bağlantıları gönderebilir. @@ -5828,6 +5868,10 @@ Hata: %@ Mesajlarda tepkileri yasakla. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. SimpleX bağlantısı gönderimini yasakla. @@ -6226,6 +6270,14 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -7544,10 +7596,6 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. Profil sadece kişilerinle paylaşılacak. No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index a8c1ec27b7..8d48227e77 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -833,6 +833,10 @@ Всі профілі profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. Всі ваші контакти залишаться на зв'язку. @@ -908,6 +912,10 @@ Дозволяє безповоротно видаляти надіслані повідомлення. (24 години) No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. Дозволити надсилати посилання SimpleX. @@ -1070,6 +1078,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload Архівування та завантаження @@ -1088,6 +1104,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts Архівні контакти @@ -1642,6 +1662,10 @@ Відверта розмова? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3693,6 +3717,10 @@ This is your own one-time link! Виправлення не підтримується учасником групи No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: Для профілю чату %@: @@ -3708,6 +3736,10 @@ This is your own one-time link! Наприклад, якщо ваш контакт отримує повідомлення через сервер SimpleX Chat, ваш додаток доставлятиме їх через сервер Flux. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing Для приватної маршрутизації @@ -4647,6 +4679,10 @@ This is your link for group %@! Користувач неактивний item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. Роль учасника буде змінено на "%@". Усі учасники чату отримають сповіщення. @@ -4682,6 +4718,10 @@ This is your link for group %@! Учасники групи можуть безповоротно видаляти надіслані повідомлення. (24 години) No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. Учасники групи можуть надсилати посилання SimpleX. @@ -5851,6 +5891,10 @@ Error: %@ Заборонити реакції на повідомлення. No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. Заборонити надсилання посилань SimpleX. @@ -6249,6 +6293,14 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -7584,10 +7636,6 @@ It can happen because of some bug or when the connection is compromised.Профіль доступний лише вашим контактам. No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. Такі ж умови діятимуть і для оператора **%@**. diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index 5be4378abb..6ac247c6f1 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -811,6 +811,10 @@ 所有配置文件 profile dropdown + + All reports will be archived for you. + No comment provided by engineer. + All your contacts will remain connected. 所有联系人会保持连接。 @@ -886,6 +890,10 @@ 允许不可撤回地删除已发送消息 No comment provided by engineer. + + Allow to report messsages to moderators. + No comment provided by engineer. + Allow to send SimpleX links. 允许发送 SimpleX 链接。 @@ -1047,6 +1055,14 @@ Archive No comment provided by engineer. + + Archive %lld reports? + No comment provided by engineer. + + + Archive all reports? + No comment provided by engineer. + Archive and upload 存档和上传 @@ -1065,6 +1081,10 @@ Archive report? No comment provided by engineer. + + Archive reports + swipe action + Archived contacts 已存档的联系人 @@ -1602,6 +1622,10 @@ 清除对话吗? No comment provided by engineer. + + Clear group? + No comment provided by engineer. + Clear or delete group? No comment provided by engineer. @@ -3618,6 +3642,10 @@ This is your own one-time link! 修复群组成员不支持的问题 No comment provided by engineer. + + For all moderators + No comment provided by engineer. + For chat profile %@: servers error @@ -3631,6 +3659,10 @@ This is your own one-time link! For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server. No comment provided by engineer. + + For me + No comment provided by engineer. + For private routing No comment provided by engineer. @@ -4555,6 +4587,10 @@ This is your link for group %@! 成员不活跃 item status text + + Member reports + chat feature + Member role will be changed to "%@". All chat members will be notified. No comment provided by engineer. @@ -4588,6 +4624,10 @@ This is your link for group %@! 群组成员可以不可撤回地删除已发送的消息 No comment provided by engineer. + + Members can report messsages to moderators. + No comment provided by engineer. + Members can send SimpleX links. 群成员可发送 SimpleX 链接。 @@ -5725,6 +5765,10 @@ Error: %@ 禁止消息回应。 No comment provided by engineer. + + Prohibit reporting messages to moderators. + No comment provided by engineer. + Prohibit sending SimpleX links. 禁止发送 SimpleX 链接。 @@ -6121,6 +6165,14 @@ Enable in *Network & servers* settings. Report violation: only group moderators will see it. report reason + + Report: (text.isEmpty ? reason.text : text) + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + Reports No comment provided by engineer. @@ -7427,10 +7479,6 @@ It can happen because of some bug or when the connection is compromised.该资料仅与您的联系人共享。 No comment provided by engineer. - - The report will be archived for you. - No comment provided by engineer. - The same conditions will apply to operator **%@**. No comment provided by engineer. From 47997fd90b37dd2769d28e3378b203589cccdd60 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Mon, 10 Feb 2025 21:36:55 +0000 Subject: [PATCH 03/10] ios: support opening SimpleX links from camera and other apps --- apps/ios/Shared/ContentView.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/ios/Shared/ContentView.swift b/apps/ios/Shared/ContentView.swift index 3198a3d361..65631954e5 100644 --- a/apps/ios/Shared/ContentView.swift +++ b/apps/ios/Shared/ContentView.swift @@ -317,6 +317,12 @@ struct ContentView: View { .onContinueUserActivity("INStartCallIntent", perform: processUserActivity) .onContinueUserActivity("INStartAudioCallIntent", perform: processUserActivity) .onContinueUserActivity("INStartVideoCallIntent", perform: processUserActivity) + .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { userActivity in + if let url = userActivity.webpageURL { + logger.debug("onContinueUserActivity.NSUserActivityTypeBrowsingWeb: \(url)") + chatModel.appOpenUrl = url + } + } } private func setConditionsNotified_() async { From 8dbebbe3d640028649980da278e17278da9cd2bc Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Mon, 10 Feb 2025 21:56:24 +0000 Subject: [PATCH 04/10] 6.3-beta.4: ios 263, android 273, desktop 91 --- apps/ios/SimpleX.xcodeproj/project.pbxproj | 36 +++++++++++----------- apps/multiplatform/gradle.properties | 8 ++--- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 95086b78a8..d5acf0df8f 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -174,8 +174,8 @@ 64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; }; 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; }; 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; }; - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ-ghc9.6.3.a */; }; - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ.a */; }; + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W-ghc9.6.3.a */; }; + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W.a */; }; 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; }; 64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; }; 64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; }; @@ -527,8 +527,8 @@ 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = ""; }; 64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; 64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ-ghc9.6.3.a"; sourceTree = ""; }; - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ.a"; sourceTree = ""; }; + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W-ghc9.6.3.a"; sourceTree = ""; }; + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W.a"; sourceTree = ""; }; 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = ""; }; 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = ""; }; @@ -680,8 +680,8 @@ 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */, 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */, 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */, - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ-ghc9.6.3.a in Frameworks */, - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ.a in Frameworks */, + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W-ghc9.6.3.a in Frameworks */, + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W.a in Frameworks */, CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -762,8 +762,8 @@ 64C829992D54AEEE006B9E89 /* libffi.a */, 64C829982D54AEED006B9E89 /* libgmp.a */, 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */, - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ-ghc9.6.3.a */, - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.3-2g9X994zhsoKwinyJQVzkZ.a */, + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W-ghc9.6.3.a */, + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.0.4-4btgYWZNeX12ojCzRaHJ3W.a */, ); path = Libraries; sourceTree = ""; @@ -1947,7 +1947,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -1996,7 +1996,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2037,7 +2037,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2057,7 +2057,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2082,7 +2082,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GCC_OPTIMIZATION_LEVEL = s; @@ -2119,7 +2119,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_CODE_COVERAGE = NO; @@ -2156,7 +2156,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2207,7 +2207,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2258,7 +2258,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -2292,7 +2292,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 262; + CURRENT_PROJECT_VERSION = 263; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; diff --git a/apps/multiplatform/gradle.properties b/apps/multiplatform/gradle.properties index 276bb8127f..2b53258fc8 100644 --- a/apps/multiplatform/gradle.properties +++ b/apps/multiplatform/gradle.properties @@ -24,11 +24,11 @@ android.nonTransitiveRClass=true kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.jvm.target=11 -android.version_name=6.3-beta.3 -android.version_code=272 +android.version_name=6.3-beta.4 +android.version_code=273 -desktop.version_name=6.3-beta.3 -desktop.version_code=90 +desktop.version_name=6.3-beta.4 +desktop.version_code=91 kotlin.version=1.9.23 gradle.plugin.version=8.2.0 From a90f255df5c314edd5c79c472278f197af4ce46d Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Sat, 15 Feb 2025 00:12:32 +0400 Subject: [PATCH 05/10] core: adapt simplexmq api for shared msg body (via MsgReq markers) (#5626) * core: shared msg body 2 * WIP * compiles * refactor * refactor * refactor * format * simplexmq * refactor * refactor ChatMsgReq * agent query plans * simpler * test * test * fix test * agent plans * simplexmq --------- Co-authored-by: Evgeny Poberezkin --- cabal.project | 2 +- scripts/nix/sha256map.nix | 2 +- src/Simplex/Chat/Library/Commands.hs | 20 ++-- src/Simplex/Chat/Library/Internal.hs | 80 +++++++------ src/Simplex/Chat/Library/Subscriber.hs | 2 +- .../SQLite/Migrations/agent_query_plans.txt | 43 ++++--- src/Simplex/Chat/Util.hs | 6 +- tests/ChatTests/Groups.hs | 108 ++++++++++++++++++ tests/ChatTests/Utils.hs | 5 + 9 files changed, 209 insertions(+), 59 deletions(-) diff --git a/cabal.project b/cabal.project index dcd465c658..70f66604de 100644 --- a/cabal.project +++ b/cabal.project @@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: bd97cb04495b90412c1300fd1a4862f488db85cb + tag: 7ac80bffcb51e2461ff8d0f54094943c56f1c4e6 source-repository-package type: git diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index d440afb61f..0975e772b9 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."bd97cb04495b90412c1300fd1a4862f488db85cb" = "19i0r2b4kfkq2zlbmq134a0hk0vszhm6wdlfyp58d35zqrc0xadf"; + "https://github.com/simplex-chat/simplexmq.git"."7ac80bffcb51e2461ff8d0f54094943c56f1c4e6" = "1qzv3vs1f0h5df5i0fi2hqiagkkwqghpzjgh9bnjrgmhkhvkl2iq"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 4c5beb9cee..ebc63e131b 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -80,7 +80,7 @@ import Simplex.Chat.Store.Shared import Simplex.Chat.Types import Simplex.Chat.Types.Preferences import Simplex.Chat.Types.Shared -import Simplex.Chat.Util (liftIOEither) +import Simplex.Chat.Util (liftIOEither, zipWith3') import qualified Simplex.Chat.Util as U import Simplex.FileTransfer.Description (FileDescriptionURI (..), maxFileSize, maxFileSizeHard) import Simplex.Messaging.Agent as Agent @@ -1893,6 +1893,12 @@ processChatCommand' vr = \case pure CRBroadcastSent {user, msgContent = mc, successes = 0, failures = 0, timestamp} Just (ctConns :: NonEmpty (Contact, Connection)) -> do let idsEvts = L.map ctSndEvent ctConns + -- TODO Broadcast rework + -- In createNewSndMessage and encodeChatMessage we could use Nothing for sharedMsgId, + -- then we could reuse message body across broadcast. + -- Encoding different sharedMsgId and reusing body is meaningless as referencing will not work anyway. + -- As an improvement, single message record with its sharedMsgId could be created for new "broadcast" entity. + -- Then all recipients could refer to broadcast message using same sharedMsgId. sndMsgs <- lift $ createSndMessages idsEvts let msgReqs_ :: NonEmpty (Either ChatError ChatMsgReq) = L.zipWith (fmap . ctMsgReq) ctConns sndMsgs (errs, ctSndMsgs :: [(Contact, SndMessage)]) <- @@ -1909,9 +1915,7 @@ processChatCommand' vr = \case ctSndEvent :: (Contact, Connection) -> (ConnOrGroupId, ChatMsgEvent 'Json) ctSndEvent (_, Connection {connId}) = (ConnectionId connId, XMsgNew $ MCSimple (extMsgContent mc Nothing)) ctMsgReq :: (Contact, Connection) -> SndMessage -> ChatMsgReq - ctMsgReq (_, conn) SndMessage {msgId, msgBody} = (conn, MsgFlags {notification = hasNotification XMsgNew_}, msgBody, [msgId]) - zipWith3' :: (a -> b -> c -> d) -> NonEmpty a -> NonEmpty b -> NonEmpty c -> NonEmpty d - zipWith3' f ~(x :| xs) ~(y :| ys) ~(z :| zs) = f x y z :| zipWith3 f xs ys zs + ctMsgReq (_, conn) SndMessage {msgId, msgBody} = (conn, MsgFlags {notification = hasNotification XMsgNew_}, (vrValue msgBody, [msgId])) combineResults :: (Contact, Connection) -> Either ChatError SndMessage -> Either ChatError ([Int64], PQEncryption) -> Either ChatError (Contact, SndMessage) combineResults (ct, _) (Right msg') (Right _) = Right (ct, msg') combineResults _ (Left e) _ = Left e @@ -2662,7 +2666,7 @@ processChatCommand' vr = \case ctMsgReq :: ChangedProfileContact -> Either ChatError SndMessage -> Either ChatError ChatMsgReq ctMsgReq ChangedProfileContact {conn} = fmap $ \SndMessage {msgId, msgBody} -> - (conn, MsgFlags {notification = hasNotification XInfo_}, msgBody, [msgId]) + (conn, MsgFlags {notification = hasNotification XInfo_}, (vrValue msgBody, [msgId])) updateContactPrefs :: User -> Contact -> Preferences -> CM ChatResponse updateContactPrefs _ ct@Contact {activeConn = Nothing} _ = throwChatError $ CEContactNotActive ct updateContactPrefs user@User {userId} ct@Contact {activeConn = Just Connection {customUserProfileId}, userPreferences = contactUserPrefs} contactUserPrefs' @@ -2713,7 +2717,7 @@ processChatCommand' vr = \case when (memberStatus membership == GSMemInvited) $ throwChatError (CEGroupNotJoined g) when (memberRemoved membership) $ throwChatError CEGroupMemberUserRemoved unless (memberActive membership) $ throwChatError CEGroupMemberNotActive - delGroupChatItemsForMembers :: User -> GroupInfo -> [GroupMember] -> [CChatItem CTGroup] -> CM ChatResponse + delGroupChatItemsForMembers :: User -> GroupInfo -> [GroupMember] -> [CChatItem 'CTGroup] -> CM ChatResponse delGroupChatItemsForMembers user gInfo ms items = do assertDeletable gInfo items assertUserGroupRole gInfo GRAdmin -- TODO GRModerator when most users migrate @@ -2723,8 +2727,8 @@ processChatCommand' vr = \case delGroupChatItems user gInfo items True where assertDeletable :: GroupInfo -> [CChatItem 'CTGroup] -> CM () - assertDeletable GroupInfo {membership = GroupMember {memberRole = membershipMemRole}} items = - unless (all itemDeletable items) $ throwChatError CEInvalidChatItemDelete + assertDeletable GroupInfo {membership = GroupMember {memberRole = membershipMemRole}} items' = + unless (all itemDeletable items') $ throwChatError CEInvalidChatItemDelete where itemDeletable :: CChatItem 'CTGroup -> Bool itemDeletable (CChatItem _ ChatItem {chatDir, meta = CIMeta {itemSharedMsgId}}) = diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index ea838206fe..3e96e1e496 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -274,7 +274,7 @@ uniqueMsgMentions maxMentions mentions = go M.empty S.empty 0 go acc seen n (name : rest) | n >= maxMentions = acc | otherwise = case M.lookup name mentions of - Just mm@MsgMention {memberId} | S.notMember memberId seen -> + Just mm@MsgMention {memberId} | S.notMember memberId seen -> go (M.insert name mm acc) (S.insert memberId seen) (n + 1) rest _ -> go acc seen n rest @@ -1312,7 +1312,7 @@ batchSendConnMessagesB _user conn msgFlags msgs_ = do let batched_ = batchSndMessagesJSON msgs_ case L.nonEmpty batched_ of Just batched' -> do - let msgReqs = L.map (fmap (msgBatchReq conn msgFlags)) batched' + let msgReqs = L.map (fmap msgBatchReq_) batched' delivered <- deliverMessagesB msgReqs let msgs' = concat $ L.zipWith flattenMsgs batched' delivered pqEnc = findLastPQEnc delivered @@ -1320,6 +1320,9 @@ batchSendConnMessagesB _user conn msgFlags msgs_ = do pure (msgs', pqEnc) Nothing -> pure ([], Nothing) where + msgBatchReq_ :: MsgBatch -> ChatMsgReq + msgBatchReq_ (MsgBatch batchBody sndMsgs) = + (conn, msgFlags, (vrValue batchBody, map (\SndMessage {msgId} -> msgId) sndMsgs)) flattenMsgs :: Either ChatError MsgBatch -> Either ChatError ([Int64], PQEncryption) -> [Either ChatError SndMessage] flattenMsgs (Right (MsgBatch _ sndMsgs)) (Right _) = map Right sndMsgs flattenMsgs (Right (MsgBatch _ sndMsgs)) (Left ce) = replicate (length sndMsgs) (Left ce) @@ -1330,9 +1333,6 @@ batchSendConnMessagesB _user conn msgFlags msgs_ = do batchSndMessagesJSON :: NonEmpty (Either ChatError SndMessage) -> [Either ChatError MsgBatch] batchSndMessagesJSON = batchMessages maxEncodedMsgLength . L.toList -msgBatchReq :: Connection -> MsgFlags -> MsgBatch -> ChatMsgReq -msgBatchReq conn msgFlags (MsgBatch batchBody sndMsgs) = (conn, msgFlags, batchBody, map (\SndMessage {msgId} -> msgId) sndMsgs) - encodeConnInfo :: MsgEncodingI e => ChatMsgEvent e -> CM ByteString encodeConnInfo chatMsgEvent = do vr <- chatVersionRange @@ -1358,7 +1358,7 @@ deliverMessage conn cmEventTag msgBody msgId = do deliverMessage' :: Connection -> MsgFlags -> MsgBody -> MessageId -> CM (Int64, PQEncryption) deliverMessage' conn msgFlags msgBody msgId = - deliverMessages ((conn, msgFlags, msgBody, [msgId]) :| []) >>= \case + deliverMessages ((conn, msgFlags, (vrValue msgBody, [msgId])) :| []) >>= \case r :| [] -> case r of Right ([deliveryId], pqEnc) -> pure (deliveryId, pqEnc) Right (deliveryIds, _) -> throwChatError $ CEInternalError $ "deliverMessage: expected 1 delivery id, got " <> show (length deliveryIds) @@ -1366,45 +1366,45 @@ deliverMessage' conn msgFlags msgBody msgId = rs -> throwChatError $ CEInternalError $ "deliverMessage: expected 1 result, got " <> show (length rs) -- [MessageId] - SndMessage ids inside MsgBatch, or single message id -type ChatMsgReq = (Connection, MsgFlags, MsgBody, [MessageId]) +type ChatMsgReq = (Connection, MsgFlags, (ValueOrRef MsgBody, [MessageId])) deliverMessages :: NonEmpty ChatMsgReq -> CM (NonEmpty (Either ChatError ([Int64], PQEncryption))) deliverMessages msgs = deliverMessagesB $ L.map Right msgs deliverMessagesB :: NonEmpty (Either ChatError ChatMsgReq) -> CM (NonEmpty (Either ChatError ([Int64], PQEncryption))) deliverMessagesB msgReqs = do - msgReqs' <- liftIO compressBodies + msgReqs' <- if any connSupportsPQ msgReqs then liftIO compressBodies else pure msgReqs sent <- L.zipWith prepareBatch msgReqs' <$> withAgent (`sendMessagesB` snd (mapAccumL toAgent Nothing msgReqs')) lift . void $ withStoreBatch' $ \db -> map (updatePQSndEnabled db) (rights . L.toList $ sent) lift . withStoreBatch $ \db -> L.map (bindRight $ createDelivery db) sent where + connSupportsPQ = \case + Right (Connection {pqSupport = PQSupportOn, connChatVersion = v}, _, _) -> v >= pqEncryptionCompressionVersion + _ -> False compressBodies = - forME msgReqs $ \mr@(conn@Connection {pqSupport, connChatVersion = v}, msgFlags, msgBody, msgIds) -> - runExceptT $ case pqSupport of - -- we only compress messages when: - -- 1) PQ support is enabled - -- 2) version is compatible with compression - -- 3) message is longer than max compressed size (as this function is not used for batched messages anyway) - PQSupportOn | v >= pqEncryptionCompressionVersion && B.length msgBody > maxCompressedMsgLength -> do + forME msgReqs $ \(conn, msgFlags, (mbr, msgIds)) -> runExceptT $ do + mbr' <- case mbr of + VRValue i msgBody | B.length msgBody > maxCompressedMsgLength -> do let msgBody' = compressedBatchMsgBody_ msgBody when (B.length msgBody' > maxCompressedMsgLength) $ throwError $ ChatError $ CEException "large compressed message" - pure (conn, msgFlags, msgBody', msgIds) - _ -> pure mr + pure $ VRValue i msgBody' + v -> pure v + pure (conn, msgFlags, (mbr', msgIds)) toAgent prev = \case - Right (conn@Connection {connId, pqEncryption}, msgFlags, msgBody, _msgIds) -> + Right (conn@Connection {connId, pqEncryption}, msgFlags, (mbr, _msgIds)) -> let cId = case prev of Just prevId | prevId == connId -> "" _ -> aConnId conn - in (Just connId, Right (cId, pqEncryption, msgFlags, msgBody)) + in (Just connId, Right (cId, pqEncryption, msgFlags, mbr)) Left _ce -> (prev, Left (AP.INTERNAL "ChatError, skip")) -- as long as it is Left, the agent batchers should just step over it prepareBatch (Right req) (Right ar) = Right (req, ar) prepareBatch (Left ce) _ = Left ce -- restore original ChatError prepareBatch _ (Left ae) = Left $ ChatErrorAgent ae Nothing createDelivery :: DB.Connection -> (ChatMsgReq, (AgentMsgId, PQEncryption)) -> IO (Either ChatError ([Int64], PQEncryption)) - createDelivery db ((Connection {connId}, _, _, msgIds), (agentMsgId, pqEnc')) = do + createDelivery db ((Connection {connId}, _, (_, msgIds)), (agentMsgId, pqEnc')) = do Right . (,pqEnc') <$> mapM (createSndMsgDelivery db (SndMsgDelivery {connId, agentMsgId})) msgIds updatePQSndEnabled :: DB.Connection -> (ChatMsgReq, (AgentMsgId, PQEncryption)) -> IO () - updatePQSndEnabled db ((Connection {connId, pqSndEnabled}, _, _, _), (_, pqSndEnabled')) = + updatePQSndEnabled db ((Connection {connId, pqSndEnabled}, _, _), (_, pqSndEnabled')) = case (pqSndEnabled, pqSndEnabled') of (Just b, b') | b' /= b -> updatePQ (Nothing, PQEncOn) -> updatePQ @@ -1471,7 +1471,7 @@ sendGroupMessages_ _user gInfo@GroupInfo {groupId} members events = do stored <- lift $ withStoreBatch (\db -> map (bindRight $ createPendingMsg db) pendingReqs) when (length stored /= length pendingMemIds) $ logError "sendGroupMessages_: pendingMemIds and stored length mismatch" -- Zip for easier access to results - let sentTo = zipWith3 (\mId mReq r -> (mId, fmap (\(_, _, _, msgIds) -> msgIds) mReq, r)) sendToMemIds msgReqs delivered + let sentTo = zipWith3 (\mId mReq r -> (mId, fmap (\(_, _, (_, msgIds)) -> msgIds) mReq, r)) sendToMemIds msgReqs delivered pending = zipWith3 (\mId pReq r -> (mId, fmap snd pReq, r)) pendingMemIds pendingReqs stored pure (sndMsgs_, GroupSndResult {sentTo, pending, forwarded}) where @@ -1495,24 +1495,36 @@ sendGroupMessages_ _user gInfo@GroupInfo {groupId} members events = do mId = groupMemberId' m mIds' = S.insert mId mIds prepareMsgReqs :: MsgFlags -> NonEmpty (Either ChatError SndMessage) -> [(GroupMember, Connection)] -> [(GroupMember, Connection)] -> ([GroupMemberId], [Either ChatError ChatMsgReq]) - prepareMsgReqs msgFlags msgs_ toSendSeparate toSendBatched = do - let batched_ = batchSndMessagesJSON msgs_ + prepareMsgReqs msgFlags msgs toSendSeparate toSendBatched = do + let batched_ = batchSndMessagesJSON msgs case L.nonEmpty batched_ of Just batched' -> do - let (memsSep, mreqsSep) = foldr' foldMsgs ([], []) toSendSeparate - (memsBtch, mreqsBtch) = foldr' (foldBatches batched') ([], []) toSendBatched + let lenMsgs = length msgs + (memsSep, mreqsSep) = foldMembers lenMsgs sndMessageMBR msgs toSendSeparate + (memsBtch, mreqsBtch) = foldMembers (length batched' + lenMsgs) msgBatchMBR batched' toSendBatched (memsSep <> memsBtch, mreqsSep <> mreqsBtch) Nothing -> ([], []) where - foldMsgs :: (GroupMember, Connection) -> ([GroupMemberId], [Either ChatError ChatMsgReq]) -> ([GroupMemberId], [Either ChatError ChatMsgReq]) - foldMsgs (GroupMember {groupMemberId}, conn) memIdsReqs = - foldr' (\msg_ (memIds, reqs) -> (groupMemberId : memIds, fmap sndMessageReq msg_ : reqs)) memIdsReqs msgs_ + foldMembers :: forall a. Int -> (Maybe Int -> Int -> a -> (ValueOrRef MsgBody, [MessageId])) -> NonEmpty (Either ChatError a) -> [(GroupMember, Connection)] -> ([GroupMemberId], [Either ChatError ChatMsgReq]) + foldMembers lastRef mkMb mbs mems = snd $ foldr' foldMsgBodies (lastMemIdx_, ([], [])) mems where - sndMessageReq :: SndMessage -> ChatMsgReq - sndMessageReq SndMessage {msgId, msgBody} = (conn, msgFlags, msgBody, [msgId]) - foldBatches :: NonEmpty (Either ChatError MsgBatch) -> (GroupMember, Connection) -> ([GroupMemberId], [Either ChatError ChatMsgReq]) -> ([GroupMemberId], [Either ChatError ChatMsgReq]) - foldBatches batched' (GroupMember {groupMemberId}, conn) memIdsReqs = - foldr' (\batch_ (memIds, reqs) -> (groupMemberId : memIds, fmap (msgBatchReq conn msgFlags) batch_ : reqs)) memIdsReqs batched' + lastMemIdx_ = let len = length mems in if len > 1 then Just len else Nothing + foldMsgBodies :: (GroupMember, Connection) -> (Maybe Int, ([GroupMemberId], [Either ChatError ChatMsgReq])) -> (Maybe Int, ([GroupMemberId], [Either ChatError ChatMsgReq])) + foldMsgBodies (GroupMember {groupMemberId}, conn) (memIdx_, memIdsReqs) = + (subtract 1 <$> memIdx_,) $ snd $ foldr' addBody (lastRef, memIdsReqs) mbs + where + addBody :: Either ChatError a -> (Int, ([GroupMemberId], [Either ChatError ChatMsgReq])) -> (Int, ([GroupMemberId], [Either ChatError ChatMsgReq])) + addBody mb (i, (memIds, reqs)) = + let req = (conn,msgFlags,) . mkMb memIdx_ i <$> mb + in (i - 1, (groupMemberId : memIds, req : reqs)) + sndMessageMBR :: Maybe Int -> Int -> SndMessage -> (ValueOrRef MsgBody, [MessageId]) + sndMessageMBR memIdx_ i SndMessage {msgId, msgBody} = (vrValue_ memIdx_ i msgBody, [msgId]) + msgBatchMBR :: Maybe Int -> Int -> MsgBatch -> (ValueOrRef MsgBody, [MessageId]) + msgBatchMBR memIdx_ i (MsgBatch batchBody sndMsgs) = (vrValue_ memIdx_ i batchBody, map (\SndMessage {msgId} -> msgId) sndMsgs) + vrValue_ memIdx_ i v = case memIdx_ of + Nothing -> VRValue Nothing v -- sending to one member, do not reference bodies + Just 1 -> VRValue (Just i) v + Just _ -> VRRef i preparePending :: NonEmpty (Either ChatError SndMessage) -> [GroupMember] -> ([GroupMemberId], [Either ChatError (GroupMemberId, MessageId)]) preparePending msgs_ = foldr' foldMsgs ([], []) diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 902c19ed63..1530f8e5c4 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -274,7 +274,7 @@ processAgentMsgSndFile _corrId aFileId msg = do map (\fileDescr -> (conn, (connOrGroupId, XMsgFileDescr {msgId = sharedMsgId, fileDescr}))) (L.toList $ splitFileDescr partSize rfdText) toMsgReq :: (Connection, (ConnOrGroupId, ChatMsgEvent 'Json)) -> SndMessage -> ChatMsgReq toMsgReq (conn, _) SndMessage {msgId, msgBody} = - (conn, MsgFlags {notification = hasNotification XMsgFileDescr_}, msgBody, [msgId]) + (conn, MsgFlags {notification = hasNotification XMsgFileDescr_}, (vrValue msgBody, [msgId])) sendFileError :: FileError -> Text -> VersionRangeChat -> FileTransferMeta -> CM () sendFileError ferr err vr ft = do logError $ "Sent file error: " <> err diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/agent_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/agent_query_plans.txt index c4f5007040..f470121f87 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/agent_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/agent_query_plans.txt @@ -15,6 +15,20 @@ SEARCH s USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INTEGER PRIMARY KEY (rowid=?) SEARCH f USING INTEGER PRIMARY KEY (rowid=?) +Query: + SELECT + m.msg_type, m.msg_flags, m.msg_body, m.pq_encryption, m.internal_ts, m.internal_snd_id, s.previous_msg_hash, + s.retry_int_slow, s.retry_int_fast, s.msg_encrypt_key, s.padded_msg_len, sb.agent_msg + FROM messages m + JOIN snd_messages s ON s.conn_id = m.conn_id AND s.internal_id = m.internal_id + LEFT JOIN snd_message_bodies sb ON sb.snd_message_body_id = s.snd_message_body_id + WHERE m.conn_id = ? AND m.internal_id = ? + +Plan: +SEARCH m USING PRIMARY KEY (conn_id=? AND internal_id=?) +SEARCH s USING PRIMARY KEY (conn_id=?) +SEARCH sb USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN + Query: SELECT r.snd_file_chunk_replica_id, r.replica_id, r.replica_key, r.replica_status, r.delay, r.retries, @@ -45,16 +59,6 @@ Query: Plan: SEARCH commands USING INDEX idx_commands_server_commands (host=? AND port=?) -Query: - SELECT m.msg_type, m.msg_flags, m.msg_body, m.pq_encryption, m.internal_ts, s.retry_int_slow, s.retry_int_fast - FROM messages m - JOIN snd_messages s ON s.conn_id = m.conn_id AND s.internal_id = m.internal_id - WHERE m.conn_id = ? AND m.internal_id = ? - -Plan: -SEARCH m USING PRIMARY KEY (conn_id=? AND internal_id=?) -SEARCH s USING PRIMARY KEY (conn_id=?) - Query: SELECT rcv_file_chunk_id, chunk_no, chunk_size, digest, tmp_path FROM rcv_file_chunks @@ -512,9 +516,9 @@ Plan: Query: INSERT INTO snd_messages - ( conn_id, internal_snd_id, internal_id, internal_hash, previous_msg_hash) + ( conn_id, internal_snd_id, internal_id, internal_hash, previous_msg_hash, msg_encrypt_key, padded_msg_len, snd_message_body_id) VALUES - (?,?,?,?,?) + (?,?,?,?,?,?,?,?) Plan: SEARCH messages USING COVERING INDEX idx_messages_conn_id_internal_snd_id (conn_id=? AND internal_snd_id=?) @@ -805,6 +809,11 @@ Plan: SEARCH snd_files USING INTEGER PRIMARY KEY (rowid=?) SEARCH snd_file_chunks USING COVERING INDEX idx_snd_file_chunks_snd_file_id (snd_file_id=?) +Query: DELETE FROM snd_message_bodies WHERE snd_message_body_id = ? +Plan: +SEARCH snd_message_bodies USING INTEGER PRIMARY KEY (rowid=?) +SEARCH snd_messages USING COVERING INDEX idx_snd_messages_snd_message_body_id (snd_message_body_id=?) + Query: DELETE FROM snd_message_deliveries WHERE conn_id = ? AND snd_queue_id = ? Plan: SEARCH snd_message_deliveries USING COVERING INDEX idx_snd_message_deliveries (conn_id=? AND snd_queue_id=?) @@ -861,6 +870,10 @@ Plan: Query: INSERT INTO snd_files (snd_file_entity_id, user_id, path, src_file_key, src_file_nonce, num_recipients, prefix_path, key, nonce, status, redirect_size, redirect_digest) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) Plan: +Query: INSERT INTO snd_message_bodies (agent_msg) VALUES (?) RETURNING snd_message_body_id +Plan: +SEARCH snd_messages USING COVERING INDEX idx_snd_messages_snd_message_body_id (snd_message_body_id=?) + Query: INSERT INTO snd_message_deliveries (conn_id, snd_queue_id, internal_id) VALUES (?, ?, ?) Plan: @@ -897,6 +910,10 @@ Query: SELECT count(*) FROM snd_message_deliveries WHERE conn_id = ? AND interna Plan: SEARCH snd_message_deliveries USING COVERING INDEX idx_snd_message_deliveries_expired (conn_id=?) +Query: SELECT count(1) FROM snd_message_bodies +Plan: +SCAN snd_message_bodies + Query: SELECT deleted FROM snd_files WHERE snd_file_id = ? Plan: SEARCH snd_files USING INTEGER PRIMARY KEY (rowid=?) @@ -921,7 +938,7 @@ Query: SELECT ratchet_state, x3dh_pub_key_1, x3dh_pub_key_2, pq_pub_kem FROM rat Plan: SEARCH ratchets USING PRIMARY KEY (conn_id=?) -Query: SELECT rcpt_internal_id, rcpt_status FROM snd_messages WHERE conn_id = ? AND internal_id = ? +Query: SELECT rcpt_internal_id, rcpt_status, snd_message_body_id FROM snd_messages WHERE conn_id = ? AND internal_id = ? Plan: SEARCH snd_messages USING PRIMARY KEY (conn_id=?) diff --git a/src/Simplex/Chat/Util.hs b/src/Simplex/Chat/Util.hs index 3f7d19fd6d..796b32778b 100644 --- a/src/Simplex/Chat/Util.hs +++ b/src/Simplex/Chat/Util.hs @@ -4,7 +4,7 @@ {-# LANGUAGE TupleSections #-} {-# OPTIONS_GHC -Wno-orphans #-} -module Simplex.Chat.Util (week, encryptFile, chunkSize, liftIOEither, shuffle) where +module Simplex.Chat.Util (week, encryptFile, chunkSize, liftIOEither, shuffle, zipWith3') where import Control.Exception (Exception) import Control.Monad @@ -15,6 +15,7 @@ import Control.Monad.Reader import Data.Bifunctor (first) import qualified Data.ByteString.Lazy as LB import Data.List (sortBy) +import Data.List.NonEmpty (NonEmpty (..)) import Data.Ord (comparing) import Data.Time (NominalDiffTime) import Data.Word (Word16) @@ -52,6 +53,9 @@ shuffle xs = map snd . sortBy (comparing fst) <$> mapM (\x -> (,x) <$> random) x random :: IO Word16 random = randomRIO (0, 65535) +zipWith3' :: (a -> b -> c -> d) -> NonEmpty a -> NonEmpty b -> NonEmpty c -> NonEmpty d +zipWith3' f ~(x :| xs) ~(y :| ys) ~(z :| zs) = f x y z :| zipWith3 f xs ys zs + liftIOEither :: (MonadIO m, MonadError e m) => IO (Either e a) -> m a liftIOEither a = liftIO a >>= liftEither {-# INLINE liftIOEither #-} diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index ca74e5e1bc..d039fb05ff 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -83,6 +83,8 @@ chatGroupTests = do it "send multiple messages api" testSendMulti it "send multiple timed messages" testSendMultiTimed it "send multiple messages (many chat batches)" testSendMultiManyBatches + xit'' "shared message body is reused" testSharedMessageBody + xit'' "shared batch body is reused" testSharedBatchBody describe "async group connections" $ do xit "create and join group when clients go offline" testGroupAsync describe "group links" $ do @@ -1883,6 +1885,112 @@ testSendMultiManyBatches = DB.query db "SELECT count(1) FROM chat_items WHERE chat_item_id > ?" (Only msgIdCath) :: IO [[Int]] cathItemsCount `shouldBe` [[300]] +testSharedMessageBody :: HasCallStack => TestParams -> IO () +testSharedMessageBody ps = + withNewTestChatOpts ps opts' "alice" aliceProfile $ \alice -> do + withSmpServer' serverCfg' $ + withNewTestChatOpts ps opts' "bob" bobProfile $ \bob -> + withNewTestChatOpts ps opts' "cath" cathProfile $ \cath -> do + createGroup3 "team" alice bob cath + + alice <##. "server disconnected localhost" + alice #> "#team hello" + bodiesCount1 <- withCCAgentTransaction alice $ \db -> + DB.query_ db "SELECT count(1) FROM snd_message_bodies" :: IO [[Int]] + bodiesCount1 `shouldBe` [[1]] + + withSmpServer' serverCfg' $ + withTestChatOpts ps opts' "bob" $ \bob -> + withTestChatOpts ps opts' "cath" $ \cath -> do + concurrentlyN_ + [ alice <##. "server connected localhost", + do + bob <## "1 contacts connected (use /cs for the list)" + bob <## "#team: connected to server(s)", + do + cath <## "1 contacts connected (use /cs for the list)" + cath <## "#team: connected to server(s)" + ] + bob <# "#team alice> hello" + cath <# "#team alice> hello" + bodiesCount2 <- withCCAgentTransaction alice $ \db -> + DB.query_ db "SELECT count(1) FROM snd_message_bodies" :: IO [[Int]] + bodiesCount2 `shouldBe` [[0]] + + alice <##. "server disconnected localhost" + where + tmp = tmpPath ps + serverCfg' = + smpServerCfg + { transports = [("7003", transport @TLS, False)], + storeLogFile = Just $ tmp <> "/smp-server-store.log", + storeMsgsFile = Just $ tmp <> "/smp-server-messages.log" + } + opts' = + testOpts + { coreOptions = + testCoreOpts + { smpServers = ["smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=:server_password@localhost:7003"] + } + } + +testSharedBatchBody :: HasCallStack => TestParams -> IO () +testSharedBatchBody ps = + withNewTestChatOpts ps opts' "alice" aliceProfile $ \alice -> do + withSmpServer' serverCfg' $ + withNewTestChatOpts ps opts' "bob" bobProfile $ \bob -> + withNewTestChatOpts ps opts' "cath" cathProfile $ \cath -> do + createGroup3 "team" alice bob cath + + alice <##. "server disconnected localhost" + + let cm i = "{\"msgContent\": {\"type\": \"text\", \"text\": \"message " <> show i <> "\"}}" + cms = intercalate ", " (map cm [1 .. 300 :: Int]) + alice `send` ("/_send #1 json [" <> cms <> "]") + _ <- getTermLine alice + alice <## "300 messages sent" + + bodiesCount1 <- withCCAgentTransaction alice $ \db -> + DB.query_ db "SELECT count(1) FROM snd_message_bodies" :: IO [[Int]] + bodiesCount1 `shouldBe` [[3]] + + withSmpServer' serverCfg' $ + withTestChatOpts ps opts' "bob" $ \bob -> + withTestChatOpts ps opts' "cath" $ \cath -> do + concurrentlyN_ + [ alice <##. "server connected localhost", + do + bob <## "1 contacts connected (use /cs for the list)" + bob <## "#team: connected to server(s)", + do + cath <## "1 contacts connected (use /cs for the list)" + cath <## "#team: connected to server(s)" + ] + forM_ [(1 :: Int) .. 300] $ \i -> do + concurrently_ + (bob <# ("#team alice> message " <> show i)) + (cath <# ("#team alice> message " <> show i)) + bodiesCount2 <- withCCAgentTransaction alice $ \db -> + DB.query_ db "SELECT count(1) FROM snd_message_bodies" :: IO [[Int]] + bodiesCount2 `shouldBe` [[0]] + + alice <##. "server disconnected localhost" + where + tmp = tmpPath ps + serverCfg' = + smpServerCfg + { transports = [("7003", transport @TLS, False)], + storeLogFile = Just $ tmp <> "/smp-server-store.log", + storeMsgsFile = Just $ tmp <> "/smp-server-messages.log" + } + opts' = + testOpts + { coreOptions = + testCoreOpts + { smpServers = ["smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=:server_password@localhost:7003"] + } + } + testGroupAsync :: HasCallStack => TestParams -> IO () testGroupAsync ps = do withNewTestChat ps "alice" aliceProfile $ \alice -> do diff --git a/tests/ChatTests/Utils.hs b/tests/ChatTests/Utils.hs index 7bb25dbe9b..9a3b560b29 100644 --- a/tests/ChatTests/Utils.hs +++ b/tests/ChatTests/Utils.hs @@ -33,6 +33,7 @@ import Simplex.Chat.Types import Simplex.Chat.Types.Preferences import Simplex.Chat.Types.Shared import Simplex.FileTransfer.Client.Main (xftpClientCLI) +import Simplex.Messaging.Agent.Client (agentClientStore) import Simplex.Messaging.Agent.Store.AgentStore (maybeFirstRow, withTransaction) import qualified Simplex.Messaging.Agent.Store.DB as DB import qualified Simplex.Messaging.Crypto as C @@ -556,6 +557,10 @@ withCCTransaction :: TestCC -> (DB.Connection -> IO a) -> IO a withCCTransaction cc action = withTransaction (chatStore $ chatController cc) $ \db -> action db +withCCAgentTransaction :: TestCC -> (DB.Connection -> IO a) -> IO a +withCCAgentTransaction TestCC {chatController = ChatController {smpAgent}} action = + withTransaction (agentClientStore smpAgent) $ \db -> action db + createCCNoteFolder :: TestCC -> IO () createCCNoteFolder cc = withCCTransaction cc $ \db -> From dfe5a4464b7ae129d355d0f09333266ccc308520 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 14 Feb 2025 23:37:06 +0000 Subject: [PATCH 06/10] desktop, android: fix parser for reactions (#5629) * desktop, android: fix parser for reactions * core: restrict API to known reactions --- apps/ios/SimpleXChat/ChatTypes.swift | 8 ++++++-- .../kotlin/chat/simplex/common/model/ChatModel.kt | 11 ++++++++--- src/Simplex/Chat.hs | 4 ++-- src/Simplex/Chat/Protocol.hs | 7 +++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index f64a1076a5..01ea2f48af 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -3391,8 +3391,12 @@ extension MsgReaction: Decodable { let type = try container.decode(String.self, forKey: CodingKeys.type) switch type { case "emoji": - let emoji = try container.decode(MREmojiChar.self, forKey: CodingKeys.emoji) - self = .emoji(emoji: emoji) + do { + let emoji = try container.decode(MREmojiChar.self, forKey: CodingKeys.emoji) + self = .emoji(emoji: emoji) + } catch { + self = .unknown(type: "emoji") + } default: self = .unknown(type: type) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index d051fc3a53..fcd2c83d60 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -2981,7 +2981,7 @@ sealed class MsgReaction { MREmojiChar.Heart -> "❤️" else -> emoji.value } - is Unknown -> "" + is Unknown -> "?" } companion object { @@ -3003,8 +3003,13 @@ object MsgReactionSerializer : KSerializer { return if (json is JsonObject && "type" in json) { when(val t = json["type"]?.jsonPrimitive?.content ?: "") { "emoji" -> { - val emoji = Json.decodeFromString(json["emoji"].toString()) - if (emoji == null) MsgReaction.Unknown(t, json) else MsgReaction.Emoji(emoji) + val msgReaction = try { + val emoji = Json.decodeFromString(json["emoji"].toString()) + MsgReaction.Emoji(emoji) + } catch (e: Throwable) { + MsgReaction.Unknown(t, json) + } + msgReaction } else -> MsgReaction.Unknown(t, json) } diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index e09ed71e57..4b217e57f8 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -8463,8 +8463,8 @@ chatCommandP = "/_update item " *> (APIUpdateChatItem <$> chatRefP <* A.space <*> A.decimal <*> liveMessageP <* A.space <*> msgContentP), "/_delete item " *> (APIDeleteChatItem <$> chatRefP <*> _strP <*> _strP), "/_delete member item #" *> (APIDeleteMemberChatItem <$> A.decimal <*> _strP), - "/_reaction " *> (APIChatItemReaction <$> chatRefP <* A.space <*> A.decimal <* A.space <*> onOffP <* A.space <*> jsonP), - "/_reaction members " *> (APIGetReactionMembers <$> A.decimal <* " #" <*> A.decimal <* A.space <*> A.decimal <* A.space <*> jsonP), + "/_reaction " *> (APIChatItemReaction <$> chatRefP <* A.space <*> A.decimal <* A.space <*> onOffP <* A.space <*> (knownReaction <$?> jsonP)), + "/_reaction members " *> (APIGetReactionMembers <$> A.decimal <* " #" <*> A.decimal <* A.space <*> A.decimal <* A.space <*> (knownReaction <$?> jsonP)), "/_forward plan " *> (APIPlanForwardChatItems <$> chatRefP <*> _strP), "/_forward " *> (APIForwardChatItems <$> chatRefP <* A.space <*> chatRefP <*> _strP <*> sendMessageTTLP), "/_read user " *> (APIUserRead <$> A.decimal), diff --git a/src/Simplex/Chat/Protocol.hs b/src/Simplex/Chat/Protocol.hs index bc6b083964..bfe1c8f02c 100644 --- a/src/Simplex/Chat/Protocol.hs +++ b/src/Simplex/Chat/Protocol.hs @@ -407,6 +407,13 @@ data MsgReaction = MREmoji {emoji :: MREmojiChar} | MRUnknown {tag :: Text, json emojiTag :: IsString a => a emojiTag = "emoji" +knownReaction :: MsgReaction -> Either String MsgReaction +knownReaction = \case + r@MREmoji {} -> Right r + MRUnknown {} -> Left "unknown MsgReaction" + +-- parseJSON for MsgReaction parses unknown emoji reactions as MRUnknown with type "emoji", +-- allowing to add new emojis in a backwards compatible way - UI shows them as ? instance FromJSON MsgReaction where parseJSON (J.Object v) = do tag <- v .: "type" From 87569e379a9d93ccc4fb74c249eff094004d0b80 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Fri, 14 Feb 2025 23:39:24 +0000 Subject: [PATCH 07/10] core: 6.2.5.0 --- package.yaml | 2 +- simplex-chat.cabal | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.yaml b/package.yaml index f8c75a0eb7..370d31cf1d 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: simplex-chat -version: 6.2.4.0 +version: 6.2.5.0 #synopsis: #description: homepage: https://github.com/simplex-chat/simplex-chat#readme diff --git a/simplex-chat.cabal b/simplex-chat.cabal index fc8cab293c..b8faf90f6e 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: simplex-chat -version: 6.2.4.0 +version: 6.2.5.0 category: Web, System, Services, Cryptography homepage: https://github.com/simplex-chat/simplex-chat#readme author: simplex.chat From 1f8755f94139b35cc06821d41de957cae9541349 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sat, 15 Feb 2025 16:18:34 +0000 Subject: [PATCH 08/10] core: update simplexmq (avoid deleting shared message bodies) (#5630) * core: update simplexmq (avoid deleting shared message bodies) * simplexmq, plans * simplexmq * output in failing test * stabilize test --- cabal.project | 2 +- scripts/nix/sha256map.nix | 2 +- .../SQLite/Migrations/agent_query_plans.txt | 38 ++++++++++++------- tests/ChatClient.hs | 22 +++++------ tests/ChatTests/DBUtils/SQLite.hs | 1 + tests/ChatTests/Groups.hs | 2 +- tests/ChatTests/Profiles.hs | 9 +++-- tests/Test.hs | 5 ++- 8 files changed, 49 insertions(+), 32 deletions(-) diff --git a/cabal.project b/cabal.project index 70f66604de..13697d6caf 100644 --- a/cabal.project +++ b/cabal.project @@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: 7ac80bffcb51e2461ff8d0f54094943c56f1c4e6 + tag: fa67d128d1d1c3edb3c49886f096c36e3f4da0d0 source-repository-package type: git diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 0975e772b9..13cb32469d 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."7ac80bffcb51e2461ff8d0f54094943c56f1c4e6" = "1qzv3vs1f0h5df5i0fi2hqiagkkwqghpzjgh9bnjrgmhkhvkl2iq"; + "https://github.com/simplex-chat/simplexmq.git"."fa67d128d1d1c3edb3c49886f096c36e3f4da0d0" = "13fl760rbw75rqa1zs4f130w7a75dfqw43w52jjnfpxgqis3dd2z"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/agent_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/agent_query_plans.txt index f470121f87..31bc2feb81 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/agent_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/agent_query_plans.txt @@ -75,6 +75,17 @@ Query: Plan: SEARCH snd_file_chunks USING INDEX idx_snd_file_chunks_snd_file_id (snd_file_id=?) +Query: + DELETE FROM snd_message_bodies + WHERE NOT EXISTS (SELECT 1 FROM snd_messages WHERE snd_message_body_id = ?) + AND snd_message_body_id = ? + +Plan: +SEARCH snd_message_bodies USING INTEGER PRIMARY KEY (rowid=?) +SCALAR SUBQUERY 1 +SEARCH snd_messages USING COVERING INDEX idx_snd_messages_snd_message_body_id (snd_message_body_id=?) +SEARCH snd_messages USING COVERING INDEX idx_snd_messages_snd_message_body_id (snd_message_body_id=?) + Query: SELECT f.rcv_file_id, f.rcv_file_entity_id, f.user_id, c.rcv_file_chunk_id, c.chunk_no, c.chunk_size, c.digest, f.tmp_path, c.tmp_path, @@ -188,6 +199,16 @@ SEARCH c USING INTEGER PRIMARY KEY (rowid=?) SEARCH f USING INTEGER PRIMARY KEY (rowid=?) USE TEMP B-TREE FOR ORDER BY +Query: + SELECT rcpt_status, snd_message_body_id FROM snd_messages + WHERE NOT EXISTS (SELECT 1 FROM snd_message_deliveries WHERE conn_id = ? AND internal_id = ? AND failed = 0) + AND conn_id = ? AND internal_id = ? + +Plan: +SEARCH snd_messages USING PRIMARY KEY (conn_id=?) +SCALAR SUBQUERY 1 +SEARCH snd_message_deliveries USING COVERING INDEX idx_snd_message_deliveries_expired (conn_id=?) + Query: SELECT rcv_file_entity_id, user_id, size, digest, key, nonce, chunk_size, prefix_path, tmp_path, save_path, save_file_key, save_file_nonce, status, deleted, redirect_id, redirect_entity_id, redirect_size, redirect_digest FROM rcv_files @@ -809,11 +830,6 @@ Plan: SEARCH snd_files USING INTEGER PRIMARY KEY (rowid=?) SEARCH snd_file_chunks USING COVERING INDEX idx_snd_file_chunks_snd_file_id (snd_file_id=?) -Query: DELETE FROM snd_message_bodies WHERE snd_message_body_id = ? -Plan: -SEARCH snd_message_bodies USING INTEGER PRIMARY KEY (rowid=?) -SEARCH snd_messages USING COVERING INDEX idx_snd_messages_snd_message_body_id (snd_message_body_id=?) - Query: DELETE FROM snd_message_deliveries WHERE conn_id = ? AND snd_queue_id = ? Plan: SEARCH snd_message_deliveries USING COVERING INDEX idx_snd_message_deliveries (conn_id=? AND snd_queue_id=?) @@ -906,10 +922,6 @@ Query: SELECT conn_id FROM connections WHERE user_id = ? Plan: SEARCH connections USING COVERING INDEX idx_connections_user (user_id=?) -Query: SELECT count(*) FROM snd_message_deliveries WHERE conn_id = ? AND internal_id = ? AND failed = 0 -Plan: -SEARCH snd_message_deliveries USING COVERING INDEX idx_snd_message_deliveries_expired (conn_id=?) - Query: SELECT count(1) FROM snd_message_bodies Plan: SCAN snd_message_bodies @@ -938,10 +950,6 @@ Query: SELECT ratchet_state, x3dh_pub_key_1, x3dh_pub_key_2, pq_pub_kem FROM rat Plan: SEARCH ratchets USING PRIMARY KEY (conn_id=?) -Query: SELECT rcpt_internal_id, rcpt_status, snd_message_body_id FROM snd_messages WHERE conn_id = ? AND internal_id = ? -Plan: -SEARCH snd_messages USING PRIMARY KEY (conn_id=?) - Query: SELECT rcv_file_id FROM rcv_files WHERE rcv_file_entity_id = ? Plan: SEARCH rcv_files USING COVERING INDEX sqlite_autoindex_rcv_files_1 (rcv_file_entity_id=?) @@ -1106,6 +1114,10 @@ Query: UPDATE snd_messages SET retry_int_slow = ?, retry_int_fast = ? WHERE conn Plan: SEARCH snd_messages USING COVERING INDEX idx_snd_messages_conn_id_internal_id (conn_id=? AND internal_id=?) +Query: UPDATE snd_messages SET snd_message_body_id = NULL WHERE conn_id = ? AND internal_id = ? +Plan: +SEARCH snd_messages USING COVERING INDEX idx_snd_messages_conn_id_internal_id (conn_id=? AND internal_id=?) + Query: UPDATE snd_queues SET snd_primary = ? WHERE conn_id = ? Plan: SEARCH snd_queues USING COVERING INDEX idx_snd_queue_id (conn_id=?) diff --git a/tests/ChatClient.hs b/tests/ChatClient.hs index 3376204f14..124818765f 100644 --- a/tests/ChatClient.hs +++ b/tests/ChatClient.hs @@ -259,13 +259,13 @@ createTestChat ps cfg opts@ChatOpts {coreOptions} dbPrefix profile = do Right db@ChatDatabase {chatStore, agentStore} <- createDatabase ps coreOptions dbPrefix insertUser agentStore Right user <- withTransaction chatStore $ \db' -> runExceptT $ createUserRecord db' (AgentUserId 1) profile True - startTestChat_ db cfg opts user + startTestChat_ ps db cfg opts user startTestChat :: TestParams -> ChatConfig -> ChatOpts -> String -> IO TestCC startTestChat ps cfg opts@ChatOpts {coreOptions} dbPrefix = do Right db@ChatDatabase {chatStore} <- createDatabase ps coreOptions dbPrefix Just user <- find activeUser <$> withTransaction chatStore getUsers - startTestChat_ db cfg opts user + startTestChat_ ps db cfg opts user createDatabase :: TestParams -> CoreChatOpts -> String -> IO (Either MigrationError ChatDatabase) #if defined(dbPostgres) @@ -282,8 +282,8 @@ insertUser :: DBStore -> IO () insertUser st = withTransaction st (`DB.execute_` "INSERT INTO users (user_id) VALUES (1)") #endif -startTestChat_ :: ChatDatabase -> ChatConfig -> ChatOpts -> User -> IO TestCC -startTestChat_ db cfg opts user = do +startTestChat_ :: TestParams -> ChatDatabase -> ChatConfig -> ChatOpts -> User -> IO TestCC +startTestChat_ TestParams {printOutput} db cfg opts user = do t <- withVirtualTerminal termSettings pure ct <- newChatTerminal t opts cc <- newChatController db (Just user) cfg opts False @@ -292,7 +292,7 @@ startTestChat_ db cfg opts user = do atomically . unless (maintenance opts) $ readTVar (agentAsync cc) >>= \a -> when (isNothing a) retry termQ <- newTQueueIO termAsync <- async $ readTerminalOutput t termQ - pure TestCC {chatController = cc, virtualTerminal = t, chatAsync, termAsync, termQ, printOutput = False} + pure TestCC {chatController = cc, virtualTerminal = t, chatAsync, termAsync, termQ, printOutput} stopTestChat :: TestParams -> TestCC -> IO () stopTestChat ps TestCC {chatController = cc@ChatController {smpAgent, chatStore}, chatAsync, termAsync} = do @@ -355,10 +355,10 @@ withTestChatOpts ps = withTestChatCfgOpts ps testCfg withTestChatCfgOpts :: HasCallStack => TestParams -> ChatConfig -> ChatOpts -> String -> (HasCallStack => TestCC -> IO a) -> IO a withTestChatCfgOpts ps cfg opts dbPrefix = bracket (startTestChat ps cfg opts dbPrefix) (\cc -> cc > stopTestChat ps cc) --- enable output for specific chat controller, use like this: --- withNewTestChat tmp "alice" aliceProfile $ \a -> withTestOutput a $ \alice -> do ... -withTestOutput :: HasCallStack => TestCC -> (HasCallStack => TestCC -> IO a) -> IO a -withTestOutput cc runTest = runTest cc {printOutput = True} +-- enable output for specific test. +-- usage: withTestOutput $ testChat2 aliceProfile bobProfile $ \alice bob -> do ... +withTestOutput :: HasCallStack => (HasCallStack => TestParams -> IO ()) -> TestParams -> IO () +withTestOutput test ps = test ps {printOutput = True} readTerminalOutput :: VirtualTerminal -> TQueue String -> IO () readTerminalOutput t termQ = do @@ -404,12 +404,12 @@ testChatN cfg opts ps test params = do ( TestCC -> IO String -getTermLine cc = +getTermLine cc@TestCC {printOutput} = 5000000 `timeout` atomically (readTQueue $ termQ cc) >>= \case Just s -> do -- remove condition to always echo virtual terminal -- when True $ do - when (printOutput cc) $ do + when printOutput $ do name <- userName cc putStrLn $ name <> ": " <> s pure s diff --git a/tests/ChatTests/DBUtils/SQLite.hs b/tests/ChatTests/DBUtils/SQLite.hs index b66e5ac851..2de94882cd 100644 --- a/tests/ChatTests/DBUtils/SQLite.hs +++ b/tests/ChatTests/DBUtils/SQLite.hs @@ -6,6 +6,7 @@ import Simplex.Messaging.TMap (TMap) data TestParams = TestParams { tmpPath :: FilePath, + printOutput :: Bool, chatQueryStats :: TMap Query SlowQueryStats, agentQueryStats :: TMap Query SlowQueryStats } diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index d039fb05ff..bdb3b443b3 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -1604,7 +1604,7 @@ testGroupModerate = testGroupModerateOwn :: HasCallStack => TestParams -> IO () testGroupModerateOwn = - testChat2 aliceProfile bobProfile $ + withTestOutput $ testChat2 aliceProfile bobProfile $ \alice bob -> do createGroup2 "team" alice bob -- disableFullDeletion2 "team" alice bob diff --git a/tests/ChatTests/Profiles.hs b/tests/ChatTests/Profiles.hs index ffdd84406c..4ab5e8fbd3 100644 --- a/tests/ChatTests/Profiles.hs +++ b/tests/ChatTests/Profiles.hs @@ -742,7 +742,7 @@ testBusinessAddress = testChat3 businessProfile aliceProfile {fullName = "Alice (biz <# "#bob bob_1> hey there") testBusinessUpdateProfiles :: HasCallStack => TestParams -> IO () -testBusinessUpdateProfiles = testChat4 businessProfile aliceProfile bobProfile cathProfile $ +testBusinessUpdateProfiles = withTestOutput $ testChat4 businessProfile aliceProfile bobProfile cathProfile $ \biz alice bob cath -> do biz ##> "/ad" cLink <- getContactLink biz True @@ -756,8 +756,11 @@ testBusinessUpdateProfiles = testChat4 businessProfile aliceProfile bobProfile c alice <## "#biz: joining the group..." biz <# "#alice Welcome" -- auto reply biz <## "#alice: alice_1 joined the group" - alice <# "#biz biz_1> Welcome" - alice <## "#biz: you joined the group" + alice + <### + [ WithTime "#biz biz_1> Welcome", + "#biz: you joined the group" + ] biz #> "#alice hi" alice <# "#biz biz_1> hi" alice #> "#biz hello" diff --git a/tests/Test.hs b/tests/Test.hs index 42dc5a0524..1d8d45ebb4 100644 --- a/tests/Test.hs +++ b/tests/Test.hs @@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-} +{-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE TupleSections #-} @@ -75,10 +76,10 @@ main = do #endif where #if defined(dbPostgres) - testBracket test = withSmpServer $ tmpBracket $ test . TestParams + testBracket test = withSmpServer $ tmpBracket $ \tmpPath -> test TestParams {tmpPath, printOutput = False} #else testBracket chatQueryStats agentQueryStats test = - withSmpServer $ tmpBracket $ \tmpPath -> test TestParams {tmpPath, chatQueryStats, agentQueryStats} + withSmpServer $ tmpBracket $ \tmpPath -> test TestParams {tmpPath, chatQueryStats, agentQueryStats, printOutput = False} #endif tmpBracket test = do t <- getSystemTime From 7c5966df70f8e436e8c8a8bcb37eb95b56e1be4a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sat, 15 Feb 2025 17:09:11 +0000 Subject: [PATCH 09/10] core: fix postgres test (#5631) --- tests/ChatTests/DBUtils/Postgres.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/ChatTests/DBUtils/Postgres.hs b/tests/ChatTests/DBUtils/Postgres.hs index 840c3d9a38..2b160379bb 100644 --- a/tests/ChatTests/DBUtils/Postgres.hs +++ b/tests/ChatTests/DBUtils/Postgres.hs @@ -1,5 +1,6 @@ module ChatTests.DBUtils.Postgres where data TestParams = TestParams - { tmpPath :: FilePath + { tmpPath :: FilePath, + printOutput :: Bool } From 88bb387b1b20120782412f9ffbf6a9433ab8d881 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Sat, 15 Feb 2025 17:15:25 +0000 Subject: [PATCH 10/10] core: 6.3.0.5 (simplexmq 6.3.0.5) --- cabal.project | 2 +- scripts/nix/sha256map.nix | 2 +- simplex-chat.cabal | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cabal.project b/cabal.project index 13697d6caf..b867c0e93b 100644 --- a/cabal.project +++ b/cabal.project @@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: fa67d128d1d1c3edb3c49886f096c36e3f4da0d0 + tag: c192339af9e9342902731f2d49ff380359be0dec source-repository-package type: git diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 13cb32469d..a54d3a35a2 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."fa67d128d1d1c3edb3c49886f096c36e3f4da0d0" = "13fl760rbw75rqa1zs4f130w7a75dfqw43w52jjnfpxgqis3dd2z"; + "https://github.com/simplex-chat/simplexmq.git"."c192339af9e9342902731f2d49ff380359be0dec" = "1h81kmwllqza7wil7w20ia934b6iny3dch9fln0x95l9q3f4zww7"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 7fbe800025..982e00fe37 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: simplex-chat -version: 6.3.0.4 +version: 6.3.0.5 category: Web, System, Services, Cryptography homepage: https://github.com/simplex-chat/simplex-chat#readme author: simplex.chat