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.
 
 
 
 
 
 

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