diff --git a/lib/api_service.dart b/lib/api_service.dart index 5a797da..fb249cf 100644 --- a/lib/api_service.dart +++ b/lib/api_service.dart @@ -979,6 +979,10 @@ class ApiService { chatResponse['payload']?['chats'] ?? []; if (chatListJson.isEmpty) { + if (config != null) { + _processServerPrivacyConfig(config); + } + final result = { 'chats': [], 'contacts': [], @@ -1013,6 +1017,10 @@ class ApiService { updatePresenceData(presence); } + if (config != null) { + _processServerPrivacyConfig(config); + } + final result = { 'chats': chatListJson, 'contacts': contactListJson, @@ -2564,27 +2572,28 @@ class ApiService { _lastChatsAt = null; print( - "✅ Кэш чатов очищен: _lastChatsPayload = $_lastChatsPayload, _chatsFetchedInThisSession = $_chatsFetchedInThisSession", + " Кэш чатов очищен: _lastChatsPayload = $_lastChatsPayload, _chatsFetchedInThisSession = $_chatsFetchedInThisSession", ); _connectionStatusController.add("disconnected"); await connect(); - print("✅ Полное переподключение завершено"); + print(" Полное переподключение завершено"); await Future.delayed(const Duration(milliseconds: 1500)); if (!_reconnectionCompleteController.isClosed) { - print("📢 Отправляем уведомление о завершении переподключения"); + print(" Отправляем уведомление о завершении переподключения"); _reconnectionCompleteController.add(null); } } catch (e) { - print("❌ Ошибка полного переподключения: $e"); + print("Ошибка полного переподключения: $e"); rethrow; } } + // ЫЫЫ ХУЯРЮ ВПЕРОД В БОГАЖНЕКЕ ГРАНАТАМЁТ Future updatePrivacySettings({ String? hidden, String? searchByPhone, @@ -2595,6 +2604,7 @@ class ApiService { String? pushSound, bool? mCallPushNotification, bool? pushDetails, + bool? contentLevelAccess, }) async { final settings = { if (hidden != null) 'user': {'HIDDEN': hidden == 'true'}, @@ -2610,19 +2620,30 @@ class ApiService { if (pushDetails != null) 'user': {'PUSH_DETAILS': pushDetails}, }; - print('Обновляем настройки приватности: $settings'); + print(''); // КАК ЖЕ ПОХУЙ if (hidden != null) { await _updateSinglePrivacySetting({'HIDDEN': hidden == 'true'}); } if (searchByPhone != null) { - await _updateSinglePrivacySetting({'SEARCH_BY_PHONE': searchByPhone}); + final seq = searchByPhone == 'ALL' ? 37 : 46; + await _updatePrivacySettingWithSeq({ + 'SEARCH_BY_PHONE': searchByPhone, + }, seq); } if (incomingCall != null) { - await _updateSinglePrivacySetting({'INCOMING_CALL': incomingCall}); + final seq = incomingCall == 'ALL' ? 30 : 23; + await _updatePrivacySettingWithSeq({'INCOMING_CALL': incomingCall}, seq); } if (chatsInvite != null) { - await _updateSinglePrivacySetting({'CHATS_INVITE': chatsInvite}); + final seq = chatsInvite == 'ALL' ? 51 : 55; + await _updatePrivacySettingWithSeq({'CHATS_INVITE': chatsInvite}, seq); + } + if (contentLevelAccess != null) { + final seq = contentLevelAccess ? 70 : 62; + await _updatePrivacySettingWithSeq({ + 'CONTENT_LEVEL_ACCESS': contentLevelAccess, + }, seq); } if (chatsPushNotification != null) { @@ -2647,10 +2668,77 @@ class ApiService { Future _updateSinglePrivacySetting(Map setting) async { await waitUntilOnline(); - final payload = {'settings': setting}; + final payload = { + 'settings': {'user': setting}, + }; _sendMessage(22, payload); - print('Отправляем обновление настройки приватности: $payload'); + print(''); //песюны + } + + Future _updatePrivacySettingWithSeq( + Map setting, + int seq, + ) async { + await waitUntilOnline(); + + final message = { + "ver": 11, + "cmd": 0, + "seq": seq, + "opcode": 22, + "payload": { + "settings": {"user": setting}, + }, + }; + + final encodedMessage = jsonEncode(message); + _channel?.sink.add(encodedMessage); + _log('SEND: $encodedMessage'); + print( + '', //вроде надо а вроде бля как же похуй + ); + } + + void _processServerPrivacyConfig(Map? config) { + if (config == null) return; + + final userConfig = config['user'] as Map?; + if (userConfig == null) return; + + print('Обработка настроек приватности с сервера: $userConfig'); + + // Сохраняем настройки в SharedPreferences + final prefs = SharedPreferences.getInstance(); + prefs.then((prefs) { + if (userConfig.containsKey('SEARCH_BY_PHONE')) { + prefs.setString( + 'privacy_search_by_phone', + userConfig['SEARCH_BY_PHONE'], + ); + } + if (userConfig.containsKey('INCOMING_CALL')) { + prefs.setString('privacy_incoming_call', userConfig['INCOMING_CALL']); + } + if (userConfig.containsKey('CHATS_INVITE')) { + prefs.setString('privacy_chats_invite', userConfig['CHATS_INVITE']); + } + if (userConfig.containsKey('CONTENT_LEVEL_ACCESS')) { + prefs.setBool( + 'privacy_content_level_access', + userConfig['CONTENT_LEVEL_ACCESS'], + ); + } + if (userConfig.containsKey('HIDDEN')) { + prefs.setBool('privacy_hidden', userConfig['HIDDEN']); + } + }); + + // Отправляем событие об обновлении настроек + _messageController.add({ + 'type': 'privacy_settings_updated', + 'settings': {'user': userConfig}, + }); } void dispose() { diff --git a/lib/full_screen_video_player.dart b/lib/full_screen_video_player.dart index b5ab958..e984f79 100644 --- a/lib/full_screen_video_player.dart +++ b/lib/full_screen_video_player.dart @@ -29,7 +29,6 @@ class _FullScreenVideoPlayerState extends State { _videoPlayerController = VideoPlayerController.networkUrl( Uri.parse(widget.videoUrl), httpHeaders: const { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', }, @@ -49,7 +48,6 @@ class _FullScreenVideoPlayerState extends State { backgroundColor: Colors.grey, bufferedColor: Colors.white, ), - ); if (mounted) { diff --git a/lib/screens/settings/privacy_settings_screen.dart b/lib/screens/settings/privacy_settings_screen.dart index ccd52b8..2aca4c1 100644 --- a/lib/screens/settings/privacy_settings_screen.dart +++ b/lib/screens/settings/privacy_settings_screen.dart @@ -1,5 +1,3 @@ - - import 'package:flutter/material.dart'; import 'package:gwid/api_service.dart'; import 'package:gwid/theme_provider.dart'; @@ -15,12 +13,12 @@ class PrivacySettingsScreen extends StatefulWidget { } class _PrivacySettingsScreenState extends State { - bool _isHidden = false; bool _isLoading = false; - String _searchByPhone = 'ALL'; // 'ALL', 'CONTACTS', 'NOBODY' - String _incomingCall = 'ALL'; // 'ALL', 'CONTACTS', 'NOBODY' - String _chatsInvite = 'ALL'; // 'ALL', 'CONTACTS', 'NOBODY' + String _searchByPhone = 'ALL'; + String _incomingCall = 'ALL'; + String _chatsInvite = 'ALL'; + bool _contentLevelAccess = false; @override void initState() { @@ -42,6 +40,8 @@ class _PrivacySettingsScreenState extends State { _searchByPhone = prefs.getString('privacy_search_by_phone') ?? 'ALL'; _incomingCall = prefs.getString('privacy_incoming_call') ?? 'ALL'; _chatsInvite = prefs.getString('privacy_chats_invite') ?? 'ALL'; + _contentLevelAccess = + prefs.getBool('privacy_content_level_access') ?? false; }); } catch (e) { print('Ошибка загрузки настроек приватности: $e'); @@ -61,8 +61,6 @@ class _PrivacySettingsScreenState extends State { } } - - Future _updateHiddenStatus(bool hidden) async { setState(() => _isLoading = true); try { @@ -92,12 +90,14 @@ class _PrivacySettingsScreenState extends State { String? searchByPhone, String? incomingCall, String? chatsInvite, + bool? contentLevelAccess, }) async { try { await ApiService.instance.updatePrivacySettings( searchByPhone: searchByPhone, incomingCall: incomingCall, chatsInvite: chatsInvite, + contentLevelAccess: contentLevelAccess, ); if (searchByPhone != null) { @@ -112,6 +112,13 @@ class _PrivacySettingsScreenState extends State { await _savePrivacySetting('privacy_chats_invite', chatsInvite); if (mounted) setState(() => _chatsInvite = chatsInvite); } + if (contentLevelAccess != null) { + await _savePrivacySetting( + 'privacy_content_level_access', + contentLevelAccess, + ); + if (mounted) setState(() => _contentLevelAccess = contentLevelAccess); + } if (mounted) { ScaffoldMessenger.of(context).showSnackBar( @@ -137,8 +144,6 @@ class _PrivacySettingsScreenState extends State { } } - - void _showOptionDialog( String title, String currentValue, @@ -162,7 +167,6 @@ class _PrivacySettingsScreenState extends State { currentValue, onSelect, ), - _buildDialogOption('Никто', 'NOBODY', currentValue, onSelect), ], ); }, @@ -188,8 +192,6 @@ class _PrivacySettingsScreenState extends State { ); } - - String _getPrivacyDescription(String value) { switch (value) { case 'ALL': @@ -313,6 +315,34 @@ class _PrivacySettingsScreenState extends State { const SizedBox(height: 16), + _OutlinedSection( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildSectionTitle("Уровень контента", colors), + SwitchListTile( + contentPadding: EdgeInsets.zero, + secondary: Icon( + _contentLevelAccess + ? Icons.shield_outlined + : Icons.visibility_outlined, + ), + title: const Text("Безопасный режим"), + subtitle: Text( + _contentLevelAccess + ? "Показывать только безопасный контент" + : "Показывать весь доступный контент", + ), + value: _contentLevelAccess, + onChanged: (value) => + _updatePrivacyOption(contentLevelAccess: value), + ), + ], + ), + ), + + const SizedBox(height: 16), + _OutlinedSection( child: Column( crossAxisAlignment: CrossAxisAlignment.start,