Files
repo-backend/app/Console/Commands/MonitorEthLog.php
T

130 lines
4.4 KiB
PHP

<?php
namespace App\Console\Commands;
use App\AccountLog;
use App\Setting;
use App\Users;
use App\Utils\RPC;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class MonitorEthLog extends Command
{
protected $signature = "monitor_eth_log";
protected $description = "监听以太坊账号";
protected $rate_exchange = 0;
protected $last_hash = "";
protected $company_eth_address = "";
public function handle()
{
$this->rate_exchange = Setting::getValueByKey("rate_exchange", 10);
$this->last_hash = Setting::getValueByKey("last_hash");
$this->company_eth_address = Setting::getValueByKey("company_eth_address");
if (empty($this->company_eth_address)) {
$this->comment("公司以太坊地址为空");
exit;
}
$this->comment("start");
$this->getEthLog();
$this->comment("end");
}
public function getEthLog($page = 1)
{
$parameter = array("module" => "account", "action" => "txlist", "address" => $this->company_eth_address, "startblock" => "0", "endblock" => "99999999", "page" => $page, "offset" => "10", "sort" => "desc", "apikey" => "579R8XPDUY1SHZNEZP9GA4FEF1URNC3X45");
$data = RPC::http_post("https://api.etherscan.io/api", $parameter);
$jsonInfo = @json_decode($data, true);
if (!empty($jsonInfo)) {
if ($jsonInfo["status"] == "1" && $jsonInfo["message"] == "OK") {
$continue = false;
if (count($jsonInfo["result"]) > 0) {
if (count($jsonInfo["result"]) == 10) {
$continue = true;
}
foreach ($jsonInfo["result"] as $j) {
if ($j["hash"] == $this->last_hash) {
$continue = false;
break 1;
} else {
if ($j["to"] == $this->company_eth_address && $j["value"] > 0) {
$user = Users::where('eth_address', $j["from"])->first();
if (!empty($user)) {
$this->updateUserBalance($user, $j);
}
}
}
}
}
if ($continue) {
$this->getEthLog($page + 1);
}
} else {
$this->comment($jsonInfo["message"]);
$this->comment($jsonInfo["result"]);
}
}
}
public function updateUserBalance($user, $info = array())
{
if (empty($user) || empty($info)) {
return false;
}
DB::beginTransaction();
try {
$balance = $info["value"] / 10000000000000 * $this->rate_exchange;
$user->balance = $user->balance + $balance;
if ($user->balance >= 5000000 && $user->level != Users::USER_LEVEL_LARGEAREA_AGENT) {
$user->level = Users::USER_LEVEL_LARGEAREA_AGENT;
} elseif ($user->balance >= 3000000 && $user->level < Users::USER_LEVEL_PROVINCIAL_AGENT) {
$user->level = Users::USER_LEVEL_PROVINCIAL_AGENT;
} elseif ($user->balance >= 2000000 && $user->level < Users::USER_LEVEL_CITY_AGENT) {
$user->level = Users::USER_LEVEL_CITY_AGENT;
} elseif ($user->balance >= 1000000 && $user->level < Users::USER_LEVEL_COUNTY_AGENT) {
$user->level = Users::USER_LEVEL_COUNTY_AGENT;
}
$user->save();
$this->updateParentLevel($user);
AccountLog::insertLog(array("user_id" => $user->id, "value" => $balance, "type" => AccountLog::ETH_EXCHANGE, "info" => $info["hash"]));
Setting::updateValueByKey("last_hash", $info["hash"]);
$this->comment($user->id . ":增加有效可用余额" . $balance);
DB::commit();
} catch (\Exception $ex) {
DB::rollback();
$this->comment($ex->getMessage());
}
}
public function updateParentLevel($user)
{
if (empty($user) || empty($user->parent_id)) {
return false;
}
$parent = Users::find($user->parent_id);
if (empty($parent)) {
return false;
}
if ($parent->level < Users::USER_LEVEL_LARGEAREA_AGENT) {
$min_count = 0;
$min_money = 0;
if ($parent->level == Users::USER_LEVEL_PROVINCIAL_AGENT) {
$min_count = 3;
$min_money = 100000;
} elseif ($parent->level == Users::USER_LEVEL_CITY_AGENT) {
$min_count = 4;
$min_money = 10000;
} elseif ($parent->level == Users::USER_LEVEL_COUNTY_AGENT) {
$min_count = 5;
$min_money = 10000;
} elseif ($parent->level == Users::USER_LEVEL_GROUP) {
$min_count = 6;
$min_money = 10000;
} elseif ($parent->level == Users::USER_LEVEL_ORDINARY) {
$min_count = 8;
$min_money = 5000;
}
$count = Users::where("parent_id", $parent->id)->where("level", $parent->level)->where("balance", ">=", $min_money)->count();
if ($count >= $min_count) {
$parent->level = $parent->level + 1;
$parent->save();
}
}
}
}