Hibok
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

401 行
11 KiB

  1. import 'dart:convert';
  2. import 'package:chat/data/UserData.dart';
  3. import 'package:chat/data/chat_data_mgr.dart';
  4. import 'package:chat/models/group_info_model.dart';
  5. import 'package:chat/proto/chat.pbserver.dart';
  6. import 'package:chat/utils/MessageMgr.dart';
  7. import 'package:chat/utils/group_member_model.dart';
  8. import 'package:chat/utils/sql_util.dart';
  9. import 'package:chat/utils/upload_util.dart';
  10. import 'package:crclib/crclib.dart';
  11. class GroupInfoMgr {
  12. static GroupInfoMgr _instance;
  13. factory GroupInfoMgr() => _getInstance();
  14. GroupInfoMgr._();
  15. static GroupInfoMgr _getInstance() {
  16. if (_instance == null) {
  17. _instance = GroupInfoMgr._();
  18. }
  19. return _instance;
  20. }
  21. List<GroupInfoModel> groupInfoList = [];
  22. bool isLoading = false;
  23. bool isInit = false;
  24. initLocalGroupList() async {
  25. if (isInit == true) {
  26. return;
  27. }
  28. isInit = true;
  29. var res = await SqlUtil.getAllGroupInfo();
  30. for (var i = 0; i < res.length; i++) {
  31. if (isGroupInList(res[i].sessionId)) {
  32. print('群已添加,勿重复添加');
  33. } else {
  34. groupInfoList.add(res[i]);
  35. }
  36. }
  37. sortGroupList();
  38. }
  39. int getGroupCheckStr(int groupId) {
  40. for (var group in groupInfoList) {
  41. if (group.sessionId == groupId) {
  42. group.members.sort((a, b) => a.memberId.compareTo(b.memberId));
  43. var checkStr = '';
  44. for (var member in group.members) {
  45. if (member.inGroup > 0) {
  46. checkStr =
  47. '$checkStr${member.memberId}${member.refName}${member.identity}';
  48. }
  49. }
  50. checkStr = '${group.sessionId}${group.name}${group.describe}$checkStr';
  51. return Crc32Zlib().convert(utf8.encode(checkStr));
  52. }
  53. }
  54. return -1;
  55. }
  56. checkGroupValid() async {
  57. if (groupInfoList.length > 0) {
  58. //获取群校验信息
  59. var groupCheckMap = await UploadUtil().getGroupCheckInfo();
  60. //获取无效群
  61. List<int> invalidGroupList = [];
  62. groupCheckMap.forEach((key, serverCode) {
  63. int groupId = int.parse(key);
  64. int checkStr = getGroupCheckStr(groupId);
  65. if (checkStr != serverCode) {
  66. print('群校验没有通过 $groupId :$checkStr : $serverCode');
  67. invalidGroupList.add(groupId);
  68. clearGroupCache(groupId);
  69. }
  70. });
  71. if (invalidGroupList.length > 0) {
  72. List<GroupInfoModel> res =
  73. await UploadUtil().getMoreGroupInfo(invalidGroupList);
  74. if (res == null || res.length == 0) {
  75. return;
  76. }
  77. for (var i = 0; i < res.length; i++) {
  78. GroupInfoMgr().addGroup(res[i]);
  79. }
  80. MessageMgr().emit('Update Group List');
  81. }
  82. } else {
  83. int localGroupCount = await SqlUtil.getGroupCount();
  84. if (localGroupCount == 0) {
  85. print('本地数据没有群数据,从服务器拉取群数据');
  86. var infoList = await UploadUtil().getGroupList();
  87. if (infoList == null || infoList.length == 0) {
  88. return;
  89. }
  90. for (var i = 0; i < infoList.length; i++) {
  91. GroupInfoMgr().addGroup(infoList[i]);
  92. }
  93. MessageMgr().emit('Update Group List');
  94. }
  95. }
  96. }
  97. clearGroupCache(int groupId) async {
  98. for (var i = 0; i < groupInfoList.length; i++) {
  99. if (groupInfoList[i].sessionId == groupId) {
  100. groupInfoList.removeAt(i);
  101. }
  102. }
  103. SqlUtil.groupInfoTableModel.deleteGroup(groupId);
  104. SqlUtil.groupMemberTableModel.deleteMembers(groupId);
  105. }
  106. sortGroupList() {
  107. print('排序开始');
  108. for (var item in groupInfoList) {
  109. print(item.name);
  110. }
  111. groupInfoList.sort((GroupInfoModel a, GroupInfoModel b) {
  112. if (a.topTag > b.topTag) {
  113. return -1;
  114. } else if (a.topTag < b.topTag) {
  115. return 1;
  116. } else {
  117. if (a.lastMsg != null && b.lastMsg != null) {
  118. if (a.lastMsg.updateAt > b.lastMsg.updateAt) {
  119. return -1;
  120. } else if (a.lastMsg.updateAt < b.lastMsg.updateAt) {
  121. return 1;
  122. } else {
  123. return 0;
  124. }
  125. } else if (a.lastMsg == null) {
  126. return 1;
  127. } else if (b.lastMsg == null) {
  128. return -1;
  129. } else {
  130. return 0;
  131. }
  132. }
  133. });
  134. }
  135. //获取群中的好友名称
  136. String getGroupFdName(int sessionId, int fdId) {
  137. GroupInfoModel group;
  138. for (var i = 0; i < groupInfoList.length; i++) {
  139. if (groupInfoList[i].sessionId == sessionId) {
  140. group = groupInfoList[i];
  141. }
  142. }
  143. if (group == null) {
  144. print('getGroupFdName 没有找到该群');
  145. } else {
  146. for (var member in group.members) {
  147. if (member.memberId == fdId) {
  148. return member.refName;
  149. }
  150. }
  151. }
  152. print('没有找到群好友的名字');
  153. return '';
  154. }
  155. //获取群信息
  156. Future<GroupInfoModel> getGroupInfo(int sessionId,
  157. {bool isSave = true}) async {
  158. if (groupInfoList.length == 0) {
  159. print('当前没有群');
  160. } else {
  161. for (var i = 0; i < groupInfoList.length; i++) {
  162. if (groupInfoList[i].sessionId == sessionId) {
  163. return groupInfoList[i];
  164. }
  165. }
  166. }
  167. var info = await UploadUtil().getGroupInfo(sessionId);
  168. if (info != null) {
  169. if (isSave) {
  170. addGroup(info);
  171. }
  172. return info;
  173. }
  174. print('群不存在 $sessionId');
  175. return null;
  176. }
  177. bool isGroupInList(int groupId) {
  178. for (var i = 0; i < groupInfoList.length; i++) {
  179. if (groupInfoList[i].sessionId == groupId) {
  180. return true;
  181. }
  182. }
  183. return false;
  184. }
  185. //保存群
  186. void addGroup(GroupInfoModel groupInfoModel) async {
  187. if (isGroupInList(groupInfoModel.sessionId)) {
  188. print('群已添加,勿重复添加');
  189. } else {
  190. bool isValid = false;
  191. for (GroupMemberModel member in groupInfoModel.members) {
  192. if (member.inGroup != 0) {
  193. isValid = true;
  194. }
  195. }
  196. if (isValid) {
  197. groupInfoList.add(groupInfoModel);
  198. var lastMsg = ChatDataMgr().getLastMsg(groupInfoModel.sessionId, true);
  199. groupInfoModel.updateLastMsg(lastMsg);
  200. bool isExist = await SqlUtil.groupInfoTableModel
  201. .isExistGroup(groupInfoModel.sessionId);
  202. if (!isExist) {
  203. SqlUtil.groupInfoTableModel.addGroup(groupInfoModel);
  204. SqlUtil.groupMemberTableModel.addMembers(groupInfoModel);
  205. print('创群成功!!! 成员数:${groupInfoModel.members.length}');
  206. }
  207. }
  208. }
  209. }
  210. //删除群
  211. void deleteGroup(int groupId) async {
  212. print('退出群聊 $groupId');
  213. var groupInfoModel = await getGroupInfo(groupId);
  214. //清空聊天数据
  215. ChatDataMgr().deleteMsg(groupId, true);
  216. if (groupInfoModel != null) {
  217. groupInfoList.remove(groupInfoModel);
  218. SqlUtil.groupInfoTableModel.deleteGroup(groupId);
  219. SqlUtil.groupMemberTableModel.deleteMembers(groupId);
  220. MessageMgr().emit('Update Group List');
  221. }
  222. }
  223. deleteAllGroup() async {
  224. print('清空所有群');
  225. SqlUtil.groupInfoTableModel.clearSelfData();
  226. SqlUtil.groupMemberTableModel.clearSelfData();
  227. SqlUtil.groupChatTableModel.clearSelfData();
  228. groupInfoList.clear();
  229. }
  230. //添加群成员
  231. void addMembers(int groupId, List<BaseUserInfo> members) async {
  232. print('添加群成员 ${members.length}个');
  233. var groupInfo = await getGroupInfo(groupId);
  234. if (groupInfo == null) {
  235. print('群不存在');
  236. return;
  237. }
  238. cleanAvatar(groupInfo);
  239. for (var i = 0; i < members.length; i++) {
  240. var member = GroupMemberModel.fromBaseInfo(members[i]);
  241. print('添加群成员 ${member.nickName}');
  242. groupInfo.addMember(member);
  243. }
  244. MessageMgr().emit('Update Group Info');
  245. }
  246. //自己被移出群
  247. void removeSelf(int groupId) async {
  248. var groupInfo = await getGroupInfo(groupId);
  249. if (groupInfo == null) {
  250. print('群不存在');
  251. return;
  252. }
  253. var myId = UserData().basicInfo.userId;
  254. groupInfo.removeMember(myId);
  255. groupInfo.isInGroup = false;
  256. MessageMgr().emit('Update Group Info');
  257. }
  258. //移出群成员
  259. void removeMembers(int groupId, List<BaseUserInfo> members) async {
  260. print('移出群成员 ${members.length}个');
  261. var groupInfo = await getGroupInfo(groupId);
  262. if (groupInfo == null) {
  263. print('群不存在');
  264. return;
  265. }
  266. cleanAvatar(groupInfo);
  267. for (var i = 0; i < members.length; i++) {
  268. groupInfo.removeMember(members[i].id);
  269. print('移出群成员 ${members[i].niceName}');
  270. }
  271. MessageMgr().emit('Update Group Info');
  272. }
  273. //修改群名称
  274. void updateGroupName(int groupId, name) async {
  275. print('修改群名称');
  276. var groupInfo = await getGroupInfo(groupId);
  277. if (groupInfo != null) {
  278. groupInfo.updateGroupName(name);
  279. }
  280. MessageMgr().emit('Update Group Info');
  281. }
  282. //修改群公告
  283. void updateGroupDescription(int groupId, String notice) async {
  284. var groupInfo = await getGroupInfo(groupId);
  285. if (groupInfo != null) {
  286. groupInfo.updateGroupNotice(notice);
  287. }
  288. MessageMgr().emit('Update Group Info');
  289. }
  290. //修改群成员别名
  291. void updateMemberRefName(int groupId, int uId, String refName) async {
  292. var groupInfo = await getGroupInfo(groupId);
  293. if (groupInfo != null) {
  294. groupInfo.updateMemberRefName(uId, refName);
  295. }
  296. MessageMgr().emit('Update Group Info');
  297. }
  298. //修改群校验开关
  299. void updateAskSwitch(int groupId, bool isOpen) async {
  300. var groupInfo = await getGroupInfo(groupId);
  301. if (groupInfo != null) {
  302. groupInfo.updateAskSwitch(isOpen);
  303. }
  304. }
  305. //修改成员免打扰设置
  306. void updateMemberMsgFree(int groupId, bool isOpen) async {
  307. var groupInfo = await getGroupInfo(groupId);
  308. if (groupInfo != null) {
  309. groupInfo.updateMemberMsgFree(isOpen ? 1 : 0);
  310. }
  311. }
  312. //修改群主
  313. void updateGroupMaster(int groupId, int oldId, int uId) async {
  314. var groupInfo = await getGroupInfo(groupId);
  315. if (groupInfo != null) {
  316. groupInfo.updateGroupHoster(oldId, uId);
  317. }
  318. }
  319. //更新头像
  320. void updateAvatar(int groupId, String path) async {
  321. var groupInfo = await getGroupInfo(groupId);
  322. if (groupInfo != null) {
  323. groupInfo.updateAvatar(path);
  324. }
  325. }
  326. void cleanAvatar(GroupInfoModel groupInfo) {
  327. if (groupInfo != null) {
  328. print('@@清除群头像');
  329. groupInfo.cleanAvatar();
  330. }
  331. }
  332. clear() {
  333. groupInfoList.clear();
  334. isInit = false;
  335. }
  336. }