Hibok
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

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