added wss tools

This commit is contained in:
2026-06-17 21:26:08 +03:30
parent cc5808e755
commit b66a8611cd
5 changed files with 140 additions and 47 deletions
@@ -150,6 +150,8 @@ class ProductController extends SuperController
$product = Product::findOrFail($id);
$oldOffsetPercent = (float) ($product->price_offset_percent ?? 0);
unset($data['trade_by_quantity']);
if (
Product::hasPriceOffsetColumn()
&& $product->reading_method
+25 -6
View File
@@ -11,19 +11,38 @@ class WebsocketBroadcastService
public function triggerBaseUrl(): ?string
{
$fromEnv = trim((string) (env('WSS_LINK') ?: env('wssLink', '')));
if ($fromEnv !== '') {
return rtrim($fromEnv, '/');
$config = app(ConfigService::class);
$port = $config->getInt('wss_http_port', 0);
if ($port > 0) {
$host = trim($config->getString('wss_trigger_host', '127.0.0.1'));
if ($host === '') {
$host = '127.0.0.1';
}
$fromSetting = trim((string) app(ConfigService::class)->getString('wss_link', ''));
if ($fromSetting !== '') {
return rtrim($fromSetting, '/');
$scheme = trim($config->getString('wss_trigger_scheme', 'http'));
if ($scheme === '') {
$scheme = 'http';
}
return rtrim("{$scheme}://{$host}:{$port}", '/');
}
// سازگاری با دیپلوی‌های قدیمی (wss_link کامل)
$legacyLink = trim($config->getString('wss_link', ''));
if ($legacyLink !== '') {
return rtrim($legacyLink, '/');
}
return null;
}
/** پورت WebSocket داخلی — برای دیپلوی لایت‌اسپید/docker (همان پروژه) */
public function socketPort(): int
{
return app(ConfigService::class)->getInt('wss_socket_port', 0);
}
public function triggerPath(): string
{
$path = trim((string) app(ConfigService::class)->getString('wss_trigger_path', ''));
@@ -312,7 +312,7 @@ INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `de
SELECT 'product_auto_close_open_on_list', '', 'باز/بسته خودکار محصول', 1, 0, NULL, 'switch'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'product_auto_close_open_on_list' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'metal_type', 'کاتد مس', 'عنوان فلز در UI', 1, 1, NULL, 'text'
SELECT 'metal_type', 'کاتد مس', 'عنوان فلز در UI', 0, 1, NULL, 'text'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'metal_type' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'payping_fin_sync_enabled', '', 'همگام‌سازی fin لیمان', 1, 0, NULL, 'switch'
@@ -1183,7 +1183,7 @@ UPDATE `settings` SET
WHERE `key` = 'product_auto_close_open_on_list';
UPDATE `settings` SET
`title_fa` = 'عنوان فلز در UI',
`can_edit` = 1,
`can_edit` = 0,
`type` = 'text',
`description` = NULL,
`value` = 'کاتد مس',
+88 -26
View File
@@ -26,6 +26,18 @@ SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
SET @db = DATABASE();
-- متن پیش‌فرض invite_link_text (تک‌خطی با CHAR(10) — سازگار با همه کلاینت‌های SQL)
SET @invite_link_default_text = CONCAT(
'⭐️الان طلا بخر؛ آخر ماه سودشو ببر!', CHAR(10),
'با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!', CHAR(10),
CHAR(10),
'این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید.', CHAR(10),
'روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.', CHAR(10),
CHAR(10),
'٪لینک'
);
SET @invite_link_desc = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی استفاده می‌کند.';
-- ستون‌های اختیاری settings (بعضی DBهای قدیمی ندارند)
SET @sql = IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
@@ -195,19 +207,31 @@ WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'external_order_api_ena
-- WebSocket قیمت (برادکست last/list)
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'wss_enabled', 'true', 'قیمت لحظه‌ای از WebSocket', 1, 1, 'روشن = کلاینت از /prc/ws استفاده می‌کند؛ خاموش = polling', 'switch'
SELECT 'wss_enabled', 'true', 'قیمت لحظه‌ای از WebSocket', 0, 1, 'روشن = کلاینت از /prc/ws استفاده می‌کند؛ خاموش = polling', 'switch'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_enabled' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'wss_path', '/prc/ws', 'مسیر WebSocket قیمت', 1, 1, 'مسیر پروکسی لایت‌اسپید — مثال: /prc/ws', 'text'
SELECT 'wss_path', '/prc/ws', 'مسیر WebSocket قیمت', 0, 1, 'مسیر پروکسی لایت‌اسپید — مثال: /prc/ws', 'text'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_path' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'wss_link', '', 'آدرس trigger وب‌سوکت (سرور)', 1, 1, 'مثال: http://localhost:2090 — اگر خالی باشد از env WSS_LINK/wssLink', 'text'
SELECT 'wss_trigger_host', '127.0.0.1', 'هاست trigger وب‌سوکت', 0, 1, 'معمولاً 127.0.0.1 — همان سرور لاراول و docker ws', 'text'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_trigger_host' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'wss_http_port', '', 'پورت HTTP trigger وب‌سوکت', 0, 1, 'مثال طباطبایی: 2010 — لاراول POST برادکست؛ لایت‌اسپید External App /prc', 'number'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_http_port' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'wss_socket_port', '', 'پورت WebSocket داخلی', 0, 1, 'مثال طباطبایی: 2011 — لایت‌اسپید WebSocket Proxy /prc/ws و WS_SOCKET_PORT در docker', 'number'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_socket_port' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'wss_link', '', 'آدرس trigger وب‌سوکت (قدیمی)', 0, 0, 'منسوخ — از wss_http_port استفاده کنید. فقط اگر http_port خالی باشد.', 'text'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_link' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'wss_trigger_path', '/prc/api/trigger-update', 'مسیر trigger برادکست', 1, 1, 'POST برای ارسال last/list به سرویس ws', 'text'
SELECT 'wss_trigger_path', '/prc/api/trigger-update', 'مسیر trigger برادکست', 0, 1, 'POST برای ارسال last/list به سرویس ws', 'text'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'wss_trigger_path' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
@@ -282,7 +306,7 @@ SELECT 'tahesab_host', '', 'آدرس IP سرور ته‌حساب', 1, 1, NULL
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'tahesab_host' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
SELECT 'tahesab_port', '', 'پورت سرور ته‌حساب', 1, 1, NULL
SELECT 'tahesab_port', '', 'پورت سرور ته‌حساب', 0, 1, NULL
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'tahesab_port' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
@@ -318,18 +342,7 @@ SELECT 'support_messenger_text', '', 'متن پشتیبانی پیام‌رسا
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'support_messenger_text' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'invite_link_text',
'⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
٪لینک',
'متن دعوتنامه اشتراک‌گذاری',
1, 1,
'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.',
'longtext'
SELECT 'invite_link_text', @invite_link_default_text, 'متن دعوتنامه اشتراک‌گذاری', 1, 1, @invite_link_desc, 'longtext'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'invite_link_text' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
@@ -355,7 +368,7 @@ SELECT 'price_extreme_date', '', 'تاریخ min/max روز', 0, 1, NULL
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'price_extreme_date' LIMIT 1);
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
SELECT 'metal_type', 'طلای آبشده', 'عنوان فلز در UI', 1, 1, NULL
SELECT 'metal_type', 'طلای آبشده', 'عنوان فلز در UI', 0, 1, NULL
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'metal_type' LIMIT 1);
-- درگاه — کلیدهای اختیاری payping
@@ -551,7 +564,16 @@ WHERE `key` = 'wss_enabled';
UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'مسیر WebSocket قیمت')
WHERE `key` = 'wss_path';
UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'آدرس trigger وب‌سوکت')
UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'هاست trigger وب‌سوکت')
WHERE `key` = 'wss_trigger_host';
UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'پورت HTTP trigger وب‌سوکت')
WHERE `key` = 'wss_http_port';
UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'پورت WebSocket داخلی')
WHERE `key` = 'wss_socket_port';
UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'آدرس trigger وب‌سوکت (قدیمی)')
WHERE `key` = 'wss_link';
UPDATE `settings` SET `title_fa` = COALESCE(NULLIF(TRIM(`title_fa`), ''), 'مسیر trigger برادکست')
@@ -634,6 +656,7 @@ UPDATE `settings` SET `type` = 'number' WHERE `key` IN (
'min_withdraw', 'min_first_buy', 'minimum_sell',
'montzar_product_id', 'gift_for_referrer',
'gift_for_referral', 'up_price', 'down_price', 'payping_fin_customer_id', 'tahesab_port',
'wss_http_port', 'wss_socket_port',
'deposit_sms_support_number'
);
@@ -647,8 +670,8 @@ UPDATE `settings` SET `type` = 'text' WHERE `key` IN (
'payping_start_url', 'payping_verify_url', 'payping_gateway_items', 'payping_fin_url',
'payping_fin_token', 'payping_gateway_item', 'tahesab_host', 'tahesab_token', 'tahesab_db',
'node_client_id', 'node_shared_secret',
'wss_path', 'wss_link', 'wss_trigger_path',
'tahesab_bank_account', 'telegram_bot_token', 'bale_bot_token', 'support_messenger_id', 'support_messenger_text', 'invite_link_text', 'referral_limit',
'wss_path', 'wss_trigger_host', 'wss_link', 'wss_trigger_path',
'tahesab_bank_account', 'telegram_bot_token', 'bale_bot_token', 'support_messenger_id', 'referral_limit',
'referral_bonus_amount', 'balance_report_exclude_customer_id', 'metal_type', 'montify_name', 'price_extreme_date',
'default_vc_number', 'liman_token'
);
@@ -827,9 +850,13 @@ WHERE `key` = 'support_messenger_text';
UPDATE `settings` SET
`title_fa` = 'متن دعوتنامه اشتراک‌گذاری',
`type` = 'longtext',
`description` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.'
`description` = @invite_link_desc
WHERE `key` = 'invite_link_text';
UPDATE `settings` SET `value` = @invite_link_default_text
WHERE `key` = 'invite_link_text'
AND (`value` IS NULL OR TRIM(`value`) = '');
UPDATE `settings` SET
`title_fa` = 'پیام‌رسان پشتیبانی',
`type` = 'select',
@@ -873,9 +900,18 @@ WHERE `key` = 'send_to_tahesab' AND TRIM(COALESCE(`value`, '')) = '';
-- is_store فقط از دیتابیس/دیپلوی — در پنل قابل ویرایش نیست
UPDATE `settings` SET `can_edit` = 0 WHERE `key` = 'is_store';
-- metal_type فقط از دیپلوی/SQL (مثلاً «کاتد مس» برای بورس مس)
UPDATE `settings` SET `can_edit` = 0 WHERE `key` = 'metal_type';
-- fee_cash legacy — فقط از دیپلوی/SQL
UPDATE `settings` SET `can_edit` = 0 WHERE `key` = 'fee_cash';
-- WebSocket و پورت — فقط سرور (env / docker / لایت‌اسپید)
UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN (
'wss_enabled', 'wss_path', 'wss_trigger_host', 'wss_http_port', 'wss_socket_port',
'wss_link', 'wss_trigger_path', 'tahesab_port'
);
-- لوگو / PWA / favicon — فقط از دیپلوی؛ در پنل نمایش داده نمی‌شوند
UPDATE `settings` SET `can_edit` = 0, `is_active` = 0
WHERE `key` IN ('logo_login', 'logo_register', 'title_pwa', 'title_fav');
@@ -914,7 +950,7 @@ UPDATE `settings` SET `description` = 'آدرس تصویر لوگو در صفح
UPDATE `settings` SET `description` = 'آدرس تصویر لوگو در صفحه ثبت‌نام. معمولاً از طریق دیپلوی تنظیم می‌شود؛ در پنل قابل ویرایش نیست.' WHERE `key` = 'logo_register';
UPDATE `settings` SET `description` = 'عنوان کوتاه برای نصب PWA روی موبایل. از دیپلوی مدیریت می‌شود.' WHERE `key` = 'title_pwa';
UPDATE `settings` SET `description` = 'عنوان نمایش‌داده‌شده در تب مرورگر (favicon). از دیپلوی مدیریت می‌شود.' WHERE `key` = 'title_fav';
UPDATE `settings` SET `description` = 'عنوان فلز اصلی در رابط کاربر (مثلاً «طلای آبشده»). در دارایی، کیف پول و برچسب‌های معامله دیده می‌شود.' WHERE `key` = 'metal_type';
UPDATE `settings` SET `description` = 'عنوان فلز اصلی در رابط کاربر (مثلاً «طلای آبشده» یا «کاتد مس»). در دارایی، کیف پول و برچسب‌های معامله دیده می‌شود. فقط از دیپلوی/SQL تغییر می‌کند.' WHERE `key` = 'metal_type';
UPDATE `settings` SET `description` = 'واحد نمایش وزن در دارایی‌ها، کیف پول و جزئیات معاملات|گرم,کیلوگرم' WHERE `key` = 'unit';
UPDATE `settings` SET `description` = 'روشن: کاربران جدید می‌توانند ثبت‌نام کنند. خاموش: فقط ورود کاربران موجود مجاز است.' WHERE `key` = 'open_register';
UPDATE `settings` SET `description` = 'روشن: حساب کاربر بلافاصله پس از ثبت‌نام فعال می‌شود. خاموش: نیاز به تأیید دستی ادمین دارد.' WHERE `key` = 'auto_active_customer';
@@ -981,8 +1017,12 @@ UPDATE `settings` SET `description` = 'شناسه کلاینت برای API سف
UPDATE `settings` SET `description` = 'کلید مشترک امضای HMAC برای احراز درخواست‌های API سفارش خارجی. محرمانه نگه دارید.' WHERE `key` = 'node_shared_secret';
UPDATE `settings` SET `description` = 'روشن: API دریافت کیف پول و ثبت سفارش از سرویس فروشگاه خارجی فعال است. نیاز به node_client_id و node_shared_secret دارد.' WHERE `key` = 'external_order_api_enabled';
UPDATE `settings` SET `description` = 'روشن: اپ کاربر به‌جای polling مکرر /api/price/last و /customer/product/list از WebSocket استفاده می‌کند. نیاز به سرویس ws و پروکسی لایت‌اسپید دارد.' WHERE `key` = 'wss_enabled';
UPDATE `settings` SET `description` = 'مسیر WebSocket روی دامنه اپ — معمولاً /prc/ws (پروکسی به پورت داخلی ws).' WHERE `key` = 'wss_path';
UPDATE `settings` SET `description` = 'آدرس HTTP سرویس ws برای trigger برادکست از سرور لاراول — مثال: http://localhost:2090. اولویت با env WSS_LINK/wssLink است.' WHERE `key` = 'wss_link';
UPDATE `settings` SET `description` = 'مسیر WebSocket روی دامنه اپ — معمولاً /prc/ws (پروکسی به wss_socket_port).' WHERE `key` = 'wss_path';
UPDATE `settings` SET `description` = 'هاست داخلی سرویس ws برای trigger لاراول — معمولاً 127.0.0.1.' WHERE `key` = 'wss_trigger_host';
UPDATE `settings` SET `description` = 'پورت HTTP trigger هر پروژه (ماژولار). لاراول: {host}:{port}/prc/api/trigger-update. لایت‌اسپید External App /prc.' WHERE `key` = 'wss_http_port';
UPDATE `settings` SET `description` = 'پورت WebSocket داخلی هر پروژه. لایت‌اسپید /prc/ws و WS_SOCKET_PORT در docker همان پروژه.' WHERE `key` = 'wss_socket_port';
UPDATE `settings` SET `description` = 'منسوخ — فقط اگر wss_http_port خالی باشد. ترجیح: wss_trigger_host + wss_http_port.' WHERE `key` = 'wss_link';
UPDATE `settings` SET `is_active` = 0 WHERE `key` = 'wss_link';
UPDATE `settings` SET `description` = 'مسیر POST برای ارسال رویداد last/list به سرویس ws — پیش‌فرض: /prc/api/trigger-update' WHERE `key` = 'wss_trigger_path';
UPDATE `settings` SET `description` = 'نام فروشگاه که در درگاه پرداخت و رسید بانکی به کاربر نمایش داده می‌شود.' WHERE `key` = 'montify_name';
@@ -1008,7 +1048,7 @@ UPDATE `settings` SET `description` = 'روشن: واریز و برداشت مش
UPDATE `settings` SET `description` = 'نوع پیام‌رسان برای دکمه پشتیبانی در اپ کاربر|bale,telegram,whatsapp,rubika,eitaa,soroush' WHERE `key` = 'support_messenger';
UPDATE `settings` SET `description` = 'شناسه تماس پشتیبانی: یوزرنیم (تلگرام)، شماره (واتساپ/بله) یا آیدی بسته به پیام‌رسان انتخاب‌شده.' WHERE `key` = 'support_messenger_id';
UPDATE `settings` SET `description` = 'متن دکمه یا توضیح کوتاه کنار لینک پشتیبانی در اپ کاربر.' WHERE `key` = 'support_messenger_text';
UPDATE `settings` SET `description` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.' WHERE `key` = 'invite_link_text';
UPDATE `settings` SET `description` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی استفاده می‌کند.' WHERE `key` = 'invite_link_text';
UPDATE `settings` SET `description` = 'شماره موبایل پشتیبانی واریز؛ در صفحه شارژ حساب دکمه پیامک با متن «شماره حساب» نمایش داده می‌شود.' WHERE `key` = 'deposit_sms_support_number';
UPDATE `settings` SET `description` = 'توکن ربات تلگرام برای ارسال اعلان‌ها. از BotFather دریافت می‌شود. محرمانه.' WHERE `key` = 'telegram_bot_token';
@@ -1021,6 +1061,28 @@ UPDATE `settings` SET `description` = 'شناسه‌های عددی محصول (
UPDATE `settings` SET `description` = 'روشن: در حالت فروشگاهی قیمت از API نصیریان خوانده می‌شود (در صورت پیکربندی). فقط برای برخی نصب‌ها.' WHERE `key` = 'price_from_nasiryan';
UPDATE `settings` SET `description` = 'روشن: API محاسبه سود طلا فعال است. در اکثر نصب‌ها خاموش می‌ماند.' WHERE `key` = 'profit_gold_api_enabled';
-- ---------------------------------------------------------------------------
-- ensure — کلیدهای longtext (INSERT نهایی + تثبیت type بعد از batchهای type=text)
-- ---------------------------------------------------------------------------
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'invite_link_text', @invite_link_default_text, 'متن دعوتنامه اشتراک‌گذاری', 1, 1, @invite_link_desc, 'longtext'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'invite_link_text' LIMIT 1);
UPDATE `settings` SET
`title_fa` = 'متن دعوتنامه اشتراک‌گذاری',
`type` = 'longtext',
`can_edit` = 1,
`is_active` = 1,
`description` = @invite_link_desc
WHERE `key` = 'invite_link_text';
UPDATE `settings` SET `value` = @invite_link_default_text
WHERE `key` = 'invite_link_text'
AND (`value` IS NULL OR TRIM(`value`) = '');
UPDATE `settings` SET `type` = 'longtext'
WHERE `key` IN ('text_rule', 'text_about', 'support_messenger_text', 'invite_link_text', 'montzar_order_response');
COMMIT;
SELECT 'deploy_settings_const.sql finished' AS status;
+23 -13
View File
@@ -3,19 +3,21 @@
START TRANSACTION;
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
SET @invite_link_default_text = CONCAT(
'⭐️الان طلا بخر؛ آخر ماه سودشو ببر!', CHAR(10),
'با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!', CHAR(10),
CHAR(10),
'این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید.', CHAR(10),
'روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.', CHAR(10),
CHAR(10),
'٪لینک'
);
SET @invite_link_desc = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی استفاده می‌کند.';
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
SELECT 'invite_link_text',
'⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
٪لینک',
'متن دعوتنامه اشتراک‌گذاری',
1, 1,
'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.',
'longtext'
SELECT 'invite_link_text', @invite_link_default_text, 'متن دعوتنامه اشتراک‌گذاری', 1, 1, @invite_link_desc, 'longtext'
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'invite_link_text' LIMIT 1);
UPDATE `settings` SET
@@ -23,7 +25,15 @@ UPDATE `settings` SET
`type` = 'longtext',
`can_edit` = 1,
`is_active` = 1,
`description` = 'متن پیام اشتراک‌گذاری دعوت در اپ کاربر (دکمه «اشتراک با دوستان» در صفحه اصلی، بخش معرف در پروفایل، صفحه کسب درآمد و مودال اشتراک). متغیرهای جایگزین: ٪نام یا %نام = نام کامل کاربر دعوت‌کننده؛ ٪لینک یا %لینک = آدرس کامل صفحه ثبت‌نام همراه با کد معرف (بر اساس تنظیم app_url یا دامنه فعلی مرورگر). فاصله اختیاری بعد از ٪ یا % مجاز است (مثلاً ٪ نام). اگر این فیلد خالی باشد، اپ از متن پیش‌فرض داخلی بر اساس نوع نصب استفاده می‌کند.'
`description` = @invite_link_desc
WHERE `key` = 'invite_link_text';
UPDATE `settings` SET `value` = @invite_link_default_text
WHERE `key` = 'invite_link_text'
AND (`value` IS NULL OR TRIM(`value`) = '');
COMMIT;
SELECT `key`, `title_fa`, LEFT(`value`, 80) AS value_preview, `type`, `is_active`
FROM `settings`
WHERE `key` = 'invite_link_text';