少年修仙传客户端代码仓库
Client_PangDeRong
2018-08-14 81e5b8440c575e29caf0aea3fd2f332f35bc4e73
System/SystemSetting/SetPrivateModel.cs
@@ -1,560 +1,564 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TableConfig;
using LitJson;
namespace Snxxz.UI
{
    public class SetPrivateModel : Model, IBeforePlayerDataInitialize, IAfterPlayerDataInitialize, IPlayerLoginOk
    {
        DailyQuestModel m_dailyModel;
        DailyQuestModel dailyModel
        {
            get { return m_dailyModel ?? (m_dailyModel = ModelCenter.Instance.GetModel<DailyQuestModel>()); }
        }
        VipModel vipModel { get { return ModelCenter.Instance.GetModel<VipModel>(); } }
        public List<int> hangUpPushlist = new List<int>();
        public event Action RefreshFreeTimeAct;
        public Dictionary<int, List<string>> pushAtcivityKeyDict = new Dictionary<int, List<string>>();
        public const string VIPEXPERIENCERECORD = "VipExperienceRecord";
        public override void Init()
        {
            hangUpPushlist.Clear();
            hangUpPushlist.Add((int)PushNotifyType.FreeTime);
            hangUpPushlist.Add((int)PushNotifyType.BossRefresh);
            hangUpPushlist.Add((int)PushNotifyType.PrivateChat);
            hangUpPushlist.Add((int)PushNotifyType.TJDead);
            hangUpPushlist.Add((int)PushNotifyType.TJWGTimeNoEnough);
        }
        public void OnBeforePlayerDataInitialize()
        {
        }
        public void OnAfterPlayerDataInitialize()
        {
        }
        public void OnPlayerLoginOk()
        {
            SetActivityPushKey();
            InitPushNotifyStr();
            SetActivityPush();
            LocalSave.SetBool(VIPEXPERIENCERECORD, vipModel.IsVipExperience());
            vipModel.OnVipTimeEvent -= SetVipPushNotifyByVipExperience;
            vipModel.OnVipTimeEvent += SetVipPushNotifyByVipExperience;
            GlobalTimeEvent.Instance.minuteEvent -= RefreshDailyQuest;
            GlobalTimeEvent.Instance.minuteEvent += RefreshDailyQuest;
        }
        public override void UnInit()
        {
        }
        public void SetActivityPushKey()
        {
            pushAtcivityKeyDict.Clear();
            List<int> dailyIdlist = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit);
            for (int i = 0; i < dailyIdlist.Count; i++)
            {
                List<string> keylist = new List<string>();
                pushAtcivityKeyDict.Add(dailyIdlist[i], keylist);
                SetPushKeylist(dailyIdlist[i], keylist);
            }
        }
        private void SetPushKeylist(int dailyId, List<string> keylist)
        {
            DailyQuestOpenTime dailyQuestOpenTime;
            dailyModel.TryGetOpenTime(dailyId, out dailyQuestOpenTime);
            foreach (var weekday in dailyQuestOpenTime.openTimes.Keys)
            {
                List<HourMinute> hourMinutelist = dailyQuestOpenTime.openTimes[weekday];
                for (int i = 0; i < hourMinutelist.Count; i++)
                {
                    string key = StringUtility.Contact(dailyId,weekday,hourMinutelist[i].hourBegin);
                    keylist.Add(key);
                }
            }
        }
        #region 处理服务器数据
        public Dictionary<int, bool> pushSetDict = new Dictionary<int, bool>();
        public int startHour { get; set; }
        public int startMinute { get; set; }
        public int endHour { get; set; }
        public int endMinute { get; set; }
        public void SetServerPushModel(HB202_tagMCPushNotificationsSetting setting)
        {
            pushSetDict.Clear();
            int switchBtnLength = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit).Count + hangUpPushlist.Count;
            for (int i = 0; i < switchBtnLength; i++)
            {
                bool isOpen = MathUtility.GetBitValue(setting.OnoffBit, (ushort)i);
                DesignDebug.Log("SetServerPushModel:" + i + "bool:" + isOpen);
                pushSetDict.Add(i, isOpen);
            }
            AnalysisFreeTime(setting.TimeStr);
        }
        private void AnalysisFreeTime(string timeStr)
        {
            string[] timeArray = timeStr.Split('-');
            for (int i = 0; i < timeArray.Length; i++)
            {
                string[] hourAndMinute = timeArray[i].Split(':');
                if (i == 0)
                {
                    startHour = int.Parse(hourAndMinute[0]);
                    startMinute = int.Parse(hourAndMinute[1]);
                }
                else if (i == 1)
                {
                    endHour = int.Parse(hourAndMinute[0]);
                    endMinute = int.Parse(hourAndMinute[1]);
                }
            }
        }
        private string GetContactFreeTime()
        {
            return StringUtility.Contact(startHour.ToString("D2"), ":", startMinute.ToString("D2"), "-", endHour.ToString("D2"), ":", endMinute.ToString("D2"));
        }
        public void SendPushNotifyQuest(int pushSet)
        {
            string freeTimeStr = GetContactFreeTime();
            CB205_tagCMPushNotificationsSetting setting = new CB205_tagCMPushNotificationsSetting();
            setting.OnoffBit = (uint)pushSet;
            setting.TimeLen = (byte)freeTimeStr.Length;
            setting.TimeStr = freeTimeStr;
            GameNetSystem.Instance.SendInfo(setting);
        }
        public void SetActivityPush()
        {
            List<int> dailyIdlist = GetOpenDailyIdlist(true);
            for (int i = 0; i < dailyIdlist.Count; i++)
            {
                bool isOpen = GetSwitchStateByIndex(GetSwitchIndexById(dailyIdlist[i]));
                if (isOpen)
                {
                    List<JsonData> pushNotifylist = GetPushJsonData(dailyIdlist[i]);
                    for (int j = 0; j < pushNotifylist.Count; j++)
                    {
                        SDKUtility.Instance.GeTui_SendLocalMessage(pushNotifylist[j]);
                    }
                }
            }
        }
        public void RemoveActivityPush(int dailyId)
        {
            List<string> keylist = pushAtcivityKeyDict[dailyId];
            for (int i = 0; i < keylist.Count; i++)
            {
                SDKUtility.Instance.GeTui_RemoveLocalMessage(keylist[i]);
            }
        }
        public void AddActivityPush(int dailyId)
        {
            var config = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(dailyId);
            if (config == null || !FuncOpen.Instance.IsFuncOpen(config.UnLockFuncID)) return;
            List<JsonData> pushNotifylist = GetPushJsonData(dailyId);
            for (int j = 0; j < pushNotifylist.Count; j++)
            {
                SDKUtility.Instance.GeTui_SendLocalMessage(pushNotifylist[j]);
            }
        }
        public List<JsonData> GetPushJsonData(int dailyId)
        {
            var config = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(dailyId);
            string content = Language.Get("SetUpPrivate102", UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName).TrimEnd(), config.Title);
            List<JsonData> pushNotifylist = new List<JsonData>();
            List<string> pushKeylist = null;
            List<int> pushNotifyTimelist = GetPushNotifyTime(dailyId,out pushKeylist);
            for (int i = 0; i < pushNotifyTimelist.Count; i++)
            {
                if(i < pushKeylist.Count)
                {
                    JsonData _params = new JsonData();
                    _params["code"] = 2005;
                    _params["id"] = pushKeylist[i];// id 重要, 标示每个通知的更新或者移除
                    _params["title"] = Language.Get("SetUpPrivate103");// 推送标题
                    _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) + pushNotifyTimelist[i];// 表示3秒后
                    _params["fireTime"] = ret;
                    pushNotifylist.Add(_params);
                }
            }
            return pushNotifylist;
        }
        private List<int> GetPushNotifyTime(int dailyId,out List<string> pushKey)
        {
            List<int> pushDelaySecond = new List<int>();
            pushKey = new List<string>();
            DailyQuestOpenTime dailyQuestOpenTime;
            dailyModel.TryGetOpenTime(dailyId, out dailyQuestOpenTime);
            foreach (var weekday in dailyQuestOpenTime.openTimes.Keys)
            {
                int day = weekday > 0 ? weekday : 7;
                int curDay = (int)TimeUtility.ServerNow.DayOfWeek > 0 ? (int)TimeUtility.ServerNow.DayOfWeek : 7;
                List <HourMinute> hourMinutelist = dailyQuestOpenTime.openTimes[weekday];
                int remainDay = day - curDay;
                if (remainDay < 0)
                {
                    remainDay = 7 + remainDay;
                }
                for (int i = 0; i < hourMinutelist.Count; i++)
                {
                    int remainHour = hourMinutelist[i].hourBegin - TimeUtility.ServerNow.Hour;
                    int remainMinute = hourMinutelist[i].minuteBegin - TimeUtility.ServerNow.Minute;
                    if(remainDay <= 0)
                    {
                        if (remainHour < 0)
                        {
                            remainDay = 7;
                        }
                        else if (remainHour == 0 && remainMinute < 0)
                        {
                            remainDay = 7;
                        }
                    }
                    int remainSecond = remainDay * 24 * 60 * 60 + remainHour * 60 * 60 + remainMinute * 60;
                    if (remainSecond > 120)
                    {
                        string key = StringUtility.Contact(dailyId,weekday,hourMinutelist[i].hourBegin);
                        pushKey.Add(key);
                        pushDelaySecond.Add(remainSecond);
                    }
                }
            }
            return pushDelaySecond;
        }
        #endregion
        StringBuilder pushSB = new StringBuilder();
        public void InitPushNotifyStr()
        {
            int playerLv = PlayerDatas.Instance.baseData.LV;
            if (playerLv > 1)
                return;
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for (int i = indexlist.Count - 1; i > -1; i--)
            {
                if (i < hangUpPushlist.Count)
                {
                    if (vipModel.IsVipActive() || vipModel.IsVipExperience())
                    {
                        pushSetDict[indexlist[i]] = true;
                    }
                    else
                    {
                        pushSetDict[indexlist[i]] = false;
                    }
                }
                else
                {
                    pushSetDict[indexlist[i]] = true;
                }
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(),2);
            SendPushNotifyQuest(pushSet);
        }
        public void SetVipPushNotify(int vipLv)
        {
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for (int i = indexlist.Count - 1; i > -1; i--)
            {
                if (i < hangUpPushlist.Count)
                {
                    if (vipLv > 0
                        && !vipModel.IsVipExperience())
                    {
                        pushSetDict[indexlist[i]] = true;
                    }
                    else if(vipLv < 1
                        && !vipModel.IsVipExperience())
                    {
                        pushSetDict[indexlist[i]] = false;
                    }
                }
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
        }
        public void SetVipPushNotifyByVipExperience()
        {
            bool recordVipExper = LocalSave.GetBool(VIPEXPERIENCERECORD);
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for (int i = indexlist.Count - 1; i > -1; i--)
            {
                if (i < hangUpPushlist.Count)
                {
                    if (vipModel.IsVipExperience()
                        && !recordVipExper
                        && PlayerDatas.Instance.baseData.VIPLv < 1)
                    {
                        pushSetDict[indexlist[i]] = true;
                    }
                    else if(!vipModel.IsVipExperience()
                        && PlayerDatas.Instance.baseData.VIPLv < 1)
                    {
                        pushSetDict[indexlist[i]] = false;
                    }
                }
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
            LocalSave.SetBool(VIPEXPERIENCERECORD,vipModel.IsVipExperience());
        }
        public void RefreshPushSet(int switchIndex, bool isOpen)
        {
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for (int i = indexlist.Count - 1; i > -1; i--)
            {
                if (indexlist[i] == switchIndex)
                {
                    pushSetDict[indexlist[i]] = isOpen;
                }
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
        }
        List<int> openDailylist = new List<int>();
        public List<int> GetOpenDailyIdlist(bool isFunclimit = false)
        {
            openDailylist.Clear();
            var quests = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit);
            for (int i = 0; i < quests.Count; i++)
            {
                DailyQuestOpenTime dailyQuestOpenTime;
                dailyModel.TryGetOpenTime(quests[i], out dailyQuestOpenTime);
                var config = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(quests[i]);
                if(isFunclimit)
                {
                    if (dailyQuestOpenTime.IsValidServerOpenTime() && FuncOpen.Instance.IsFuncOpen(config.UnLockFuncID))
                    {
                        openDailylist.Add(quests[i]);
                    }
                }
                else
                {
                    if (dailyQuestOpenTime.IsValidServerOpenTime())
                    {
                        openDailylist.Add(quests[i]);
                    }
                }
            }
            return openDailylist;
        }
        public bool GetSwitchStateByIndex(int index)
        {
            if (pushSetDict.ContainsKey(index))
            {
                return pushSetDict[index];
            }
            return false;
        }
        public void GetDailyInfoById(int id, out string title, out string week, out string time)
        {
            var config = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(id);
            DailyQuestOpenTime dailyQuestOpenTime;
            dailyModel.TryGetOpenTime(id, out dailyQuestOpenTime);
            week = dailyQuestOpenTime.ToOpenTimeString();
            title = config.Title;
            time = "";
            foreach (var weekday in dailyQuestOpenTime.openTimes.Keys)
            {
                List<HourMinute> hourMinutelist = dailyQuestOpenTime.openTimes[weekday];
                time = StringUtility.Contact(hourMinutelist[0].hourBegin > 9 ? hourMinutelist[0].hourBegin.ToString() : "0" + hourMinutelist[0].hourBegin, ":", hourMinutelist[0].minuteBegin > 9 ? hourMinutelist[0].minuteBegin.ToString() : "0" + hourMinutelist[0].minuteBegin);
                break;
            }
        }
        public int GetSwitchIndexById(int id)
        {
            var quests = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit);
            for (int i = 0; i < quests.Count; i++)
            {
                if (quests[i] == id)
                {
                    return i + hangUpPushlist.Count;
                }
            }
            return -1;
        }
        /// <summary>
        /// type 1 开始时间 2 结束时间
        /// </summary>
        /// <param name="type"></param>
        public void SetRefreshFreeTimeEvent(int type, int hour, int minute)
        {
            switch (type)
            {
                case 1:
                    startHour = hour;
                    startMinute = minute;
                    break;
                case 2:
                    endHour = hour;
                    endMinute = minute;
                    break;
            }
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for(int i = indexlist.Count - 1; i > -1; i--)
            {
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
            if (RefreshFreeTimeAct != null)
            {
                RefreshFreeTimeAct();
            }
        }
        private void RefreshDailyQuest()
        {
            foreach (var dailyQuest in dailyModel.GetDailyQuestlist().Values)
            {
                var isUnLocked = TestDailyQuestUnLock(dailyQuest.id);
                if (isUnLocked)
                {
                    ModelCenter.Instance.GetModel<SetPrivateModel>().CheckActivityOpenTime(dailyQuest.id);
                }
            }
        }
        public bool TestDailyQuestUnLock(int _dailyQuestId)
        {
            switch ((DailyQuestType)_dailyQuestId)
            {
                case DailyQuestType.FairyLeague:
                case DailyQuestType.FairyFeast:
                case DailyQuestType.FairyTask:
                    var _dailyConfig = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(_dailyQuestId);
                    return PlayerDatas.Instance.baseData.Family > 0 &&
                        (_dailyConfig.UnLockFuncID == 0 || FuncOpen.Instance.IsFuncOpen(_dailyConfig.UnLockFuncID));
                case DailyQuestType.RuneTowerSweep:
                    return ModelCenter.Instance.GetModel<RuneTowerModel>().yesterdayPassFloor > 0;
                default:
                    var dailyConfig = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(_dailyQuestId);
                    return dailyConfig.UnLockFuncID == 0 || FuncOpen.Instance.IsFuncOpen(dailyConfig.UnLockFuncID);
            }
        }
        public void CheckActivityOpenTime(int dailyId)
        {
            bool isOpen = GetSwitchStateByIndex(GetSwitchIndexById(dailyId));
            if (!isOpen)
                return;
            DailyQuestOpenTime openTime;
            dailyModel.TryGetOpenTime(dailyId, out openTime);
            var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
            if (openTime.openTimes.ContainsKey(dayOfWeek))
            {
                var hourMinutes = openTime.openTimes[dayOfWeek];
                for (int i = 0; i < hourMinutes.Count; i++)
                {
                    var minutes = TimeUtility.ServerNow.Hour * 60 + TimeUtility.ServerNow.Minute;
                    float minuteOffset = (hourMinutes[i].hourBegin * 60 + hourMinutes[i].minuteBegin) - minutes;
                    if (minuteOffset <= 2 && minuteOffset > 0)
                    {
                        RemoveActivityPush(dailyId);
                    }
                    else if (minuteOffset < 0 && minuteOffset >= -2)
                    {
                        AddActivityPush(dailyId);
                    }
                }
            }
        }
        public enum PushNotifyType
        {
            FreeTime = 0, //免打扰时间开关
            BossRefresh = 1, //关注BOSS
            PrivateChat = 2,  //私聊
            TJDead = 3,  //脱机死亡
            TJWGTimeNoEnough, //脱机外挂时间不足
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TableConfig;
using LitJson;
namespace Snxxz.UI
{
    public class SetPrivateModel : Model, IBeforePlayerDataInitialize, IAfterPlayerDataInitialize, IPlayerLoginOk
    {
        DailyQuestModel m_dailyModel;
        DailyQuestModel dailyModel
        {
            get { return m_dailyModel ?? (m_dailyModel = ModelCenter.Instance.GetModel<DailyQuestModel>()); }
        }
        VipModel vipModel { get { return ModelCenter.Instance.GetModel<VipModel>(); } }
        public List<int> hangUpPushlist = new List<int>();
        public event Action RefreshFreeTimeAct;
        public Dictionary<int, List<string>> pushAtcivityKeyDict = new Dictionary<int, List<string>>();
        public const string VIPEXPERIENCERECORD = "VipExperienceRecord";
        public override void Init()
        {
            hangUpPushlist.Clear();
            hangUpPushlist.Add((int)PushNotifyType.FreeTime);
            hangUpPushlist.Add((int)PushNotifyType.BossRefresh);
            hangUpPushlist.Add((int)PushNotifyType.PrivateChat);
            hangUpPushlist.Add((int)PushNotifyType.TJDead);
            hangUpPushlist.Add((int)PushNotifyType.TJWGTimeNoEnough);
        }
        public void OnBeforePlayerDataInitialize()
        {
        }
        public void OnAfterPlayerDataInitialize()
        {
        }
        public void OnPlayerLoginOk()
        {
            SetActivityPushKey();
            InitPushNotifyStr();
            SetActivityPush();
            LocalSave.SetBool(VIPEXPERIENCERECORD, vipModel.IsVipExperience());
            vipModel.OnVipTimeEvent -= SetVipPushNotifyByVipExperience;
            vipModel.OnVipTimeEvent += SetVipPushNotifyByVipExperience;
            GlobalTimeEvent.Instance.minuteEvent -= RefreshDailyQuest;
            GlobalTimeEvent.Instance.minuteEvent += RefreshDailyQuest;
        }
        public override void UnInit()
        {
        }
        public void SetActivityPushKey()
        {
            pushAtcivityKeyDict.Clear();
            List<int> dailyIdlist = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit);
            for (int i = 0; i < dailyIdlist.Count; i++)
            {
                List<string> keylist = new List<string>();
                pushAtcivityKeyDict.Add(dailyIdlist[i], keylist);
                SetPushKeylist(dailyIdlist[i], keylist);
            }
        }
        private void SetPushKeylist(int dailyId, List<string> keylist)
        {
            DailyQuestOpenTime dailyQuestOpenTime;
            dailyModel.TryGetOpenTime(dailyId, out dailyQuestOpenTime);
            foreach (var weekday in dailyQuestOpenTime.openTimes.Keys)
            {
                List<HourMinute> hourMinutelist = dailyQuestOpenTime.openTimes[weekday];
                for (int i = 0; i < hourMinutelist.Count; i++)
                {
                    string key = StringUtility.Contact(dailyId,weekday,hourMinutelist[i].hourBegin);
                    keylist.Add(key);
                }
            }
        }
        #region 处理服务器数据
        public Dictionary<int, bool> pushSetDict = new Dictionary<int, bool>();
        public int startHour { get; set; }
        public int startMinute { get; set; }
        public int endHour { get; set; }
        public int endMinute { get; set; }
        public void SetServerPushModel(HB202_tagMCPushNotificationsSetting setting)
        {
            pushSetDict.Clear();
            int switchBtnLength = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit).Count + hangUpPushlist.Count;
            for (int i = 0; i < switchBtnLength; i++)
            {
                bool isOpen = MathUtility.GetBitValue(setting.OnoffBit, (ushort)i);
                pushSetDict.Add(i, isOpen);
            }
            AnalysisFreeTime(setting.TimeStr);
        }
        private void AnalysisFreeTime(string timeStr)
        {
            string[] timeArray = timeStr.Split('-');
            for (int i = 0; i < timeArray.Length; i++)
            {
                string[] hourAndMinute = timeArray[i].Split(':');
                if (i == 0)
                {
                    startHour = int.Parse(hourAndMinute[0]);
                    startMinute = int.Parse(hourAndMinute[1]);
                }
                else if (i == 1)
                {
                    endHour = int.Parse(hourAndMinute[0]);
                    endMinute = int.Parse(hourAndMinute[1]);
                }
            }
        }
        private string GetContactFreeTime()
        {
            return StringUtility.Contact(startHour.ToString("D2"), ":", startMinute.ToString("D2"), "-", endHour.ToString("D2"), ":", endMinute.ToString("D2"));
        }
        public void SendPushNotifyQuest(int pushSet)
        {
            string freeTimeStr = GetContactFreeTime();
            CB205_tagCMPushNotificationsSetting setting = new CB205_tagCMPushNotificationsSetting();
            setting.OnoffBit = (uint)pushSet;
            setting.TimeLen = (byte)freeTimeStr.Length;
            setting.TimeStr = freeTimeStr;
            GameNetSystem.Instance.SendInfo(setting);
        }
        public void SetActivityPush()
        {
            List<int> dailyIdlist = GetOpenDailyIdlist(true);
            for (int i = 0; i < dailyIdlist.Count; i++)
            {
                bool isOpen = GetSwitchStateByIndex(GetSwitchIndexById(dailyIdlist[i]));
                if (isOpen)
                {
                    List<JsonData> pushNotifylist = GetPushJsonData(dailyIdlist[i]);
                    for (int j = 0; j < pushNotifylist.Count; j++)
                    {
                        SDKUtility.Instance.GeTui_SendLocalMessage(pushNotifylist[j]);
                    }
                }
            }
        }
        public void RemoveActivityPush(int dailyId)
        {
            List<string> keylist = pushAtcivityKeyDict[dailyId];
            for (int i = 0; i < keylist.Count; i++)
            {
                SDKUtility.Instance.GeTui_RemoveLocalMessage(keylist[i]);
            }
        }
        public void RemoveActivityPushByKey(int dailyId, string pushKey)
        {
            if(pushAtcivityKeyDict[dailyId].Contains(pushKey))
            {
                SDKUtility.Instance.GeTui_RemoveLocalMessage(pushKey);
            }
        }
        public void AddActivityPush(int dailyId)
        {
            var config = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(dailyId);
            if (config == null || !FuncOpen.Instance.IsFuncOpen(config.UnLockFuncID)) return;
            List<JsonData> pushNotifylist = GetPushJsonData(dailyId);
            for (int j = 0; j < pushNotifylist.Count; j++)
            {
                SDKUtility.Instance.GeTui_SendLocalMessage(pushNotifylist[j]);
            }
        }
        public List<JsonData> GetPushJsonData(int dailyId)
        {
            var config = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(dailyId);
            string content = Language.Get("SetUpPrivate102", UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName).TrimEnd(), config.Title);
            List<JsonData> pushNotifylist = new List<JsonData>();
            List<string> pushKeylist = null;
            List<int> pushNotifyTimelist = GetPushNotifyTime(dailyId,out pushKeylist);
            for (int i = 0; i < pushNotifyTimelist.Count; i++)
            {
                if(i < pushKeylist.Count)
                {
                    JsonData _params = new JsonData();
                    _params["code"] = 2005;
                    _params["id"] = pushKeylist[i];// id 重要, 标示每个通知的更新或者移除
                    _params["title"] = Language.Get("SetUpPrivate103");// 推送标题
                    _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) + pushNotifyTimelist[i];// 表示3秒后
                    _params["fireTime"] = ret;
                    pushNotifylist.Add(_params);
                }
            }
            return pushNotifylist;
        }
        private List<int> GetPushNotifyTime(int dailyId,out List<string> pushKey)
        {
            List<int> pushDelaySecond = new List<int>();
            pushKey = new List<string>();
            DailyQuestOpenTime dailyQuestOpenTime;
            dailyModel.TryGetOpenTime(dailyId, out dailyQuestOpenTime);
            foreach (var weekday in dailyQuestOpenTime.openTimes.Keys)
            {
                int day = weekday > 0 ? weekday : 7;
                int curDay = (int)TimeUtility.ServerNow.DayOfWeek > 0 ? (int)TimeUtility.ServerNow.DayOfWeek : 7;
                List <HourMinute> hourMinutelist = dailyQuestOpenTime.openTimes[weekday];
                int remainDay = day - curDay;
                if (remainDay < 0)
                {
                    remainDay = 7 + remainDay;
                }
                for (int i = 0; i < hourMinutelist.Count; i++)
                {
                    int remainHour = hourMinutelist[i].hourBegin - TimeUtility.ServerNow.Hour;
                    int remainMinute = hourMinutelist[i].minuteBegin - TimeUtility.ServerNow.Minute;
                    if(remainDay <= 0)
                    {
                        if (remainHour < 0)
                        {
                            remainDay = 7;
                        }
                        else if (remainHour == 0 && remainMinute < 0)
                        {
                            remainDay = 7;
                        }
                    }
                    int remainSecond = remainDay * 24 * 60 * 60 + remainHour * 60 * 60 + remainMinute * 60;
                    if (remainSecond > 120)
                    {
                        string key = StringUtility.Contact(dailyId,weekday,hourMinutelist[i].hourBegin);
                        pushKey.Add(key);
                        pushDelaySecond.Add(remainSecond);
                    }
                }
            }
            return pushDelaySecond;
        }
        #endregion
        StringBuilder pushSB = new StringBuilder();
        public void InitPushNotifyStr()
        {
            int playerLv = PlayerDatas.Instance.baseData.LV;
            if (playerLv > 1)
                return;
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for (int i = indexlist.Count - 1; i > -1; i--)
            {
                if (i < hangUpPushlist.Count)
                {
                    if (vipModel.IsVipActive() || vipModel.IsVipExperience())
                    {
                        pushSetDict[indexlist[i]] = true;
                    }
                    else
                    {
                        pushSetDict[indexlist[i]] = false;
                    }
                }
                else
                {
                    pushSetDict[indexlist[i]] = true;
                }
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(),2);
            SendPushNotifyQuest(pushSet);
        }
        public void SetVipPushNotify(int vipLv)
        {
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for (int i = indexlist.Count - 1; i > -1; i--)
            {
                if (i < hangUpPushlist.Count)
                {
                    if (vipLv > 0
                        && !vipModel.IsVipExperience())
                    {
                        pushSetDict[indexlist[i]] = true;
                    }
                    else if(vipLv < 1
                        && !vipModel.IsVipExperience())
                    {
                        pushSetDict[indexlist[i]] = false;
                    }
                }
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
        }
        public void SetVipPushNotifyByVipExperience()
        {
            bool recordVipExper = LocalSave.GetBool(VIPEXPERIENCERECORD);
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for (int i = indexlist.Count - 1; i > -1; i--)
            {
                if (i < hangUpPushlist.Count)
                {
                    if (vipModel.IsVipExperience()
                        && !recordVipExper
                        && PlayerDatas.Instance.baseData.VIPLv < 1)
                    {
                        pushSetDict[indexlist[i]] = true;
                    }
                    else if(!vipModel.IsVipExperience()
                        && PlayerDatas.Instance.baseData.VIPLv < 1)
                    {
                        pushSetDict[indexlist[i]] = false;
                    }
                }
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
            LocalSave.SetBool(VIPEXPERIENCERECORD,vipModel.IsVipExperience());
        }
        public void RefreshPushSet(int switchIndex, bool isOpen)
        {
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for (int i = indexlist.Count - 1; i > -1; i--)
            {
                if (indexlist[i] == switchIndex)
                {
                    pushSetDict[indexlist[i]] = isOpen;
                }
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
        }
        List<int> openDailylist = new List<int>();
        public List<int> GetOpenDailyIdlist(bool isFunclimit = false)
        {
            openDailylist.Clear();
            var quests = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit);
            for (int i = 0; i < quests.Count; i++)
            {
                DailyQuestOpenTime dailyQuestOpenTime;
                dailyModel.TryGetOpenTime(quests[i], out dailyQuestOpenTime);
                var config = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(quests[i]);
                if(isFunclimit)
                {
                    if (dailyQuestOpenTime.IsValidServerOpenTime() && FuncOpen.Instance.IsFuncOpen(config.UnLockFuncID))
                    {
                        openDailylist.Add(quests[i]);
                    }
                }
                else
                {
                    if (dailyQuestOpenTime.IsValidServerOpenTime())
                    {
                        openDailylist.Add(quests[i]);
                    }
                }
            }
            return openDailylist;
        }
        public bool GetSwitchStateByIndex(int index)
        {
            if (pushSetDict.ContainsKey(index))
            {
                return pushSetDict[index];
            }
            return false;
        }
        public void GetDailyInfoById(int id, out string title, out string week, out string time)
        {
            var config = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(id);
            DailyQuestOpenTime dailyQuestOpenTime;
            dailyModel.TryGetOpenTime(id, out dailyQuestOpenTime);
            week = dailyQuestOpenTime.ToOpenTimeString();
            title = config.Title;
            time = "";
            foreach (var weekday in dailyQuestOpenTime.openTimes.Keys)
            {
                List<HourMinute> hourMinutelist = dailyQuestOpenTime.openTimes[weekday];
                time = StringUtility.Contact(hourMinutelist[0].hourBegin > 9 ? hourMinutelist[0].hourBegin.ToString() : "0" + hourMinutelist[0].hourBegin, ":", hourMinutelist[0].minuteBegin > 9 ? hourMinutelist[0].minuteBegin.ToString() : "0" + hourMinutelist[0].minuteBegin);
                break;
            }
        }
        public int GetSwitchIndexById(int id)
        {
            var quests = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit);
            for (int i = 0; i < quests.Count; i++)
            {
                if (quests[i] == id)
                {
                    return i + hangUpPushlist.Count;
                }
            }
            return -1;
        }
        /// <summary>
        /// type 1 开始时间 2 结束时间
        /// </summary>
        /// <param name="type"></param>
        public void SetRefreshFreeTimeEvent(int type, int hour, int minute)
        {
            switch (type)
            {
                case 1:
                    startHour = hour;
                    startMinute = minute;
                    break;
                case 2:
                    endHour = hour;
                    endMinute = minute;
                    break;
            }
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for(int i = indexlist.Count - 1; i > -1; i--)
            {
                if (pushSetDict[indexlist[i]])
                {
                    pushSB.Append("1");
                }
                else
                {
                    pushSB.Append("0");
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
            if (RefreshFreeTimeAct != null)
            {
                RefreshFreeTimeAct();
            }
        }
        private void RefreshDailyQuest()
        {
            foreach (var dailyQuest in dailyModel.GetDailyQuestlist().Values)
            {
                var isUnLocked = TestDailyQuestUnLock(dailyQuest.id);
                if (isUnLocked)
                {
                    ModelCenter.Instance.GetModel<SetPrivateModel>().CheckActivityOpenTime(dailyQuest.id);
                }
            }
        }
        public bool TestDailyQuestUnLock(int _dailyQuestId)
        {
            switch ((DailyQuestType)_dailyQuestId)
            {
                case DailyQuestType.FairyLeague:
                case DailyQuestType.FairyFeast:
                case DailyQuestType.FairyTask:
                    var _dailyConfig = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(_dailyQuestId);
                    return PlayerDatas.Instance.baseData.Family > 0 &&
                        (_dailyConfig.UnLockFuncID == 0 || FuncOpen.Instance.IsFuncOpen(_dailyConfig.UnLockFuncID));
                case DailyQuestType.RuneTowerSweep:
                    return ModelCenter.Instance.GetModel<RuneTowerModel>().yesterdayPassFloor > 0;
                default:
                    var dailyConfig = ConfigManager.Instance.GetTemplate<DailyQuestConfig>(_dailyQuestId);
                    return dailyConfig.UnLockFuncID == 0 || FuncOpen.Instance.IsFuncOpen(dailyConfig.UnLockFuncID);
            }
        }
        public void CheckActivityOpenTime(int dailyId)
        {
            bool isOpen = GetSwitchStateByIndex(GetSwitchIndexById(dailyId));
            if (!isOpen)
                return;
            DailyQuestOpenTime openTime;
            dailyModel.TryGetOpenTime(dailyId, out openTime);
            var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
            if (openTime.openTimes.ContainsKey(dayOfWeek))
            {
                var hourMinutes = openTime.openTimes[dayOfWeek];
                for (int i = 0; i < hourMinutes.Count; i++)
                {
                    var minutes = TimeUtility.ServerNow.Hour * 60 + TimeUtility.ServerNow.Minute;
                    float minuteOffset = (hourMinutes[i].hourBegin * 60 + hourMinutes[i].minuteBegin) - minutes;
                    if (minuteOffset <= 2 && minuteOffset > 0)
                    {
                        string key = StringUtility.Contact(dailyId, dayOfWeek, hourMinutes[i].hourBegin);
                        RemoveActivityPushByKey(dailyId,key);
                    }
                }
            }
        }
        public enum PushNotifyType
        {
            FreeTime = 0, //免打扰时间开关
            BossRefresh = 1, //关注BOSS
            PrivateChat = 2,  //私聊
            TJDead = 3,  //脱机死亡
            TJWGTimeNoEnough, //脱机外挂时间不足
        }
    }
}