| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  | using System; | 
					
						
							|  |  |  | using System.Collections; | 
					
						
							|  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  | using System.Linq; | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  | using GoogleMobileAds.Common; | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  | using JetBrains.Annotations; | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  | using KwaiAds.Scripts.Api.Interstitial; | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  | using KwaiAds.Scripts.Api.Reward; | 
					
						
							|  |  |  | using UnityEngine; | 
					
						
							|  |  |  | using static WZ.KwaiAdsConfigParser; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace WZ | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |     public class KwaiFloorIvManager : D_MonoSingleton<KwaiFloorIvManager> | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |         private int _ivParallelRequests = 3; | 
					
						
							|  |  |  |         private List<FloorConfig> _ivFloorConfigs = new List<FloorConfig>(); | 
					
						
							|  |  |  |         public Dictionary<string, IInterstitialAdController> _ivFloorAdControllers = new Dictionary<string, IInterstitialAdController>(); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |         private List<FloorConfig> _sortedFloors = new List<FloorConfig>(); | 
					
						
							|  |  |  |         private int _currentFloorIndex = 0; | 
					
						
							|  |  |  |         private bool _isRequestingFloors = false; | 
					
						
							|  |  |  |         private List<FloorConfig> _currentRequestBatch = new List<FloorConfig>(); | 
					
						
							|  |  |  |         private FloorConfig _successfulFloor = null; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |         public float _ivStartLoadTime = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |         public void InitializeWithFloors() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // 对楼层按价格从高到低排序 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             _sortedFloors = _ivFloorConfigs.OrderByDescending(f => f.price).ToList(); | 
					
						
							|  |  |  |             LoggerUtils.Debug("[kwai] floor inter Sorted floors: " + string.Join(", ", _sortedFloors.Select(f => $"{f.id}:{f.price}"))); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public void LoadKwaiBiddingConfig() | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             _ivParallelRequests = KwaiAdsConfigParser.GetIvParallelRequests(); | 
					
						
							|  |  |  |             _ivFloorConfigs = KwaiAdsConfigParser.GetIvFloorConfigs(); | 
					
						
							|  |  |  |             LoggerUtils.Debug($"[kwai] floor inter  bidding config loaded. FloorOpen: {KwaiAdsConfigParser.GetKwaiIvFloorOpen()}, ParallelRequests: {_ivParallelRequests}, Floors: {_ivFloorConfigs.Count}"); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |         public void LoadInterstitialWithFloors() | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             if (_ivFloorConfigs == null || _ivFloorConfigs.Count == 0) | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |                 LoggerUtils.Debug("[kwai] floor inter No floor configs available, using standard load"); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |                 KwaiAdsManager.Instance.LoadRewardedStandard(); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             _ivStartLoadTime = Time.realtimeSinceStartup; | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |             // 重置状态 | 
					
						
							|  |  |  |             _currentFloorIndex = 0; | 
					
						
							|  |  |  |             _successfulFloor = null; | 
					
						
							|  |  |  |             _isRequestingFloors = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // 清理之前的广告控制器 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             foreach (var controller in _ivFloorAdControllers.Values) | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |             { | 
					
						
							|  |  |  |                 controller.Destroy(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             _ivFloorAdControllers.Clear(); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // 开始请求楼层广告 | 
					
						
							|  |  |  |             RequestNextFloorBatch(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void RequestNextFloorBatch() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (!_isRequestingFloors || _successfulFloor != null) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // 获取下一批要请求的楼层 | 
					
						
							|  |  |  |             _currentRequestBatch = new List<FloorConfig>(); | 
					
						
							|  |  |  |             int count = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             while (_currentFloorIndex < _sortedFloors.Count && count < _ivParallelRequests) | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |             { | 
					
						
							|  |  |  |                 _currentRequestBatch.Add(_sortedFloors[_currentFloorIndex]); | 
					
						
							|  |  |  |                 _currentFloorIndex++; | 
					
						
							|  |  |  |                 count++; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (_currentRequestBatch.Count == 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 // 所有楼层都请求完毕,没有填充 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |                 LoggerUtils.Debug("[kwai] floor inter All floors requested, no fill"); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |                 _isRequestingFloors = false; | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             LoggerUtils.Debug($"[kwai] floor inter Requesting floor batch: {string.Join(", ", _currentRequestBatch.Select(f => $"{f.id}({f.price})"))}"); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // 并行请求当前批次的楼层 | 
					
						
							|  |  |  |             foreach (var floor in _currentRequestBatch) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 RequestFloorAd(floor); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void RequestFloorAd(FloorConfig floor) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             IInterstitialAdController controller = KwaiAds.Scripts.Api.KwaiAdsSdk.SDK.getInterstitialAdController();; | 
					
						
							|  |  |  |             _ivFloorAdControllers[floor.id] = controller; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             KwaiInterstitialAdRequest kwaiInterstitialAdRequest = new KwaiInterstitialAdRequest(floor.unite_id); | 
					
						
							|  |  |  |             controller.Load(kwaiInterstitialAdRequest, | 
					
						
							|  |  |  |                 new FloorInterAdListener(this, floor), | 
					
						
							|  |  |  |                 new FloorInterAdLoadListener(this, floor)); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // 处理楼层广告加载成功 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |         public void OnFloorAdLoaded(FloorConfig floor, IInterstitialAdController controller) | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             if (!_isRequestingFloors || _successfulFloor != null) return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             LoggerUtils.Debug($"[kwai] floor inter Floor ad loaded: {floor.id} with price: {floor.price}"); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // 暂停其他并行请求 | 
					
						
							|  |  |  |             _successfulFloor = floor; | 
					
						
							|  |  |  |             _isRequestingFloors = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // 取消其他楼层的请求 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             foreach (var kvp in _ivFloorAdControllers) | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |             { | 
					
						
							|  |  |  |                 if (kvp.Key != floor.id) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     kvp.Value.Destroy(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // 处理楼层广告加载失败 | 
					
						
							|  |  |  |         public void OnFloorAdFailed(FloorConfig floor, string error) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (!_isRequestingFloors || _successfulFloor != null) return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |             LoggerUtils.Debug($"[kwai] floor inter Floor ad failed: {floor.id} with error: {error}"); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // 检查当前批次是否全部失败 | 
					
						
							|  |  |  |             bool allFailedInBatch = true; | 
					
						
							|  |  |  |             foreach (var f in _currentRequestBatch) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (f.id == floor.id) continue; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |                 if (_ivFloorAdControllers.ContainsKey(f.id) && | 
					
						
							|  |  |  |                     _ivFloorAdControllers[f.id] != null && | 
					
						
							|  |  |  |                     _ivFloorAdControllers[f.id].IsReady()) | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |                 { | 
					
						
							|  |  |  |                     allFailedInBatch = false; | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // 如果当前批次全部失败,请求下一批 | 
					
						
							|  |  |  |             if (allFailedInBatch) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 RequestNextFloorBatch(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |         public bool IsInterstitialAdAvailable() | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             return _successfulFloor != null && | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |                     _ivFloorAdControllers.ContainsKey(_successfulFloor.id) && | 
					
						
							|  |  |  |                     _ivFloorAdControllers[_successfulFloor.id] != null && | 
					
						
							|  |  |  |                     _ivFloorAdControllers[_successfulFloor.id].IsReady(); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |         public void ShowInterstitialAd(Action _action) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |             if (_successfulFloor != null && | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |                     _ivFloorAdControllers.ContainsKey(_successfulFloor.id) && | 
					
						
							|  |  |  |                     _ivFloorAdControllers[_successfulFloor.id] != null) | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-09-15 05:58:43 +00:00
										 |  |  |                 _ivFloorAdControllers[_successfulFloor.id].Show(); | 
					
						
							| 
									
										
										
										
											2025-09-15 02:19:03 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 _action?.Invoke(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |