user_chat.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:io';
  4. import 'package:dash_chat/dash_chat.dart';
  5. import 'package:e2ee_chat/common/api.dart';
  6. import 'package:e2ee_chat/common/cipher.dart';
  7. import 'package:e2ee_chat/common/global.dart';
  8. import 'package:e2ee_chat/model/message.dart';
  9. import 'package:e2ee_chat/model/user.dart';
  10. import 'package:e2ee_chat/presenter/login.dart';
  11. import 'chat_list.dart';
  12. class UserChatPresenter extends ChatListPresenter {
  13. UserChatPresenter({this.to}) {
  14. _listener = _listenUserChat();
  15. }
  16. User? get from => LoginPresenter().user;
  17. User? to;
  18. List<ChatMessage>? _chatMessages;
  19. List<ChatMessage> get chatMessages => _chatMessages ?? [];
  20. bool _disposed = false;
  21. Future<void>? _listener;
  22. @override
  23. void dispose() {
  24. _disposed = true;
  25. _listener?.then((e) => super.dispose()) ?? super.dispose();
  26. }
  27. Future<void> _listenUserChat() async {
  28. while (!_disposed) {
  29. if (to != null) {
  30. if (_chatMessages == null) {
  31. debug("init chatMessages");
  32. _chatMessages = await retrieveAllChatMessages();
  33. notifyListeners();
  34. } else {
  35. await flushChatMessages();
  36. }
  37. }
  38. await Future.delayed(Duration(seconds: 1));
  39. }
  40. }
  41. Future<void> flushChatMessages() async {
  42. final _user = LoginPresenter().user;
  43. if (_user != null) {
  44. List<String>? _list = await Api().getLastMessages(_user.username);
  45. if (_list != null) {
  46. debug("flush chat message");
  47. for (final i in _list) {
  48. final _chatMessage = await chatMessageFromMessage(i);
  49. if (_chatMessage != null) {
  50. chatMessages.add(_chatMessage);
  51. }
  52. }
  53. notifyListeners();
  54. }
  55. }
  56. // messages.forEach((message) => list.add(message.chatMessage));
  57. }
  58. Future<ChatMessage?> chatMessageFromMessage(String json) async {
  59. String? username = from?.username;
  60. ChatMessage? _chatMessage;
  61. try {
  62. _chatMessage = ChatMessage.fromJson(jsonDecode(json));
  63. } catch (e) {
  64. try {
  65. final _message = Message.fromJson(jsonDecode(json));
  66. _chatMessage = await _message.chatMessage;
  67. } catch (e) {
  68. debug('chatMessageFromMessagePackage error: e');
  69. }
  70. }
  71. return _chatMessage;
  72. }
  73. Future<List<ChatMessage>> retrieveAllChatMessages() async {
  74. final list = <ChatMessage>[];
  75. final _user = LoginPresenter().user;
  76. final _to = to;
  77. if (_user != null && _to != null) {
  78. List<String>? _list = await Api().getFilterMessages(_to.username);
  79. if (_list != null) {
  80. for (final i in _list) {
  81. final _chatMessage = await chatMessageFromMessage(i);
  82. if (_chatMessage != null) {
  83. list.add(_chatMessage);
  84. }
  85. }
  86. }
  87. }
  88. return list;
  89. // messages.forEach((message) => list.add(message.chatMessage));
  90. }
  91. Future<bool> sendMessage(ChatMessage chatMessage) async {
  92. debug('user chat presenter send msg begin');
  93. bool _result = true;
  94. chatMessages.add(chatMessage);
  95. notifyListeners();
  96. final _from = from;
  97. final _to = to;
  98. if (_from != null && _to != null && _from == LoginPresenter().user) {
  99. try {
  100. String chatMessageJson = jsonEncode(chatMessage.toJson());
  101. debug('user chat presenter send msg: chatMessageJson: $chatMessageJson');
  102. String? publicKeyJson = (await Api().getPublicKey(_to.username))?.first;
  103. debug('user chat presenter send msg: publicKeyJson: $publicKeyJson');
  104. if (publicKeyJson != null)
  105. {
  106. final publicKey = RSAPublicKeyStore.fromJson(jsonDecode(publicKeyJson));
  107. final message = await Message.encrypt(_from.username, _to.username, chatMessageJson, publicKey);
  108. final messageJson = jsonEncode(message.toJson());
  109. debug('user chat presenter send msg: messageJson $messageJson ');
  110. _result = await Api().sendMessage(_to.username, messageJson);
  111. } else {
  112. debug('user chat presenter send msg: get public key failed.');
  113. _result = false;
  114. }
  115. } catch (e) {
  116. debug(e);
  117. _result = false;
  118. }
  119. }
  120. if (!_result) {
  121. debug('user chat presenter send msg failed');
  122. }
  123. return _result;
  124. }
  125. }