import 'package:guru_app/database/guru_db.dart'; import 'package:guru_app/financial/asset/assets_model.dart'; import 'package:guru_app/financial/asset/assets_store.dart'; import 'package:guru_app/financial/data/db/order_database.dart'; import 'package:guru_app/financial/manifest/manifest_manager.dart'; import 'package:guru_app/financial/product/product_model.dart'; import 'package:guru_app/financial/reward/reward_model.dart'; import 'package:guru_app/guru_app.dart'; import 'package:guru_utils/extensions/extensions.dart'; /// Created by Haoyi on 2023/2/13 class RewardManager { static final RewardManager _instance = RewardManager._(); static RewardManager get instance => _instance; RewardManager._(); final BehaviorSubject> _assetsStoreSubject = BehaviorSubject.seeded(AssetsStore.inactive()); AssetsStore get rewardedStore => _assetsStoreSubject.value; Stream> get observableAssetStore => _assetsStoreSubject.stream; Future init() async { await reloadAssets(); } Future reloadAssets() async { final transactions = await GuruDB.instance.selectOrders( method: TransactionMethod.reward, attrs: [TransactionAttributes.asset]); final newAssetsStore = AssetsStore(); for (var transaction in transactions) { final productId = transaction.productId; Log.v("init [Rewards] transaction:${transaction.sku} $productId"); newAssetsStore.addAsset(Asset(productId, transaction)); } _assetsStoreSubject.addEx(newAssetsStore); } Future buildRewardProduct(TransactionIntent intent) async { final manifest = await ManifestManager.instance.createManifest(intent); return RewardProduct(intent.productId, manifest); } Future claim(RewardProduct product, {String from = ""}) async { Log.v("rewarded"); // 如果得到的奖励是可消耗的物品(金币,Joker等),这里将直接领取成功 if (product.productId.isConsumable) { ManifestManager.instance.deliver(product.manifest, TransactionMethod.reward); return true; } final order = product.createOrder(); final result = await GuruDB.instance.upsertOrder(order: order).catchError((error, stacktrace) { Log.v("refreshTransaction error!$error $stacktrace"); return false; }); if (result) { final newAssetsStore = rewardedStore.clone(); newAssetsStore.addAsset(Asset(product.productId, order)); _assetsStoreSubject.addEx(newAssetsStore); } ManifestManager.instance.deliver(product.manifest, TransactionMethod.reward); return result; } }