user_chat.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:dash_chat/dash_chat.dart';
  4. import 'package:e2ee_chat/common/api.dart';
  5. import 'package:e2ee_chat/common/global.dart';
  6. import 'package:e2ee_chat/model/friendship.dart';
  7. import 'package:e2ee_chat/model/message.dart';
  8. import 'package:e2ee_chat/model/user.dart';
  9. import 'package:e2ee_chat/objectbox.g.dart';
  10. import 'package:e2ee_chat/presenter/login.dart';
  11. import 'package:flutter/material.dart';
  12. import 'package:objectbox/objectbox.dart';
  13. import 'package:rxdart/rxdart.dart';
  14. import 'chat_list.dart';
  15. class UserChatPresenter extends ChatListPresenter {
  16. UserChatPresenter({this.to}) {
  17. _listener = _listenUserChat();
  18. }
  19. User? get from => LoginPresenter().user;
  20. User? to;
  21. FriendShip get friendShip => FriendShip()
  22. ..user0.target = from
  23. ..user1.target = to;
  24. ToMany<Message> get messages => friendShip.messages;
  25. List<ChatMessage>? _chatMessages;
  26. List<ChatMessage> get chatMessages => _chatMessages ?? [];
  27. bool _disposed = false;
  28. Future<void>? _listener;
  29. @override
  30. void dispose() {
  31. _disposed = true;
  32. _listener?.then((e) => super.dispose()) ?? super.dispose();
  33. }
  34. Future<void> _listenUserChat() async {
  35. while (!_disposed) {
  36. if (to != null) {
  37. if (_chatMessages == null) {
  38. debug("init chatMessages");
  39. _chatMessages = await retrieveAllChatMessages();
  40. notifyListeners();
  41. } else {
  42. await flushChatMessages();
  43. }
  44. }
  45. await Future.delayed(Duration(seconds: 1));
  46. }
  47. }
  48. Future<void> flushChatMessages() async {
  49. final _user = LoginPresenter().user;
  50. if (_user != null) {
  51. List<String>? _list = await Api().getLastMessages(_user.username);
  52. if (_list != null) {
  53. debug("flush chat message");
  54. for (final i in _list) {
  55. chatMessages.add(chatMessageFromMessagePackage(i));
  56. }
  57. notifyListeners();
  58. }
  59. }
  60. // messages.forEach((message) => list.add(message.chatMessage));
  61. }
  62. ChatMessage chatMessageFromMessagePackage(String encText) {
  63. // Map<String, dynamic> json0 = jsonDecode(s);
  64. // String plaintext = json0["plaintext"];
  65. ChatMessage? _message;
  66. try {
  67. _message = ChatMessage.fromJson(jsonDecode(encText));
  68. } catch (e) {
  69. try {
  70. } catch (e) {
  71. }
  72. }
  73. debug('plaintext: $encText');
  74. return ChatMessage.fromJson(jsonDecode(plaintext));
  75. }
  76. Future<List<ChatMessage>> retrieveAllChatMessages() async {
  77. final list = <ChatMessage>[];
  78. final _user = LoginPresenter().user;
  79. final _to = to;
  80. if (_user != null && _to != null) {
  81. List<String>? _list = await Api().getFilterMessages(_to.username);
  82. if (_list != null) {
  83. for (final i in _list) {
  84. list.add(chatMessageFromMessagePackage(i));
  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. try {
  97. final plaintext = json.encode(chatMessage);
  98. var message = Message();
  99. message.from.target = from!;
  100. message.to.target = to!;
  101. message.plaintext = plaintext;
  102. _result = await Api().sendMessage(to!.username, json.encode(chatMessage));
  103. } catch (e) {
  104. debug(e);
  105. _result = false;
  106. }
  107. if (!_result) {
  108. debug('user chat presenter send msg failed');
  109. }
  110. return _result;
  111. }
  112. /// 消息体
  113. Message? get lastMessage {
  114. Message? message;
  115. try {
  116. message = messages.last;
  117. } catch (e) {
  118. debug("no message");
  119. }
  120. return message;
  121. }
  122. /// 未读数量
  123. int get unReadCount {
  124. // TODO: 未读消息数量
  125. return 0;
  126. }
  127. get chatName => to?.username;
  128. /// 单聊
  129. get isSingle => true;
  130. /// 群聊信息
  131. get isGroup => false;
  132. /// 消息免打扰
  133. get isDND => to?.isDND;
  134. /// 是否为置顶
  135. get isStick => to?.isStick;
  136. /// 特别关注
  137. get isSpecialAttention => to?.isSpecialAttention;
  138. // TODO: 是否 @ 你
  139. get isAtYou => false;
  140. // TODO: 是否 @ 全部
  141. get isAtAll => false;
  142. // TODO: user avatar
  143. get avatar => Global.defaultAvatar;
  144. }