// // KMMemberInfo.swift // PDF Reader Pro // // Created by wanjun on 2024/10/22. // import Cocoa // 用户场景类型 @objc enum KMUserScenarioType : Int { case null = 0 // 默认状态 case lite_type1 // 免费版 未登录 - 无订阅+无AI (右上角导航栏按钮 - “登录领福利” + “升级至Pro”) case lite_type2 // 免费版 未登录 - 无订阅+有AI (右上角导航栏按钮 - “登录领福利” + “升级至Pro”) case lite_type3 // 免费版 未登录 - 有订阅高级版+有AI序列码 (右上角导航栏按钮 - “登录领福利”) case lite_type4 // 免费版 未登录 - 有订阅高级版+无AI序列码 (右上角导航栏按钮 - “登录领福利”) case lite_type5 // 免费版 已登录(未试用过的免费用户+未订阅AI) - 无订阅+无AI旧剩余点数 (右上角导航栏按钮 - 头像 + 立即试用) case lite_type6 // 免费版 已登录(试用到期且未付费用户+未订阅AI) - 无旧订阅+有AI旧剩余点数 (右上角导航栏按钮 - 头像 + 立即续费) case lite_type7 // 免费版 已登录(新的买断会员+有订阅AI) - 无旧订阅+无AI旧剩余点数 (右上角导航栏按钮 - 头像 + 立即升级) case lite_type8 // 免费版 已登录(自动订阅中 + 订阅AI) - 无旧订阅+有AI旧剩余点数 (右上角导航栏按钮 - 头像) case lite_type9 // 免费版 已登录(订阅中但取消续订用户) - 无旧订阅+无AI旧剩余点数 (右上角导航栏按钮 - 头像) case lite_type10 // 免费版 已登录(订阅过期用户) - 无旧订阅+无AI旧剩余点数 (右上角导航栏按钮 - 头像 + 立即续费) case lite_type11 // 免费版 已登录(试用过期用户) - 无旧订阅+无AI旧剩余点数 (右上角导航栏按钮 - 头像 + 立即续费) } @objcMembers class KMMemberInfo: NSObject { static let shared = KMMemberInfo() var isLogin: Bool = false /** 登录 */ private var _refresh_token: String = "" // 刷新Token private var _access_token: String = "" // 访问Token private var _token_type: String = "" // Token 类型 private var _expires_in: String = "" private var _scope: String = "" /** 登录 */ var userID: String = "" // 用户ID var userEmail: String = "" // 用户邮箱 var fullName: String = "" // 用户名称 var _activeVips: [KMMemberUserInfoActiveVIP] = [] // 活跃的会员 var _activeAis: [KMMemberUserInfoActiveVIP] = [] // 活跃的AI var vip_id: String = "" // id var vip_userId: String = "" // 用户id var vip_status: Int = 0 // 状态 0注册1订阅中2订阅过期3试用中4试用过期 var vip_endDate: String = "" // 到期时间 var vip_payType: Int = 0 // 0未开启自动续订 1自动续订 var vip_productName: String = "" // 产品名字 var vip_levels: String = "" // 会员等级 1是免费 2是标准 3是高级 var vip_platforms: String = "" // 支持的平台 var vip_point: Int = 0 // 剩余ai点数(svip才有) var vip_maxDeviceNum: Int = 0 // 最大登录设备限制数 var vip_paymentModel: String = "" // 支付方式 付费模式(1自动续订(vip svip) 2单次付费(永久会员)) var vip_isAi: String = "" // 是否是ai产品(0否1是) var vip_cycle: Int = 0 // 订阅周期:1、月(30天);2、季(90天);3、半年(183天);4、年(365天) var ai_id: String = "" // id var ai_userId: String = "" // 用户id var ai_status: Int = 0 // 状态 0注册1订阅中2订阅过期3试用中4试用过期 var ai_endDate: String = "" // 到期时间 var ai_payType: Int = 0 // 0未开启自动续订 1自动续订 var ai_productName: String = "" // 产品名字 var ai_levels: String = "" // 会员等级 1是免费 2是标准 3是高级 var ai_platforms: String = "" // 支持的平台 var ai_point: Int = 0 // 剩余ai点数(svip才有) var ai_maxDeviceNum: Int = 0 // 最大登录设备限制数 var ai_paymentModel: String = "" // 支付方式 付费模式(1自动续订(vip svip) 2单次付费(永久会员)) var ai_isAi: String = "" // 是否是ai产品(0否1是) var ai_cycle: Int = 0 // 订阅周期:1、月(30天);2、季(90天);3、半年(183天);4、年(365天) var aiPoint: Int = 0 // AI 点数 var validFlag: String = "" // 注销(0), * 正常(1), * 停用(2), * 注销中(5); var isHaveAIDiscount: String = "" // 是否有ai折扣 var canTrail: Bool = false // 是否能试用 // var currentTime: String = "" // 当前注销时间 // var logOffTime: String = "" // 注销时间 // MARK: Get & Set var refresh_token: String { get { let token = UserDefaults.standard.value(forKey: "MemberRefreshToken") if token is String { return token as! String } return _refresh_token } set { _refresh_token = newValue UserDefaults.standard.setValue(newValue, forKey: "MemberRefreshToken") UserDefaults.standard.synchronize() } } var access_token: String { get { let token = UserDefaults.standard.value(forKey: "MemberAccessToken") if token is String { return token as! String } return _access_token } set { _access_token = newValue UserDefaults.standard.setValue(newValue, forKey: "MemberAccessToken") UserDefaults.standard.synchronize() } } var token_type: String { get { return _token_type } set { _token_type = newValue } } var activeVips: [KMMemberUserInfoActiveVIP] { get { return _activeVips } set { _activeVips = newValue for vip in _activeVips { if vip_levels == "" { vip_id = vip.id vip_userId = vip.userId vip_status = vip.status vip_endDate = vip.endDate vip_payType = vip.payType vip_productName = vip.productName vip_levels = vip.levels vip_platforms = vip.platforms vip_point = vip.point vip_maxDeviceNum = vip.maxDeviceNum vip_paymentModel = vip.paymentModel vip_isAi = vip.isAi vip_cycle = vip.cycle } else { if let vipLevelsInt = Int(vip_levels), let vipOtherLevelsInt = Int(vip.levels), vipLevelsInt < vipOtherLevelsInt { vip_id = vip.id vip_userId = vip.userId vip_status = vip.status vip_endDate = vip.endDate vip_payType = vip.payType vip_productName = vip.productName vip_levels = vip.levels vip_platforms = vip.platforms vip_point = vip.point vip_maxDeviceNum = vip.maxDeviceNum vip_paymentModel = vip.paymentModel vip_isAi = vip.isAi vip_cycle = vip.cycle } } } } } var activeAis: [KMMemberUserInfoActiveVIP] { get { return _activeAis } set { _activeAis = newValue for vip in _activeAis { if ai_levels == "" { ai_id = vip.id ai_userId = vip.userId ai_status = vip.status ai_endDate = vip.endDate ai_payType = vip.payType ai_productName = vip.productName ai_levels = vip.levels ai_platforms = vip.platforms ai_point = vip.point ai_maxDeviceNum = vip.maxDeviceNum ai_paymentModel = vip.paymentModel ai_isAi = vip.isAi ai_cycle = vip.cycle } else { if let vipLevelsInt = Int(ai_levels), let vipOtherLevelsInt = Int(vip.levels), vipLevelsInt < vipOtherLevelsInt { ai_id = vip.id ai_userId = vip.userId ai_status = vip.status ai_endDate = vip.endDate ai_payType = vip.payType ai_productName = vip.productName ai_levels = vip.levels ai_platforms = vip.platforms ai_point = vip.point ai_maxDeviceNum = vip.maxDeviceNum ai_paymentModel = vip.paymentModel ai_isAi = vip.isAi ai_cycle = vip.cycle } } } } } // 用户当前的状态 var userScenarioType: KMUserScenarioType { get { let oldAIPoints = AIInfoManager.default().aiInfo.totalToken - AIInfoManager.default().aiInfo.usedTimes // 旧版AI点数 #if VERSION_FREE #if VERSION_DMG // DMG if KMMemberInfo.shared.isLogin { } else { } #else // AppStore 免费版本 if KMMemberInfo.shared.isLogin { if KMMemberInfo.shared.canTrail && KMMemberInfo.shared.ai_productName == "" && !IAPProductsManager.default().isAvailableAllFunction() && !AIInfoManager.default().aiInfoValid { /** 1、临时邮箱已注册成新账户,未试用过,也未订阅AI;2、APP中已登录该账户;3、未升级APP前,未订阅高级功能也未购买AI点数 */ return .lite_type5 // 已登录(未试用过的免费用户+未订阅AI) - 无订阅+无AI旧剩余点数 } else if KMMemberInfo.shared.vip_status == 3 && !IAPProductsManager.default().isAvailableAllFunction() && oldAIPoints > 0 { /** 1、临时邮箱已注册成新账户,试用中试用到期且未付费;2、APP中已登录该账户;3、未升级APP前,未订阅高级功能,有AI旧剩余点数 */ return .lite_type6 // 已登录(试用到期且未付费用户+未订阅AI) - 无旧订阅+有AI旧剩余点数 } else if KMMemberInfo.shared.vip_levels == "3" && KMMemberInfo.shared.vip_paymentModel == "2" && KMMemberInfo.shared.vip_maxDeviceNum == 2 { /** 1、临时邮箱已注册成新账户,已付费Mac&Windows双平台高级版永久版;2、APP中已登录该账户;3、未升级APP前,未订阅高级功能也未购买AI点数 */ return .lite_type7 // 已登录(新的买断会员+有订阅AI) - 无旧订阅+无AI旧剩余点数 } else if KMMemberInfo.shared.vip_status == 3 && KMMemberInfo.shared.vip_payType == 1 { /** 1、临时邮箱已注册成新账户,试用高级版年订阅并自动订阅中;2、APP中已登录该账户;3、未升级APP前,未订阅高级功能,但有购买AI,有剩余点数 */ return .lite_type8 // 已登录(自动订阅中 + 订阅AI) - 无旧订阅+有AI旧剩余点数 } else if KMMemberInfo.shared.vip_levels == "2" && KMMemberInfo.shared.vip_cycle == 4 && KMMemberInfo.shared.vip_paymentModel == "1" && KMMemberInfo.shared.vip_payType == 0 { /** 1、临时邮箱已注册成新账户,已付费标准版年订阅并取消续订;2、APP中已登录该账户;3、未升级APP前,未订阅高级功能也未购买AI点数 */ return .lite_type9 // 已登录(订阅中但取消续订用户) - 无旧订阅+无AI旧剩余点数 } else if KMMemberInfo.shared.vip_levels == "2" && KMMemberInfo.shared.vip_paymentModel == "2" && KMMemberInfo.shared.vip_cycle == 4 && KMMemberInfo.shared.vip_status == 2 { /** 1、临时邮箱已注册成新账户,已订阅标准版年订阅过期;2、APP中已登录该账户;3、未升级APP前,未订阅高级功能也未购买AI点数 */ return .lite_type10 // 已登录(订阅过期用户) - 无旧订阅+无AI旧剩余点数 } else if KMMemberInfo.shared.vip_status == 4 && KMMemberInfo.shared.vip_levels == "1" { /** 1、临时邮箱已注册成新账户,已试用高级版年订阅并取消续订,当前试用过期;2、APP中已登录该账户;3、未升级APP前,未订阅高级功能也未购买AI点数 */ return .lite_type11 // 已登录(试用过期用户) - 无旧订阅+无AI旧剩余点数 } } else { if IAPProductsManager.default().isAvailableAllFunction() { if AIInfoManager.default().aiInfoValid { return .lite_type3 // 未登录 - 有订阅高级版+有AI序列码 } else { return .lite_type4 // 未登录 - 有订阅高级版+无AI序列码 } } else { if AIInfoManager.default().aiInfoValid { return .lite_type2 // 未登录 - 无订阅 - 有AI } else { return .lite_type1 // 未登录 - 无订阅 - 无AI } } } #endif #else // AppStore 付费版 if KMMemberInfo.shared.isLogin { } else { } #endif return .null } } // 是否允许全部功能 var isMemberAllFunction: Bool { get { if KMMemberInfo.shared.isLogin { if userScenarioType == .lite_type7 || userScenarioType == .lite_type8 || userScenarioType == .lite_type9 { return true } return false } else { if IAPProductsManager.default().isAvailableAllFunction() { return true } return false } } } // 是否允许使用转档 var isPermitConvert: Bool { if KMMemberInfo.shared.isLogin { if userScenarioType == .lite_type7 || userScenarioType == .lite_type8 { return true } return false } else { if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() { return true } return false } } // 是否允许使用AI var isPermitAI: Bool { let oldAIPoints = AIInfoManager.default().aiInfo.totalToken - AIInfoManager.default().aiInfo.usedTimes // 旧版AI点数 if KMMemberInfo.shared.isLogin { if oldAIPoints > 0 { return true } else { if userScenarioType == .lite_type6 || userScenarioType == .lite_type7 || userScenarioType == .lite_type8 { if KMMemberInfo.shared.aiPoint > 0 { return true } else { return false } } return false } } else { if AIInfoManager.default().aiInfoValid && oldAIPoints > 0 { return true } return false } } // MARK: Public Method func memberUserInfo(model: KMMemberUserInfo) -> Void { userID = model.id userEmail = model.email fullName = model.fullName aiPoint = model.aiPoint validFlag = model.validFlag isHaveAIDiscount = model.isHaveAIDiscount if model.canTrail == "1" { canTrail = true } else { canTrail = false } activeVips = model.activeVIP activeAis = model.activeAI } func advancedFunctionUsage() -> Void { if userScenarioType == .lite_type1 || userScenarioType == .lite_type2 { if KMMemberInfo.shared.isLogin { KMProductCompareWC.shared.orientation = true KMProductCompareWC.shared.orientationType = .trial KMProductCompareWC.shared.showWindow(nil) } else { KMLoginWindowsController.shared.openWindow() { success in if success { KMProductCompareWC.shared.orientation = true KMProductCompareWC.shared.orientationType = .trial KMProductCompareWC.shared.showWindow(nil) } } } } else if userScenarioType == .lite_type3 || userScenarioType == .lite_type4 { } else if userScenarioType == .lite_type5 { KMProductCompareWC.shared.orientation = true KMProductCompareWC.shared.orientationType = .trial KMProductCompareWC.shared.showWindow(nil) } else if userScenarioType == .lite_type6 { KMProductCompareWC.shared.orientation = true KMProductCompareWC.shared.orientationType = .lite_Base KMProductCompareWC.shared.showWindow(nil) } else if userScenarioType == .lite_type7 || userScenarioType == .lite_type8 || userScenarioType == .lite_type9 { } else if userScenarioType == .lite_type10 || userScenarioType == .lite_type11 { KMProductCompareWC.shared.orientation = true KMProductCompareWC.shared.orientationType = .lite_Base KMProductCompareWC.shared.showWindow(nil) } } func aiSubscription() -> Void { } }