| using LitJson; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
|   | 
|   | 
| namespace vnxbqy.UI | 
| { | 
|      | 
|     public class ActivitiesPushModel : Model, IBeforePlayerDataInitialize, IAfterPlayerDataInitialize, IPlayerLoginOk | 
|     { | 
|         public const int WholePeopleRankStart = 2091000; //全民冲榜开始 | 
|         public const int WholePeopleRankEnd = 20910000; //全民冲榜截止 | 
|         public const int FlashRushToBuy = 209014; //限时抢购 | 
|         ImpactRankModel impactRank { get { return ModelCenter.Instance.GetModel<ImpactRankModel>(); } } | 
|         FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } } | 
|   | 
|         private List<int> rankTypelist = new List<int>(); | 
|   | 
|         public override void Init() | 
|         { | 
|             List<OSCBillRankAwardConfig> configs = OSCBillRankAwardConfig.GetValues(); | 
|             for (int i = 0; i < configs.Count; i++) | 
|             { | 
|                 if (!rankTypelist.Contains(configs[i].RangListType)) | 
|                 { | 
|                     rankTypelist.Add(configs[i].RangListType); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         public void OnBeforePlayerDataInitialize() | 
|         { | 
|             rushToBuyModel.UpdateAllAppointmentEvent -= UpdateAllAppointment; | 
|             rushToBuyModel.UpdateAppointmentEvent -= UpdateAppointment; | 
|             GlobalTimeEvent.Instance.minuteEvent -= RefreshMinuteTime; | 
|             OpenServerActivityCenter.Instance.openServerActivityStateChange -= RefreshOpenServerState; | 
|         } | 
|   | 
|         public void OnAfterPlayerDataInitialize() | 
|         { | 
|   | 
|         } | 
|   | 
|         public void OnPlayerLoginOk() | 
|         { | 
|             SetRankStartPushInfo(); | 
|             SetRankEndPushInfo(); | 
|             SetFlashRushToBuyAppointmentInfo(); | 
|             GlobalTimeEvent.Instance.minuteEvent += RefreshMinuteTime; | 
|             OpenServerActivityCenter.Instance.openServerActivityStateChange += RefreshOpenServerState; | 
|             rushToBuyModel.UpdateAllAppointmentEvent += UpdateAllAppointment; | 
|             rushToBuyModel.UpdateAppointmentEvent += UpdateAppointment; | 
|         } | 
|   | 
|         public override void UnInit() | 
|         { | 
|   | 
|         } | 
|   | 
|   | 
|         private void RefreshMinuteTime() | 
|         { | 
|             RemovePushByTime(PushInfoType.RankStart, 11); | 
|             RemovePushByTime(PushInfoType.RankEnd, 23); | 
|             RemoveFlashRushToBuyAppointmentByTime(); | 
|         } | 
|   | 
|         private void RefreshOpenServerState() | 
|         { | 
|             SetRankStartPushInfo(); | 
|             SetRankEndPushInfo(); | 
|             RemovePushByActiveClose(PushInfoType.RankStart); | 
|             RemovePushByActiveClose(PushInfoType.RankEnd); | 
|             SetFlashRushToBuyAppointmentInfo(); | 
|         } | 
|   | 
|         #region 开服活动冲榜推送 | 
|         private void SetRankStartPushInfo() | 
|         { | 
|             return; | 
|             for (int i = 0; i < rankTypelist.Count; i++) | 
|             { | 
|                 int rankStartId = WholePeopleRankStart + rankTypelist[i]; | 
|                 if (impactRank.IsActivityClose(rankTypelist[i])) | 
|                 { | 
|                     RemovePushInfo(rankStartId); | 
|                 } | 
|                 else | 
|                 { | 
|                     int day = impactRank.GetOpenDay(rankTypelist[i]); | 
|                     int remainHour = 11 - TimeUtility.ServerNow.Hour; | 
|                     int remainMinute = 0 - TimeUtility.ServerNow.Minute; | 
|                     int remainSecond = day * 24 * 60 * 60 + remainHour * 60 * 60 + remainMinute * 60; | 
|                     if (remainSecond > 0) | 
|                     { | 
|                         RankType rankType = impactRank.GetRankType(rankTypelist[i]); | 
|                         string rankName = StringUtility.Contact("OSCBillRankTitle_", rankType); | 
|                         SendPushInfo(GetPushJsonData(rankStartId, remainSecond, Language.Get("SetUpPrivate106"), Language.Get("SetUpPrivate107", Language.Get(rankName)))); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|   | 
|         private void SetRankEndPushInfo() | 
|         { | 
|             return; | 
|             for (int i = 0; i < rankTypelist.Count; i++) | 
|             { | 
|                 int rankEndId = WholePeopleRankEnd + rankTypelist[i]; | 
|                 if (impactRank.IsActivityClose(rankTypelist[i])) | 
|                 { | 
|                     RemovePushInfo(rankEndId); | 
|                 } | 
|                 else | 
|                 { | 
|                     int day = impactRank.GetSurplusDay(rankTypelist[i]); | 
|                     int remainHour = 23 - TimeUtility.ServerNow.Hour; | 
|                     int remainMinute = 0 - TimeUtility.ServerNow.Minute; | 
|                     int remainSecond = (day - 1) * 24 * 60 * 60 + remainHour * 60 * 60 + remainMinute * 60; | 
|                     if (remainSecond > 0) | 
|                     { | 
|                         RankType rankType = impactRank.GetRankType(rankTypelist[i]); | 
|                         string rankName = StringUtility.Contact("OSCBillRankTitle_", rankType); | 
|                         SendPushInfo(GetPushJsonData(rankEndId, remainSecond, Language.Get("SetUpPrivate106"), Language.Get("SetUpPrivate108", Language.Get(rankName)))); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|   | 
|         private void RemovePushByActiveClose(PushInfoType type) | 
|         { | 
|             return; | 
|             switch (type) | 
|             { | 
|                 case PushInfoType.RankStart: | 
|                     for (int i = 0; i < rankTypelist.Count; i++) | 
|                     { | 
|                         int rankStartId = WholePeopleRankStart + rankTypelist[i]; | 
|                         if (impactRank.IsActivityClose(rankTypelist[i])) | 
|                         { | 
|                             RemovePushInfo(rankStartId); | 
|                         } | 
|                     } | 
|                     break; | 
|                 case PushInfoType.RankEnd: | 
|                     for (int i = 0; i < rankTypelist.Count; i++) | 
|                     { | 
|                         int rankEndId = WholePeopleRankEnd + rankTypelist[i]; | 
|                         if (impactRank.IsActivityClose(rankTypelist[i])) | 
|                         { | 
|                             RemovePushInfo(rankEndId); | 
|                         } | 
|                     } | 
|                     break; | 
|             } | 
|         } | 
|   | 
|         private void RemovePushByTime(PushInfoType type, int time) | 
|         { | 
|             return; | 
|             int remainHour = time - TimeUtility.ServerNow.Hour; | 
|             int remainMinute = 0 - TimeUtility.ServerNow.Minute; | 
|             int remainSecond = remainHour * 60 * 60 + remainMinute * 60; | 
|             switch (type) | 
|             { | 
|                 case PushInfoType.RankStart: | 
|                     for (int i = 0; i < rankTypelist.Count; i++) | 
|                     { | 
|                         int rankStartId = WholePeopleRankStart + rankTypelist[i]; | 
|                         if (!impactRank.IsActivityClose(rankTypelist[i])) | 
|                         { | 
|                             int day = impactRank.GetOpenDay(rankTypelist[i]); | 
|                             if (day <= 0 && remainSecond <= 120) | 
|                             { | 
|                                 RemovePushInfo(rankStartId); | 
|                             } | 
|                         } | 
|                     } | 
|                     break; | 
|                 case PushInfoType.RankEnd: | 
|                     for (int i = 0; i < rankTypelist.Count; i++) | 
|                     { | 
|                         int rankEndId = WholePeopleRankEnd + rankTypelist[i]; | 
|                         if (!impactRank.IsActivityClose(rankTypelist[i])) | 
|                         { | 
|                             int day = impactRank.GetSurplusDay(rankTypelist[i]); | 
|                             if (day <= 1 && remainSecond <= 120) | 
|                             { | 
|                                 RemovePushInfo(rankEndId); | 
|                             } | 
|                         } | 
|                     } | 
|                     break; | 
|             } | 
|         } | 
|         #endregion | 
|   | 
|         #region 限时抢购推送 | 
|         private void UpdateAllAppointment() | 
|         { | 
|             SetFlashRushToBuyAppointmentInfo(); | 
|         } | 
|   | 
|         private void UpdateAppointment(int shopGuid) | 
|         { | 
|             return; | 
|             if (!rushToBuyModel.IsOpen) return; | 
|   | 
|             var operation = rushToBuyModel.GetOperationFlashRushToBuy(); | 
|             int pushId = FlashRushToBuy * 10 + shopGuid; | 
|             OperationFlashRushToBuy.FlashSaleItem saleItem; | 
|             OperationFlashRushToBuy.FlashSaleShop saleShop; | 
|             bool isSaleItem = operation.TryGetFlashItem(shopGuid, out saleShop, out saleItem); | 
|             if (isSaleItem) | 
|             { | 
|                 if (saleItem.isAppointment != 1) | 
|                 { | 
|                     RemovePushInfo(pushId); | 
|                 } | 
|                 else | 
|                 { | 
|                     int seconds = 0; | 
|                     int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow, saleShop.dayIndex, saleShop.timeIndex, out seconds); | 
|                     if (seconds > 800) | 
|                     { | 
|                         int remainSecond = seconds - 600; | 
|                         SendPushInfo(GetPushJsonData(pushId, remainSecond, Language.Get("buymail1"), Language.Get("buymail2"))); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|   | 
|         private void SetFlashRushToBuyAppointmentInfo() | 
|         { | 
|             return; | 
|             if (!rushToBuyModel.IsOpen) return; | 
|   | 
|             var operation = rushToBuyModel.GetOperationFlashRushToBuy(); | 
|             for (int i = 0; i < operation.flashShops.Count; i++) | 
|             { | 
|                 var flashShop = operation.flashShops[i]; | 
|                 int seconds = 0; | 
|                 int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow, flashShop.dayIndex, flashShop.timeIndex, out seconds); | 
|                 var saleItems = operation.flashShops[i].items; | 
|                 for (int j = 0; j < saleItems.Length; j++) | 
|                 { | 
|                     int pushId = FlashRushToBuy * 10 + saleItems[j].shopGuid; | 
|                     if (buyState == -1 && seconds > 800 && saleItems[j].isAppointment == 1) | 
|                     { | 
|                         int remainSecond = seconds - 600; | 
|                         SendPushInfo(GetPushJsonData(pushId, remainSecond, Language.Get("buymail1"), Language.Get("buymail2"))); | 
|                     } | 
|                     else | 
|                     { | 
|                         RemovePushInfo(pushId); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|   | 
|         private void RemoveFlashRushToBuyAppointmentByTime() | 
|         { | 
|             return; | 
|             if (!rushToBuyModel.IsOpen) return; | 
|   | 
|             var operation = rushToBuyModel.GetOperationFlashRushToBuy(); | 
|             for (int i = 0; i < operation.flashShops.Count; i++) | 
|             { | 
|                 var flashShop = operation.flashShops[i]; | 
|                 int seconds = 0; | 
|                 int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow, flashShop.dayIndex, flashShop.timeIndex, out seconds); | 
|                 var saleItems = operation.flashShops[i].items; | 
|                 for (int j = 0; j < saleItems.Length; j++) | 
|                 { | 
|                     int pushId = FlashRushToBuy * 10 + saleItems[j].shopGuid; | 
|                     if (buyState != -1) | 
|                     { | 
|                         RemovePushInfo(pushId); | 
|                     } | 
|                     else | 
|                     { | 
|                         if (seconds <= 180) | 
|                         { | 
|                             RemovePushInfo(pushId); | 
|                         } | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|         #endregion | 
|         public void RemovePushInfo(int pushId) | 
|         { | 
|             ynmbxxjUtil.Instance.GeTui_RemoveLocalMessage(pushId.ToString()); | 
|         } | 
|   | 
|         public void SendPushInfo(JsonData data) | 
|         { | 
|             ynmbxxjUtil.Instance.GeTui_SendLocalMessage(data); | 
|         } | 
|   | 
|         public JsonData GetPushJsonData(int pushId, int pushtime, string title, string content) | 
|         { | 
|             JsonData _params = new JsonData(); | 
|             _params["code"] = 2005; | 
|             _params["id"] = pushId;// id 重要, 标示每个通知的更新或者移除 | 
|             _params["title"] = title;// 推送标题 | 
|             _params["subtitle"] = "";// 副标题 | 
|             _params["content"] = content;// 具体内容 | 
|             _params["badge"] = -1;// 角标 | 
|   | 
|             // 以下为决定应该多久后弹出此通知 | 
|             System.TimeSpan ts = System.DateTime.UtcNow - new System.DateTime(1970, 1, 1, 0, 0, 0, 0); | 
|             long ret = System.Convert.ToInt64(ts.TotalSeconds) + pushtime;// 表示3秒后 | 
|             _params["fireTime"] = ret; | 
|             return _params; | 
|         } | 
|   | 
|         public enum PushInfoType | 
|         { | 
|             RankStart, | 
|             RankEnd, | 
|         } | 
|     } | 
| } |