UserNotificationController.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace app\api\controller\user;
  3. use app\Request;
  4. use crmeb\services\UtilService;
  5. use crmeb\utils\Redis;
  6. use think\facade\Config;
  7. use think\facade\Log;
  8. /**
  9. *
  10. * activities json 配置:
  11. mining:
  12. {
  13. "enabled": 1,
  14. "symbol": "btc",
  15. }
  16. * Class UserNotificationController
  17. * @package app\api\controller\user
  18. */
  19. class UserNotificationController {
  20. /**
  21. * 定时请求的状态接口
  22. * @param Request $request
  23. */
  24. public function snapshot(Request $request) {
  25. $uid = 1;
  26. $redis = Redis::instance();
  27. // 未读消息
  28. $unread = intval(Redis::hGet('user:'.$uid, 'unread')??0);
  29. // 是否开启挖矿
  30. $symbo = Config::get('app.mining_symbo');
  31. $icon = Config::get('app.mining_symbo_icon');
  32. /*
  33. 最近挖矿状态
  34. hash key user:<uid> field: mining
  35. 格式:
  36. {
  37. "progress": 10,
  38. "symbol": "etc",
  39. "icon": "http://x.png",
  40. "price": 20,
  41. "total": 20
  42. }
  43. */
  44. $defStatus = [
  45. 'progress'=> 0,
  46. 'symbol'=>$symbo,
  47. 'icon'=>$icon,
  48. 'total'=> 0,
  49. 'ts' => time(),
  50. ];
  51. if ($symbo) {
  52. $smymining = Redis::hGet('user:'.$uid, 'mining');
  53. $mymining = json_decode($smymining, true) ?? $defStatus;
  54. if ($mymining['progress'] > 0) {
  55. $mymining = $this->calcMining($mymining);
  56. }
  57. }
  58. /*
  59. 跑马灯
  60. 列表: 键 sys:carousel
  61. 格式:
  62. {
  63. "text": "<span style=\"color:2343;\"></span>",
  64. "uri": "page/boards",
  65. }
  66. */
  67. $arrStr = Redis::lRange('sys:carousel', 0, 10)??[];
  68. $carousel = [];
  69. foreach ($arrStr as $str) {
  70. array_push($carousel, json_decode($str, true));
  71. }
  72. return app('json')->successful(compact('unread', 'mymining', 'carousel'));
  73. }
  74. /**
  75. * 根据上次挖矿状态, 和过去的时长, 计算当前的状态
  76. * @param $p
  77. * @return mixed
  78. */
  79. protected function calcMining(&$p) {
  80. if ($p['progress'] <= 0) {
  81. return $p;
  82. }
  83. if (!isset($p['ts'])) {
  84. return $p;
  85. }
  86. $now = time();
  87. $secs_passed = $now - $p['ts'];
  88. $reward_unit = Config::get('app.mining_num_per_5_sec');
  89. $hours = Config::get('app.mining_time');
  90. if (count($hours) != 2 || $hours[1] < $hours[0]) {
  91. Log::warning('app.mining_time config error.');
  92. return $p;
  93. }
  94. $hour = random_int($hours[1], $hours[0]);
  95. $secs = $hour * 60 * 60;
  96. //
  97. if ($secs_passed >= $secs) { // 挖矿结束
  98. $p['progress'] = 0;
  99. // 本次个数
  100. $count = floatval(bcmul(bcdiv($secs, 5.0, 2), $reward_unit, 2));
  101. // TODO save to database
  102. $p['total'] += $count;
  103. return $p;
  104. }
  105. $count = floatval(bcmul(bcdiv($secs_passed, 5.0, 2), $reward_unit, 2));
  106. $p['progress'] = $count;
  107. return $p;
  108. }
  109. }