Hibok
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

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