diff --git a/app/build.gradle b/app/build.gradle index 08b1ac8e3..f6ff6343c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 34 - versionCode 295 - versionName "0.76.1" + versionCode 296 + versionName "0.76.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt index 58fd00425..f7c061e02 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt @@ -23,7 +23,7 @@ class RegisterAccounts( ): List { return accounts.mapNotNull { val acc = LocalPreferences.loadFromEncryptedStorage(it.npub) - if (acc != null) { + if (acc != null && acc.isWriteable()) { val relayToUse = acc.activeRelays()?.firstOrNull { it.read } if (relayToUse != null) { acc.createAuthEvent(relayToUse, notificationToken) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt index b5164442b..614d36a51 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt @@ -1,7 +1,10 @@ package com.vitorpamplona.amethyst.ui.note import android.util.Log +import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.Crossfade +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -358,6 +361,12 @@ private fun ParseAuthorCommentAndAmount( onReady(content) } +fun click(content: MutableState, nav: (String) -> Unit) { + content.value.user?.let { + nav(routeFor(it)) + } +} + @Composable private fun RenderState( content: MutableState, @@ -366,11 +375,7 @@ private fun RenderState( nav: (String) -> Unit ) { Row( - modifier = Modifier.clickable { - content.value.user?.let { - nav(routeFor(it)) - } - }, + modifier = Modifier.clickable { click(content, nav) }, verticalAlignment = Alignment.CenterVertically ) { DisplayAuthorCommentAndAmount( @@ -418,8 +423,19 @@ fun CrossfadeToDisplayPicture(authorComment: MutableState) { - Crossfade(authorComment.value, modifier = amountBoxModifier) { - it.amount?.let { + val visible by remember(authorComment) { + derivedStateOf { + authorComment.value.amount != null + } + } + + AnimatedVisibility( + visible = visible, + modifier = amountBoxModifier, + enter = fadeIn(), + exit = fadeOut() + ) { + authorComment.value.amount?.let { Box( modifier = amountBoxModifier, contentAlignment = Alignment.BottomCenter @@ -453,8 +469,18 @@ fun CrossfadeToDisplayComment( nav: (String) -> Unit, accountViewModel: AccountViewModel ) { - Crossfade(authorComment.value) { - it.comment?.let { + val visible by remember(authorComment) { + derivedStateOf { + authorComment.value.comment != null + } + } + + AnimatedVisibility( + visible, + enter = fadeIn(), + exit = fadeOut() + ) { + authorComment.value.comment?.let { TranslatableRichTextViewer( content = it, canPreview = true, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 2b1df6ee9..28aeee6b6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -1076,6 +1076,8 @@ private fun NoteBody( fun DisplayZapSplits(noteEvent: EventInterface, accountViewModel: AccountViewModel, nav: (String) -> Unit) { val list = remember(noteEvent) { noteEvent.zapSplitSetup() } + if (list.isEmpty()) return + Row(verticalAlignment = CenterVertically) { Box( Modifier diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt index 9073c78ad..04231840f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt @@ -127,7 +127,6 @@ fun WatchAccountForVideoScreen(videoFeedView: NostrVideoFeedViewModel, accountVi } } -@OptIn(ExperimentalFoundationApi::class) @Composable private fun SaveableFeedState( videoFeedView: NostrVideoFeedViewModel, diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 8565ac82c..ee4ea46c7 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -5,13 +5,13 @@ প্রোফাইল ছবি QR স্ক্যান করুন যাহোক, দেখান - পোস্টটি কারো দ্বারা রিপোর্ট করা হয়েছে - ইভেন্টটি লোড হচ্ছে বা আপনার রিলে তালিকায় এটি পাওয়া যাচ্ছে না + পোস্টটি কারো দ্বারা অভিযুক্ত হয়েছে + ইভেন্টটি লোড হচ্ছে অথবা আপনার রিলে তালিকায় এটি পাওয়া যাচ্ছে না চ্যানেল ইমেজ উল্লেখিত ইভেন্টটি পাওয়া যায় নি মেসেজটি ডিক্রিপ্ট করা যায় নি দলগত ছবি - প্রাপ্তবয়স্ক-উপযোগী আধেয় + খোলামেলা আধেয় স্প্যাম ছদ্মবেশ বেআইনী আচরণ @@ -23,19 +23,19 @@ নোটের আইডি কপি করুন সম্প্রচার নোটটি মুছে ফেলার অনুরোধ করুন - ব্লক/রিপোর্ট + ব্লক/অভিযুক্ত করুন স্প্যাম/প্রতারণার অভিযোগ করুন ছদ্মবেশ ধারণের অভিযোগ করুন - প্রাপ্তবয়স্ক-উপযোগী আধেয় হিসেবে অভিযোগ করুন + খোলামেলা আধেয় হিসেবে অভিযোগ করুন বেআইনী আচরণের অভিযোগ করুন - প্রতিউত্তর দিতে ব্যক্তিগত-কি দিয়ে লগ ইন করুন - পোস্টগুলি বুস্ট করতে ব্যক্তিগত-কি দিয়ে লগ ইন করুন - পোস্টগুলি লাইক করতে ব্যক্তিগত-কি দিয়ে লগ ইন করুন + প্রতিউত্তর দিতে ব্যক্তিগত চাবি দিয়ে লগ ইন করুন + পোস্টগুলি বুস্ট করতে ব্যক্তিগত চাবি দিয়ে লগ ইন করুন + পোস্টগুলি লাইক করতে ব্যক্তিগত চাবি দিয়ে লগ ইন করুন জ্যাপের কোনো পরিমাণ নির্দিষ্ট করা নেই। এটি পরিবর্তন করতে চাইলে দীর্ঘক্ষণ চাপুন - কাউকে জ্যাপ পাঠাতে ব্যক্তিগত-কি দিয়ে লগ ইন করুন - কাউকে অনুসরণ বা ফলো করতে ব্যক্তিগত-কি দিয়ে লগ ইন করুন - কাউকে আনফলো করতে ব্যক্তিগত-কি দিয়ে লগ ইন করুন + কাউকে জ্যাপ পাঠাতে ব্যক্তিগত চাবি দিয়ে লগ ইন করুন + কাউকে অনুসরণ করতে ব্যক্তিগত চাবি দিয়ে লগইন করুন + কাউকে আনফলো করতে ব্যক্তিগত চাবি দিয়ে লগ ইন করুন জ্যাপস পরিমাণ দেখুন বুস্ট @@ -49,7 +49,7 @@ প্রোফাইলের ব্যানার সফলভাবে মূল্য পরিশোধিত হয়েছে এরর পার্সিং এরর মেসেজ - " অনুসৃত" + " অনুসরণ" " অনুসারী" প্রোফাইল নিরাপত্তা-ফিল্টার @@ -58,7 +58,7 @@ লাইটনিং ইনভয়েস পরিশোধ করুন লাইটনিং টিপস - প্রাপকের উদ্দেশ্যে চিরকুট + প্রাপকের উদ্দেশে চিরকুট আপনাকে অনেক ধন্যবাদ! স্যাটে মোট পরিমাণ স্যাট পাঠান @@ -80,7 +80,7 @@ পোস্টগুলি বাইটস ত্রুটিসমূহ - নীড় পাতা + নীড়পাতা ব্যক্তিগত বার্তাসমূহ সার্বজনীন কথোপকথন বৈশ্বিক পাতা @@ -118,22 +118,22 @@ আরও বিকল্প " রিলেগুলি" ওয়েবসাইট - লাইটনিং অ্যাড্রেস - ব্যাকআপের জন্য আপনার Nsec ID (তথা পাসওয়ার্ড) ক্লিপবোর্ডে কপি করা হলো - আপনার গোপন কি ক্লিপবোর্ডে কপি করুন - অন্যদের সাথে শেয়ারের জন্য আপনার পাবলিক কি ক্লিপবোর্ডে কপি করা হলো - পাবলিক কি (Npub) ক্লিপবোর্ডে কপি করুন - একটি ডিরেক্ট মেসেজ পাঠান + লাইটনিং ঠিকানা + ব্যাকআপের জন্য আপনার Nsec আইডি (তথা পাসওয়ার্ড) ক্লিপবোর্ডে কপি করে + আপনার ব্যক্তিগত চাবিটি ক্লিপবোর্ডে কপি করুন + অন্যদের সাথে শেয়ারের জন্য আপনার গণ চাবি ক্লিপবোর্ডে কপি করে + গণ চাবি (Npub) ক্লিপবোর্ডে কপি করুন + একটি সরাসরি-বার্তা পাঠান ব্যবহারকারীর মেটাডেটা সম্পাদনা করে অনুসরণ করুন প্রতি-অনুসরণ করুন - অবরোধ তুলে নিন + আনব্লক করুন ব্যবহারকারীর আইডি কপি করুন - ব্যবহারকারীর উপর থেকে অবরোধ তুলে নিন - "এন-পাব, ইউজারনেম, টেক্সট" + ব্যবহারকারীকে আনব্লক করুন + "Npub, ইউজারনেম, টেক্সট" মুছে ফেলুন অ্যাপের লোগো - এন-সেক অথবা এন-পাব.. + Nsec.. অথবা Npub.. পাসওয়ার্ড দেখান পাসওয়ার্ড লুকান অকেজো কি @@ -207,7 +207,7 @@ নতুন অ্যাকাউন্ট যুক্ত করুন অ্যাকাউন্ট সক্রিয় করুন ব্যক্তিগত চাবি আছে - শুধুমাত্র পাঠযোগ্য, কোনো ব্যক্তিগত চাবি নেই + শুধুমাত্র পাঠযোগ্য, ব্যক্তিগত চাবি নেই পিছে যান নির্বাচন করুন ব্রাউজারের লিংক শেয়ার করুন @@ -220,9 +220,9 @@ অনুসরণ করুন নোটটি মুছে ফেলার অনুরোধ করুন অ্যামেথিস্ট অনুরোধ করবে যেন আপনার নোটটি আপনার বর্তমানে সংযুক্ত রিলেগুলো থেকে মুছে ফেলা হয়। তবে কোনো নিশ্চয়তা নেই যে নোটটি স্থায়ীভাবে সেই রিলেগুলি থেকে বা অন্যান্য রিলে থেকে মুছে ফেলা হবে, যেখানে এটি সংরক্ষণ করা হতে পারে৷ - অবরুদ্ধ করুন + ব্লক করুন মুছে ফেলুন - অবরুদ্ধ করুন + ব্লক করুন অভিযোগ করুন মুছে ফেলুন আর দেখাবেন না @@ -231,8 +231,8 @@ ক্রূর উদ্দেশ্য সাধনে ছদ্মবেশ নগ্নতা বা গ্রাফিক আধেয় বেআইনী আচরণ - কোনো ব্যবহারকারীকে ব্লক বা অবরুদ্ধ করে রাখলে আপনার অ্যাপে তাদের কন্টেন্ট দেখা যাবে না। আপনার নোটগুলি সর্বজনীনভাবে উন্মুক্ত, আপনার দ্বারা অবরুদ্ধ ব্যক্তিরাও তা দেখতে পাবে। অবরুদ্ধ করে রাখা ব্যবহারকারীদেরকে নিরাপত্তা-ফিল্টার স্ক্রিনে তালিকাভুক্ত করা হয়েছে। - + কোনো ব্যবহারকারীকে ব্লক করে রাখলে আপনার অ্যাপে তাদের কোনো আধেয় দেখা যাবে না। তবে আপনার নোটগুলি সর্বজনীনভাবে উন্মুক্ত, আপনার দ্বারা ব্লক করা ব্যক্তিরাও তা দেখতে পাবে। ব্লক করে রাখা ব্যবহারকারীদেরকে নিরাপত্তা-ফিল্টার স্ক্রিনে তালিকাভুক্ত করা হয়েছে। + অবমাননার অভিযোগ করুন পেশকৃত সমস্ত অভিযোগ সর্বজনীনভাবে দৃশ্যমান হবে৷ আপনি চাইলে আপনার অভিযোগের সাথে অতিরিক্ত অনুসঙ্গ যোগ করতে পারেন… @@ -240,22 +240,22 @@ কারণ একটি কারণ নির্বাচন করুন… অভিযোগ পেশ করুন - অবরুদ্ধ করুন এবং অভিযোগ পেশ করুন - অবরুদ্ধ করুন + ব্লক করুন এবং অভিযোগ পেশ করুন + ব্লক করুন বুকমার্ক করুন ব্যক্তিগত বুকমার্ক - সার্বজনীন বুকমার্ক + সর্বজনীন বুকমার্ক ব্যক্তিগত বুকমার্কে যুক্ত করুন - সার্বজনীন বুকমার্কে যুক্ত করুন + সর্বজনীন বুকমার্কে যুক্ত করুন ব্যক্তিগত বুকমার্ক থেকে সরিয়ে দিন - সার্বজনীন বুকমার্ক থেকে সরিয়ে দিন + সর্বজনীন বুকমার্ক থেকে সরিয়ে দিন ওয়ালেট সংযোগের পরিষেবা অ্যাপ থেকে বের না হয়েই জ্যাপ প্রদান করতে একটি নস্টার-সিক্রেট অনুমোদন করা হয়ে থাকে। এই নস্টার-সিক্রেটটি নিরাপদে রাখুন এবং সম্ভব হলে একটি প্রাইভেট রিলে ব্যবহার করুন - ওয়ালেট সংযোগের পাবলিক কি + ওয়ালেট সংযোগের গণ চাবি ওয়ালেট সংযোগের রিলে ওয়ালেট সংযোগের সিক্রেট - সিক্রেট কি দেখান - এন-সেক/হেক্স প্রাইভেট কি + গোপন চাবি দেখান + nsec / hex ব্যক্তিগত চাবি প্রতিশ্রুত পরিমাণ স্যাট দ্বারা জানান একটি পোল পেশ করুন প্রয়োজনীয় ক্ষেত্রসমূহ: @@ -274,14 +274,14 @@ পরিমাণটি জ্যাপ করুন এই জাতীয় পোলে একজন ব্যবহারকারী শুধুমাত্র একটি করেই ভোট দিতে পারবেন "ইভেন্ট খোঁজা হচ্ছে %1$s" - একটি সার্বজনীন বার্তা পাঠান + একটি সর্বজনীন বার্তা পাঠান একটি ব্যক্তিগত বার্তা পাঠান একটি ইনভয়েস বার্তা পাঠান আপনার সকল কাজের জন্য আপনাকে অসংখ্য ধন্যবাদ! তৈরি করুন এবং যোগ করুন পোল-রচয়িতারা নিজেদের পোলে ভোট দিতে পারবেন না। ঐ পোস্ট এবং এই আধেয়র বিষয়বস্তু অভিন্ন - এই আধেয়র বিষয়বস্তু পরিবর্তিত হয়েছে। লেখক হয়তো পরিবর্তনটি দেখেননি বা অনুমোদন করেননি + এই আধেয়র বিষয়বস্তু পরিবর্তিত হয়েছে। লেখক হয়তো পরিবর্তনটি দেখেন নি বা অনুমোদন করেন নি ছবি যোগ করুন ভিডিও যোগ করুন নথি যোগ করুন @@ -290,7 +290,7 @@ সূর্যাস্তের সময় সাদা বালুকাময় সমুদ্র সৈকতে একটি নীল নৌকা জ্যাপের ধরন সকল বিকল্পগুলিতে জ্যাপের ধরন - সার্বজনীন + সর্বজনীন লেনদেন এবং বার্তা সকলে দেখতে পারেন ব্যক্তিগত প্রেরক এবং প্রাপক একে অপরকে দেখতে এবং বার্তা পড়তে পারেন @@ -337,7 +337,7 @@ \n৩. Orbot এ ঢুকে Socks পোর্টটি খেয়াল করুন। এটি ৯০৫০ তে নির্দিষ্ট করা থাকে \n৪. প্রয়োজনে Orbot এ পোর্টটি বদলে দিন \n৫. স্ক্রিনের Socks পোর্টটি প্রস্তুত করুন - \n৬. Orbot কে প্রক্সি হিসেবে ব্যবহার করতে Activate বাটনটি চাপুন + \n৬. Orbot কে প্রক্সি হিসেবে ব্যবহার করতে Activate বোতামটি চাপুন Orbot এর Socks পোর্ট পোর্ট নম্বরটি অকার্যকর @@ -362,12 +362,62 @@ সংবেদনশীল আধেয় সবসময় আড়ালে রাখুন সংবেদনশীল বিষয়বস্তু সবসময় খোলামেলা দেখান সবসময় আধেয় বিষয়ক সতর্কতা দেখান + প্রস্তাবিত: + অপরিচিতদের কাছ থেকে স্প্যাম ফিল্টার করুন + কোনো পোস্টে আপনার অনুসরীদের থেকে অভিযোগ থাকলে অবহিত হোন + প্রতিক্রিয়ার নতুন প্রতীক + প্রতিক্রিয়ার কোনো ধরন বেছে নেওয়া হয়নি। পরিবর্তন করতে দীর্ঘক্ষণ চাপুন + জ্যাপরেইজার + এই পোস্টের জন্য স্যাটের একটি লক্ষ্যমাত্রা যোগ করে। সহায়তাকারী ক্লায়েন্টরা অনুদানকে উৎসাহিত করার জন্য একে একটি অগ্রগতির মানদণ্ড হিসাবে দেখাতে পারে + পরিমাণের লক্ষ্যমাত্রা স্যাট দ্বারা জানান + জ্যাপরাইজার %1$s তে আছে। %2$s স্যাট লক্ষ্যমাত্রা + রিলে থেকে পড়ুন + রিলেতে লিখুন + %1$s থেকে রিলের তথ্যের জন্য চেষ্টা করার সময় একটি ত্রুটি ঘটেছে৷ মালিক সংস্করণ সফটওয়্যার যোগাযোগ - সমর্থিত NIPs + সমর্থিত NIP গুলো প্রবেশমূল্য + মূল্যপরিশোধের URL + সীমাবদ্ধতা + দেশসমূহ + ভাষাসমূহ + ট্যাগগুলি + আধেয় পেশ করার নীতি + বার্তার ব্যাপ্তি + সকল সদস্যতা + ফিল্টারগুলি + সদস্যতা আইডির ব্যাপ্তি + ন্যূনতম উপসর্গ + সর্বাধিক ইভেন্ট ট্যাগ + আধেয়র ব্যাপ্তি + ন্যূনতম PoW + অনুমোদন + মূল্যপরিশোধ + ক্যাশু টোকেন + খালাস করুন + কোনো লাইটনিং ঠিকানা সেট করা নেই + টোকেনটি ক্লিপবোর্ডে কপি করা হয়েছে + লাইভ + অফলাইন + সমাপ্ত + সময়সূচি নির্ধারিত + লাইভস্ট্রিমটি অফলাইন আছে + লাইভস্ট্রিম সমাপ্ত + লগ আউট করলে আপনার সমস্ত স্থানীয় তথ্য মুছে যাবে। অ্যাকাউন্ট সুরক্ষিত রাখতে আপনার ব্যক্তিগত চাবিটি নিরাপদে সংরক্ষিত আছে কিনা নিশ্চিত হোন। সামনে আগাতে চান? + অনুসৃত ট্যাগগুলি + রিলেগুলি + লাইভ + কম্যুনিটি + বার্তালাপগুলি + অনুমোদিত পোস্টগুলি + এই দলটির কোনো বিবরণ কিংবা নীতিমালা নেই। এগুলো যুক্ত করতে দলনেতার সাথে কথা বলুন + এই কম্যুনিটির কোনো বিবরণ কিংবা নীতিমালা নেই। এগুলো যুক্ত করতে এর মালিকের সাথে কথা বলুন + সংবেদনশীল আধেয় + সংবেদনশীল আধেয় দেখানোর আগে এ সম্পর্কিত সতর্কতা প্রদর্শন করে + সেটিংস সবসময় শুধুমাত্র ওয়াইফাইতে কখনো না @@ -385,4 +435,65 @@ মৌন করে রাখা। এটি তুলে নিতে ক্লিক করুন শব্দ চালু আছে। মৌন করতে ক্লিক করুন স্থানীয় এবং দূরবর্তী রেকর্ড অনুসন্ধান করুন + নস্টার ঠিকানাটি যাচাই করা হয়েছে + নস্টার ঠিকানাটি যাচাই করা যায় নি + নস্টার ঠিকানাটি পরীক্ষা করে দেখা হচ্ছে + সবগুলিকে নির্বাচন/অনির্বাচন করুন + পূর্ব-নির্ধারিত + চালিয়ে যেতে একটি রিলে নির্বাচন করুন + জ্যাপটি পাঠান: + সহায়তাকারী ক্লায়েন্টরা আপনার পরিবর্তে নীচের LN ঠিকানা বা ব্যবহারকারীর প্রোফাইলে জ্যাপ পাঠাবে + আপনার অবস্থান এভাবে প্রকাশ করুন + পোস্টে আপনার অবস্থানের একটি জিওহ্যাশ যোগ করে। জনসাধারণ জানবে যে আপনি বর্তমান অবস্থান থেকে ৫ কিলোমিটার (৩ মাইল) এর মধ্যে আছেন + আপনার পেশকৃত আধেয় দেখানোর আগে সংবেদনশীল আধেয়-সতর্কতা জারি করে। এটি সেসকল আধেয়র জন্য আদর্শ যেখানে NSFW উপাদান কিংবা এমনকিছু থাকতে পারে যা কারো কারো জন্য আপত্তিকর কিংবা সমস্যাজনক মনে হতে পারে। + নতুন ফিচার + এই মোড সক্রিয় করার জন্য অ্যামেথিস্টকে একটি NIP-24 বার্তা পাঠাতে হবে। (GiftWrapped, সিল করা সরাসরি এবং দলগত বার্তা)। NIP-24 নতুন এবং বেশিরভাগ ক্লায়েন্ট এখনও এটি বাস্তবায়ন করেনি। নিশ্চিত করুন যে প্রাপক একটি সামঞ্জস্যপূর্ণ ক্লায়েন্ট ব্যবহার করছে। + সক্রিয় করুন + সর্বজনীন + ব্যক্তিগত + প্রতি + বিষয় + আলোচনার বিষয় + "\@User1, @User2, @User3" + এই দলের সদস্যরা + সদস্যদের নিকট ব্যাখ্যা + নতুন লক্ষ্যের জন্য নাম পরিবর্তন করা হচ্ছে। + অ্যাপের ইন্টারফেসের জন্য + আঁধারি, উজ্জ্বল কিংবা সিস্টেমের থিম + স্বয়ংক্রিয়ভাবে ছবি এবং GIF লোড করুন + স্বয়ংক্রিয়ভাবে ভিডিও এবং GIF চালু করুন + URL এর পূর্বরূপ দেখান + কখন ছবি লোড করতে হবে + URL ক্লিপবোর্ডে কপি করুন + নোট আইডি ক্লিপবোর্ডে কপি করুন + যেখানে নির্মিত + নিয়ম + আপনার স্ট্যাটাস আপডেট করুন + Error parsing error message + জ্যাপের পরিমাণ দ্বারা ভোটসংখ্যা গোণা হয়। আপনি স্প্যামার এড়াতে একটি সর্বনিম্ন পরিমাণ এবং একটি বড়ো জ্যাপার দ্বারা পোল দখল এড়াতে সর্বোচ্চ পরিমাণ স্যাট নির্ধারণ করতে পারেন। প্রতিটি ভোটের মূল্য একই পরিমাণে রয়েছে তা নিশ্চিত করতে উভয় ক্ষেত্রেই একই পরিমাণ ব্যবহার করুন। যেকোনো পরিমাণ গ্রহণ করতে এটি খালি ছেড়ে দিন। + জ্যাপ পাঠানো যায় নি + ব্যবহারকারীকে বার্তা দিন + ঠিক আছে + %1$s: %2$s পৌঁছাতে ব্যর্থ + %1$s: %2$s পৌঁছাতে ব্যর্থ + %1$s: %2$s থেকে ফলাফল পার্স করা যায় নি + %1$s কোড দিয়ে ব্যর্থ হয়েছে %2$s + এর জন্য সক্রিয় করুন: + নীড় + বার্তাসমূহ + আলাপচারিতা + বৈশ্বিক + অনুসন্ধান করুন + জ্যাপগুলি ভাগ করুন এবং পাঠান + সমর্থিত ক্লায়েন্টরা জ্যাপ ভাগ করবে এবং আপনার পরিবর্তে এখানে সংযুক্ত ব্যবহারকারীদেরকে পাঠাবে + ব্যবহারকারীদের অনুসন্ধান করুন এবং যুক্ত করুন + ইউজারনেম কিংবা প্রদর্শিত নাম দিন + %1$s ব্যবহারকারীর স্যাট গ্রহণের উপযোগী কোনো লাইটনিং ঠিকানা সেট করা নেই + শতাংশ + ২৫ + এর সাথে জ্যাপ ভাগ করা হচ্ছে + একে জ্যাপ পাঠানো হচ্ছে + লাইটনিং ওয়ালেট পাওয়া যায় নি + পরিশোধিত + ওয়ালেট %1$s diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c5b8db64c..8661a8709 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -474,4 +474,26 @@ Impossible d\'envoyer un zap Contacter l\'Utilisateur Ok + Impossible d\'atteindre %1$s: %2$s + Impossible d\'atteindre %1$s: %2$s + Impossible d\'analyser le résultat de %1$s: %2$s + %1$s a échoué avec le code %2$s + Actif pour : + Accueil + MPs + Salons + Général + Rechercher + Diviser et Transférer des Zaps + Les clients supportés vont diviser et transférer les zaps aux utilisateurs ajoutés ici au lieu du vôtre + Rechercher et Ajouter un Utilisateur + Nom d\'utilisateur ou nom affiché + L\'utilisateur %1$s n\'a pas configuré d\'adresse Lightning pour recevoir des sats + Pourcentage + 25 + Diviser les zaps avec + Transférer les zaps à + Portefeuilles Lightning introuvables + Payé + Portefeuille %1$s diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 043c65396..dd7f1a8b5 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -474,4 +474,9 @@ Kan zap niet verzenden Bericht de gebruiker Ok + Mislukt om %1$s te bereiken: %2$s + Mislukt om %1$s te bereiken: %2$s + Mislukt om het resultaat van %1$s te parsen: %2$s + %1$s mislukt met code %2$s + Actief voor: diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt index 3ed0990cc..20851034d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt @@ -96,16 +96,20 @@ open class Event( override fun hasZapSplitSetup() = tags.any { it.size > 1 && it[0] == "zap" } override fun zapSplitSetup(): List { - return tags.filter { it.size > 1 && it[0] == "zap" }.map { + return tags.filter { it.size > 1 && it[0] == "zap" }.mapNotNull { val isLnAddress = it[0].contains("@") || it[0].startsWith("LNURL", true) val weight = if (isLnAddress) 1.0 else (it.getOrNull(3)?.toDoubleOrNull() ?: 0.0) - ZapSplitSetup( - it[1], - it.getOrNull(2), - weight, - isLnAddress - ) + if (weight > 0) { + ZapSplitSetup( + it[1], + it.getOrNull(2), + weight, + isLnAddress + ) + } else { + null + } } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP24Factory.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP24Factory.kt index 1110b548f..dce37778b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP24Factory.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP24Factory.kt @@ -3,6 +3,7 @@ package com.vitorpamplona.quartz.events import com.vitorpamplona.quartz.encoders.toHexKey import com.vitorpamplona.quartz.crypto.CryptoUtils import com.vitorpamplona.quartz.crypto.KeyPair +import com.vitorpamplona.quartz.encoders.ATag import com.vitorpamplona.quartz.encoders.HexKey class NIP24Factory { @@ -86,4 +87,50 @@ class NIP24Factory { ) } } + + fun createTextNoteNIP24( + msg: String, + to: List, + from: ByteArray, + replyTos: List? = null, + mentions: List? = null, + addresses: List?, + extraTags: List?, + zapReceiver: List? = null, + markAsSensitive: Boolean = false, + replyingTo: String?, + root: String?, + directMentions: Set, + zapRaiserAmount: Long? = null, + geohash: String? = null + ): List { + val senderPublicKey = CryptoUtils.pubkeyCreate(from).toHexKey() + + val senderMessage = TextNoteEvent.create( + msg = msg, + privateKey = from, + replyTos = replyTos, + mentions = mentions, + zapReceiver = zapReceiver, + root = root, + extraTags = extraTags, + addresses = addresses, + directMentions = directMentions, + replyingTo = replyingTo, + markAsSensitive = markAsSensitive, + zapRaiserAmount = zapRaiserAmount, + geohash = geohash + ) + + return to.plus(senderPublicKey).map { + GiftWrapEvent.create( + event = SealedGossipEvent.create( + event = senderMessage, + encryptTo = it, + privateKey = from + ), + recipientPubKey = it + ) + } + } }