Explorar o código

update:挖矿进度带点随机性

joe %!s(int64=4) %!d(string=hai) anos
pai
achega
482f66b7bd
Modificáronse 1 ficheiros con 26 adicións e 5 borrados
  1. 26 5
      app/api/controller/coin/UserCoinController.php

+ 26 - 5
app/api/controller/coin/UserCoinController.php

@@ -10,6 +10,7 @@ use app\Request;
 use crmeb\services\{UtilService, JsonService};
 use think\facade\Config;
 use think\facade\Cache;
+use think\facade\Log;
 
 class UserCoinController {
     public function status(Request $request) {
@@ -60,19 +61,39 @@ class UserCoinController {
         ]);
     }
 
+    /**
+     * 根据 $step 返回一个新 $step
+     * 新的 $step 值为围绕 旧 $step 周围的随机值,上下波动幅度为 10%
+     */
+    protected function floatStep($step)
+    {
+        $amp = bcdiv($step, 10, 8);
+		$min = bcsub($step, $amp, 8);
+		$max = bcadd($step, $amp, 8);
+		$distance = bcsub($max, $min, 8);
+		$section = bcdiv($distance, 10, 8);
+		return bcmul($section, mt_rand(0, 10), 8) + $min;
+    }
+
     /**
      * 根据上次挖矿状态, 和过去的时长, 计算当前的状态
      * @param $p
      * @return mixed
      */
     protected function calcMining($uid, $p) {
-        if ($p['progress'] <= 0) {
+        if (!isset($p['ts']) || 
+            !isset($p['boot']) || 
+            !isset($p['stop']) || 
+            !isset($p['step']) || 
+            !isset($p['progress'])) {
+            Log::warning('error format.');
             return $p;
         }
-        if (!isset($p['ts']) || !isset($p['boot']) || !isset($p['stop']) || !isset($p['step'])) {
-            Log::warning('error format.');
+
+        if ($p['progress'] <= 0) {
             return $p;
         }
+        $step = $this->floatStep($p['step']);
         $now = time();
         $secs_passed = $now - $p['ts'];     // 从上次到现在
         //
@@ -82,7 +103,7 @@ class UserCoinController {
                 $secs_remain = 0;
             }
             // 本次个数
-            $count = floatval(bcmul($p['step'], $secs_remain, 8));
+            $count = floatval(bcmul($step, $secs_remain, 8));
             $p['progress'] += floatval(bcadd($p['progress'], $count, 8));
             // save to db
             UserCoinTransfer::beginTrans();
@@ -101,7 +122,7 @@ class UserCoinController {
             return $p;
         }
         // 进行中
-        $count = floatval(bcmul($p['step'], $secs_passed, 8));
+        $count = floatval(bcmul($step, $secs_passed, 8));
         $p['progress'] = floatval(bcadd($p['progress'], $count, 8));
         $p['ts'] = $now;