import 'package:azlistview/azlistview.dart'; import 'package:chat/models/im/contact_info_model.dart'; import 'package:chat/models/im/search_user_model.dart'; import 'package:chat/services/tim_service.dart'; import 'package:chat/utils/im_tools.dart'; import 'package:chat/utils/request/http.dart'; import 'package:chat/utils/ui_tools.dart'; import 'package:get/get.dart'; import 'package:lpinyin/lpinyin.dart'; import 'package:tencent_im_sdk_plugin/enum/friend_type_enum.dart'; import 'package:tencent_im_sdk_plugin/manager/v2_tim_friendship_manager.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_friend_check_result.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_friend_info.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_friend_info_result.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_user_full_info.dart'; class TimFriendService extends GetxService { static TimFriendService get to => Get.find(); /// 好友关系 V2TIMFriendshipManager get friendshipManager => TimService.to.instance.v2TIMFriendshipManager; /// 好友列表 var friends = List.empty(growable: true).obs; /// 格式化后的联系人信息 var contacts = List.empty(growable: true).obs; Future fetchList() async { var result = await friendshipManager.getFriendList(); if (result.code == 0) { friends.value = result.data!; contacts.clear(); for (var element in result.data!) { String name = ImTools.parseNicknameFromInfo(element); String pinyin = PinyinHelper.getPinyinE(name); String tag = pinyin.substring(0, 1).toUpperCase(); if (!RegExp('[A-Z]').hasMatch(tag)) { tag = '#'; } contacts.add(ContactInfoModel( name: name, userID: element.userID, tagIndex: tag, namePinyin: pinyin, friendInfo: element, )); } SuspensionUtil.sortListBySuspensionTag(contacts); SuspensionUtil.setShowSuspensionStatus(contacts); } } /// 添加好友 Future add( String userID, { String? remark, String? addWording, String? addSource, }) async { var result = await friendshipManager.addFriend( userID: userID, remark: remark, addWording: addWording, addSource: addSource, addType: FriendTypeEnum.V2TIM_FRIEND_TYPE_BOTH, ); if (result.code == 0) { if (result.data!.resultCode == 0) { fetchList(); return true; } else if (result.data!.resultCode == 30539) { return true; } else if (result.data!.resultCode == 30010) { UiTools.toast('好友数量已达上限'); return false; } else { UiTools.toast( result.data!.resultInfo! + result.data!.resultCode.toString()); return false; } } UiTools.toast(result.desc); return false; } /// 删除双向好友 Future delete(String userID) async { var result = await friendshipManager.deleteFromFriendList( deleteType: FriendTypeEnum.V2TIM_FRIEND_TYPE_BOTH, userIDList: [userID], ); if (result.code == 0) { fetchList(); return result.data!.first.resultCode == 0; } else { UiTools.toast(result.desc); return false; } } /// 检测好友是否有双向(单向)好友关系。 Future check(String userID) async { var result = await friendshipManager.checkFriend( checkType: FriendTypeEnum.V2TIM_FRIEND_TYPE_BOTH, userIDList: [userID], ); if (result.code == 0) { return result.data!.first; } else { UiTools.toast(result.desc); return null; } } /// 获取用户资料 Future userInfo(String userID) async { var result = await TimService.to.instance.getUsersInfo( userIDList: [userID], ); if (result.code == 0) { return result.data!.first; } UiTools.toast(result.desc); return null; } /// 获取好友资料 Future friendInfo(String userID) async { var result = await friendshipManager.getFriendsInfo(userIDList: [userID]); if (result.code == 0) { if (result.data!.isNotEmpty) { return result.data!.first; } else { return null; } } UiTools.toast(result.desc); return null; } /// 修改个人资料 Future setSelfInfo({ String? nickname, String? avatar, }) async { var result = await TimService.to.instance.setSelfInfo( userFullInfo: V2TimUserFullInfo( nickName: nickname, faceUrl: avatar, ), ); if (result.code == 0) { // TimService.to.fetchSelfInfo(); return true; } UiTools.toast(result.desc); return false; } /// 设置是否允许陌生人消息 Future allowStrangerMessage() async { var result = await TimService.to.instance.setSelfInfo( userFullInfo: V2TimUserFullInfo( customInfo: { 'Stranger': 'TRUE', }, ), ); if (result.code == 0) { return true; } UiTools.toast(result.desc); return false; } /// 禁止陌生人消息 Future forbidStrangerMessage() async { var result = await TimService.to.instance.setSelfInfo( userFullInfo: V2TimUserFullInfo( customInfo: { 'Stranger': '', }, ), ); if (result.code == 0) { return true; } return false; } /// 修改好友备注信息 Future setFriendRemark( String userID, String friendRemark, ) async { var result = await friendshipManager.setFriendInfo( userID: userID, friendRemark: friendRemark, ); if (result.code == 0) { return true; } UiTools.toast(result.desc); return false; } /// 从服务器查找用户 Future?> searchUser(String keyword) async { try { var json = await Http.get( 'user/search', params: { 'keyword': keyword, }, ); return List.from( json.map( (x) => SearchUserModel.fromJson(x), ), ); } catch (err) { UiTools.toast(err.toString()); } return null; } }