Hibok
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

1672 řádky
57 KiB

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