|
@@ -0,0 +1,140 @@
|
|
|
+//
|
|
|
+// TSPurchaseManager+Judge.swift
|
|
|
+// AIEmoji
|
|
|
+//
|
|
|
+// Created by 100Years on 2025/8/1.
|
|
|
+//
|
|
|
+
|
|
|
+extension TSNeURLType {
|
|
|
+
|
|
|
+ var needValidate : Bool {
|
|
|
+ return validateURLTypeList.contains(self)
|
|
|
+ }
|
|
|
+ //判断是否是生成视频,每次新增类型,必须配置
|
|
|
+ var isVideo:Bool{
|
|
|
+ switch self {
|
|
|
+ case .createVideo,.videoV2,.photoAnimation,.text2Video,.img2video:
|
|
|
+ return true
|
|
|
+ default:
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //对应的 生成次数限制,每次新增类型,必须配置
|
|
|
+ var vipFreeNumType:VipFreeNumType {
|
|
|
+ isVideo ? .videoV2 : .aiGenerate
|
|
|
+ }
|
|
|
+
|
|
|
+ ///需要进行次数验证的接口,每次新增生成接口,必须配置
|
|
|
+ var validateURLTypeList : [TSNeURLType] {
|
|
|
+ [.textPicCreate,
|
|
|
+ .upload,
|
|
|
+ .imageRewrite,
|
|
|
+ .changeAge,
|
|
|
+ .subscriptionApple,
|
|
|
+ .changeEmotion,
|
|
|
+ .changeHair,
|
|
|
+ .imageRestore,
|
|
|
+ .eyeOpen,
|
|
|
+ .pretty,
|
|
|
+ .photoAnimation,
|
|
|
+ .photoExpand,
|
|
|
+ .overResolution,
|
|
|
+ .changeClothes,
|
|
|
+ .createVideo,
|
|
|
+ .videoV2,
|
|
|
+ .text2Video,
|
|
|
+ .img2video,
|
|
|
+ ]
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+extension VipFreeNumType {
|
|
|
+ var isVideo:Bool{
|
|
|
+ switch self {
|
|
|
+ case .videoV2:
|
|
|
+ return true
|
|
|
+ default:
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ static var videoType:VipFreeNumType{
|
|
|
+ return .videoV2
|
|
|
+ }
|
|
|
+}
|
|
|
+extension TSFuncStyle {
|
|
|
+ //对应的 生成次数限制,每次新增类型,必须配置
|
|
|
+ var vipFreeNumType:VipFreeNumType{
|
|
|
+ switch self {
|
|
|
+ case .videoV2,.photoLive,.futureBaby,.textToVideo,.pictureToVideo:
|
|
|
+ return .videoV2
|
|
|
+ default:
|
|
|
+ return .aiGenerate
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+extension PurchaseManager {
|
|
|
+
|
|
|
+ func getDayGeneratedNum(type: VipFreeNumType) -> VipFreeNumType{
|
|
|
+ if type.isVideo {
|
|
|
+ return VipFreeNumType.videoType
|
|
|
+ }else{
|
|
|
+ return .aiGenerate
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断视频是否超出限制
|
|
|
+ func judgeVideoV2ExceedLimit(vipFreeNumType:VipFreeNumType) -> Bool{
|
|
|
+ if vipFreeNumType.isVideo {
|
|
|
+ return isExceedsVipGeneratedNum(vipFreeNumType:VipFreeNumType.videoType)
|
|
|
+ }
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ func judgeUsedNumType(vipFreeNumType:VipFreeNumType,completion: @escaping (Any?, Error?) -> Void) -> Bool{
|
|
|
+ ///需要校验,是否超出了 vip 生成的次数,且需要判断是否超过最大次数
|
|
|
+ if judgeVideoV2ExceedLimit(vipFreeNumType: vipFreeNumType) {
|
|
|
+ completion(nil,NSError(domain: "", code: TSNetWorkCode.generateToMax.rawValue))
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ ///需要校验。且需要判断是否超过每天生成的最大次数
|
|
|
+ if PurchaseManager.default.isExceedsDayGeneratedNum(vipFreeNumType: vipFreeNumType) {
|
|
|
+ completion(nil,NSError(domain: "", code: TSNetWorkCode.generateTooMuch.rawValue))
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ func judgeUsedNumUrlType(urlType:TSNeURLType,completion:@escaping (Result<Any, Error>) -> Void) -> Bool{
|
|
|
+ let vipFreeNumType:VipFreeNumType = urlType.isVideo ? VipFreeNumType.videoType : .aiGenerate
|
|
|
+ ///需要校验,是否超出了 vip 生成的次数,且需要判断是否超过最大次数
|
|
|
+ if urlType.needValidate,judgeVideoV2ExceedLimit(vipFreeNumType: vipFreeNumType) {
|
|
|
+ completion(.failure(NSError(domain: "", code: TSNetWorkCode.generateToMax.rawValue)))
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ ///需要校验。且需要判断是否超过最大次数
|
|
|
+ if urlType.needValidate,PurchaseManager.default.isExceedsDayGeneratedNum(vipFreeNumType: vipFreeNumType) {
|
|
|
+ completion(.failure(NSError(domain: "", code: TSNetWorkCode.generateTooMuch.rawValue)))
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断试用的视频次数,是否超出了最大数量,如果超出,提示用户购买加油宝
|
|
|
+ func judgePurchaseVideoPackage(vipFreeNumType:VipFreeNumType,target:UIViewController) -> Bool{
|
|
|
+ ///需要校验,是否超出了 vip 生成的次数,且需要判断是否超过最大次数
|
|
|
+ if judgeVideoV2ExceedLimit(vipFreeNumType: vipFreeNumType) {
|
|
|
+ kPresentModalVC(target: target, modelVC: TSPurchaseVideoTimesVC(isShowAlertModel: true),transitionStyle:.crossDissolve)
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ return false
|
|
|
+ }
|
|
|
+}
|