| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- 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<ChatMessage>? _chatMessages;
- List<ChatMessage> get chatMessages => _chatMessages ?? [];
- bool _disposed = false;
- Future<void>? _listener;
- @override
- void dispose() {
- _disposed = true;
- _listener?.then((e) => super.dispose()) ?? super.dispose();
- }
- Future<void> _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<void> flushChatMessages() async {
- final _user = LoginPresenter().user;
- if (_user != null) {
- List<String>? _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<ChatMessage?> 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<List<ChatMessage>> retrieveAllChatMessages() async {
- final list = <ChatMessage>[];
- final _user = LoginPresenter().user;
- final _to = to;
- if (_user != null && _to != null) {
- List<String>? _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<bool> 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;
- }
- }
|