Hibok
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

397 line
12 KiB

  1. import 'package:chat/data/UserData.dart';
  2. import 'package:chat/models/ChatMsg.dart';
  3. import 'package:chat/models/group_info_server_model.dart';
  4. import 'package:chat/models/last_message_model.dart';
  5. import 'package:chat/proto/all.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. class GroupInfoModel {
  10. int sessionId; //群ID
  11. List<GroupMemberModel> members; //群成员
  12. int hosterId; // 群主id
  13. int topTag; //是否置顶
  14. String describe; //群公告
  15. int decribeTime; //群公告时间
  16. String name; //群名称
  17. LastMessageModel lastMsg;
  18. String image; //群图片
  19. String myName; //我在群中的别名
  20. int isSave; //是否保存到通讯录
  21. int askSwitch; //是否开启验证
  22. int messageFree; //群信息提醒
  23. int isShowName; //在聊天消息中是否显示名称
  24. bool isInGroup; //自己是否还在该群中
  25. GroupInfoModel(this.sessionId,
  26. {this.hosterId,
  27. this.topTag = 0,
  28. this.describe = '',
  29. this.decribeTime = 0,
  30. this.name = '',
  31. this.image = '',
  32. this.myName = '',
  33. this.askSwitch = 0,
  34. this.messageFree = 0,
  35. this.isShowName = 1,
  36. this.isSave = 0,
  37. this.isInGroup = true})
  38. : this.members = [];
  39. GroupInfoModel.fromJson(Map<String, dynamic> jsonStr) {
  40. print('群信息 $jsonStr');
  41. this.sessionId = jsonStr['sessionId'];
  42. this.hosterId = jsonStr['hosterId'];
  43. this.topTag = jsonStr['topTag'] ?? 0;
  44. this.describe = jsonStr['describe'];
  45. this.decribeTime = jsonStr['decribeTime'];
  46. this.name = jsonStr['name'];
  47. this.image = jsonStr['image'];
  48. this.myName = jsonStr['my_name'];
  49. this.askSwitch = jsonStr['ask_switch'] ?? 0;
  50. this.isSave = jsonStr['is_save'] ?? 0;
  51. this.messageFree = jsonStr['messageFree'] ?? 0;
  52. this.isShowName = jsonStr['show_name'] ?? 1;
  53. this.isInGroup = true;
  54. }
  55. GroupInfoModel.fromInfo(GroupInfo groupInfo) {
  56. this.sessionId = groupInfo.id;
  57. var myId = UserData().basicInfo.userId;
  58. if (members == null) {
  59. members = [];
  60. }
  61. for (var i = 0; i < groupInfo.members.length; i++) {
  62. var member = groupInfo.members[i];
  63. GroupMemberModel model = GroupMemberModel.fromPb(member);
  64. members.add(model);
  65. if (model.identity == GroupMemberIdentity.identityMaster.value) {
  66. hosterId = model.memberId;
  67. }
  68. if (member.info.id == myId) {
  69. myName = member.name;
  70. messageFree = member.messageFree ? 1 : 0;
  71. }
  72. }
  73. describe = groupInfo.notice;
  74. askSwitch = groupInfo.isOpenMemberCheck ? 1 : 0;
  75. isShowName = members.length > 20 ? 1 : 0;//群人数大于20个自动打开
  76. topTag = 0;
  77. isSave = 0;
  78. this.isInGroup = true;
  79. this.name = groupInfo.groupName;
  80. }
  81. GroupInfoModel.fromServerGroupInfo(GroupInfoServerModel groupInfo) {
  82. this.sessionId = groupInfo.id;
  83. var myId = UserData().basicInfo.userId;
  84. if (members == null) {
  85. members = [];
  86. }
  87. for (var i = 0; i < groupInfo.members.length; i++) {
  88. var member = groupInfo.members[i];
  89. GroupMemberModel model = GroupMemberModel.fromServerMember(member);
  90. members.add(model);
  91. if (model.identity == GroupMemberIdentity.identityMaster.value) {
  92. hosterId = model.memberId;
  93. }
  94. if (member.info.id == myId) {
  95. myName = member.name;
  96. messageFree = member.messageFree ? 1 : 0;
  97. }
  98. }
  99. describe = groupInfo.notice;
  100. askSwitch = groupInfo.isOpenMemberCheck ? 1 : 0;
  101. isShowName = members.length > 20 ? 1 : 0;//群人数大于20个自动打开
  102. isSave = 0;
  103. topTag = 0;
  104. this.isInGroup = true;
  105. this.name = groupInfo.groupName;
  106. }
  107. updateWithInfo(GroupInfoModel groupInfo) {
  108. members = groupInfo.members;
  109. describe = groupInfo.describe;
  110. name = groupInfo.name;
  111. askSwitch = groupInfo.askSwitch;
  112. messageFree = groupInfo.messageFree;
  113. myName = groupInfo.myName;
  114. hosterId = groupInfo.hosterId;
  115. image = groupInfo.image;
  116. isShowName = groupInfo.isShowName;
  117. isSave = groupInfo.isSave;
  118. }
  119. //是否可以修改群名称
  120. canAlterGroupName() {
  121. //70人以上的群只有群主或者管理员才能修改群名
  122. if (members.length >= 70) {
  123. int myId = UserData().basicInfo.userId;
  124. var myInfo = getMember(myId);
  125. if (myInfo != null &&
  126. (myInfo.identity == GroupMemberIdentity.identityMaster.value ||
  127. myInfo.identity == GroupMemberIdentity.identityManager.value)) {
  128. return true;
  129. } else {
  130. return false;
  131. }
  132. } else {
  133. //普通群都可以修改群名
  134. return true;
  135. }
  136. }
  137. //更新最新的消息
  138. updateLastMsg(MsgModel msgModel) {
  139. if (msgModel == null) {
  140. print('消息未空,无法初始化最新消息');
  141. return;
  142. }
  143. if (lastMsg != null) {
  144. //更新
  145. lastMsg.updateWithMessage(msgModel);
  146. } else {
  147. lastMsg = LastMessageModel.fromChatMsg(msgModel);
  148. }
  149. MessageMgr().emit('Update Group List');
  150. print('msgModel.sessionId ${msgModel.sessionId}');
  151. MessageMgr().emit('Update LastMsg', msgModel.sessionId);
  152. }
  153. //更新最新的消息
  154. updateLastMsgWithUnread(UserUnreadMsgNotice unread) {
  155. if (lastMsg == null) {
  156. lastMsg = LastMessageModel.fromUnreadMsg(unread);
  157. } else {
  158. lastMsg.updateWithUnreadMsg(unread);
  159. }
  160. MessageMgr().emit('Update Group List');
  161. MessageMgr().emit('Update LastMsg', unread.targetId);
  162. }
  163. updateLastMsgWithTransMsg(PushChat chat) {
  164. //更新
  165. if (chat.cType == ChatType.TextChatType) {
  166. print('更新最新数据的翻译结果');
  167. if (lastMsg != null && chat.hasTencentTranslate()) {
  168. lastMsg.msgContent = chat.tencentTranslate;
  169. }
  170. MessageMgr().emit('Update Group List');
  171. MessageMgr().emit('Update LastMsg', chat.targetId);
  172. }
  173. }
  174. //获取还在群中的成员
  175. List<GroupMemberModel> getMembersInGroup() {
  176. List<GroupMemberModel> inMembers = [];
  177. for (var i = 0; i < members.length; i++) {
  178. if (members[i].inGroup == 1) {
  179. inMembers.add(members[i]);
  180. }
  181. }
  182. return inMembers;
  183. }
  184. getHoster() {
  185. for (var i = 0; i < members.length; i++) {
  186. if (members[i].identity == GroupMemberIdentity.identityMaster.value) {
  187. return members[i];
  188. }
  189. }
  190. return null;
  191. }
  192. getGroupName(Map refMap) {
  193. if (name != null && name != '') {
  194. return name;
  195. } else {
  196. var members = getMembersInGroup();
  197. String res = '';
  198. int nums = members.length > 4 ? 4 : members.length;
  199. for (int i = 0; i < nums; i++) {
  200. if (i != 0) {
  201. res += '、';
  202. }
  203. if (refMap[members[i].memberId] != null) {
  204. String name = (refMap[members[i].memberId] as String);
  205. res += name.length>8?name.substring(0,8)+'..':name;
  206. } else {
  207. String name = members[i].refName;
  208. res += name.length>8?name.substring(0,8)+'..':name;
  209. }
  210. }
  211. return res;
  212. }
  213. }
  214. //置顶
  215. updateTopTag(bool isTop) {
  216. topTag = isTop ? 1 : 0;
  217. SqlUtil.groupInfoTableModel.updateTopTag(sessionId, topTag);
  218. }
  219. //修改群校验开关
  220. updateAskSwitch(bool isOpen) {
  221. askSwitch = isOpen ? 1 : 0;
  222. SqlUtil.groupInfoTableModel.updateAskSwitch(sessionId, askSwitch);
  223. }
  224. //修改是否在聊天中展示用户名称
  225. updateShowNameSwitch(bool isShow) {
  226. isShowName = isShow ? 1 : 0;
  227. SqlUtil.groupInfoTableModel.updateShowNameSwitch(sessionId, isShowName);
  228. }
  229. //添加群成员
  230. addMember(GroupMemberModel member) {
  231. var oldMember = getMember(member.memberId);
  232. //如果该群中已有数据,更新状态
  233. if (oldMember != null) {
  234. if (oldMember.inGroup == 0) {
  235. oldMember.inGroup = 1;
  236. SqlUtil.groupMemberTableModel
  237. .updateMemberState(sessionId, member.memberId, 1);
  238. }
  239. } else {
  240. members.add(member);
  241. SqlUtil.groupMemberTableModel.addSingleMember(sessionId, member);
  242. }
  243. print('addMember ${member.memberId} ${UserData().basicInfo.userId}');
  244. if (member.memberId == UserData().basicInfo.userId) {
  245. print('addMember ture');
  246. isInGroup = true;
  247. }
  248. MessageMgr().emit('Update Group Info');
  249. }
  250. //删除成员,更新状态即可
  251. removeMember(int uId) {
  252. var member = getMember(uId);
  253. if (member != null) {
  254. member.inGroup = 0;
  255. SqlUtil.groupMemberTableModel.updateMemberState(sessionId, uId, 0);
  256. }
  257. }
  258. //修改群名称
  259. updateGroupName(String groupName) {
  260. name = groupName;
  261. SqlUtil.groupInfoTableModel.updateGroupName(sessionId, groupName);
  262. MessageMgr().emit('Update Group Info');
  263. }
  264. //修改群公告
  265. updateGroupNotice(String notice) {
  266. describe = notice;
  267. SqlUtil.groupInfoTableModel.updateGroupNotice(sessionId, notice);
  268. MessageMgr().emit('Update Group Info');
  269. }
  270. GroupMemberModel getMember(int uId) {
  271. for (var i = 0; i < members.length; i++) {
  272. if (members[i].memberId == uId) {
  273. return members[i];
  274. }
  275. }
  276. print('找不到该成员$uId');
  277. return null;
  278. }
  279. //修改成员免打扰设置
  280. updateMemberMsgFree(int isAvoid) {
  281. messageFree = isAvoid;
  282. MessageMgr().emit('Update Group Info');
  283. SqlUtil.groupInfoTableModel.updateGroupMesssageFree(sessionId, isAvoid);
  284. }
  285. //修改成员别名
  286. updateMemberRefName(int uId, String refName) {
  287. print('修改成员别名 $uId $refName');
  288. var member = getMember(uId);
  289. if (member != null) {
  290. member.refName = refName;
  291. if (uId == UserData().basicInfo.userId) {
  292. //自己
  293. myName = refName;
  294. SqlUtil.groupInfoTableModel.updateMyName(sessionId, refName);
  295. } else {
  296. SqlUtil.groupMemberTableModel
  297. .updateMemberRefName(sessionId, uId, refName);
  298. }
  299. MessageMgr().emit('Update Group Info');
  300. }
  301. }
  302. //修改群主
  303. updateGroupHoster(int oldId, int uId) {
  304. //系统
  305. if (oldId == 0) {
  306. //去除旧的群主
  307. for (var i = 0; i < members.length; i++) {
  308. if (members[i].identity == GroupMemberIdentity.identityMaster.value) {
  309. members[i].identity = 0;
  310. SqlUtil.groupMemberTableModel
  311. .updateMemberIdentity(sessionId, members[i].memberId, 0);
  312. break;
  313. }
  314. }
  315. } else {
  316. var member = getMember(oldId);
  317. member.identity = 0;
  318. SqlUtil.groupMemberTableModel
  319. .updateMemberIdentity(sessionId, member.memberId, 0);
  320. }
  321. //修改新的群主
  322. var member = getMember(uId);
  323. if (member != null) {
  324. hosterId = member.memberId;
  325. member.identity = GroupMemberIdentity.identityMaster.value;
  326. SqlUtil.groupMemberTableModel
  327. .updateMemberIdentity(sessionId, member.memberId, member.identity);
  328. SqlUtil.groupInfoTableModel.updateHoster(sessionId, member.memberId);
  329. }
  330. MessageMgr().emit('Update Group Info');
  331. }
  332. //判断是否在群中
  333. bool isGroupMember(int userId) {
  334. for (var i = 0; i < members.length; i++) {
  335. if (members[i].memberId == userId) {
  336. return members[i].inGroup == 1;
  337. }
  338. }
  339. return false;
  340. }
  341. updateAvatar(String path) {
  342. image = path;
  343. SqlUtil.groupInfoTableModel.updateImage(sessionId, image);
  344. }
  345. cleanAvatar() {
  346. image = '';
  347. }
  348. }