import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; import '../../../data_sources/models/enum/sc_props_type.dart'; /// token : "" /// userCredential : {"expireTime":0,"releaseTime":0,"sign":"","sysOrigin":"","userId":0,"version":""} /// userProfile : {"account":"","accountStatus":"","age":0,"bornDay":0,"bornMonth":0,"bornYear":0,"countryCode":"","countryId":0,"countryName":"","createTime":0,"del":false,"freezingTime":0,"id":0,"originSys":"","ownSpecialId":{"account":"","expiredTime":0},"sameRegion":false,"sysOriginChild":"","useProps":[{"expireTime":0,"propsResources":{"amount":0.0,"code":"","cover":"","expand":"","id":0,"name":"","sourceUrl":"","type":""},"userId":0}],"userAvatar":"","userNickname":"","userSex":0,"wearBadge":[{"animationUrl":"","badgeKey":"","badgeLevel":0,"badgeName":"","expireTime":0,"id":0,"milestone":0,"notSelectUrl":"","selectUrl":"","type":"","userId":0}]} /// userSig : "" class SocialChatLoginRes { SocialChatLoginRes({ String? token, SocialChatUserCredential? userCredential, SocialChatUserProfile? userProfile, String? userSig, }) { _token = token; _userCredential = userCredential; _userProfile = userProfile; _userSig = userSig; } SocialChatLoginRes.fromJson(dynamic json) { _token = json['token']; _userCredential = json['userCredential'] != null ? SocialChatUserCredential.fromJson(json['userCredential']) : null; _userProfile = json['userProfile'] != null ? SocialChatUserProfile.fromJson(json['userProfile']) : null; _userSig = json['userSig']; } String? _token; SocialChatUserCredential? _userCredential; SocialChatUserProfile? _userProfile; String? _userSig; SocialChatLoginRes copyWith({ String? token, SocialChatUserCredential? userCredential, SocialChatUserProfile? userProfile, String? userSig, }) => SocialChatLoginRes( token: token ?? _token, userCredential: userCredential ?? _userCredential, userProfile: userProfile ?? _userProfile, userSig: userSig ?? _userSig, ); String? get token => _token; SocialChatUserCredential? get userCredential => _userCredential; SocialChatUserProfile? get userProfile => _userProfile; String? get userSig => _userSig; Map toJson() { final map = {}; map['token'] = _token; if (_userCredential != null) { map['userCredential'] = _userCredential?.toJson(); } if (_userProfile != null) { map['userProfile'] = _userProfile?.toJson(); } map['userSig'] = _userSig; return map; } void setUserProfile(SocialChatUserProfile userInfo) { _userProfile = userInfo; } } /// account : "" /// accountStatus : "" /// age : 0 /// bornDay : 0 /// bornMonth : 0 /// bornYear : 0 /// countryCode : "" /// countryId : 0 /// countryName : "" /// createTime : 0 /// del : false /// freezingTime : 0 /// id : 0 /// originSys : "" /// ownSpecialId : {"account":"","expiredTime":0} /// sameRegion : false /// sysOriginChild : "" /// useProps : [{"expireTime":0,"propsResources":{"amount":0.0,"code":"","cover":"","expand":"","id":0,"name":"","sourceUrl":"","type":""},"userId":0}] /// userAvatar : "" /// userNickname : "" /// userSex : 0 /// wearBadge : [{"animationUrl":"","badgeKey":"","badgeLevel":0,"badgeName":"","expireTime":0,"id":0,"milestone":0,"notSelectUrl":"","selectUrl":"","type":"","userId":0}] class SocialChatUserProfile { SocialChatUserProfile({ String? account, String? accountStatus, num? age, num? bornDay, num? bornMonth, num? bornYear, String? countryCode, String? countryId, String? countryName, num? createTime, bool? del, num? freezingTime, String? id, bool? firstRecharge, num? charmLevel, num? firstRechargeAmount, num? wealthLevel, num? heartbeatVal, String? originSys, OwnSpecialId? ownSpecialId, String? vipLevel, bool? sameRegion, int? firstRechargeEndTime, String? sysOriginChild, List? useProps, String? userAvatar, String? roles, String? inRoomId, String? userNickname, String? hobby, String? familyId, String? autograph, num? userSex, List? wearBadge, List? wearHonor, List? backgroundPhotos, List? personalPhotos, List? cpList, List? closeFriendList, bool? isCpRelation, }) { _account = account; _accountStatus = accountStatus; _age = age; _bornDay = bornDay; _inRoomId = inRoomId; _bornMonth = bornMonth; _bornYear = bornYear; _countryCode = countryCode; _countryId = countryId; _countryName = countryName; _createTime = createTime; _del = del; _freezingTime = freezingTime; _id = id; _originSys = originSys; _charmLevel = charmLevel; _firstRechargeAmount = firstRechargeAmount; _wealthLevel = wealthLevel; _heartbeatVal = heartbeatVal; _ownSpecialId = ownSpecialId; _vipLevel = vipLevel; _sameRegion = sameRegion; _isCpRelation = isCpRelation; _firstRechargeEndTime = firstRechargeEndTime; _firstRecharge = firstRecharge; _sysOriginChild = sysOriginChild; _useProps = useProps; _userAvatar = userAvatar; _roles = roles; _userNickname = userNickname; _hobby = hobby; _familyId = familyId; _autograph = autograph; _userSex = userSex; _wearBadge = wearBadge; _wearHonor = wearHonor; _backgroundPhotos = backgroundPhotos; _personalPhotos = personalPhotos; _cpList = cpList; _closeFriendList = closeFriendList; } SocialChatUserProfile.fromJson(dynamic json) { final sourceJson = json; if (sourceJson is Map && sourceJson['userProfile'] is Map) { json = sourceJson['userProfile']; } _account = json['account']; _accountStatus = json['accountStatus']; _age = json['age']; _bornDay = json['bornDay']; _inRoomId = json['inRoomId']; _bornMonth = json['bornMonth']; _bornYear = json['bornYear']; _countryCode = json['countryCode']; _countryId = json['countryId']; _countryName = json['countryName']; _createTime = json['createTime']; _del = json['del']; _freezingTime = json['freezingTime']; _id = json['id']; _originSys = json['originSys']; _charmLevel = json['charmLevel']; _firstRechargeAmount = json['firstRechargeAmount']; _wealthLevel = json['wealthLevel']; _heartbeatVal = json['heartbeatVal']; _ownSpecialId = json['ownSpecialId'] != null ? OwnSpecialId.fromJson(json['ownSpecialId']) : null; _vipLevel = _firstNonBlankString([ ..._vipLevelHintValues(json), ..._vipLevelHintValues(sourceJson), ]); _sameRegion = json['sameRegion']; _isCpRelation = json['isCpRelation']; _firstRechargeEndTime = json['firstRechargeEndTime']; _firstRecharge = json['firstRecharge']; _sysOriginChild = json['sysOriginChild']; if (json['useProps'] != null) { _useProps = []; json['useProps'].forEach((v) { _useProps?.add(UseProps.fromJson(v)); }); } _userAvatar = json['userAvatar'] ?? json['avatar']; _roles = json['roles']; _userNickname = json['userNickname']; _hobby = json['hobby']; _familyId = json['familyId']; _autograph = json['autograph']; _userSex = json['userSex']; if (json['wearBadge'] != null) { _wearBadge = []; json['wearBadge'].forEach((v) { _wearBadge?.add(WearBadge.fromJson(v)); }); } if (json['wearHonor'] != null) { _wearHonor = []; json['wearHonor'].forEach((v) { _wearHonor?.add(WearBadge.fromJson(v)); }); } if (json['backgroundPhotos'] != null) { _backgroundPhotos = []; json['backgroundPhotos'].forEach((v) { _backgroundPhotos?.add(PersonPhoto.fromJson(v)); }); } if (json['personalPhotos'] != null) { _personalPhotos = []; json['personalPhotos'].forEach((v) { _personalPhotos?.add(PersonPhoto.fromJson(v)); }); } if (json['cpList'] != null) { _cpList = []; json['cpList'].forEach((v) { _cpList?.add(CPRes.fromJson(v)); }); } if (json['closeFriendList'] != null) { _closeFriendList = []; json['closeFriendList'].forEach((v) { _closeFriendList?.add(CPRes.fromJson(v)); }); } } String? _account; String? _accountStatus; num? _age; num? _bornDay; num? _bornMonth; num? _bornYear; String? _countryCode; String? _countryId; String? _inRoomId; String? _countryName; num? _createTime; bool? _del; num? _freezingTime; String? _id; String? _originSys; num? _charmLevel; num? _firstRechargeAmount; num? _wealthLevel; num? _heartbeatVal; OwnSpecialId? _ownSpecialId; String? _vipLevel; bool? _sameRegion; bool? _isCpRelation; int? _firstRechargeEndTime; bool? _firstRecharge; String? _sysOriginChild; List? _useProps; String? _userAvatar; String? _roles; String? _userNickname; String? _hobby; String? _familyId; String? _autograph; num? _userSex; List? _wearBadge; List? _wearHonor; List? _backgroundPhotos; List? _personalPhotos; List? _cpList; List? _closeFriendList; SocialChatUserProfile copyWith({ String? account, String? accountStatus, num? age, num? bornDay, num? bornMonth, num? bornYear, String? countryCode, String? countryId, String? countryName, num? createTime, bool? del, num? freezingTime, String? id, String? originSys, String? inRoomId, num? charmLevel, num? firstRechargeAmount, num? wealthLevel, num? heartbeatVal, OwnSpecialId? ownSpecialId, String? vipLevel, bool? sameRegion, bool? isCpRelation, int? firstRechargeEndTime, bool? firstRecharge, String? sysOriginChild, List? useProps, String? userAvatar, String? roles, String? userNickname, String? hobby, String? familyId, String? autograph, num? userSex, List? wearBadge, List? wearHonor, List? backgroundPhotos, List? personalPhotos, List? cpList, List? closeFriendList, }) => SocialChatUserProfile( account: account ?? _account, accountStatus: accountStatus ?? _accountStatus, age: age ?? _age, bornDay: bornDay ?? _bornDay, bornMonth: bornMonth ?? _bornMonth, bornYear: bornYear ?? _bornYear, inRoomId: inRoomId ?? _inRoomId, countryCode: countryCode ?? _countryCode, countryId: countryId ?? _countryId, countryName: countryName ?? _countryName, createTime: createTime ?? _createTime, del: del ?? _del, freezingTime: freezingTime ?? _freezingTime, id: id ?? _id, originSys: originSys ?? _originSys, charmLevel: charmLevel ?? _charmLevel, firstRechargeAmount: firstRechargeAmount ?? _firstRechargeAmount, wealthLevel: wealthLevel ?? _wealthLevel, heartbeatVal: heartbeatVal ?? _heartbeatVal, ownSpecialId: ownSpecialId ?? _ownSpecialId, vipLevel: vipLevel ?? _vipLevel, sameRegion: sameRegion ?? _sameRegion, isCpRelation: isCpRelation ?? _isCpRelation, firstRechargeEndTime: firstRechargeEndTime ?? _firstRechargeEndTime, firstRecharge: firstRecharge ?? _firstRecharge, sysOriginChild: sysOriginChild ?? _sysOriginChild, useProps: useProps ?? _useProps, userAvatar: userAvatar ?? _userAvatar, roles: roles ?? _roles, userNickname: userNickname ?? _userNickname, hobby: hobby ?? _hobby, familyId: familyId ?? _familyId, autograph: autograph ?? _autograph, userSex: userSex ?? _userSex, wearBadge: wearBadge ?? _wearBadge, wearHonor: wearHonor ?? _wearHonor, backgroundPhotos: backgroundPhotos ?? _backgroundPhotos, personalPhotos: personalPhotos ?? _personalPhotos, cpList: cpList ?? _cpList, closeFriendList: closeFriendList ?? _closeFriendList, ); String? get account => _account; String? get inRoomId => _inRoomId; String? get accountStatus => _accountStatus; num? get age => (_age ?? 0) < 1 ? 18 : _age; num? get bornDay => _bornDay; num? get bornMonth => _bornMonth; num? get bornYear => _bornYear; String? get countryCode => _countryCode; String? get countryId => _countryId; String? get countryName => _countryName; num? get createTime => _createTime; bool? get del => _del; num? get freezingTime => _freezingTime; String? get id => _id; String? get originSys => _originSys; num? get charmLevel => _charmLevel; num? get firstRechargeAmount => _firstRechargeAmount; num? get wealthLevel => _wealthLevel; num? get heartbeatVal => _heartbeatVal; OwnSpecialId? get ownSpecialId => _ownSpecialId; String? get vipLevel => _vipLevel; bool? get sameRegion => _sameRegion; bool? get isCpRelation => _isCpRelation; int? get firstRechargeEndTime => _firstRechargeEndTime; bool? get firstRecharge => _firstRecharge; String? get sysOriginChild => _sysOriginChild; List? get useProps => _useProps; String? get userAvatar => _userAvatar; String? get roles => _roles; String? get userNickname => _userNickname; String? get hobby => _hobby; String? get familyId => _familyId; String? get autograph => _autograph; num? get userSex => _userSex; List? get wearBadge => _wearBadge; List? get wearHonor => _wearHonor; List? get backgroundPhotos => _backgroundPhotos; List? get personalPhotos => _personalPhotos; List? get cpList => _cpList; List? get closeFriendList => _closeFriendList; void setFamilyId(String? familyId) { _familyId = familyId; AccountStorage().setCurrentUser(AccountStorage().getCurrentUser()!); } ///清除荣耀信息,避免发送消息个人信息数据太多超12kb,注意这个只在房间发消息的时候才用,因为荣耀这个属性数据在房间里面不用展示 void cleanWearHonor() { _wearHonor?.clear(); } ///同上 void cleanWearBadge() { _wearBadge?.clear(); } void cleanUseProps() { _useProps?.clear(); } void cleanPhotos() { _backgroundPhotos?.clear(); _personalPhotos?.clear(); _cpList?.clear(); _closeFriendList?.clear(); } PropsResources? getHeaddress() { PropsResources? pr; _useProps?.forEach((value) { final resource = value.propsResources; if (socialChatIsAvatarFrameResource(resource)) { pr = resource; } }); return pr; } PropsResources? getChatBox() { PropsResources? pr; _useProps?.forEach((value) { if (value.propsResources?.type == SCPropsType.CHAT_BUBBLE.name) { pr = value.propsResources; } }); return pr; } PropsResources? getFloatPicture() { PropsResources? pr; _useProps?.forEach((value) { if (value.propsResources?.type == SCPropsType.FLOAT_PICTURE.name) { pr = value.propsResources; } }); return pr; } PropsResources? getVipBadge() { PropsResources? pr; _useProps?.forEach((value) { if (value.propsResources?.type == SCPropsType.BADGE.name) { pr = value.propsResources; } }); return pr; } PropsResources? getMountains() { PropsResources? pr; _useProps?.forEach((value) { if (value.propsResources?.type == SCPropsType.RIDE.name) { pr = value.propsResources; } }); return pr; } PropsResources? getVIP() { PropsResources? pr; _useProps?.forEach((value) { if (value.propsResources?.type == SCPropsType.NOBLE_VIP.name) { pr = value.propsResources; } }); return pr; } PropsResources? getDataCard() { PropsResources? pr; _useProps?.forEach((value) { if (value.propsResources?.type == SCPropsType.DATA_CARD.name) { pr = value.propsResources; } }); return pr; } Map toJson() { final map = {}; map['account'] = _account; map['accountStatus'] = _accountStatus; map['age'] = _age; map['bornDay'] = _bornDay; map['bornMonth'] = _bornMonth; map['bornYear'] = _bornYear; map['countryCode'] = _countryCode; map['countryId'] = _countryId; map['countryName'] = _countryName; map['createTime'] = _createTime; map['del'] = _del; map['freezingTime'] = _freezingTime; map['id'] = _id; map['originSys'] = _originSys; map['charmLevel'] = _charmLevel; map['firstRechargeAmount'] = _firstRechargeAmount; map['wealthLevel'] = _wealthLevel; map['heartbeatVal'] = _heartbeatVal; if (_ownSpecialId != null) { map['ownSpecialId'] = _ownSpecialId?.toJson(); } if (_vipLevel != null) { map['vipLevel'] = _vipLevel; } map['sameRegion'] = _sameRegion; map['isCpRelation'] = _isCpRelation; map['firstRecharge'] = _firstRecharge; map['firstRechargeEndTime'] = _firstRechargeEndTime; map['sysOriginChild'] = _sysOriginChild; if (_useProps != null) { map['useProps'] = _useProps?.map((v) => v.toJson()).toList(); } map['userAvatar'] = _userAvatar; map['roles'] = _roles; map['userNickname'] = _userNickname; map['hobby'] = _hobby; map['familyId'] = _familyId; map['autograph'] = _autograph; map['userSex'] = _userSex; if (_wearBadge != null) { map['wearBadge'] = _wearBadge?.map((v) => v.toJson()).toList(); } if (_wearHonor != null) { map['wearHonor'] = _wearHonor?.map((v) => v.toJson()).toList(); } return map; } ///获取Id,有靓号显示靓号 String getID() { String uid = account ?? ""; if (hasSpecialId()) { uid = _ownSpecialId?.account ?? ""; } return uid; } ///是否有靓号 bool hasSpecialId() { if (_ownSpecialId != null) { if ((_ownSpecialId?.expiredTime ?? 0) > DateTime.now().millisecondsSinceEpoch) { return true; } } return false; } int get vipLevelForColoredId { final hasExplicitVipLevel = _vipLevel?.trim().isNotEmpty ?? false; final explicitLevel = _parseVipLevelForColoredId(_vipLevel) ?? 0; if (hasExplicitVipLevel && explicitLevel <= 0) { return 0; } if (explicitLevel > 0) { return explicitLevel; } final vipResource = getVIP(); final resourceLevel = _parseVipLevelForColoredId( vipResource?.name, allowPlainNumber: false, ) ?? _parseVipLevelForColoredId( vipResource?.code, allowPlainNumber: false, allowTrailingNumber: false, ); if ((resourceLevel ?? 0) > 0) { return resourceLevel!; } return vipResource == null ? 0 : 1; } int get vipVisualResourceLevelForColoredId { for (final resource in [ getVipBadge(), getHeaddress(), getChatBox(), getFloatPicture(), getDataCard(), getMountains(), ]) { final level = _vipLevelFromVisualResource(resource); if ((level ?? 0) > 0) { return level!; } } return 0; } /// ID 数字渐变字的 VIP 条件。 /// 新 VIP 接口优先读等级字段;旧数据继续兼容 useProps 里的 NOBLE_VIP。 bool hasVipPrivilegeForColoredId() { return vipLevelForColoredId > 0; } bool hasVipVisualResourceForColoredId() { return vipVisualResourceLevelForColoredId > 0; } bool shouldShowColoredSpecialIdText() { return hasVipPrivilegeForColoredId() || hasVipVisualResourceForColoredId(); } void setHeartbeatVal(num? heartbeatVal) { _heartbeatVal = (_heartbeatVal ?? 0) + (heartbeatVal ?? 0); } } String? socialChatVipLevelHintFromJson(dynamic json) { return _firstNonBlankString(_vipLevelHintValues(json)); } SocialChatUserProfile? socialChatProfileWithVipLevelHint( SocialChatUserProfile? profile, dynamic json, ) { final vipLevel = socialChatVipLevelHintFromJson(json); if (profile == null || vipLevel == null) { return profile; } return profile.copyWith(vipLevel: vipLevel); } SocialChatUserProfile? socialChatUserProfileFromJsonWithVipHint( dynamic json, { String userProfileKey = 'userProfile', }) { if (json == null) { return null; } if (json is Map && json[userProfileKey] != null) { return socialChatProfileWithVipLevelHint( SocialChatUserProfile.fromJson(json[userProfileKey]), json, ); } return SocialChatUserProfile.fromJson(json); } Iterable _vipLevelHintValues(dynamic json) sync* { if (json is! Map) { return; } yield json['vipLevel']; yield json['svipLevel']; yield json['sVipLevel']; yield json['userSVipLevel']; yield json['supperVip']; yield json['superVip']; yield json['nobleVipLevel']; yield json['vipLevelCode']; yield json['levelCode']; yield _nestedVipLevel(json['vipStatus']); yield _nestedVipLevel(json['vipState']); yield _nestedVipLevel(json['vip']); final nestedProfile = json['userProfile']; if (nestedProfile is Map) { yield* _vipLevelHintValues(nestedProfile); } } String? _firstNonBlankString(Iterable values) { for (final value in values) { final text = value?.toString().trim(); if (text != null && text.isNotEmpty) { return text; } } return null; } dynamic _nestedVipLevel(dynamic value) { if (value is Map) { final active = value['active']; if (active == false || active?.toString().trim().toLowerCase() == 'false') { return '0'; } return value['level'] ?? value['vipLevel'] ?? value['userSVipLevel'] ?? value['supperVip'] ?? value['levelCode']; } return null; } int? _vipLevelFromVisualResource(PropsResources? resource) { if (resource == null) { return null; } return _parseVipLevelForColoredId(resource.name, allowPlainNumber: false) ?? _parseVipLevelForColoredId(resource.code, allowPlainNumber: false) ?? _parseVipLevelForColoredId(resource.cover, allowPlainNumber: false) ?? _parseVipLevelForColoredId(resource.sourceUrl, allowPlainNumber: false) ?? _parseVipLevelForColoredId( resource.roomOpenedUrl, allowPlainNumber: false, ) ?? _parseVipLevelForColoredId( resource.roomSendCoverUrl, allowPlainNumber: false, ); } int? _parseVipLevelForColoredId( dynamic value, { bool allowPlainNumber = true, bool allowTrailingNumber = true, }) { final text = value?.toString().trim(); if (text == null || text.isEmpty) { return null; } if (allowPlainNumber) { final plainLevel = int.tryParse(text); if ((plainLevel ?? 0) > 0) { return plainLevel; } } final vipLevelMatch = RegExp( r'(?:S?VIP|NOBLE[_\s-]*VIP)[^\d]*([1-9]\d*)', caseSensitive: false, ).firstMatch(text); if (vipLevelMatch != null) { return int.tryParse(vipLevelMatch.group(1) ?? ''); } if (allowTrailingNumber) { final trailingLevelMatch = RegExp(r'([1-9]\d*)$').firstMatch(text); if (trailingLevelMatch != null) { return int.tryParse(trailingLevelMatch.group(1) ?? ''); } } return null; } /// animationUrl : "" /// badgeKey : "" /// badgeLevel : 0 /// badgeName : "" /// expireTime : 0 /// id : 0 /// milestone : 0 /// notSelectUrl : "" /// selectUrl : "" /// type : "" /// userId : 0 class WearBadge { WearBadge({ String? animationUrl, String? badgeKey, num? badgeLevel, String? badgeName, int? expireTime, String? id, String? milestone, String? notSelectUrl, String? selectUrl, String? sourceType, String? type, String? userId, int? updateTime, String? updatedAt, bool? use, }) { _animationUrl = animationUrl; _badgeKey = badgeKey; _badgeLevel = badgeLevel; _badgeName = badgeName; _expireTime = expireTime; _id = id; _use = use; _milestone = milestone; _notSelectUrl = notSelectUrl; _selectUrl = selectUrl; _sourceType = sourceType; _type = type; _userId = userId; _updateTime = updateTime; _updatedAt = updatedAt; } WearBadge.fromJson(dynamic json) { if (json is! Map) { return; } _animationUrl = _stringValue(json['animationUrl']); _badgeKey = _stringValue(json['badgeKey']); _badgeLevel = _numValue(json['badgeLevel'] ?? json['level']); _badgeName = _stringValue( json['badgeName'] ?? json['name'] ?? json['displayName'], ); _expireTime = _intValue(json['expireTime'] ?? json['expireAt']); _id = _stringValue(json['id'] ?? json['badgeId']); _use = _boolValue(json['use']); _milestone = _stringValue(json['milestone']); _notSelectUrl = _stringValue(json['notSelectUrl']); _selectUrl = _stringValue(json['url'] ?? json['selectUrl']); final rawType = _stringValue(json['type']); _sourceType = _stringValue(json['sourceType']) ?? _sourceTypeFromType(rawType); _type = rawType; _userId = _stringValue(json['userId']); _updateTime = _intValue( json['updateTime'] ?? json['updatedAt'] ?? json['createTime'], ); _updatedAt = _stringValue(json['updatedAt']); } String? _animationUrl; String? _badgeKey; num? _badgeLevel; String? _badgeName; int? _expireTime; String? _id; bool? _use; String? _milestone; String? _notSelectUrl; String? _selectUrl; String? _sourceType; String? _type; String? _userId; int? _updateTime; String? _updatedAt; WearBadge copyWith({ String? animationUrl, String? badgeKey, num? badgeLevel, String? badgeName, int? expireTime, String? id, bool? use, String? milestone, String? notSelectUrl, String? selectUrl, String? sourceType, String? type, String? userId, int? updateTime, String? updatedAt, }) => WearBadge( animationUrl: animationUrl ?? _animationUrl, badgeKey: badgeKey ?? _badgeKey, badgeLevel: badgeLevel ?? _badgeLevel, badgeName: badgeName ?? _badgeName, expireTime: expireTime ?? _expireTime, id: id ?? _id, use: use ?? _use, milestone: milestone ?? _milestone, notSelectUrl: notSelectUrl ?? _notSelectUrl, selectUrl: selectUrl ?? _selectUrl, sourceType: sourceType ?? _sourceType, type: type ?? _type, userId: userId ?? _userId, updateTime: updateTime ?? _updateTime, updatedAt: updatedAt ?? _updatedAt, ); String? get animationUrl => _animationUrl; String? get badgeKey => _badgeKey; num? get badgeLevel => _badgeLevel; bool? get use => _use; String? get badgeName => _badgeName; int? get expireTime => _expireTime; String? get id => _id; String? get milestone => _milestone; String? get notSelectUrl => _notSelectUrl; String? get selectUrl => _selectUrl; String? get sourceType => _sourceType; String? get type => _type; String? get userId => _userId; int? get updateTime => _updateTime; String? get updatedAt => _updatedAt; Map toJson() { final map = {}; map['animationUrl'] = _animationUrl; map['badgeKey'] = _badgeKey; map['badgeLevel'] = _badgeLevel; map['badgeName'] = _badgeName; map['expireTime'] = _expireTime; map['id'] = _id; map['use'] = _use; map['milestone'] = _milestone; map['notSelectUrl'] = _notSelectUrl; map['selectUrl'] = _selectUrl; map['sourceType'] = _sourceType; map['type'] = _type; map['userId'] = _userId; map['updateTime'] = _updateTime; map['updatedAt'] = _updatedAt; return map; } static String? _stringValue(dynamic value) { final text = value?.toString().trim(); return text == null || text.isEmpty ? null : text; } static String? _sourceTypeFromType(String? type) { final normalized = type?.trim().toUpperCase(); if (normalized == "VIP" || normalized == "ACTIVITY" || normalized == "ACHIEVEMENT") { return normalized; } return null; } static int? _intValue(dynamic value) { if (value is int) { return value; } if (value is num) { return value.toInt(); } return int.tryParse(value?.toString() ?? ""); } static num? _numValue(dynamic value) { if (value is num) { return value; } return num.tryParse(value?.toString() ?? ""); } static bool? _boolValue(dynamic value) { if (value is bool) { return value; } if (value is num) { return value != 0; } final text = value?.toString().trim().toLowerCase(); if (text == "true" || text == "1") { return true; } if (text == "false" || text == "0") { return false; } return null; } } class PersonPhoto { PersonPhoto({String? url, num? status}) { _url = url; _status = status; } PersonPhoto.fromJson(dynamic json) { _url = json['url']; _status = json['status']; } String? _url; num? _status; PersonPhoto copyWith({String? url, num? status}) => PersonPhoto(url: url ?? _url, status: status ?? _status); String? get url => _url; num? get status => _status; Map toJson() { final map = {}; map['url'] = _url; map['status'] = _status; return map; } } class CPRes { CPRes({ String? meUserId, String? meAccount, String? meUserAvatar, String? meUserNickname, String? cpUserId, String? cpUserNickname, String? cpAccount, String? cpUserAvatar, String? days, String? firstDay, double? cpValue, String? relationType, String? status, String? levelText, int? dismissEndTime, int? dismissRemainSeconds, int? dismissCost, }) { _meUserId = meUserId; _meAccount = meAccount; _meUserAvatar = meUserAvatar; _meUserNickname = meUserNickname; _cpUserId = cpUserId; _cpUserNickname = cpUserNickname; _cpAccount = cpAccount; _cpUserAvatar = cpUserAvatar; _days = days; _firstDay = firstDay; _cpValue = cpValue; _relationType = relationType; _status = status; _levelText = levelText; _dismissEndTime = dismissEndTime; _dismissRemainSeconds = dismissRemainSeconds; _dismissCost = dismissCost; } CPRes.fromJson(dynamic json) { final source = json is Map ? json : const {}; final meProfileJson = source['meUserProfile']; final cpProfileJson = source['cpUserProfile']; final meProfile = meProfileJson is Map ? SocialChatUserProfile.fromJson(meProfileJson) : null; final cpProfile = cpProfileJson is Map ? SocialChatUserProfile.fromJson(cpProfileJson) : null; _meUserId = _asString(source['meUserId']) ?? meProfile?.id; _meAccount = _asString(source['meAccount']) ?? meProfile?.account; _meUserAvatar = _asString(source['meUserAvatar']) ?? meProfile?.userAvatar; _meUserNickname = _asString(source['meUserNickname']) ?? meProfile?.userNickname; _cpUserId = _asString(source['cpUserId']) ?? cpProfile?.id; _cpUserNickname = _asString(source['cpUserNickname']) ?? cpProfile?.userNickname; _cpAccount = _asString(source['cpAccount']) ?? cpProfile?.account; _cpUserAvatar = _asString(source['cpUserAvatar']) ?? cpProfile?.userAvatar; _days = _asString(source['days']); _firstDay = _asString(source['firstDay']); _cpValue = _asDouble(source['cpValue']); _relationType = _asString(source['relationType']); _status = _asString(source['status']); _levelText = _asString( source['levelText'] ?? source['levelName'] ?? source['level'] ?? source['cpLevel'] ?? source['cabinLevel'] ?? source['lv'] ?? source['name'] ?? source['title'], ); _dismissEndTime = _asInt(source['dismissEndTime']); _dismissRemainSeconds = _asInt(source['dismissRemainSeconds']); _dismissCost = _asInt( _firstValue(source, const [ 'dismissCost', 'dismissGold', 'dismissCoins', 'dismissCoin', 'cancelCost', 'cancelGold', 'removeCost', 'partWaysCost', 'consumeGold', 'goldCost', 'cost', 'coins', 'priceGold', ]), ); } static dynamic _firstValue(Map source, List keys) { for (final key in keys) { if (source.containsKey(key) && source[key] != null) { return source[key]; } } return null; } static String? _asString(dynamic value) { final text = value?.toString().trim(); return text == null || text.isEmpty ? null : text; } static double? _asDouble(dynamic value) { if (value is num) { return value.toDouble(); } return double.tryParse(value?.toString() ?? ''); } static int? _asInt(dynamic value) { if (value is int) { return value; } if (value is num) { return value.toInt(); } return int.tryParse(value?.toString() ?? ''); } String? _meUserId; String? _meAccount; String? _meUserAvatar; String? _meUserNickname; String? _cpUserId; String? _cpUserNickname; String? _cpAccount; String? _cpUserAvatar; String? _days; String? _firstDay; double? _cpValue; String? _relationType; String? _status; String? _levelText; int? _dismissEndTime; int? _dismissRemainSeconds; int? _dismissCost; String? get meUserId => _meUserId; String? get meAccount => _meAccount; String? get meUserAvatar => _meUserAvatar; String? get meUserNickname => _meUserNickname; String? get cpUserId => _cpUserId; String? get cpUserNickname => _cpUserNickname; String? get cpAccount => _cpAccount; String? get cpUserAvatar => _cpUserAvatar; String? get days => _days; String? get firstDay => _firstDay; double? get cpValue => _cpValue; String? get relationType => _relationType; String? get status => _status; String? get levelText => _levelText; int? get dismissEndTime => _dismissEndTime; int? get dismissRemainSeconds => _dismissRemainSeconds; int? get dismissCost => _dismissCost; CPRes copyWith({ String? relationType, double? cpValue, String? days, String? levelText, int? dismissCost, }) { return CPRes( meUserId: _meUserId, meAccount: _meAccount, meUserAvatar: _meUserAvatar, meUserNickname: _meUserNickname, cpUserId: _cpUserId, cpUserNickname: _cpUserNickname, cpAccount: _cpAccount, cpUserAvatar: _cpUserAvatar, days: days ?? _days, firstDay: _firstDay, cpValue: cpValue ?? _cpValue, relationType: relationType ?? _relationType, status: _status, levelText: levelText ?? _levelText, dismissEndTime: _dismissEndTime, dismissRemainSeconds: _dismissRemainSeconds, dismissCost: dismissCost ?? _dismissCost, ); } Map toJson() { final map = {}; map['meUserId'] = _meUserId; map['meAccount'] = _meAccount; map['meUserAvatar'] = _meUserAvatar; map['meUserNickname'] = _meUserNickname; map['cpUserId'] = _cpUserId; map['cpUserNickname'] = _cpUserNickname; map['cpAccount'] = _cpAccount; map['cpUserAvatar'] = _cpUserAvatar; map['days'] = _days; map['firstDay'] = _firstDay; map['cpValue'] = _cpValue; map['relationType'] = _relationType; map['status'] = _status; map['levelText'] = _levelText; map['dismissEndTime'] = _dismissEndTime; map['dismissRemainSeconds'] = _dismissRemainSeconds; map['dismissCost'] = _dismissCost; return map; } } class SCCpCabinRes { SCCpCabinRes({ int? cpVal, int? blessVal, int? cpValLastMonth, int? historyCpValMax, CPRes? cpPairUserProfileCO, List? cpCabinConfigCO, dynamic currentCpCabinConfigCO, dynamic userCpCabinSpecial, bool? checkSelfCabin, int? dismissCost, }) { _cpVal = cpVal; _blessVal = blessVal; _cpValLastMonth = cpValLastMonth; _historyCpValMax = historyCpValMax; _cpPairUserProfileCO = cpPairUserProfileCO; _cpCabinConfigCO = cpCabinConfigCO; _currentCpCabinConfigCO = currentCpCabinConfigCO; _userCpCabinSpecial = userCpCabinSpecial; _checkSelfCabin = checkSelfCabin; _dismissCost = dismissCost; } SCCpCabinRes.fromJson(dynamic json) { final source = json is Map ? json : const {}; _cpVal = CPRes._asInt(source['cpVal']); _blessVal = CPRes._asInt(source['blessVal']); _cpValLastMonth = CPRes._asInt(source['cpValLastMonth']); _historyCpValMax = CPRes._asInt(source['historyCpValMax']); final pair = source['cpPairUserProfileCO']; _cpPairUserProfileCO = pair is Map ? CPRes.fromJson(pair) : null; final configs = source['cpCabinConfigCO']; _cpCabinConfigCO = configs is List ? List.from(configs) : null; _currentCpCabinConfigCO = source['currentCpCabinConfigCO']; _userCpCabinSpecial = source['userCpCabinSpecial']; _checkSelfCabin = source['checkSelfCabin'] is bool ? source['checkSelfCabin'] as bool : null; _dismissCost = CPRes._asInt( CPRes._firstValue(source, const [ 'dismissCost', 'dismissGold', 'dismissCoins', 'dismissCoin', 'cancelCost', 'cancelGold', 'removeCost', 'partWaysCost', 'consumeGold', 'goldCost', 'cost', 'coins', 'priceGold', ]), ); } int? _cpVal; int? _blessVal; int? _cpValLastMonth; int? _historyCpValMax; CPRes? _cpPairUserProfileCO; List? _cpCabinConfigCO; dynamic _currentCpCabinConfigCO; dynamic _userCpCabinSpecial; bool? _checkSelfCabin; int? _dismissCost; int? get cpVal => _cpVal; int? get blessVal => _blessVal; int? get cpValLastMonth => _cpValLastMonth; int? get historyCpValMax => _historyCpValMax; CPRes? get cpPairUserProfileCO => _cpPairUserProfileCO; List? get cpCabinConfigCO => _cpCabinConfigCO; dynamic get currentCpCabinConfigCO => _currentCpCabinConfigCO; dynamic get userCpCabinSpecial => _userCpCabinSpecial; bool? get checkSelfCabin => _checkSelfCabin; int? get dismissCost => _dismissCost; } class SCCpCabinValueRes { SCCpCabinValueRes({int? cpVal, int? blessVal}) { _cpVal = cpVal; _blessVal = blessVal; } SCCpCabinValueRes.fromJson(dynamic json) { final source = json is Map ? json : const {}; _cpVal = CPRes._asInt(source['cpVal']); _blessVal = CPRes._asInt(source['blessVal']); } int? _cpVal; int? _blessVal; int? get cpVal => _cpVal; int? get blessVal => _blessVal; } /// expireTime : 0 /// propsResources : {"amount":0.0,"code":"","cover":"","expand":"","id":0,"name":"","sourceUrl":"","type":""} /// userId : 0 class UseProps { UseProps({ bool? allowGive, String? expireTime, PropsResources? propsResources, String? userId, }) { _allowGive = allowGive; _expireTime = expireTime; _propsResources = propsResources; _userId = userId; } UseProps.fromJson(dynamic json) { _allowGive = json['allowGive']; _expireTime = json['expireTime']; _propsResources = json['propsResources'] != null ? PropsResources.fromJson(json['propsResources']) : null; _userId = json['userId']; } bool? _allowGive; String? _expireTime; PropsResources? _propsResources; String? _userId; UseProps copyWith({ bool? allowGive, String? expireTime, PropsResources? propsResources, String? userId, }) => UseProps( allowGive: allowGive ?? _allowGive, expireTime: expireTime ?? _expireTime, propsResources: propsResources ?? _propsResources, userId: userId ?? _userId, ); bool? get allowGive => _allowGive; String? get expireTime => _expireTime; PropsResources? get propsResources => _propsResources; String? get userId => _userId; Map toJson() { final map = {}; map['allowGive'] = _allowGive; map['expireTime'] = _expireTime; if (_propsResources != null) { map['propsResources'] = _propsResources?.toJson(); } map['userId'] = _userId; return map; } void setPropsResources(PropsResources? pr) { _propsResources = pr; } } /// amount : 0.0 /// code : "" /// cover : "" /// expand : "" /// id : 0 /// name : "" /// sourceUrl : "" /// type : "" class PropsResources { PropsResources({ num? amount, String? code, String? cover, num? createTime, bool? del, String? expand, String? id, String? imNotOpenedUrl, String? imOpenedUrl, String? imOpenedUrlTwo, String? imSendCoverUrl, String? name, String? roomNotOpenedUrl, String? roomOpenedUrl, String? roomSendCoverUrl, String? sourceUrl, String? sysOrigin, String? type, num? updateTime, }) { _amount = amount; _code = code; _cover = cover; _createTime = createTime; _del = del; _expand = expand; _id = id; _imNotOpenedUrl = imNotOpenedUrl; _imOpenedUrl = imOpenedUrl; _imOpenedUrlTwo = imOpenedUrlTwo; _imSendCoverUrl = imSendCoverUrl; _name = name; _roomNotOpenedUrl = roomNotOpenedUrl; _roomOpenedUrl = roomOpenedUrl; _roomSendCoverUrl = roomSendCoverUrl; _sourceUrl = sourceUrl; _sysOrigin = sysOrigin; _type = type; _updateTime = updateTime; } PropsResources.fromJson(dynamic json) { if (json is! Map) { return; } _amount = json['amount']; _code = json['code']; _cover = json['cover'] ?? json['coverUrl']; _createTime = json['createTime']; _del = json['del']; _expand = json['expand']; _id = json['id'] ?? json['resourceId']; _imNotOpenedUrl = json['imNotOpenedUrl']; _imOpenedUrl = json['imOpenedUrl']; _imOpenedUrlTwo = json['imOpenedUrlTwo']; _imSendCoverUrl = json['imSendCoverUrl']; _name = json['name']; _roomNotOpenedUrl = json['roomNotOpenedUrl']; _roomOpenedUrl = json['roomOpenedUrl']; _roomSendCoverUrl = json['roomSendCoverUrl']; _sysOrigin = json['sysOrigin']; _type = json['type']; _sourceUrl = _isAvatarFrameType(_type) ? json['sourceUrl'] : json['sourceUrl'] ?? json['resourceUrl'] ?? json['url']; _updateTime = json['updateTime']; } num? _amount; String? _code; String? _cover; num? _createTime; bool? _del; String? _expand; String? _id; String? _imNotOpenedUrl; String? _imOpenedUrl; String? _imOpenedUrlTwo; String? _imSendCoverUrl; String? _name; String? _roomNotOpenedUrl; String? _roomOpenedUrl; String? _roomSendCoverUrl; String? _sourceUrl; String? _sysOrigin; String? _type; num? _updateTime; PropsResources copyWith({ num? amount, String? code, String? cover, num? createTime, bool? del, String? expand, String? id, String? imNotOpenedUrl, String? imOpenedUrl, String? imOpenedUrlTwo, String? imSendCoverUrl, String? name, String? roomNotOpenedUrl, String? roomOpenedUrl, String? roomSendCoverUrl, String? sourceUrl, String? sysOrigin, String? type, num? updateTime, }) => PropsResources( amount: amount ?? _amount, code: code ?? _code, cover: cover ?? _cover, createTime: createTime ?? _createTime, del: del ?? _del, expand: expand ?? _expand, id: id ?? _id, imNotOpenedUrl: imNotOpenedUrl ?? _imNotOpenedUrl, imOpenedUrl: imOpenedUrl ?? _imOpenedUrl, imOpenedUrlTwo: imOpenedUrlTwo ?? _imOpenedUrlTwo, imSendCoverUrl: imSendCoverUrl ?? _imSendCoverUrl, name: name ?? _name, roomNotOpenedUrl: roomNotOpenedUrl ?? _roomNotOpenedUrl, roomOpenedUrl: roomOpenedUrl ?? _roomOpenedUrl, roomSendCoverUrl: roomSendCoverUrl ?? _roomSendCoverUrl, sourceUrl: sourceUrl ?? _sourceUrl, sysOrigin: sysOrigin ?? _sysOrigin, type: type ?? _type, updateTime: updateTime ?? _updateTime, ); num? get amount => _amount; String? get code => _code; String? get cover => _cover; num? get createTime => _createTime; bool? get del => _del; String? get expand => _expand; String? get id => _id; String? get imNotOpenedUrl => _imNotOpenedUrl; String? get imOpenedUrl => _imOpenedUrl; String? get imOpenedUrlTwo => _imOpenedUrlTwo; String? get imSendCoverUrl => _imSendCoverUrl; String? get name => _name; String? get roomNotOpenedUrl => _roomNotOpenedUrl; String? get roomOpenedUrl => _roomOpenedUrl; String? get roomSendCoverUrl => _roomSendCoverUrl; String? get sourceUrl => _sourceUrl; String? get sysOrigin => _sysOrigin; String? get type => _type; num? get updateTime => _updateTime; Map toJson() { final map = {}; map['amount'] = _amount; map['code'] = _code; map['cover'] = _cover; map['createTime'] = _createTime; map['del'] = _del; map['expand'] = _expand; map['id'] = _id; map['imNotOpenedUrl'] = _imNotOpenedUrl; map['imOpenedUrl'] = _imOpenedUrl; map['imOpenedUrlTwo'] = _imOpenedUrlTwo; map['imSendCoverUrl'] = _imSendCoverUrl; map['name'] = _name; map['roomNotOpenedUrl'] = _roomNotOpenedUrl; map['roomOpenedUrl'] = _roomOpenedUrl; map['roomSendCoverUrl'] = _roomSendCoverUrl; map['sourceUrl'] = _sourceUrl; map['sysOrigin'] = _sysOrigin; map['type'] = _type; map['updateTime'] = _updateTime; return map; } } bool socialChatIsAvatarFrameResource(PropsResources? resource) { if (!_isAvatarFrameType(resource?.type)) { return false; } final sourceUrl = resource?.sourceUrl?.trim() ?? ""; if (sourceUrl.isEmpty) { return false; } return !_looksLikeEntryEffectResource(sourceUrl) && !_looksLikeEntryEffectResource(resource?.cover ?? ""); } PropsResources? socialChatAvatarFrameProps({ String? id, String? name, String? sourceUrl, String? cover, String? code, }) { final resource = PropsResources( id: id, name: name, code: code, sourceUrl: sourceUrl, cover: cover, type: SCPropsType.AVATAR_FRAME.name, ); return socialChatIsAvatarFrameResource(resource) ? resource : null; } SocialChatUserProfile socialChatProfileWithAvatarFrameResource( SocialChatUserProfile profile, PropsResources? avatarFrame, { String? expireTime, }) { if (!socialChatIsAvatarFrameResource(avatarFrame)) { return profile; } final currentHeaddress = profile.getHeaddress(); if (currentHeaddress != null) { return profile; } final useProps = [ ...?profile.useProps?.where( (item) => !_isAvatarFrameType(item.propsResources?.type), ), UseProps( expireTime: expireTime ?? "4102444800000", propsResources: avatarFrame, userId: profile.id, ), ]; return profile.copyWith(useProps: useProps); } bool _isAvatarFrameType(String? type) { return type?.trim().toUpperCase() == SCPropsType.AVATAR_FRAME.name; } bool _looksLikeEntryEffectResource(String value) { if (value.trim().isEmpty) { return false; } final text = _decodeResourceText(value).toLowerCase(); final entryResourcePattern = RegExp( r'(^|[\/_\-.?=&])(?:entry|entrance|ride|mountain|mountains)([\/_\-.?=&]|$)', ); return entryResourcePattern.hasMatch(text) || text.contains('entryeffect') || text.contains('进场') || text.contains('坐骑'); } String _decodeResourceText(String value) { try { return Uri.decodeFull(value); } catch (_) { return value; } } /// account : "" /// expiredTime : 0 class OwnSpecialId { OwnSpecialId({String? account, num? expiredTime}) { _account = account; _expiredTime = expiredTime; } OwnSpecialId.fromJson(dynamic json) { _account = json['account']; _expiredTime = json['expiredTime']; } String? _account; num? _expiredTime; OwnSpecialId copyWith({String? account, num? expiredTime}) => OwnSpecialId( account: account ?? _account, expiredTime: expiredTime ?? _expiredTime, ); String? get account => _account; num? get expiredTime => _expiredTime; Map toJson() { final map = {}; map['account'] = _account; map['expiredTime'] = _expiredTime; return map; } } /// expireTime : 0 /// releaseTime : 0 /// sign : "" /// sysOrigin : "" /// userId : 0 /// version : "" class SocialChatUserCredential { SocialChatUserCredential({ String? expireTime, String? releaseTime, String? sign, String? sysOrigin, String? userId, String? version, }) { _expireTime = expireTime; _releaseTime = releaseTime; _sign = sign; _sysOrigin = sysOrigin; _userId = userId; _version = version; } SocialChatUserCredential.fromJson(dynamic json) { _expireTime = json['expireTime']; _releaseTime = json['releaseTime']; _sign = json['sign']; _sysOrigin = json['sysOrigin']; _userId = json['userId']; _version = json['version']; } String? _expireTime; String? _releaseTime; String? _sign; String? _sysOrigin; String? _userId; String? _version; SocialChatUserCredential copyWith({ String? expireTime, String? releaseTime, String? sign, String? sysOrigin, String? userId, String? version, }) => SocialChatUserCredential( expireTime: expireTime ?? _expireTime, releaseTime: releaseTime ?? _releaseTime, sign: sign ?? _sign, sysOrigin: sysOrigin ?? _sysOrigin, userId: userId ?? _userId, version: version ?? _version, ); String? get expireTime => _expireTime; String? get releaseTime => _releaseTime; String? get sign => _sign; String? get sysOrigin => _sysOrigin; String? get userId => _userId; String? get version => _version; Map toJson() { final map = {}; map['expireTime'] = _expireTime; map['releaseTime'] = _releaseTime; map['sign'] = _sign; map['sysOrigin'] = _sysOrigin; map['userId'] = _userId; map['version'] = _version; return map; } }