From cdaff4da06f2a92f8b1856ce2300f6bdbc2d2848 Mon Sep 17 00:00:00 2001 From: Vahid Farid Date: Fri, 9 Feb 2024 20:25:51 +0330 Subject: [PATCH 1/2] added support for multiple custom configs in subscriptions + remarks Accepting both single config and multiple configs i.e: {customConfig} or [{customConfig1}, {customConfig2} ...] Furtheremore added an optional 'remarks' field to v2rayConfig class to keep remote customConfig name. --- .../kotlin/com/v2ray/ang/dto/V2rayConfig.kt | 14 +++++++- .../com/v2ray/ang/util/AngConfigManager.kt | 34 +++++++++++++++---- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt index 4464ed0c..94d3848d 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt @@ -10,6 +10,7 @@ import com.google.gson.reflect.TypeToken import java.lang.reflect.Type data class V2rayConfig( + var remarks: String? = null, var stats: Any? = null, val log: LogBean, var policy: PolicyBean?, @@ -69,6 +70,7 @@ data class V2rayConfig( val mux: MuxBean? = MuxBean(false)) { data class OutSettingsBean(var vnext: List? = null, + var fragment: FragmentBean? = null, var servers: List? = null, /*Blackhole*/ var response: Response? = null, @@ -101,6 +103,10 @@ data class V2rayConfig( var flow: String = "") } + data class FragmentBean(var packets: String = "", + var length: String = "10-20", + var interval: String = "10-20") + data class ServersBean(var address: String = "", var method: String = "chacha20-poly1305", var ota: Boolean = false, @@ -135,7 +141,7 @@ data class V2rayConfig( var realitySettings: TlsSettingsBean? = null, var grpcSettings: GrpcSettingsBean? = null, val dsSettings: Any? = null, - val sockopt: Any? = null + val sockopt: SockoptBean? = null ) { data class TcpSettingsBean(var header: HeaderBean = HeaderBean(), @@ -181,6 +187,12 @@ data class V2rayConfig( data class HttpSettingsBean(var host: List = ArrayList(), var path: String = "") + data class SockoptBean(var TcpNoDelay: Boolean? = null, + var tcpKeepAliveIdle: Int? = null, + var tcpFastOpen: Boolean? = null, + var tproxy: String? = null, + var mark: Int? = null) + data class TlsSettingsBean(var allowInsecure: Boolean = false, var serverName: String = "", val alpn: List? = null, diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt index c3dea69a..aa49aa9e 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt @@ -7,6 +7,7 @@ import android.text.TextUtils import android.util.Log import androidx.preference.PreferenceManager import com.google.gson.Gson +import com.google.gson.GsonBuilder import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig import com.v2ray.ang.AppConfig.ANG_CONFIG @@ -985,13 +986,32 @@ object AngConfigManager { && server.contains("outbounds") && server.contains("routing") ) { - val config = ServerConfig.create(EConfigType.CUSTOM) - config.remarks = System.currentTimeMillis().toString() - config.subscriptionId = subid - config.fullConfig = Gson().fromJson(server, V2rayConfig::class.java) - val key = MmkvManager.encodeServerConfig("", config) - serverRawStorage?.encode(key, server) - return 1 + val gson = GsonBuilder().setPrettyPrinting().create() + val serverList: Array = Gson().fromJson(server, Array::class.java) + if (serverList.size > 0) { + var count = 0 + for (srv in serverList) { + if (srv.inbounds != null && srv.outbounds != null && srv.routing != null) { + var config = ServerConfig.create(EConfigType.CUSTOM) + config.remarks = srv.remarks ?: "%04d-".format(count + 1) + System.currentTimeMillis().toString() + config.subscriptionId = subid + config.fullConfig = srv + var key = MmkvManager.encodeServerConfig("", config) + serverRawStorage?.encode(key, gson.toJson(srv)) + count = count + 1 + } + } + return count + } else { // For compatibility + val config = ServerConfig.create(EConfigType.CUSTOM) + config.subscriptionId = subid + config.fullConfig = Gson().fromJson(server, V2rayConfig::class.java) + config.remarks = System.currentTimeMillis().toString() + // config.remarks = config.fullConfig?.remarks ?: System.currentTimeMillis().toString() + val key = MmkvManager.encodeServerConfig("", config) + serverRawStorage?.encode(key, server) + return 1 + } } else { return 0 } From fbd9d92f5e2902b4f2fec364e9686a1941bb8eeb Mon Sep 17 00:00:00 2001 From: Vahid Farid Date: Sat, 10 Feb 2024 01:22:07 +0330 Subject: [PATCH 2/2] Update strings.xml --- .../app/src/main/res/values-fa/strings.xml | 79 ++++++++++--------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml index f71efd33..a363e9f8 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -6,7 +6,7 @@ برای اولین بار از این ویژگی استفاده می‌کنید، لطفا از برنامه برای افزودن سرور استفاده کنید باز کردن منو کشویی بستن منو کشویی - موفقیت در انتقال داده! + موفقیت در انتقال داده انتقال داده انجام نشد! @@ -16,26 +16,26 @@ شروع خدمات توقف خدمات خدمات با موفقیت شروع شد - شروع خدمات انجام نشد + شروع خدمات انجام نشد! - پرونده پیکربندی - افزودن پیکربندی - ذخیره پیکربندی - حذف پیکربندی - پیکربندی را از QRcode وارد کنید - پیکربندی را از کلیپ‌بورد وارد کنید + فایل کانفیگ + افزودن کانفیگ + ذخیره کانفیگ + حذف کانفیگ + کانفیگ را از QRcode وارد کنید + کانفیگ را از کلیپ‌بورد وارد کنید تایپ دستی[Vmess] تایپ دستی[VLESS] تایپ دستی[Shadowsocks] تایپ دستی[Socks] تایپ دستی[Trojan] [Wireguard]تایپ دستی - پیکربندی سفارشی - پیکربندی سفارشی را از کلیپ‌بورد وارد کنید - پیکربندی سفارشی را به صورت محلی وارد کنید - پیکربندی سفارشی را از طریق نشانی اینترنتی وارد کنید - نشانی اینترنتی اسکن پیکربندی سفارشی را وارد کنید + کانفیگ سفارشی + کانفیگ سفارشی را از کلیپ‌بورد وارد کنید + کانفیگ سفارشی را به صورت محلی وارد کنید + کانفیگ سفارشی را از طریق نشانی اینترنتی وارد کنید + نشانی اینترنتی اسکن کانفیگ سفارشی را وارد کنید حذف شود؟ ملاحظات نشانی @@ -47,10 +47,10 @@ انتقال نوع head حالت gRPC - درخواست میزبان (میزبان/میزبان ws/ میزبان h2)/امنیت QUIC + میزبان درخواست (host/host ws/host h2)/امنیت QUIC مسیر (مسیر ws/ مسیر h2) کلید QUIC/دانه kcp/نام‌خدمات gRPC TLS - allowInsecure + مجوز ناامن SNI نشانی پورت @@ -58,7 +58,7 @@ امنیت رمز عبور (اختیاری) نام‌کاربری (اختیاری) - رمزگذاری + رمزنگاری جریان Reserved (اختیاری) آدرس محلی IPv4(اختیاری) @@ -68,19 +68,19 @@ چیزی نیست پروتکل نادرست رمزگشایی انجام نشد - انتخاب پرونده پیکربندی - لطفا یک مدیر پرونده نصب کنید. - سفارشی‌سازی پیکربندی - پیکربندی معتبر نیست + انتخاب فایل کانفیگ + لطفا یک برنامه مدیریت فایل نصب کنید. + سفارشی‌سازی کانفیگ + کانفیگ معتبر نیست محتوا هیچ داده‌ای در کلیپ‌بورد وجود ندارد نشانی اینترنتی معتبر نیست اطمینان حاصل کنید که پورت ورودی با تنظیمات مطابقت دارد - پیکربندی درست نیست + کانفیگ درست نیست میزبان (SNI) (اختیاری) - کپی پرونده انجام نشد، لطفا از مدیر پرونده استفاده کنید - افزودن پرونده‌ها - دانلود پرونده‌ها + کپی فایل انجام نشد، لطفا از برنامه مدیریت فایل استفاده کنید + افزودن فایل‌ها + دانلود فایل‌ها بارگذاری @@ -98,7 +98,7 @@ تنظیمات تنظیمات پیشرفته تنظیمات VPN - پروکسی هر برنامه + پروکسی به تفکیک برنامه عمومی: برنامه بررسی شده پروکسی است، اتصال مستقیم بدون بررسی است. \nحالت bypass: برنامه بررسی شده مستقیما متصل است، پراکسی بررسی نشده است. \nگزینه‌ای برای انتخاب خودکار پروکسی برنامه در منو است فعال کردن Mux @@ -155,8 +155,8 @@ پورت DNS محلی پورت DNS محلی - تایید حذف پرونده پیکربندی - آیا برای حذف پرونده پیکربندی نیاز به تایید دوم توسط کاربر است + تایید حذف فایل کانفیگ + آیا برای حذف فایل کانفیگ نیاز به تایید دوم توسط کاربر است فورا اسکن را شروع کن دوربین را برای اسکن بلافاصله در هنگام راه اندازی باز کنید، در غیر این صورت می توانید کد را اسکن کنید یا عکسی را در نوار ابزار انتخاب کنید. @@ -179,20 +179,20 @@ کپی پاک کردن راه‌اندازی مجدد خدمات - حذف تمام پیکربندی + حذف تمام کانفیگ حذف کانفیگ های تکراری - تنظیمات نامعتبر را حذف کنید (ابتدا آزمایش کنید) - خروجی گرفتن پیکربندی‌های غیرسفارشی در کلیپ‌بورد + حذف کانفیگ‌های نامعتبر (ابتدا آزمایش کنید) + خروجی گرفتن کانفیگ‌های غیرسفارشی در کلیپ‌بورد تنظیمات گروه‌ی اشتراک ملاحظات نشانی اینترنتی اختیاری فعال کردن به‌روزرسانی به‌روزرسانی اشتراک - Tcping همه پیکربندی - تاخیر واقعی همه پیکربندی - پرونده‌های دارایی جغرافیا + Tcping همه کانفیگ + تاخیر واقعی همه کانفیگ + فایل‌های دارایی جغرافیا مرتب‌سازی بر اساس نتایج آزمایش - فیلتر پرونده پیکربندی ها + فیلتر کردن کانفیگ‌ها همه گروه‌های اشتراک حذف %d کانفیگ تکراری @@ -200,12 +200,12 @@ تایید تنظیمات مسیریابی - با کاما (,) از هم جدا شوند، ذخیره کردن هم فراموش نک + با کاما (,) از هم جدا شوند، ذخیره کردن فراموش نشود ذخیره پاک کردن اسکن و جایگزین کنید اسکن و اضافه کنید - قوانین مسیریابی پیش‌فرض را تنظیم کنید + قوانین مسیریابی پیش‌فرض را تنظیم کنید اتصال را بررسی کنید در حال آزمایش... @@ -216,10 +216,13 @@ متصل است، برای بررسی اتصال ضربه بزنید متصل نیست + اشتراک با موفقیت ذخیره شد + ذخیره اشتراک ناموفق بود + QRcode خروجی گرفتن در کلیپ‌بورد - خروجی گرفتن پیکربندی کامل در کلیپ‌بورد + خروجی گرفتن کانفیگ کامل در کلیپ‌بورد @@ -245,7 +248,5 @@ VPN فقط پروکسی - اشتراک با موفقیت ذخیره شد - ذخیره اشتراک ناموفق بود