Hibok
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

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