Hibok
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

427 Zeilen
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. getGroupName(int groupId) {
  157. for (var i = 0; i < groupInfoList.length; i++) {
  158. var info = groupInfoList[i];
  159. if (info.sessionId == groupId) {
  160. if (info.name != null && info.name != '') {
  161. return info.name;
  162. } else {
  163. var members = info.getMembersInGroup();
  164. String res = '';
  165. int nums = members.length > 4 ? 4 : members.length;
  166. for (int i = 0; i < nums; i++) {
  167. if (i != 0) {
  168. res += '、';
  169. }
  170. String name = members[i].refName;
  171. res += name.length > 8 ? name.substring(0, 8) + '..' : name;
  172. }
  173. return res;
  174. }
  175. }
  176. }
  177. return '';
  178. }
  179. //获取群信息
  180. Future<GroupInfoModel> getGroupInfo(int sessionId,
  181. {bool isSave = true}) async {
  182. if (groupInfoList.length == 0) {
  183. print('当前没有群');
  184. } else {
  185. for (var i = 0; i < groupInfoList.length; i++) {
  186. if (groupInfoList[i].sessionId == sessionId) {
  187. return groupInfoList[i];
  188. }
  189. }
  190. }
  191. var info = await UploadUtil().getGroupInfo(sessionId);
  192. if (info != null) {
  193. if (isSave) {
  194. addGroup(info);
  195. }
  196. return info;
  197. }
  198. print('群不存在 $sessionId');
  199. return null;
  200. }
  201. bool isGroupInList(int groupId) {
  202. for (var i = 0; i < groupInfoList.length; i++) {
  203. if (groupInfoList[i].sessionId == groupId) {
  204. return true;
  205. }
  206. }
  207. return false;
  208. }
  209. //保存群
  210. void addGroup(GroupInfoModel groupInfoModel) async {
  211. if (isGroupInList(groupInfoModel.sessionId)) {
  212. print('群已添加,勿重复添加');
  213. } else {
  214. bool isValid = false;
  215. for (GroupMemberModel member in groupInfoModel.members) {
  216. if (member.inGroup != 0) {
  217. isValid = true;
  218. }
  219. }
  220. if (isValid) {
  221. groupInfoList.add(groupInfoModel);
  222. var lastMsg = ChatDataMgr().getLastMsg(groupInfoModel.sessionId, true);
  223. groupInfoModel.updateLastMsg(lastMsg);
  224. bool isExist = await SqlUtil.groupInfoTableModel
  225. .isExistGroup(groupInfoModel.sessionId);
  226. if (!isExist) {
  227. SqlUtil.groupInfoTableModel.addGroup(groupInfoModel);
  228. SqlUtil.groupMemberTableModel.addMembers(groupInfoModel);
  229. print('创群成功!!! 成员数:${groupInfoModel.members.length}');
  230. }
  231. }
  232. }
  233. }
  234. //删除群
  235. void deleteGroup(int groupId) async {
  236. print('退出群聊 $groupId');
  237. var groupInfoModel = await getGroupInfo(groupId);
  238. //清空聊天数据
  239. ChatDataMgr().deleteMsg(groupId, true);
  240. if (groupInfoModel != null) {
  241. groupInfoList.remove(groupInfoModel);
  242. SqlUtil.groupInfoTableModel.deleteGroup(groupId);
  243. SqlUtil.groupMemberTableModel.deleteMembers(groupId);
  244. MessageMgr().emit('Update Group List');
  245. }
  246. }
  247. deleteAllGroup() async {
  248. print('清空所有群');
  249. SqlUtil.groupInfoTableModel.clearSelfData();
  250. SqlUtil.groupMemberTableModel.clearSelfData();
  251. SqlUtil.groupChatTableModel.clearSelfData();
  252. groupInfoList.clear();
  253. }
  254. //添加群成员
  255. void addMembers(int groupId, List<BaseUserInfo> members) async {
  256. print('添加群成员 ${members.length}个');
  257. var groupInfo = await getGroupInfo(groupId);
  258. if (groupInfo == null) {
  259. print('群不存在');
  260. return;
  261. }
  262. cleanAvatar(groupInfo);
  263. for (var i = 0; i < members.length; i++) {
  264. var member = GroupMemberModel.fromBaseInfo(members[i]);
  265. print('添加群成员 ${member.nickName}');
  266. groupInfo.addMember(member);
  267. }
  268. MessageMgr().emit('Update Group Info');
  269. }
  270. //自己被移出群
  271. void removeSelf(int groupId) async {
  272. var groupInfo = await getGroupInfo(groupId);
  273. if (groupInfo == null) {
  274. print('群不存在');
  275. return;
  276. }
  277. var myId = UserData().basicInfo.userId;
  278. groupInfo.removeMember(myId);
  279. groupInfo.isInGroup = false;
  280. MessageMgr().emit('Update Group Info');
  281. }
  282. //移出群成员
  283. void removeMembers(int groupId, List<BaseUserInfo> members) async {
  284. print('移出群成员 ${members.length}个');
  285. var groupInfo = await getGroupInfo(groupId);
  286. if (groupInfo == null) {
  287. print('群不存在');
  288. return;
  289. }
  290. cleanAvatar(groupInfo);
  291. for (var i = 0; i < members.length; i++) {
  292. groupInfo.removeMember(members[i].id);
  293. print('移出群成员 ${members[i].niceName}');
  294. }
  295. MessageMgr().emit('Update Group Info');
  296. }
  297. //修改群名称
  298. void updateGroupName(int groupId, name) async {
  299. print('修改群名称');
  300. var groupInfo = await getGroupInfo(groupId);
  301. if (groupInfo != null) {
  302. groupInfo.updateGroupName(name);
  303. }
  304. MessageMgr().emit('Update Group Info');
  305. }
  306. //修改群公告
  307. void updateGroupDescription(int groupId, String notice) async {
  308. var groupInfo = await getGroupInfo(groupId);
  309. if (groupInfo != null) {
  310. groupInfo.updateGroupNotice(notice);
  311. }
  312. MessageMgr().emit('Update Group Info');
  313. }
  314. //修改群成员别名
  315. void updateMemberRefName(int groupId, int uId, String refName) async {
  316. var groupInfo = await getGroupInfo(groupId);
  317. if (groupInfo != null) {
  318. groupInfo.updateMemberRefName(uId, refName);
  319. }
  320. MessageMgr().emit('Update Group Info');
  321. }
  322. //修改群校验开关
  323. void updateAskSwitch(int groupId, bool isOpen) async {
  324. var groupInfo = await getGroupInfo(groupId);
  325. if (groupInfo != null) {
  326. groupInfo.updateAskSwitch(isOpen);
  327. }
  328. }
  329. //修改成员免打扰设置
  330. void updateMemberMsgFree(int groupId, bool isOpen) async {
  331. var groupInfo = await getGroupInfo(groupId);
  332. if (groupInfo != null) {
  333. groupInfo.updateMemberMsgFree(isOpen ? 1 : 0);
  334. }
  335. }
  336. //修改群主
  337. void updateGroupMaster(int groupId, int oldId, int uId) async {
  338. var groupInfo = await getGroupInfo(groupId);
  339. if (groupInfo != null) {
  340. groupInfo.updateGroupHoster(oldId, uId);
  341. }
  342. }
  343. //更新头像
  344. void updateAvatar(int groupId, String path) async {
  345. var groupInfo = await getGroupInfo(groupId);
  346. if (groupInfo != null) {
  347. groupInfo.updateAvatar(path);
  348. }
  349. }
  350. void cleanAvatar(GroupInfoModel groupInfo) {
  351. if (groupInfo != null) {
  352. print('@@清除群头像');
  353. groupInfo.cleanAvatar();
  354. }
  355. }
  356. clear() {
  357. groupInfoList.clear();
  358. isInit = false;
  359. }
  360. }