Hibok
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1344 lines
43 KiB

  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:typed_data';
  4. import 'package:chat/chat/group_chat_view.dart';
  5. import 'package:chat/data/UserData.dart';
  6. import 'package:chat/data/chat_data_mgr.dart';
  7. import 'package:chat/data/constants.dart';
  8. import 'package:chat/data/group_data_mgr.dart';
  9. import 'package:chat/generated/i18n.dart';
  10. import 'package:chat/home/IndexPage.dart';
  11. import 'package:chat/models/ChatMsg.dart';
  12. import 'package:chat/models/group_info_model.dart';
  13. import 'package:chat/proto/all.pbserver.dart';
  14. import 'package:chat/utils/NetUtil.dart';
  15. import 'package:chat/utils/blacklist_mgr.dart';
  16. import 'package:chat/utils/friend_list_mgr.dart';
  17. import 'package:chat/utils/group_member_model.dart';
  18. import 'package:chat/utils/local_notification_util.dart';
  19. import 'package:chat/utils/sound_util.dart';
  20. import 'package:chat/utils/sql_util.dart';
  21. import 'package:chat/utils/upload_util.dart';
  22. import 'package:flutter/material.dart';
  23. import 'package:oktoast/oktoast.dart';
  24. import 'package:fixnum/fixnum.dart';
  25. import 'MessageMgr.dart';
  26. const MaxMsgContentSize = 1024 * 1024 * 3;
  27. class MsgHandler {
  28. //当前会话ID
  29. static int curActiveSession;
  30. static bool isTranslate = false;
  31. static bool isAudioConnect = false;
  32. static BuildContext context = Constants.getCurrentContext();
  33. static List<MsgModel> sendCache = [];
  34. static Timer ringTimer;
  35. static int audioChatRequestFriendId = 0;
  36. static Function createGroupComplete;
  37. static updateActiveSesstion(int session, {bool isGroup = false}) {
  38. curActiveSession = session;
  39. getUnreadMsgDetail(isGroup);
  40. ChatDataMgr().signRead(curActiveSession, isGroup: isGroup);
  41. }
  42. static getActiveSesstion(List<int> memberList) {
  43. var seq = CreateSessionReq();
  44. var member = seq.memberIds;
  45. member.addAll(memberList);
  46. NetWork().sendMsg(ComId.Chat, 101, seq);
  47. }
  48. //根据会话获取会话成员信息
  49. static getSessionInfo(int sessionId) {
  50. var seq = QuerySessionReq();
  51. seq.sessionId = sessionId;
  52. NetWork().sendMsg(ComId.Chat, 102, seq);
  53. }
  54. //创建群
  55. static createGroup(List<int> members, Function complete) {
  56. var seq = CreateChatGroupReq.create();
  57. seq.members.addAll(members);
  58. createGroupComplete = complete;
  59. var curTime = DateTime.now();
  60. print('发送建群消息 $curTime');
  61. NetWork().sendMsg(ComId.Chat, 201, seq);
  62. }
  63. //创建群结果
  64. static handleCreateGroup(List<int> content) async {
  65. var res = CreateChatGroupRes.fromBuffer(content);
  66. if (res.errorCode == 0) {
  67. var curTime = DateTime.now();
  68. print('建群成功 $curTime');
  69. GroupInfoModel infoModel = GroupInfoModel.fromInfo(res.group);
  70. GroupInfoMgr().addGroup(infoModel);
  71. if (createGroupComplete != null) {
  72. createGroupComplete(infoModel);
  73. createGroupComplete = null;
  74. }
  75. MessageMgr().emit('Update Group List');
  76. } else {
  77. print('建群失败');
  78. }
  79. }
  80. static createCoinBagMsg(Map args) {
  81. MsgModel msg;
  82. Int64 time = Int64((DateTime.now()).millisecondsSinceEpoch);
  83. var friendId = args['friendId'];
  84. RedWallet wallet = RedWallet.create();
  85. wallet.amount = args['amount'];
  86. wallet.title = args['title'];
  87. wallet.orderId = args['redNo'];
  88. wallet.tuId = friendId;
  89. wallet.suId = UserData().basicInfo.userId;
  90. wallet.state = RedWalletState.Uncollected;
  91. var myId = UserData().basicInfo.userId;
  92. msg = MsgModel(myId, friendId, ChatType.RedWalletChatType.value,
  93. wallet.writeToBuffer(), time.toInt(), curActiveSession);
  94. return msg;
  95. }
  96. static createSendMsg(ChatType chatType, content,
  97. {int extra,
  98. int friendId,
  99. String localFile,
  100. MsgModel refMsg,
  101. String refShortTxt,
  102. List<int> altUsers,
  103. ChatChannelType channelType = ChatChannelType.Session}) {
  104. MsgModel msg;
  105. if (content is String) {
  106. content = utf8.encode(content);
  107. }
  108. Int64 time = Int64((DateTime.now()).millisecondsSinceEpoch);
  109. var myId = UserData().basicInfo.userId;
  110. if (channelType == ChatChannelType.Group) {
  111. msg = MsgModel(
  112. myId, 0, chatType.value, content, time.toInt(), curActiveSession,
  113. channelType: channelType.value);
  114. } else {
  115. msg = MsgModel(myId, friendId, chatType.value, content, time.toInt(),
  116. curActiveSession,
  117. channelType: channelType.value);
  118. }
  119. if (localFile != null) {
  120. var fileId = curActiveSession.toString() + time.toString();
  121. msg.localFile = localFile;
  122. msg.extraFile = fileId;
  123. }
  124. if (extra != null) {
  125. msg.extraInfo = extra;
  126. }
  127. if (refMsg != null) {
  128. QuoteMsg quoteMsg = QuoteMsg.create();
  129. quoteMsg.sendUserId = refMsg.from;
  130. quoteMsg.sendTime = Int64(refMsg.time);
  131. quoteMsg.targetId = refMsg.sessionId;
  132. quoteMsg.content = refShortTxt;
  133. quoteMsg.channelType = ChatChannelType.valueOf(refMsg.channelType);
  134. msg.refMsgContent = quoteMsg.writeToBuffer();
  135. }
  136. if (altUsers != null && altUsers.length > 0) {
  137. msg.altUsers = altUsers;
  138. }
  139. return msg;
  140. }
  141. static insertMsgToDB(MsgModel msg) {
  142. //缓存消息,发送成功之后清理
  143. if (!sendCache.contains(msg)) {
  144. sendCache.add(msg);
  145. ChatDataMgr().saveMsg(msg);
  146. }
  147. }
  148. //登录成功之后重新发送缓存的消息
  149. static flushCacheMsg() {
  150. for (var i = 0; i < sendCache.length; i++) {
  151. sendChatMsg(sendCache[i]);
  152. }
  153. }
  154. static sendChatMsg(MsgModel msg) {
  155. var seq = ChatSendReq.create();
  156. seq.targetId = msg.sessionId;
  157. seq.sendTime = Int64(msg.time);
  158. seq.cType = ChatType.valueOf(msg.msgType);
  159. seq.channelType = ChatChannelType.valueOf(msg.channelType);
  160. if (msg.extraFile != null) {
  161. seq.enclosureUrl = msg.extraFile;
  162. }
  163. if (msg.extraInfo != null) {
  164. seq.contentSzie = msg.extraInfo;
  165. }
  166. if (msg.refMsgContent != null && msg.refMsgContent.length > 0) {
  167. seq.quoteMsg = msg.refMsgContent;
  168. }
  169. if (msg.altUsers != null && msg.altUsers.length > 0) {
  170. print('设置@信息 ${msg.altUsers.toString()}');
  171. seq.altUserIds.addAll(msg.altUsers);
  172. }
  173. seq.contentBuff = msg.msgContent;
  174. if (msg.msgContent.length > MaxMsgContentSize) {
  175. showToast(I18n.of(context).server_error_tips);
  176. print('消息包大小超过3M');
  177. }
  178. //本地文件为空或者等发送成功之后才可以发送
  179. if (msg.localFile == null || msg.state >= MsgState.Uploaded) {
  180. Future.delayed(Duration(seconds: 60), () {
  181. if (msg.state != MsgState.SendingSuccess) {
  182. msg.state = MsgState.SendingFailed;
  183. ChatDataMgr().updateMsgState(
  184. msg.sessionId, msg.time, msg.channelType, msg.state);
  185. }
  186. });
  187. NetWork().sendMsg(ComId.Chat, 1, seq);
  188. msg.state = MsgState.Sending;
  189. }
  190. }
  191. //获取会话未读消息
  192. static getUnreadMsgDetail(bool isGroup) {
  193. print('获取未读消息 群$isGroup');
  194. // showToast('获取未读消息 群$isGroup');
  195. var seq = RequestTargetUnreadReq.create();
  196. seq.targetId = curActiveSession;
  197. if (curActiveSession == 10000) {
  198. seq.channelType = ChatChannelType.CSD;
  199. } else {
  200. seq.channelType =
  201. isGroup ? ChatChannelType.Group : ChatChannelType.Session;
  202. }
  203. NetWork().sendMsg(ComId.Chat, 5, seq);
  204. }
  205. // static int tempGroupId=0;
  206. // static int receivedCount=0;
  207. static handlerReceiveMsg(PushChat chat) async {
  208. bool isGroup = false;
  209. if (chat.channelType == ChatChannelType.Group) {
  210. print('群聊消息');
  211. isGroup = true;
  212. }
  213. MsgModel msgModel;
  214. if (chat.sendUserId == 1) {
  215. //更新消息
  216. print('服务器更新消息');
  217. MsgModel findMsg;
  218. var msgList;
  219. if (isGroup) {
  220. msgList = ChatDataMgr().getGroupRecord();
  221. } else {
  222. msgList = ChatDataMgr().getRecord();
  223. }
  224. for (var i = 0; i < msgList.length; i++) {
  225. var msg = msgList[i];
  226. if (msg.time == chat.sendTime.toInt()) {
  227. findMsg = msg;
  228. }
  229. }
  230. //更新翻译
  231. if (findMsg != null) {
  232. findMsg.transTag = chat.translateState;
  233. if (chat.translateState == 4) {
  234. print('人工翻译结果更新${chat.targetId},${chat.translateState}');
  235. findMsg.translateContent = chat.humanTranslate;
  236. findMsg.enTranslateContent = chat.googleTranslate ?? Uint8List(0);
  237. ChatDataMgr().updateLastMsgWithTranslateMsg(chat);
  238. SqlUtil().updateUserTranslateContent(chat.targetId,
  239. chat.sendTime.toInt(), chat.humanTranslate, chat.translateState);
  240. } else if (chat.translateState == 3 || chat.translateState == 2) {
  241. print('机器翻译结果更新');
  242. ChatDataMgr().updateLastMsgWithTranslateMsg(chat);
  243. findMsg.translateContent = chat.tencentTranslate;
  244. findMsg.enTranslateContent = chat.googleTranslate;
  245. SqlUtil().updateMachineTranslateContent(
  246. chat.targetId,
  247. chat.sendTime.toInt(),
  248. chat.tencentTranslate,
  249. chat.googleTranslate,
  250. chat.translateState);
  251. }
  252. MessageMgr().emit('Update Translate Message', findMsg);
  253. }
  254. } else {
  255. if (chat.sendUserId == 0) {
  256. print('服务器通知消息 ${chat.sendTime.toInt()}');
  257. if (isGroup) {
  258. if (chat.cType == ChatType.GroupChatNoticeType) {
  259. //检查是否存在群信息
  260. var info = await GroupInfoMgr().getGroupInfo(chat.targetId);
  261. if (info == null) {
  262. print('群不存在');
  263. return;
  264. }
  265. var myId = UserData().basicInfo.userId;
  266. var notice = GroupChatNotice.fromBuffer(chat.contentBuff);
  267. print('群改变消息 changeType ${notice.changeType.toString()}');
  268. bool isShow = true;
  269. switch (notice.changeType) {
  270. case GroupChangeType.AddMember:
  271. GroupInfoMgr().addMembers(chat.targetId, notice.operateduId);
  272. break;
  273. case GroupChangeType.RemoveMember:
  274. var isMeIn = isContainMe(notice.operateduId);
  275. if (!isMeIn) {
  276. //别人,这个自己有群信息
  277. GroupInfoMgr()
  278. .removeMembers(chat.targetId, notice.operateduId);
  279. } else {
  280. //自己
  281. GroupInfoMgr().removeSelf(chat.targetId);
  282. print('已被移出该群,不能发消息了');
  283. }
  284. break;
  285. case GroupChangeType.GroupNameChange:
  286. print('更改群名 ${notice.changeStr}');
  287. GroupInfoMgr().updateGroupName(chat.targetId, notice.changeStr);
  288. break;
  289. case GroupChangeType.GroupNoticeChange:
  290. print('更改群公告 ${notice.changeStr}');
  291. GroupInfoMgr()
  292. .updateGroupDescription(chat.targetId, notice.changeStr);
  293. break;
  294. case GroupChangeType.GroupMemberAliasChange:
  295. isShow = false;
  296. print('修改别名 ${notice.operatuId.id} ${notice.changeStr}');
  297. GroupInfoMgr().updateMemberRefName(
  298. chat.targetId, notice.operatuId.id, notice.changeStr);
  299. //该消息不用显示和保存
  300. break;
  301. case GroupChangeType.MasterTrans:
  302. print(
  303. '转让群主 转让人${notice.operatuId.id},被转让人${notice.operateduId[0].id}');
  304. GroupInfoMgr().updateGroupMaster(chat.targetId,
  305. notice.operatuId.id, notice.operateduId[0].id);
  306. break;
  307. case GroupChangeType.QRCodeAddMemberNotice:
  308. if (notice.operatuId.id != myId) {
  309. //别人在此处理,自己走回应消息
  310. GroupInfoMgr().addMembers(chat.targetId, [notice.operatuId]);
  311. } else {}
  312. break;
  313. case GroupChangeType.GroupIsOpenMemberCheckChange:
  314. print('群主开启了群验证: ${notice.changeBool}');
  315. GroupInfoMgr()
  316. .updateAskSwitch(chat.targetId, notice.changeBool);
  317. break;
  318. case GroupChangeType.GroupMemberCheckAddMemberNotice:
  319. print('群主确认进群: ${notice.operateduId.length}');
  320. GroupInfoMgr().addMembers(chat.targetId, notice.operateduId);
  321. break;
  322. case GroupChangeType.GroupMemberLeave:
  323. print('有人离开群: ${notice.operatuId}');
  324. isShow = false;
  325. GroupInfoMgr().removeMembers(chat.targetId, [notice.operatuId]);
  326. break;
  327. default:
  328. }
  329. //不需要展示给用户看
  330. if (!isShow) {
  331. print('该消息不用展示');
  332. return;
  333. }
  334. msgModel = MsgModel(0, chat.sendUserId, chat.cType.value,
  335. chat.contentBuff, chat.sendTime.toInt(), chat.targetId,
  336. channelType: ChatChannelType.Group.value);
  337. }
  338. } else {//私聊通知消息
  339. if (chat.cType == ChatType.RedWalletChatType) {
  340. //系统红包通知消息
  341. RedWallet wallet = RedWallet.fromBuffer(chat.contentBuff);
  342. var myId = UserData().basicInfo.userId;
  343. var friendId;
  344. if (myId == wallet.suId) {
  345. friendId = wallet.tuId;
  346. } else {
  347. friendId = wallet.suId;
  348. }
  349. int sessionId = chat.targetId;
  350. msgModel = MsgModel(0, friendId, chat.cType.value, chat.contentBuff,
  351. chat.sendTime.toInt(), sessionId,
  352. channelType: ChatChannelType.Group.value);
  353. //更新红包信息
  354. ChatDataMgr()
  355. .updateRedWalletMsg(sessionId, wallet.orderId, wallet.state);
  356. } else {
  357. print('未知私聊通知消息');
  358. }
  359. }
  360. } else { //聊天消息
  361. // receivedCount++;
  362. int sessionId = chat.targetId;
  363. print('sessionId $sessionId');
  364. if (isGroup) {
  365. GroupInfoMgr()
  366. .getGroupInfo(sessionId)
  367. .then((GroupInfoModel groupInfo) {
  368. bool showGroup = false;
  369. if (groupInfo != null) {
  370. showGroup = groupInfo.messageFree == 0;
  371. }
  372. if (showGroup ) {
  373. // tempGroupId = sessionId;
  374. LocalNotificationUtil.instance.show(
  375. I18n.of(context).notice, I18n.of(context).new_chat_msg,
  376. id: sessionId > 1000
  377. ? int.parse(sessionId.toString().substring(0, 3))
  378. : sessionId);
  379. }
  380. });
  381. } else {
  382. LocalNotificationUtil.instance
  383. .show(I18n.of(context).notice, I18n.of(context).new_chat_msg);
  384. }
  385. msgModel = MsgModel(chat.sendUserId, chat.sendUserId, chat.cType.value,
  386. chat.contentBuff, chat.sendTime.toInt(), chat.targetId,
  387. channelType: chat.channelType.value);
  388. // if (chat.cType == ChatType.TextChatType){
  389. // String content =utf8.decode(msgModel.msgContent);
  390. // print('当前收到消息条数$receivedCount $content');
  391. // }
  392. if (chat.hasTencentTranslate()) {
  393. msgModel.translateContent = chat.tencentTranslate;
  394. }
  395. if (chat.hasGoogleTranslate()) {
  396. msgModel.enTranslateContent = chat.googleTranslate;
  397. }
  398. if (chat.hasContentSzie()) {
  399. msgModel.extraInfo = chat.contentSzie;
  400. }
  401. if (chat.targetId != curActiveSession) {
  402. msgModel.readState = 1; //未读标记
  403. }
  404. //视频附件
  405. if (chat.hasEnclosureUrl()) {
  406. msgModel.extraFile = chat.enclosureUrl;
  407. }
  408. if (chat.hasQuoteMsg()) {
  409. print('存在引用消息');
  410. msgModel.refMsgContent = chat.quoteMsg;
  411. }
  412. if (chat.altUserIds.length > 0) {
  413. print('存在@消息');
  414. msgModel.altUsers = chat.altUserIds;
  415. var myId = UserData().basicInfo.userId;
  416. for (var i = 0; i < msgModel.altUsers.length; i++) {
  417. if (msgModel.altUsers[i] == myId) {
  418. print('有人@了你');
  419. //to do
  420. }
  421. }
  422. print(chat.altUserIds.toString());
  423. }
  424. if (chat.cType == ChatType.TextChatType ||
  425. chat.cType == ChatType.ShortVoiceChatType ||
  426. chat.cType == ChatType.RedWalletChatType) {
  427. if (chat.hasTranslateState()) {
  428. //是否有人工翻译
  429. msgModel.transTag = chat.translateState;
  430. print('翻译标记:${chat.translateState}');
  431. }
  432. } else {
  433. msgModel.transTag = 0;
  434. }
  435. }
  436. if (msgModel == null) {
  437. print('消息为空,无法保存');
  438. return;
  439. }
  440. // print('收到消息,准备保存 会话Id:${msgModel.sessionId}');
  441. ChatDataMgr().saveMsg(msgModel);
  442. if (msgModel.msgType == ChatType.ShortVoiceChatType.value) {
  443. //如果是语音消息,自动下载
  444. msgModel.state = MsgState.Downloading;
  445. var filePath = await UploadUtil().downloadFile(msgModel);
  446. if (filePath != null) {
  447. msgModel.localFile = filePath;
  448. SqlUtil().updateLocalFile(msgModel.extraFile, filePath,
  449. isGroup: msgModel.channelType == ChatChannelType.Group.value);
  450. msgModel.state = MsgState.DownloadSuccess;
  451. } else {
  452. print('下载文件失败');
  453. msgModel.state = MsgState.DownloadFailed;
  454. }
  455. }
  456. if (msgModel.sessionId == 10000 ) {
  457. print('收到反馈小助手消息');
  458. }
  459. if (msgModel.sessionId == curActiveSession) {
  460. MessageMgr().emit('New Chat Message', msgModel.sessionId);
  461. }
  462. }
  463. }
  464. static isContainMe(List<BaseUserInfo> members) {
  465. var myId = UserData().basicInfo.userId;
  466. for (var i = 0; i < members.length; i++) {
  467. if (myId == members[i].id) {
  468. print('我在其中');
  469. return true;
  470. }
  471. }
  472. return false;
  473. }
  474. static getGroupNoticeMsg(
  475. GroupChatNotice notice, GroupInfoModel groupInfoModel) {
  476. var showStr = '';
  477. if (groupInfoModel == null) {
  478. print('群不存在');
  479. return '';
  480. }
  481. var myId = UserData().basicInfo.userId;
  482. var optId = notice.operatuId;
  483. List<BaseUserInfo> optedIds = notice.operateduId;
  484. switch (notice.changeType) {
  485. case GroupChangeType.AddMember:
  486. if (optId.id == myId) {
  487. var otherNames = '';
  488. for (var i = 0; i < optedIds.length; i++) {
  489. //获取用户名
  490. var nickName = _getUserName(optedIds[i].id, groupInfoModel.members);
  491. if (otherNames.length == 0) {
  492. otherNames = nickName;
  493. } else {
  494. otherNames = '$otherNames、$nickName';
  495. }
  496. }
  497. showStr = I18n.of(context).you_invite.replaceFirst('/s1', otherNames);
  498. } else {
  499. bool isMySelf = false;
  500. var otherNames = '';
  501. for (var i = 0; i < optedIds.length; i++) {
  502. //获取用户名
  503. isMySelf = myId == optedIds[i].id;
  504. var nickName = _getUserName(optedIds[i].id, groupInfoModel.members);
  505. if (otherNames.length == 0) {
  506. otherNames = nickName;
  507. } else {
  508. otherNames = '$otherNames、$nickName';
  509. }
  510. }
  511. var optName = _getUserName(optId.id, groupInfoModel.members);
  512. if (isMySelf) {
  513. showStr = I18n.of(context).invite_you.replaceFirst('/s1', optName);
  514. } else {
  515. showStr = I18n.of(context)
  516. .invite_someone
  517. .replaceFirst('/s1', optName)
  518. .replaceFirst('/s2', otherNames);
  519. }
  520. }
  521. break;
  522. case GroupChangeType.RemoveMember:
  523. var optName = _getUserName(optId.id, groupInfoModel.members);
  524. if (optId.id == myId) {
  525. optName = I18n.of(context).you;
  526. }
  527. var otherNames = '';
  528. for (var i = 0; i < optedIds.length; i++) {
  529. if (optedIds[i].id == myId) {
  530. otherNames = I18n.of(context).you;
  531. } else {
  532. //获取用户名
  533. var nickName = _getUserName(optedIds[i].id, groupInfoModel.members);
  534. if (otherNames.length == 0) {
  535. otherNames = nickName;
  536. } else {
  537. otherNames = '$otherNames,$nickName';
  538. }
  539. }
  540. }
  541. showStr = I18n.of(context)
  542. .delete_group
  543. .replaceFirst('/s1', optName)
  544. .replaceFirst('/s2', otherNames);
  545. break;
  546. case GroupChangeType.MasterTrans:
  547. var optedName = _getUserName(optedIds.first.id, groupInfoModel.members);
  548. if (optedIds.first.id == myId) {
  549. showStr = I18n.of(context).you_group_owner;
  550. } else {
  551. showStr = I18n.of(context)
  552. .someone_group_owner
  553. .replaceFirst('/s1', optedName);
  554. }
  555. break;
  556. case GroupChangeType.GroupNameChange:
  557. var groupName = notice.changeStr;
  558. var optName = _getUserName(notice.operatuId.id, groupInfoModel.members);
  559. if (notice.operatuId.id == myId) {
  560. showStr = '你 更改群名为 $groupName';
  561. } else {
  562. showStr = '$optName 更改群名为 $groupName';
  563. }
  564. // I18n.of(context).change_group_owner1.replaceFirst('/s1', groupName);
  565. break;
  566. case GroupChangeType.GroupNoticeChange:
  567. print('optId.id ${optId.id}');
  568. showStr = I18n.of(context).update_group_announce;
  569. break;
  570. case GroupChangeType.QRCodeAddMemberNotice:
  571. var optName = _getUserName(optId.id, groupInfoModel.members);
  572. print('optId.id ${optId.id}');
  573. showStr = optId.id == UserData().basicInfo.userId
  574. ? I18n.of(context).you_qr
  575. : I18n.of(context).others_qr.replaceFirst('/s1', optName);
  576. break;
  577. case GroupChangeType.GroupMemberCheckNotice:
  578. var optedName = _getUserName(optId.id, groupInfoModel.members);
  579. print('groupInfoModel.hosterId:${groupInfoModel.hosterId}');
  580. if (myId == groupInfoModel.hosterId) {
  581. showStr = I18n.of(context)
  582. .invite_confirm
  583. .replaceFirst('/s1', optedName)
  584. .replaceFirst('/s2', optedIds.length.toString());
  585. } else {
  586. //获取用户名
  587. var otherNames = '';
  588. for (var i = 0; i < optedIds.length; i++) {
  589. //获取用户名
  590. var nickName = optedIds[i].niceName;
  591. if (otherNames.length == 0) {
  592. otherNames = nickName;
  593. } else {
  594. otherNames = '$otherNames、$nickName';
  595. }
  596. }
  597. showStr = I18n.of(context)
  598. .want_invite_confirm
  599. .replaceFirst('/s1', optedName)
  600. .replaceFirst('/s2', otherNames);
  601. }
  602. break;
  603. case GroupChangeType.GroupMemberCheckAddMemberNotice:
  604. // var optedName = _getUserName(optId.id, groupInfoModel.members);
  605. bool isMy = false;
  606. var otherNames = '';
  607. for (var i = 0; i < optedIds.length; i++) {
  608. if (optedIds[i].id == myId) {
  609. isMy = true;
  610. }
  611. //获取用户名
  612. var nickName = optedIds[i].niceName;
  613. if (otherNames.length == 0) {
  614. otherNames = nickName;
  615. } else {
  616. otherNames = '$otherNames、$nickName';
  617. }
  618. }
  619. if (myId == groupInfoModel.hosterId) {
  620. showStr = I18n.of(context)
  621. .join_group_confirm
  622. .replaceFirst('/s1', otherNames);
  623. } else {
  624. if (isMy) {
  625. showStr = I18n.of(context)
  626. .you_invite_gourp
  627. .replaceFirst('/s1', optId.niceName);
  628. } else {
  629. showStr = I18n.of(context)
  630. .someone_join_group
  631. .replaceFirst('/s1', otherNames);
  632. }
  633. }
  634. break;
  635. case GroupChangeType.GroupIsOpenMemberCheckChange:
  636. showStr = notice.changeBool
  637. ? I18n.of(context).group_setting_tips1
  638. : I18n.of(context).group_setting_tips2;
  639. break;
  640. default:
  641. }
  642. return showStr;
  643. }
  644. static _getUserName(int uId, List<GroupMemberModel> members) {
  645. for (var uItem in members) {
  646. if (uItem.memberId == uId) {
  647. print('用户$uId 的名字 是 ${uItem.refName}');
  648. return uItem.refName;
  649. }
  650. }
  651. return '';
  652. }
  653. static void handlerUnreadMsg(msg) {
  654. var msgContent = PushUserUnreadMsgNotice.fromBuffer(msg);
  655. var noticeList = msgContent.notices;
  656. ChatDataMgr().updateRecordWithUnreadMsg(noticeList);
  657. }
  658. static handlerServerMsg(int comId, int msgId, List<int> content) {
  659. switch (comId) {
  660. case ComId.Chat:
  661. if (msgId == 2) {
  662. //发送消息成功回应
  663. var msgContent = ChatSendRes.fromBuffer(content);
  664. if (msgContent.errorCode == 0 ||
  665. msgContent.errorCode == 17 ||
  666. msgContent.errorCode == 16) {
  667. print('发送聊天消息成功');
  668. ChatDataMgr().updateMsgState(
  669. msgContent.targetId,
  670. msgContent.sendTime.toInt(),
  671. msgContent.channelType.value,
  672. MsgState.SendingSuccess);
  673. //去除缓存
  674. for (var i = 0; i < sendCache.length; i++) {
  675. MsgModel msg = sendCache[i];
  676. if (msgContent.targetId == msg.sessionId &&
  677. msgContent.sendTime.toInt() == msg.time) {
  678. msg.state = MsgState.SendingSuccess;
  679. sendCache.remove(msg);
  680. break;
  681. }
  682. }
  683. } else {
  684. if (msgContent.errorCode == 3001) {
  685. print('用户没有登录,重新登录');
  686. NetWork().reLogin();
  687. } else {
  688. ChatDataMgr().updateMsgState(
  689. msgContent.targetId,
  690. msgContent.sendTime.toInt(),
  691. msgContent.channelType.value,
  692. MsgState.SendingFailed);
  693. for (var i = 0; i < sendCache.length; i++) {
  694. MsgModel msg = sendCache[i];
  695. if (msgContent.targetId == msg.sessionId &&
  696. msgContent.sendTime.toInt() == msg.time) {
  697. msg.state = MsgState.SendingFailed;
  698. break;
  699. }
  700. }
  701. }
  702. }
  703. } else if (msgId == 3) {
  704. var msgContent = PushChat.fromBuffer(content);
  705. // print('收到聊天消息');
  706. ackServerMsg(msgContent.sendTime);
  707. handlerReceiveMsg(msgContent);
  708. } else if (msgId == 4) {
  709. print('处理未读消息汇总');
  710. handlerUnreadMsg(content);
  711. } else if (msgId == 9) {
  712. print('切换人工翻译状态通知');
  713. receiveTranslateState(content);
  714. } else if (msgId == 11) {
  715. //
  716. var msgContent = RequestRealtimeCallRes.fromBuffer(content);
  717. if (msgContent.errorCode == 0) {
  718. print('发送连麦消息成功');
  719. // showToast('发送连麦消息成功');
  720. } else {
  721. print('发送连麦消息失败');
  722. MessageMgr().emit('AudioChat Failed');
  723. }
  724. } else if (msgId == 12) {
  725. var msgContent = PushRealtimeCall.fromBuffer(content);
  726. var friendId = msgContent.sUserId;
  727. print('收到连麦消息 $friendId');
  728. //只能一次接收一个人的连麦
  729. if (!isAudioConnect) {
  730. LocalNotificationUtil.instance
  731. .show(I18n.of(context).notice, I18n.of(context).new_video_msg);
  732. playAudioRing();
  733. MessageMgr().emit('Receive AudioChat Request', friendId);
  734. }
  735. } else if (msgId == 14) {
  736. var msgContent = PushRealtimeCallRespond.fromBuffer(content);
  737. var friendId = msgContent.tUserId;
  738. print('收到连麦消息 $friendId');
  739. bool isAnswer = msgContent.isAnswer;
  740. stopAudioRing();
  741. if (!isAnswer) {
  742. audioChatRequestFriendId = 0;
  743. }
  744. MessageMgr().emit(
  745. 'AudioChat State', {'fdId': friendId, 'isAnswer': isAnswer});
  746. } else if (msgId == 18) {
  747. var res = PushGiftGiving.fromBuffer(content);
  748. print('收到礼物:${res.sendUserId} , ${res.giftId} ,${res.giftAmount}');
  749. MessageMgr().emit("Receive Gift", res);
  750. } else if (msgId == 103) {
  751. print('收到会话成员信息');
  752. } else if (msgId == 202) {
  753. handleCreateGroup(content);
  754. } else if (msgId == 204) {
  755. handlerQuitGroup(content);
  756. } else if (msgId == 206) {
  757. handelerQueryGroupInfoRes(content);
  758. } else if (msgId == 208) {
  759. handlerAddGroupMemberRes(content);
  760. } else if (msgId == 210) {
  761. handlerRemoveGroupMemberRes(content);
  762. } else if (msgId == 212) {
  763. handlerUpdateGroupNoticeRes(content);
  764. } else if (msgId == 214) {
  765. handlerUpdateGroupNameRes(content);
  766. } else if (msgId == 216) {
  767. handlerUpdateMemberRefName(content);
  768. } else if (msgId == 218) {
  769. handlerGetGroupListRes(content);
  770. } else if (msgId == 220) {
  771. handlerSetGroupSwitch(content);
  772. } else if (msgId == 222) {
  773. handlerJoinGroupRes(content);
  774. } else if (msgId == 224) {
  775. handlerUpdateGroupHoster(content);
  776. } else if (msgId == 226) {
  777. handlerAgreeMember(content);
  778. } else if (msgId == 228) {
  779. handlerUpdateMemberMsgFree(content);
  780. }
  781. break;
  782. case ComId.PushMsg:
  783. String msg = PushNetRelay.fromBuffer(content).msg;
  784. print('接受的推送消息:msg $msg');
  785. Map map = json.decode(msg);
  786. String type = map['type'];
  787. switch (type) {
  788. case 'notice':
  789. ///由于极光本地推送点击事件无反应,暂时不走这,由远端推
  790. String messageJson = map['message'];
  791. Map messageMap = json.decode(messageJson);
  792. Map ext = json.decode(messageMap['extparameters']);
  793. print('ext $ext}');
  794. LocalNotificationUtil.instance.showOtherNotification(
  795. ext, messageMap['title'], messageMap['content']);
  796. break;
  797. case 'friends':
  798. FriendListMgr().getFriendListFromServer();
  799. MessageMgr().emit('Add friend');
  800. break;
  801. case 'deletedata':
  802. print('收到清空用户聊天记录通知');
  803. GroupInfoMgr().deleteAllGroup();
  804. ChatDataMgr().deleteAllRecord();
  805. FriendListMgr().deleteAllFriend();
  806. Navigator.of(context).pushAndRemoveUntil(new MaterialPageRoute(
  807. builder: (context) {
  808. return IndexPage();
  809. },
  810. ), (route) => route == null);
  811. NetWork().singOut();
  812. UserData().reset();
  813. break;
  814. case 'blacklist':
  815. String messageJson = map['message'];
  816. Map messageMap = json.decode(messageJson);
  817. if (messageMap['Status'] == 0) {
  818. BlacklistMgr.addBlackListMe(messageMap['UserId']);
  819. } else {
  820. BlacklistMgr.removeBalckListMe(messageMap['UserId']);
  821. }
  822. break;
  823. }
  824. break;
  825. default:
  826. }
  827. }
  828. //设置群验证开关
  829. static setGroupSwitch(int groupId, bool isCheck) {
  830. print('设置群验证开关 $isCheck');
  831. var seq = SettingGroupReq.create();
  832. seq.groupId = groupId;
  833. seq.isOpenMemberCheck = isCheck;
  834. NetWork().sendMsg(ComId.Chat, 219, seq);
  835. }
  836. //设置群验证开关结果
  837. static handlerSetGroupSwitch(List<int> msgContent) {
  838. print('设置群验证开关结果');
  839. var res = SettingGroupRes.fromBuffer(msgContent);
  840. if (res.errorCode == 0) {
  841. print('设置群验证开关结果成功');
  842. } else {
  843. print('设置群验证开关结果失败${res.errorCode}');
  844. }
  845. }
  846. //退出群
  847. static quitGroup(int groupId) {
  848. print('退出群');
  849. var seq = QuitChatGroupReq.create();
  850. seq.groupId = groupId;
  851. NetWork().sendMsg(ComId.Chat, 203, seq);
  852. }
  853. static handlerQuitGroup(List<int> msgContent) {
  854. print('退出群结果');
  855. var res = QuitChatGroupRes.fromBuffer(msgContent);
  856. if (res.errorCode == 0) {
  857. print('退出群结果成功 ${res.groupId}');
  858. } else {
  859. print('退出群结果失败${res.errorCode}');
  860. }
  861. }
  862. //添加群成员
  863. static addGroupMember(int groupId, List<int> uIdList) {
  864. print('##发送207 添加群成员------');
  865. var seq = AddGroupMemberReq.create();
  866. seq.groupId = groupId;
  867. seq.userIds.addAll(uIdList);
  868. NetWork().sendMsg(ComId.Chat, 207, seq);
  869. }
  870. //添加群成员结果
  871. static handlerAddGroupMemberRes(List<int> msgContent) {
  872. var res = AddGroupMemberRes.fromBuffer(msgContent);
  873. print('##发送返回 添加群成员 res.errorCode:${res.errorCode}');
  874. if (res.errorCode == 0) {
  875. MessageMgr().emit('Update Group Info');
  876. print('添加群成员成功');
  877. } else {
  878. switch (res.errorCode) {
  879. case 3007:
  880. showToast(I18n.of(context).members_max);
  881. break;
  882. default:
  883. }
  884. print('添加群成员失败');
  885. }
  886. }
  887. //扫码加入群
  888. static joinGroup(int groupId) {
  889. print('添加群成员');
  890. var seq = GroupQRcodeAddMemberReq.create();
  891. seq.groupId = groupId;
  892. NetWork().sendMsg(ComId.Chat, 221, seq);
  893. }
  894. //扫码加入群结果
  895. static handlerJoinGroupRes(List<int> msgContent) async {
  896. print('扫码加入群结果');
  897. var res = GroupQRcodeAddMemberRes.fromBuffer(msgContent);
  898. if (res.errorCode == 0) {
  899. print('扫码加入群结果成功');
  900. var groupInfoModel = GroupInfoModel.fromInfo(res.group);
  901. GroupInfoMgr().addGroup(groupInfoModel);
  902. Navigator.pushReplacement(context,
  903. MaterialPageRoute<void>(builder: (BuildContext context) {
  904. return GroupChatPage(
  905. key: Key('GroupChat'), groupInfoModel: groupInfoModel);
  906. }));
  907. } else {
  908. switch (res.errorCode) {
  909. case 3007:
  910. showToast(I18n.of(context).members_max);
  911. break;
  912. default:
  913. }
  914. print('扫码加入群结果失败${res.errorCode}');
  915. }
  916. }
  917. //移出群成员
  918. static removeGroupMember(int groupId, List<int> uIdList) {
  919. print('添加群成员');
  920. var seq = RemoveGroupMemberReq.create();
  921. seq.groupId = groupId;
  922. seq.userIds.addAll(uIdList);
  923. NetWork().sendMsg(ComId.Chat, 209, seq);
  924. }
  925. //移出群成员结果
  926. static handlerRemoveGroupMemberRes(List<int> msgContent) {
  927. print('移出群成员结果');
  928. var res = RemoveGroupMemberRes.fromBuffer(msgContent);
  929. if (res.errorCode == 0) {
  930. MessageMgr().emit('Update Group Info');
  931. print('移出群成员结果成功');
  932. } else {
  933. print('移出群成员结果失败${res.errorCode}');
  934. }
  935. }
  936. //修改群公告
  937. static updateGroupNotice(int groupId, String notice) {
  938. print('修改群公告');
  939. var seq = ModifyGroupNoticeReq.create();
  940. seq.groupId = groupId;
  941. seq.notice = notice;
  942. NetWork().sendMsg(ComId.Chat, 211, seq);
  943. }
  944. //修改群公告结果
  945. static handlerUpdateGroupNoticeRes(List<int> msgContent) {
  946. print('修改群公告结果');
  947. var res = ModifyGroupNoticeRes.fromBuffer(msgContent);
  948. if (res.errorCode == 0) {
  949. print('修改群公告结果成功');
  950. } else {
  951. print('修改群公告结果失败${res.errorCode}');
  952. }
  953. }
  954. //修改群名称请求
  955. static updateGroupName(int groupId, String name) {
  956. print('修改群名称请求');
  957. var seq = ModifyGroupNameReq.create();
  958. seq.groupId = groupId;
  959. seq.name = name;
  960. NetWork().sendMsg(ComId.Chat, 213, seq);
  961. }
  962. //修改群名称请求结果
  963. static handlerUpdateGroupNameRes(List<int> msgContent) {
  964. print('修改群名称请求结果');
  965. var res = ModifyGroupNameRes.fromBuffer(msgContent);
  966. if (res.errorCode == 0) {
  967. print('修改群名称请求成功');
  968. } else {
  969. showToast(I18n.of(context).fail);
  970. print('修改群名称请求失败${res.errorCode}');
  971. }
  972. }
  973. //修改群个人别名请求
  974. static updateMemberRefName(int groupId, String refName) {
  975. print('修改群个人别名请求$groupId');
  976. var seq = GroupMemberModifyAliasReq.create();
  977. seq.groupId = groupId;
  978. seq.name = refName;
  979. NetWork().sendMsg(ComId.Chat, 215, seq);
  980. }
  981. //修改群个人别名请求结果
  982. static handlerUpdateMemberRefName(List<int> msgContent) {
  983. print('修改群个人别名请求结果');
  984. var res = GroupMemberModifyAliasRes.fromBuffer(msgContent);
  985. if (res.errorCode == 0) {
  986. print('修改群个人别名请求结果成功');
  987. } else {
  988. print('修改群个人别名请求结果失败${res.errorCode}');
  989. }
  990. }
  991. //群主转让其他人
  992. static updateGroupHoster(int groupId, int uId) {
  993. print('群主转让其他人');
  994. var seq = GroupMasterTransReq.create();
  995. seq.groupId = groupId;
  996. seq.userId = uId;
  997. NetWork().sendMsg(ComId.Chat, 223, seq);
  998. }
  999. //群主转让其他人结果
  1000. static handlerUpdateGroupHoster(List<int> msgContent) {
  1001. print('群主转让其他人结果');
  1002. var res = GroupMasterTransRes.fromBuffer(msgContent);
  1003. if (res.errorCode == 0) {
  1004. MessageMgr().emit('Update Group Info');
  1005. print('群主转让其他人结果成功');
  1006. } else {
  1007. print('群主转让其他人结果失败${res.errorCode}');
  1008. }
  1009. }
  1010. //群主批准其他人加入群
  1011. static agreeMember(int groupId, List<int> uId) {
  1012. print('群主批准其他人加入群 groupId:$groupId uId: $uId}');
  1013. var seq = GroupMasterCheckAddMemberReq.create();
  1014. seq.groupId = groupId;
  1015. seq.userIds.addAll(uId);
  1016. NetWork().sendMsg(ComId.Chat, 225, seq);
  1017. }
  1018. //群主批准其他人加入群结果
  1019. static handlerAgreeMember(List<int> msgContent) {
  1020. print('群主批准其他人加入群结果');
  1021. var res = GroupMasterCheckAddMemberRes.fromBuffer(msgContent);
  1022. if (res.errorCode == 0) {
  1023. print('群主批准其他人加入群结果成功');
  1024. } else {
  1025. switch (res.errorCode) {
  1026. case 3007:
  1027. showToast('群成员已满');
  1028. break;
  1029. default:
  1030. }
  1031. }
  1032. }
  1033. //消息免打扰请求
  1034. static updateMemberMsgFreeReq(int groupId, bool isAvoid) {
  1035. print('消息免打扰请求');
  1036. var seq = SetGroupMasterMessageFreeReq.create();
  1037. seq.groupId = groupId;
  1038. seq.messageFree = isAvoid;
  1039. NetWork().sendMsg(ComId.Chat, 227, seq);
  1040. }
  1041. //消息免打扰请求结果
  1042. static handlerUpdateMemberMsgFree(List<int> msgContent) {
  1043. print('消息免打扰请求结果');
  1044. var res = SetGroupMasterMessageFreeRes.fromBuffer(msgContent);
  1045. if (res.errorCode == 0) {
  1046. GroupInfoMgr().updateMemberMsgFree(res.groupId, res.messageFree);
  1047. print('消息免打扰请求结果成功');
  1048. } else {
  1049. print('消息免打扰请求结果失败${res.errorCode}');
  1050. }
  1051. }
  1052. //请求群列表求结果
  1053. static handlerGetGroupListRes(List<int> msgContent) async {
  1054. var res = QueryUserRelationGroupRes.fromBuffer(msgContent);
  1055. if (res.relationGroup == null) {
  1056. print('服务器也没有群存在');
  1057. return;
  1058. }
  1059. for (var i = 0; i < res.relationGroup.length; i++) {
  1060. var group = GroupInfoModel.fromInfo(res.relationGroup[i]);
  1061. print('群id ${group.sessionId}');
  1062. GroupInfoMgr().addGroup(group);
  1063. }
  1064. MessageMgr().emit('Update Group List');
  1065. }
  1066. //查询聊天群信息
  1067. static queryGroupInfo(int groupId) {
  1068. print('查询聊天群信息');
  1069. var seq = QueryChatGroupReq.create();
  1070. seq.groupId = groupId;
  1071. NetWork().sendMsg(ComId.Chat, 205, seq);
  1072. }
  1073. //查询聊天群信息结果
  1074. static handelerQueryGroupInfoRes(List<int> msgContent) async {
  1075. print('处理查询聊天群信息结果');
  1076. var res = QueryChatGroupRes.fromBuffer(msgContent);
  1077. if (res.errorCode == 0) {
  1078. print('获取群信息成功');
  1079. var groupInfo = GroupInfoModel.fromInfo(res.group);
  1080. print('开始创建群头像');
  1081. GroupInfoMgr().addGroup(groupInfo);
  1082. } else {
  1083. print('获取群信息失败');
  1084. switch (res.errorCode) {
  1085. case 3006:
  1086. showToast(I18n.of(context).group_max);
  1087. break;
  1088. default:
  1089. showToast(I18n.of(context).fail);
  1090. }
  1091. }
  1092. }
  1093. static playAudioRing() {
  1094. ringTimer = Timer.periodic(Duration(milliseconds: 2200), (timer) {
  1095. SoundUtils().play(
  1096. 'http://testcyhd.chengyouhd.com/Upload/Audio/even_wheat_sound.mp3',
  1097. isLocal: false);
  1098. });
  1099. }
  1100. static stopAudioRing() {
  1101. ringTimer?.cancel();
  1102. }
  1103. static ackServerMsg(Int64 msgId) {
  1104. var seq = AnswerPushChat.create();
  1105. seq.msgId = msgId;
  1106. NetWork().sendMsg(ComId.Chat, 100, seq);
  1107. }
  1108. static swtichTranslateState(TranslateState transState) {
  1109. print('请求切换人工翻译状态');
  1110. var seq = RequestSetHTranslReq.create();
  1111. seq.sessionId = curActiveSession;
  1112. seq.hTransl = transState;
  1113. NetWork().sendMsg(ComId.Chat, 7, seq);
  1114. }
  1115. static void receiveTranslateState(msg) {
  1116. var res = PushHTranslState.fromBuffer(msg);
  1117. if (res.sessionId == curActiveSession) {
  1118. MessageMgr().emit("Update Translate State", res);
  1119. }
  1120. }
  1121. static void sendAudioChatReq(int friendId) {
  1122. var seq = RequestRealtimeCallReq.create();
  1123. seq.tUserId = friendId;
  1124. seq.cType = ChatType.RealtimeCallVoiceType;
  1125. NetWork().sendMsg(ComId.Chat, 10, seq);
  1126. }
  1127. static void sendReplyAudioChatReq(int friendId, bool isReply) {
  1128. var seq = RespondRealtimeCallReq.create();
  1129. seq.sUserId = friendId;
  1130. seq.isAnswer = isReply;
  1131. NetWork().sendMsg(ComId.Chat, 13, seq);
  1132. }
  1133. //打赏礼物
  1134. static sendGiftTo(int friendId, int giftId, int giftAmount, int total) {
  1135. var seq = RequestGiftGivingReq.create();
  1136. seq.targetUserId = friendId;
  1137. seq.giftId = giftId;
  1138. seq.giftAmount = giftAmount;
  1139. seq.money = total;
  1140. NetWork().sendMsg(ComId.Chat, 17, seq);
  1141. }
  1142. static clear() {
  1143. curActiveSession = 0;
  1144. isTranslate = false;
  1145. isAudioConnect = false;
  1146. sendCache.clear();
  1147. }
  1148. }