import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:dash_chat/dash_chat.dart'; import 'package:e2ee_chat/common/api.dart'; import 'package:e2ee_chat/common/cipher.dart'; import 'package:e2ee_chat/common/global.dart'; import 'package:e2ee_chat/model/message.dart'; import 'package:e2ee_chat/model/user.dart'; import 'package:e2ee_chat/presenter/login.dart'; import 'chat_list.dart'; class UserChatPresenter extends ChatListPresenter { UserChatPresenter({this.to}) { _listener = _listenUserChat(); } User? get from => LoginPresenter().user; User? to; List? _chatMessages; List get chatMessages => _chatMessages ?? []; bool _disposed = false; Future? _listener; @override void dispose() { _disposed = true; _listener?.then((e) => super.dispose()) ?? super.dispose(); } Future _listenUserChat() async { while (!_disposed) { if (to != null) { if (_chatMessages == null) { debug("init chatMessages"); _chatMessages = await retrieveAllChatMessages(); notifyListeners(); } else { await flushChatMessages(); } } await Future.delayed(Duration(seconds: 1)); } } Future flushChatMessages() async { final _user = LoginPresenter().user; if (_user != null) { List? _list = await Api().getLastMessages(_user.username); if (_list != null) { debug("flush chat message"); for (final i in _list) { final _chatMessage = await chatMessageFromMessage(i); if (_chatMessage != null) { chatMessages.add(_chatMessage); } } notifyListeners(); } } // messages.forEach((message) => list.add(message.chatMessage)); } Future chatMessageFromMessage(String json) async { String? username = from?.username; ChatMessage? _chatMessage; try { _chatMessage = ChatMessage.fromJson(jsonDecode(json)); } catch (e) { try { final _message = Message.fromJson(jsonDecode(json)); _chatMessage = await _message.chatMessage; } catch (e) { debug('chatMessageFromMessagePackage error: e'); } } return _chatMessage; } Future> retrieveAllChatMessages() async { final list = []; final _user = LoginPresenter().user; final _to = to; if (_user != null && _to != null) { List? _list = await Api().getFilterMessages(_to.username); if (_list != null) { for (final i in _list) { final _chatMessage = await chatMessageFromMessage(i); if (_chatMessage != null) { list.add(_chatMessage); } } } } return list; // messages.forEach((message) => list.add(message.chatMessage)); } Future sendMessage(ChatMessage chatMessage) async { debug('user chat presenter send msg begin'); bool _result = true; chatMessages.add(chatMessage); notifyListeners(); final _from = from; final _to = to; if (_from != null && _to != null && _from == LoginPresenter().user) { try { String chatMessageJson = jsonEncode(chatMessage.toJson()); debug('user chat presenter send msg: chatMessageJson: $chatMessageJson'); String? publicKeyJson = (await Api().getPublicKey(_to.username))?.first; debug('user chat presenter send msg: publicKeyJson: $publicKeyJson'); if (publicKeyJson != null) { final publicKey = RSAPublicKeyStore.fromJson(jsonDecode(publicKeyJson)); final message = await Message.encrypt(_from.username, _to.username, chatMessageJson, publicKey); final messageJson = jsonEncode(message.toJson()); debug('user chat presenter send msg: messageJson $messageJson '); _result = await Api().sendMessage(_to.username, messageJson); } else { debug('user chat presenter send msg: get public key failed.'); _result = false; } } catch (e) { debug(e); _result = false; } } if (!_result) { debug('user chat presenter send msg failed'); } return _result; } }