package main

//
///*
//	描述:由玩家在游戏中,没有点击退回到大厅的按钮,直接关闭App导致不能及时下分
//	功能:当玩家强制退出APP并且没有正常下分的时候,将该玩家放入map集合,定时轮询该集合根据guid执行下分操作
//	是否有断线重连的消息,标志着是否进行下分
//*/
//const (
//	CRONJOB_EXCUTE_TIME = 3 * 60 //3分钟
//)
//
//var guid_map = sync.Map{} //非正常退出游戏map key:{guid} ; value(数组):{gameId(500401),执行下分时间}
//
//type mapCronJob struct {
//	GameId int64 `json:"gameId"` //游戏Id
//	Ts     int64 `json:"ts"`     //执行时间
//}
//
//// 每秒检查map是否有任务
//func checkCronMap() {
//	ticker := time.NewTicker(1 * time.Minute)
//	for _ = range ticker.C {
//
//		guid_map.Range(func(key, value interface{}) bool {
//			excute_time := value.([]int64)[1]
//
//			if time.Now().Unix() >= excute_time { // excute_time 执行时间的时间戳
//				gameId := value.([]int64)[0]
//				makerId := gameapi.GetChannelByGameId(gameId)
//
//				switch makerId {
//
//				case gameapi.ZZYL:
//					guid := key.(uint64)
//					if gameapi.ZZYL_Cronjob(guid, gameId) {
//						//4.删除已经执行的任务
//						del_CronJob(guid)
//					} else { //请求h5那边失败,再次放入map 具体看返回参数
//						dispatch_taskByShutDown(guid, gameId)
//					}
//				}
//			}
//			time.Sleep(1 * time.Second)
//			return true
//		})
//
//	}
//}
//
//// 添加
//// excute_time 执行时间的时间戳
//func dispatch_taskByShutDown(guid uint64, gameId int64) {
//
//	makerId := gameapi.GetChannelByGameId(gameId)
//	guid_str := strconv.FormatUint(guid, 10)
//	switch makerId {
//
//	//共享钱包
//	case gameapi.HONGBO, gameapi.DBDZ:
//		gameapi.Ntf_Nats_LeaveGameInfo(guid, gameId)
//
//	//上下分
//	case gameapi.ZZYL:
//		gameapi.Add_withdraw_interval(guid_str, strconv.FormatInt(gameId,10),
//			guid_str, 30, 10, gameapi.ZZYL_TASK_TAG)
//
//	case gameapi.IG_DZ,gameapi.IG_LOTTERY,gameapi.IG_LMG:
//		gameapi.Add_withdraw_interval(guid_str, strconv.FormatInt(gameId,10),
//			guid_str, 3, 3, gameapi.IG_TASK_TAG)
//
//	case gameapi.CQ9_DZ,gameapi.CQ9_BY:
//		gameapi.Add_withdraw_interval(guid_str, strconv.FormatInt(gameId,10),
//			guid_str, 3, 3, gameapi.CQ9_TASK_TAG)
//
//	case gameapi.DBDZ_QP:
//		gameapi.Add_withdraw_interval(guid_str, strconv.FormatInt(gameId,10),
//			guid_str, 30, 10, gameapi.DBDZ_TASK_TAG)
//
//	case gameapi.VG: //共享钱包都用这种方式
//		gameapi.Add_withdraw_interval(guid_str, strconv.FormatInt(gameId,10),
//			guid_str, 30, 10, gameapi.VG_TASK_TAG)
//
//	case gameapi.FG:
//		gameapi.Add_withdraw_interval(guid_str, strconv.FormatInt(gameId,10),
//			guid_str, 30, 10, gameapi.FG_TASK_TAG)
//	}
//}
//
////强制关端 处理未完成的牌局结算
//func Ntf_SettlementByShutDown(guid uint64){
//	regame, err := mod.GetUserAttr(guid, "regameinfo")
//	if err != nil {
//		log.Error("OnUserLogout mod.GetUserAttr err", zap.Uint64("guid", guid), zap.Error(err))
//		return
//	}
//
//	if len(regame) > 0 { //如果是断线重连 开启定时任务:15分钟后请求下分
//		strArr := strings.Split(regame, "#") //存放 接入游戏大类id和接入游戏子id
//		gameId, err := strconv.Atoi(strArr[0])
//		if err != nil {
//			log.Error("OnUserLogout strconv.Atoi err", zap.Error(err))
//		}
//		dispatch_taskByShutDown(guid, int64(gameId))
//	}
//}
//
//
//func save_CronJobToredis(gn string,guid uint64, gameId int64){
//	arr := make([]int64, 2)
//	arr[0] = gameId
//	arr[1] = time.Now().Unix() + CRONJOB_EXCUTE_TIME
//	guid_map.Store(guid, arr)
//
//	var mj mapCronJob
//	mj.GameId = gameId
//	mj.Ts = arr[1]
//	json_, err := json.Marshal(&mj)
//	if err != nil {
//		log.Debug("add_CronJob Marshal err", zap.String("err", err.Error()))
//	}
//	if err := mod.UpdateCronJob(strconv.FormatUint(guid, 10), json_); err != nil {
//		log.Error("add_CronJob UpdateCronJob err", zap.Error(err))
//	}
//	log.Debug(gn+"save_CronJob_redis filed,so put in map", zap.Uint64("guid", guid), zap.Int64("gameId", gameId), zap.Int64("excute_time", arr[1]))
//}
//
//func del_CronJob(guid uint64) {
//	if err := mod.RemCronJob(strconv.FormatUint(guid, 10)); err != nil {
//		log.Error("del_CronJob RemCronJob", zap.Error(err), zap.Uint64("guid", guid))
//	}
//	guid_map.Delete(guid)
//
//	log.Debug("del_CronJob", zap.Uint64("guid", guid))
//}
//
////登陆时  清除延时任务
//func onUserLogin_ClearTask(guid uint64) {
//
//	regame, err := mod.GetUserAttr(guid, "regameinfo")
//	if err != nil {
//		log.Error("OnUserLogout mod.GetUserAttr err", zap.Uint64("guid", guid), zap.Error(err))
//		return
//	}
//
//	if len(regame) > 0 { //如果是断线重连 删除延时任务
//		var guid_arr = make([]int64,1)
//		guid_arr[0] = int64(guid)
//		gameapi.Rem_withdraw_task(guid_arr)
//	}
//}
//
//
//
////退出时  处理延时任务
//func onUserLogout_ProcessCronJob(guid uint64) {
//
//	regame, err := mod.GetUserAttr(guid, "regameinfo")
//	if err != nil {
//		log.Error("OnUserLogout mod.GetUserAttr err", zap.Uint64("guid", guid), zap.Error(err))
//		return
//	}
//
//	if len(regame) > 0 { //如果是断线重连 开启定时任务:15分钟后请求下分
//		strArr := strings.Split(regame, "#") //存放 接入游戏大类id和接入游戏子id
//		gameId, err := strconv.Atoi(strArr[0])
//		if err != nil {
//			log.Error("OnUserLogout strconv.Atoi err", zap.Error(err))
//		}
//		dispatch_taskByShutDown(guid, int64(gameId))
//	}
//}
//
////清除玩家游戏位置
//func RemoveUserLogicByGuid(guid uint64) {
//
//	gId, err := mod.GetUserLogic(guid)
//	if err != nil && err.Error() != "redis: nil" {
//		log.Debug("cleanUserLogic GetUserLogic err", zap.Error(err), zap.Uint64("guid", guid))
//		return
//	}
//	if err := mod.RemoveUserLogic(guid, gId); err != nil {
//		log.Error("cleanUserLogic RemoveUserLogic err", zap.Error(err),
//			zap.Uint64("guid", guid), zap.Int64("gameId", gId))
//	}
//}
//
////初始化任务
//func loadCronJob() {
//	map_job, err := mod.GetAllCronJob()
//	utils.ErrPanic(err)
//
//	duration := time.Now().Unix()
//	for k, v := range map_job {
//		var mj mapCronJob
//		if err := json.Unmarshal([]byte(v), &mj); err != nil {
//			utils.ErrPanic(err)
//		}
//
//		arr := make([]int64, 2)
//		arr[0] = mj.GameId
//		arr[1] = duration + CRONJOB_EXCUTE_TIME
//		duration = arr[1]
//
//		guid_, err := strconv.ParseUint(k, 10, 64)
//		utils.ErrPanic(err)
//		guid_map.Store(guid_, arr)
//	}
//	log.Debug("cronjob loadCronJob success...")
//}
//
////遍历输出
////func look_view() {
////	guid_map.Range(func(key, value interface{}) bool {
////		log.Debug("look_view", zap.Int64("key", value.([]int64)[0]), zap.Int64("value", value.([]int64)[1]))
////		return true
////	})
////}
