FcmLogic.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. -----------------------------------------------------------
  2. -- 防沉迷逻辑
  3. -----------------------------------------------------------
  4. local Util = require("common.Util")
  5. local Lang = require("common.Lang")
  6. local CommonDefine = require("common.CommonDefine")
  7. local ObjHuman = require("core.ObjHuman")
  8. local Broadcast = require("broadcast.Broadcast")
  9. local FcmDefine = require("fcm.FcmDefine")
  10. -- 是否在健康时间段
  11. HEALTH_TIME_INFO = HEALTH_TIME_INFO or nil
  12. local function inHealthTime()
  13. local nowTime = os.time()
  14. if not HEALTH_TIME_INFO or nowTime >= HEALTH_TIME_INFO.dayEndTime then
  15. local dayStartTime = Util.getDayStartTime(nowTime)
  16. HEALTH_TIME_INFO = {}
  17. HEALTH_TIME_INFO.dayEndTime = dayStartTime + 86400
  18. HEALTH_TIME_INFO.startTime = dayStartTime + FcmDefine.CHILD_HEALTH_START_HOUR * 3600
  19. HEALTH_TIME_INFO.endTime = dayStartTime + FcmDefine.CHILD_HEALTH_END_HOUR * 3600
  20. end
  21. if HEALTH_TIME_INFO.startTime <= nowTime and
  22. nowTime <= HEALTH_TIME_INFO.endTime then
  23. return true
  24. end
  25. end
  26. -- 检查是否通过防沉迷
  27. local function check(human)
  28. if not FcmDefine.IS_FCM_OPEN then
  29. return true
  30. end
  31. local fcmState = human.fcmState or FcmDefine.STATE_NOPEN
  32. if fcmState == FcmDefine.STATE_NOPEN then -- 默认不开
  33. return true
  34. end
  35. -- 如果已验证&成年
  36. if fcmState == FcmDefine.STATE_OK_ADULT then
  37. return true
  38. end
  39. -- 在不健康时间段游戏
  40. if not inHealthTime() then
  41. return false, CommonDefine.DISCONNECT_FCM_HEALTH
  42. end
  43. -- 今日在线时间
  44. local time = os.time() - human.db.lastLoginTime
  45. local onlineTimeDay = (human.db.onlineTimeDay or 0) + time
  46. --print("onlineTimeDay", onlineTimeDay)
  47. if onlineTimeDay >= FcmDefine.CHILD_DAILY_TIME then
  48. return false, CommonDefine.DISCONNECT_FCM_CHILD
  49. end
  50. return true
  51. end
  52. -- 防沉迷校验含踢人
  53. function checkFcm(human)
  54. if not human.db then return true end
  55. local isok, code = check(human)
  56. if not isok then
  57. ObjHuman.doDisconnect(human, code)
  58. end
  59. if human.fcmState then
  60. --print("isok, code",isok, code, human.fcmState)
  61. end
  62. return isok
  63. end
  64. -- 充值限额
  65. local BUY_PRICE_ONE2 = 50 -- 未满16单笔金额
  66. local BUY_PRICE_MONTH2 = 200 -- 未满16每月金额
  67. local BUY_PRICE_ONE3 = 100 -- 未满18单笔金额
  68. local BUY_PRICE_MONTH3 = 400 -- 未满18每月金额
  69. local function checkBuyPrice(human, price, dayPrice, monthPrice, age)
  70. if price > dayPrice then -- 单笔不能超过50元
  71. Broadcast.sendErr(human, Util.format(Lang.BUY_CHECK_ERR_FCM_AGE, age))
  72. Broadcast.sendErr(human, Util.format(Lang.BUY_CHECK_ERR_FCM_ONE, dayPrice))
  73. return false
  74. end
  75. local sum = human.db.topupAccountMonth or 0
  76. if (sum + price) > monthPrice then -- 每月不能超过200元
  77. Broadcast.sendErr(human, Util.format(Lang.BUY_CHECK_ERR_FCM_AGE, age))
  78. Broadcast.sendErr(human, Util.format(Lang.BUY_CHECK_ERR_FCM_MONTH, monthPrice))
  79. return false
  80. end
  81. return true
  82. end
  83. function checkCanBuy(human, price)
  84. if not human.db then return true end
  85. local fcmState = human.fcmState or FcmDefine.STATE_NOPEN
  86. print("checkCanBuy",price,fcmState)
  87. if fcmState == FcmDefine.STATE_NOPEN then -- 默认不开
  88. return true
  89. end
  90. -- 如果已验证&成年
  91. if fcmState == FcmDefine.STATE_OK_ADULT then
  92. return true
  93. end
  94. -- 未满8岁
  95. if fcmState == FcmDefine.STATE_OK_CHILD then
  96. Broadcast.sendErr(human, Util.format(Lang.BUY_CHECK_ERR_FCM_AGE, 8))
  97. Broadcast.sendErr(human, Lang.BUY_CHECK_ERR_FCM_NOCHARGE)
  98. return false
  99. end
  100. -- 未满16岁
  101. if fcmState == FcmDefine.STATE_OK_CHILD2 then
  102. return checkBuyPrice(human, price, BUY_PRICE_ONE2, BUY_PRICE_MONTH2, 16)
  103. end
  104. -- 未满18岁
  105. if fcmState == FcmDefine.STATE_OK_CHILD3 then
  106. return checkBuyPrice(human, price, BUY_PRICE_ONE3, BUY_PRICE_MONTH3, 18)
  107. end
  108. -- 未通过
  109. Broadcast.sendErr(human, Lang.BUY_CHECK_ERR_FCM)
  110. Broadcast.sendErr(human, Lang.BUY_CHECK_ERR_FCM_NOCHARGE)
  111. return false
  112. end
  113. function onTimer()
  114. for _, human in pairs(ObjHuman.onlineUuid) do
  115. if human.fd then
  116. checkFcm(human)
  117. end
  118. end
  119. end
  120. function CG_FMC_STATE(human, state)
  121. human.fcmState = state
  122. checkFcm(human)
  123. end