From b02152248c57901f495e1ce48f8f033d042262b0 Mon Sep 17 00:00:00 2001 From: klockky Date: Sun, 7 Jun 2026 19:32:53 +0000 Subject: [PATCH] =?UTF-8?q?fix(webapp):=20=D0=B4=D0=B8=D0=BD=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9=20appid=20=D0=A1?= =?UTF-8?q?=D1=84=D0=B5=D1=80=D1=83=D0=BC=D0=B0=20=D0=B8=D0=B7=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=B8?= =?UTF-8?q?=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/backend/modules/account.dart | 26 ++++++++++++++++++++++++++ lib/backend/modules/webapp.dart | 30 ++++++++++++++++++++---------- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/lib/backend/modules/account.dart b/lib/backend/modules/account.dart index 88cde47..a4d0991 100644 --- a/lib/backend/modules/account.dart +++ b/lib/backend/modules/account.dart @@ -12,6 +12,7 @@ import 'chats.dart'; import 'contacts.dart'; import 'folders.dart'; import 'messages.dart'; +import 'webapp.dart'; String _normalizeAuthPhone(String phone) { final digits = phone.replaceAll(RegExp(r'\D'), ''); @@ -1281,6 +1282,9 @@ class AccountModule { final config = data['config'] as Map?; final serverConfig = config?['server'] as Map?; final userConfig = config?['user'] as Map?; + if (serverConfig != null) { + await _persistEntryBannerApps(accountId, serverConfig); + } final yMap = serverConfig?['y-map'] as Map?; final whiteListLinks = serverConfig?['white-list-links'] as List?; final fileUploadUnsupported = serverConfig?['file-upload-unsupported-types'] as List?; @@ -1305,6 +1309,28 @@ class AccountModule { await AppDatabase.saveLoginInfo(accountId, jsonEncode(info)); } + Future _persistEntryBannerApps(int accountId, Map serverConfig) async { + final banners = serverConfig['settings-entry-banners']; + if (banners is! List) return; + for (final banner in banners) { + final items = (banner is Map) ? banner['items'] : null; + if (items is! List) continue; + for (final item in items) { + if (item is! Map) continue; + final appId = item['appid']; + final icon = item['icon']?.toString().toLowerCase() ?? ''; + if (appId is int && icon.contains('sferum')) { + await AppDatabase.setSyncValue( + accountId, + EntryBannerApps.sferumKey, + appId.toString(), + ); + return; + } + } + } + } + Map _extractChatMarker(List chats) { int? latestTime; for (final chat in chats) { diff --git a/lib/backend/modules/webapp.dart b/lib/backend/modules/webapp.dart index db5d0c9..f7b0563 100644 --- a/lib/backend/modules/webapp.dart +++ b/lib/backend/modules/webapp.dart @@ -1,5 +1,11 @@ import '../api.dart'; import '../../core/protocol/opcode_map.dart'; +import '../../core/storage/app_database.dart'; +import '../../core/storage/token_storage.dart'; + +abstract class EntryBannerApps { + static const String sferumKey = 'entry_banner_app_sferum'; +} class WebAppLaunch { final String url; @@ -8,8 +14,6 @@ class WebAppLaunch { } class WebAppModule { - static const int sferumBotId = 2340319; - final Api _api; WebAppModule(this._api); @@ -18,7 +22,6 @@ class WebAppModule { if (_api.state != SessionState.online) { throw const WebAppUnavailable('Нет соединения с сервером'); } - await _resolveBot(botId); final packet = await _api.sendRequest(Opcode.webAppInitData, { 'botId': botId, }); @@ -33,14 +36,21 @@ class WebAppModule { return WebAppLaunch(url: url); } - Future fetchSferum() => fetchLaunch(sferumBotId); + Future fetchSferum() async { + final botId = await _resolveEntryApp(EntryBannerApps.sferumKey); + if (botId == null) { + throw const WebAppUnavailable( + 'Сферум сейчас недоступен. Переподключитесь и попробуйте снова.', + ); + } + return fetchLaunch(botId); + } - Future _resolveBot(int botId) async { - try { - await _api.sendRequest(Opcode.contactInfo, { - 'contactIds': [botId], - }); - } catch (_) {} + Future _resolveEntryApp(String key) async { + final accountId = await TokenStorage.getActiveAccountId(); + if (accountId == null) return null; + final raw = await AppDatabase.getSyncValue(accountId, key); + return int.tryParse(raw ?? ''); } }