no message
This commit is contained in:
parent
96190ea437
commit
8b88da3ccd
@ -35,7 +35,7 @@ $oHttp->aData = [
|
|||||||
'type' => 'private'
|
'type' => 'private'
|
||||||
],
|
],
|
||||||
'date' => 1610000000,
|
'date' => 1610000000,
|
||||||
"text" => "\/orderFindByUser 2",
|
"text" => "\/zhuanfaReset-youshi 2025-02-02",
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ $oHttp->aData = [
|
|||||||
|
|
||||||
$r = $oHttp->send();
|
$r = $oHttp->send();
|
||||||
|
|
||||||
var_dump($r);
|
echo($r);
|
||||||
|
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
|||||||
@ -57,7 +57,7 @@ EOL;
|
|||||||
$jobs->cleanDb();
|
$jobs->cleanDb();
|
||||||
// $jobs->resetNodeBandwidth();
|
// $jobs->resetNodeBandwidth();
|
||||||
$jobs->resetDuckBandwidth();
|
$jobs->resetDuckBandwidth();
|
||||||
$jobs->bandwidthMerge();
|
$jobs->reportBandWidth();
|
||||||
$jobs->resetFreeUserBandwidth();
|
$jobs->resetFreeUserBandwidth();
|
||||||
$jobs->sendDailyTrafficReport();
|
$jobs->sendDailyTrafficReport();
|
||||||
|
|
||||||
@ -138,6 +138,10 @@ EOL;
|
|||||||
$detect = new Detect();
|
$detect = new Detect();
|
||||||
$detect->ban();
|
$detect->ban();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($minute === 0) {
|
||||||
|
$jobs->mergeBandWidth();
|
||||||
|
}
|
||||||
|
|
||||||
// Run email queue
|
// Run email queue
|
||||||
$jobs->processEmailQueue();
|
$jobs->processEmailQueue();
|
||||||
|
|||||||
@ -29,7 +29,9 @@ final class TestController extends BaseController
|
|||||||
{
|
{
|
||||||
$jobs = new CronService();
|
$jobs = new CronService();
|
||||||
|
|
||||||
$jobs->userCount();
|
$jobs->mergeBandWidth();
|
||||||
|
|
||||||
|
$jobs->reportBandWidth();
|
||||||
|
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,12 +10,15 @@ use App\Models\Ticket;
|
|||||||
use App\Models\Node;
|
use App\Models\Node;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Models\Order;
|
use App\Models\Order;
|
||||||
|
use App\Models\Ducks;
|
||||||
|
use App\Models\Zhuanfas;
|
||||||
use App\Services\Tg\ReportUser as ServiceTgReportUser;
|
use App\Services\Tg\ReportUser as ServiceTgReportUser;
|
||||||
use GuzzleHttp\Exception\GuzzleException;
|
use GuzzleHttp\Exception\GuzzleException;
|
||||||
use Psr\Http\Client\ClientExceptionInterface;
|
use Psr\Http\Client\ClientExceptionInterface;
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
use Slim\Http\Response;
|
use Slim\Http\Response;
|
||||||
use Slim\Http\ServerRequest;
|
use Slim\Http\ServerRequest;
|
||||||
|
use App\Utils\Tools;
|
||||||
|
|
||||||
use App\Services\TomTool\Http;
|
use App\Services\TomTool\Http;
|
||||||
|
|
||||||
@ -227,6 +230,292 @@ final class HookController
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 添加duck
|
||||||
|
// /duckAdd jp01
|
||||||
|
if (strpos($sText, '/duckAdd') === 0 || strpos($sText, '\/duckAdd') === 0) {
|
||||||
|
|
||||||
|
list($sCmd, $sCode) = explode(" ", $sText, 2);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$oDucks = new Ducks();
|
||||||
|
$oDucks->code = $sCode;
|
||||||
|
|
||||||
|
if ($oDucks->save()) {
|
||||||
|
$sMsg = "成功";
|
||||||
|
} else {
|
||||||
|
$sMsg = "失败";
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$sMsg = json_encode($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendMessage($sMsg);
|
||||||
|
|
||||||
|
Http::response(200, 'ok');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加zhuanfa
|
||||||
|
// /zhuanfaAdd jp01
|
||||||
|
if (strpos($sText, '/zhuanfaAdd') === 0 || strpos($sText, '\/zhuanfaAdd') === 0) {
|
||||||
|
|
||||||
|
list($sCmd, $sCode) = explode(" ", $sText, 2);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$oZhuanfas = new Zhuanfas();
|
||||||
|
$oZhuanfas->code = $sCode;
|
||||||
|
|
||||||
|
if ($oZhuanfas->save()) {
|
||||||
|
$sMsg = "成功";
|
||||||
|
} else {
|
||||||
|
$sMsg = "失败";
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$sMsg = json_encode($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendMessage($sMsg);
|
||||||
|
|
||||||
|
Http::response(200, 'ok');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除duck
|
||||||
|
// /duckDel jp01
|
||||||
|
if (strpos($sText, '/duckDel') === 0 || strpos($sText, '\/duckDel') === 0) {
|
||||||
|
|
||||||
|
list($sCmd, $sCode) = explode(" ", $sText, 2);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$oDucks = Ducks::where("code", $sCode)->first();
|
||||||
|
|
||||||
|
if ($oDucks) {
|
||||||
|
// 尝试删除记录
|
||||||
|
$deleted = $oDucks->delete();
|
||||||
|
|
||||||
|
if ($deleted) {
|
||||||
|
// 删除成功
|
||||||
|
$sMsg = "成功";
|
||||||
|
} else {
|
||||||
|
// 删除失败
|
||||||
|
$sMsg = "失败";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 找不到记录
|
||||||
|
$sMsg = "找不到记录";
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// 捕获异常并返回错误信息
|
||||||
|
$sMsg = json_encode($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendMessage($sMsg);
|
||||||
|
|
||||||
|
Http::response(200, 'ok');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除zhuanfa
|
||||||
|
// /zhuanfaDel jp01
|
||||||
|
if (strpos($sText, '/zhuanfaDel') === 0 || strpos($sText, '\/zhuanfaDel') === 0) {
|
||||||
|
|
||||||
|
list($sCmd, $sCode) = explode(" ", $sText, 2);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$oZhuanfas = Zhuanfas::where("code", $sCode)->first();
|
||||||
|
|
||||||
|
if ($oZhuanfas) {
|
||||||
|
// 尝试删除记录
|
||||||
|
$deleted = $oZhuanfas->delete();
|
||||||
|
|
||||||
|
if ($deleted) {
|
||||||
|
// 删除成功
|
||||||
|
$sMsg = "成功";
|
||||||
|
} else {
|
||||||
|
// 删除失败
|
||||||
|
$sMsg = "失败";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 找不到记录
|
||||||
|
$sMsg = "找不到记录";
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// 捕获异常并返回错误信息
|
||||||
|
$sMsg = json_encode($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendMessage($sMsg);
|
||||||
|
|
||||||
|
Http::response(200, 'ok');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改duck
|
||||||
|
// /duckOption-end_date-jp01 2025_02_02
|
||||||
|
// /duckOption-max_width-jp01 1.66#tb
|
||||||
|
if (strpos($sText, '/duckOption') === 0 || strpos($sText, '\/duckOption') === 0) {
|
||||||
|
|
||||||
|
list($sCmd, $sSet) = explode(" ", $sText, 2);
|
||||||
|
list(, $sField, $sCode) = explode("-", $sCmd, 3);
|
||||||
|
@list($iWidth, $sWidthType) = explode("#", $sSet, 2);
|
||||||
|
|
||||||
|
if ($sWidthType == 'tb') {
|
||||||
|
$sSet = Tools::tomTbToB($iWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($sWidthType == 'gb') {
|
||||||
|
$sSet = Tools::tomGbToB($iWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sMsg = '?';
|
||||||
|
try {
|
||||||
|
|
||||||
|
$oDuck = Ducks::where('code', $sCode)->first();
|
||||||
|
|
||||||
|
if (!$oDuck) {
|
||||||
|
$sMsg = "没有这个code";
|
||||||
|
} else {
|
||||||
|
$oDuck->$sField = $sSet;
|
||||||
|
if ($oDuck->save()) {
|
||||||
|
$sMsg = "成功"; // 保存成功
|
||||||
|
} else {
|
||||||
|
$sMsg = "失败"; // 保存失败
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (\Illuminate\Database\QueryException $e) {
|
||||||
|
|
||||||
|
$sMsg = json_encode($e->getMessage());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendMessage($sMsg);
|
||||||
|
|
||||||
|
Http::response(200, 'ok');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改zhuanfa
|
||||||
|
// /zhuanfaOption-end_date-jp01 2025_02_02
|
||||||
|
// /zhuanfaOption-max_width-jp01 1.66#tb
|
||||||
|
if (strpos($sText, '/zhuanfaOption') === 0 || strpos($sText, '\/zhuanfaOption') === 0) {
|
||||||
|
|
||||||
|
list($sCmd, $sSet) = explode(" ", $sText, 2);
|
||||||
|
list(, $sField, $sCode) = explode("-", $sCmd, 3);
|
||||||
|
@list($iWidth, $sWidthType) = explode("#", $sSet, 2);
|
||||||
|
|
||||||
|
if ($sWidthType == 'tb') {
|
||||||
|
$sSet = Tools::tomTbToB($iWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($sWidthType == 'gb') {
|
||||||
|
$sSet = Tools::tomGbToB($iWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sMsg = '?';
|
||||||
|
try {
|
||||||
|
|
||||||
|
$oZhuanfas = Zhuanfas::where('code', $sCode)->first();
|
||||||
|
|
||||||
|
if (!$oZhuanfas) {
|
||||||
|
$sMsg = "没有这个code";
|
||||||
|
} else {
|
||||||
|
$oZhuanfas->$sField = $sSet;
|
||||||
|
if ($oZhuanfas->save()) {
|
||||||
|
$sMsg = "成功"; // 保存成功
|
||||||
|
} else {
|
||||||
|
$sMsg = "失败"; // 保存失败
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (\Illuminate\Database\QueryException $e) {
|
||||||
|
|
||||||
|
$sMsg = json_encode($e->getMessage());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendMessage($sMsg);
|
||||||
|
|
||||||
|
Http::response(200, 'ok');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 转发重置
|
||||||
|
// /zhuanfaReset-youshi 2025-02-02
|
||||||
|
if (strpos($sText, '/zhuanfaReset') === 0 || strpos($sText, '\/zhuanfaReset') === 0) {
|
||||||
|
|
||||||
|
list($sCmd, $sDate) = explode(" ", $sText, 2);
|
||||||
|
list(, $sCode) = explode("-", $sCmd, 2);
|
||||||
|
|
||||||
|
$sMsg = '?';
|
||||||
|
try {
|
||||||
|
|
||||||
|
$oZhuanfas = Zhuanfas::where('code', $sCode)->first();
|
||||||
|
|
||||||
|
if (!$oZhuanfas) {
|
||||||
|
$sMsg = "没有这个code";
|
||||||
|
} else {
|
||||||
|
$oZhuanfas->use_width = 0;
|
||||||
|
$oZhuanfas->end_date = $sDate;
|
||||||
|
if ($oZhuanfas->save()) {
|
||||||
|
$sMsg = "成功"; // 保存成功
|
||||||
|
} else {
|
||||||
|
$sMsg = "失败"; // 保存失败
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (\Illuminate\Database\QueryException $e) {
|
||||||
|
|
||||||
|
$sMsg = json_encode($e->getMessage());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendMessage($sMsg);
|
||||||
|
|
||||||
|
Http::response(200, 'ok');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// duck list
|
||||||
|
// /duckList
|
||||||
|
if (strpos($sText, '/duckList') === 0 || strpos($sText, '\/duckList') === 0) {
|
||||||
|
|
||||||
|
$aDuckList = Ducks::all()->toArray();
|
||||||
|
|
||||||
|
$aMsgData = [];
|
||||||
|
foreach ($aDuckList as $k => $v) {
|
||||||
|
$v['use_width'] = Tools::flowToTB($v['use_width']).'t';
|
||||||
|
$v['max_width'] = Tools::flowToTB($v['max_width']).'t';
|
||||||
|
$v['today_width'] = Tools::flowToGB($v['today_width']).'g';
|
||||||
|
$aMsgData[] = $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendMessage(json_encode($aMsgData, JSON_PRETTY_PRINT));
|
||||||
|
|
||||||
|
Http::response(200, 'ok');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// zhuanfa list
|
||||||
|
// /zhuanfaList
|
||||||
|
if (strpos($sText, '/zhuanfaList') === 0 || strpos($sText, '\/zhuanfaList') === 0) {
|
||||||
|
|
||||||
|
$aZhuanfaList = Zhuanfas::all()->toArray();
|
||||||
|
|
||||||
|
$aMsgData = [];
|
||||||
|
foreach ($aZhuanfaList as $k => $v) {
|
||||||
|
$v['use_width'] = Tools::flowToTB($v['use_width'])."t";
|
||||||
|
$v['max_width'] = Tools::flowToTB($v['max_width']).'t';
|
||||||
|
$v['today_width'] = Tools::flowToGB($v['today_width']).'g';
|
||||||
|
$aMsgData[] = $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendMessage(json_encode($aMsgData, JSON_PRETTY_PRINT));
|
||||||
|
|
||||||
|
Http::response(200, 'ok');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// 节点设置变更
|
// 节点设置变更
|
||||||
// /nodeOption_name_1 haha
|
// /nodeOption_name_1 haha
|
||||||
if (strpos($sText, '/nodeOption_') === 0 || strpos($sText, '\/nodeOption_') === 0) {
|
if (strpos($sText, '/nodeOption_') === 0 || strpos($sText, '\/nodeOption_') === 0) {
|
||||||
@ -391,7 +680,8 @@ final class HookController
|
|||||||
private function sendMessage($sText) {
|
private function sendMessage($sText) {
|
||||||
|
|
||||||
if ($_ENV['is_loc'] === true) {
|
if ($_ENV['is_loc'] === true) {
|
||||||
var_dump($sText);
|
echo "<pre>";
|
||||||
|
echo($sText);
|
||||||
} else {
|
} else {
|
||||||
$url = "https://api.telegram.org/bot$this->sApiToken/sendMessage?chat_id=$this->sApiChatId&text=" . urlencode($sText);
|
$url = "https://api.telegram.org/bot$this->sApiToken/sendMessage?chat_id=$this->sApiChatId&text=" . urlencode($sText);
|
||||||
file_get_contents($url);
|
file_get_contents($url);
|
||||||
|
|||||||
@ -586,7 +586,134 @@ final class Cron
|
|||||||
// echo Tools::toDateTime(time()) . ' 重设机器流量完成' . PHP_EOL;
|
// echo Tools::toDateTime(time()) . ' 重设机器流量完成' . PHP_EOL;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public static function bandwidthMerge(): void
|
public static function mergeBandWidth(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
$oNodeAll = Node::all();
|
||||||
|
|
||||||
|
$aZhuanfaFlowNow = [];
|
||||||
|
$aDuckFlowNow = [];
|
||||||
|
$sMsg = "";
|
||||||
|
|
||||||
|
// 统计node流量
|
||||||
|
foreach ($oNodeAll as $oNodeRow) {
|
||||||
|
|
||||||
|
if ($oNodeRow->node_bandwidth <= 1242880) {
|
||||||
|
|
||||||
|
$sMsg .= $oNodeRow->name."1小时消耗流量不足1mb,可能存在异常。\n";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@$aZhuanfaFlowNow[$oNodeRow->zhuanfa_code] += $oNodeRow->node_bandwidth;
|
||||||
|
@$aDuckFlowNow[$oNodeRow->duck_code] += $oNodeRow->node_bandwidth;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 入库zhunafa
|
||||||
|
foreach ($aZhuanfaFlowNow as $k => $v) {
|
||||||
|
|
||||||
|
if ($v) {
|
||||||
|
Zhuanfas::where('code', $k)->increment('today_width', $v);
|
||||||
|
Zhuanfas::where('code', $k)->increment('use_width', $v);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 入库duck
|
||||||
|
foreach ($aDuckFlowNow as $k => $v) {
|
||||||
|
|
||||||
|
if ($v) {
|
||||||
|
Ducks::where('code', $k)->increment('today_width', $v);
|
||||||
|
Ducks::where('code', $k)->increment('use_width', $v);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清空node流量
|
||||||
|
Node::query()->update(['node_bandwidth' => 0]);
|
||||||
|
|
||||||
|
if ($sMsg) {
|
||||||
|
// echo $sMsg;
|
||||||
|
(new Telegram())->send(0, $sMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function reportBandWidth(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
$oZhuanfas = new Zhuanfas();
|
||||||
|
$oDucks = new Ducks();
|
||||||
|
|
||||||
|
// 流量报告,转发
|
||||||
|
$oTgSendFormat = new TgSendFormat();
|
||||||
|
$oTgSendFormat->sTitleEmoji = "⚡️⚡️⚡️⚡️⚡️⚡️";
|
||||||
|
$oTgSendFormat->sTitle = "# 转发流量";
|
||||||
|
$today = new DateTime();
|
||||||
|
|
||||||
|
$oZhuanfasAll = $oZhuanfas->all();
|
||||||
|
foreach ($oZhuanfasAll as $oZhuanfasRow) {
|
||||||
|
|
||||||
|
$targetDate = new DateTime($oZhuanfasRow->end_date);
|
||||||
|
$interval = $today->diff($targetDate);
|
||||||
|
|
||||||
|
$oTgSendFormat->rowAdd(
|
||||||
|
$oZhuanfasRow->name,
|
||||||
|
$oZhuanfasRow->today_width,
|
||||||
|
$oZhuanfasRow->use_width,
|
||||||
|
$oZhuanfasRow->max_width,
|
||||||
|
$interval->days
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$sTgReport = $oTgSendFormat->typeA();
|
||||||
|
|
||||||
|
// var_dump($sTgReport);
|
||||||
|
(new Telegram())->send(0, $sTgReport);
|
||||||
|
Zhuanfas::query()->update(['today_width' => 0]);
|
||||||
|
|
||||||
|
// 流量报告,机器
|
||||||
|
$oTgSendFormat = new TgSendFormat();
|
||||||
|
$oTgSendFormat->sTitleEmoji = "\n\n";
|
||||||
|
$oTgSendFormat->sTitle = "# 机器流量";
|
||||||
|
|
||||||
|
$oDucksAll = $oDucks->orderBy('code')->get();
|
||||||
|
foreach ($oDucksAll as $oDucksRow) {
|
||||||
|
|
||||||
|
if ($oDucksRow->width_reset_day == 0) {
|
||||||
|
$iWidthResetDay = 0;
|
||||||
|
} if ($oDucksRow->width_reset_day > date('d')) {
|
||||||
|
$iWidthResetDay = $oDucksRow->width_reset_day - date('d');
|
||||||
|
} else {
|
||||||
|
$date = new DateTime();
|
||||||
|
$date->modify('first day of next month');
|
||||||
|
$date->setDate((int)$date->format('Y'), (int)$date->format('m'), $oDucksRow->width_reset_day);
|
||||||
|
$sEndDate = $date;
|
||||||
|
|
||||||
|
$currentDate = new DateTime();
|
||||||
|
$interval = $currentDate->diff($sEndDate);
|
||||||
|
$iWidthResetDay = $interval->days;
|
||||||
|
}
|
||||||
|
|
||||||
|
$oTgSendFormat->rowAdd(
|
||||||
|
$oDucksRow->code,
|
||||||
|
$oDucksRow->today_width,
|
||||||
|
$oDucksRow->use_width,
|
||||||
|
$oDucksRow->max_width,
|
||||||
|
$iWidthResetDay
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$sTgReport = $oTgSendFormat->typeA();
|
||||||
|
|
||||||
|
// var_dump($sTgReport);
|
||||||
|
(new Telegram())->send(0, $sTgReport);
|
||||||
|
Ducks::query()->update(['today_width' => 0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function reportBandWidth_back(): void
|
||||||
{
|
{
|
||||||
$oNode = new Node();
|
$oNode = new Node();
|
||||||
$oZhuanfas = new Zhuanfas();
|
$oZhuanfas = new Zhuanfas();
|
||||||
@ -630,7 +757,6 @@ final class Cron
|
|||||||
|
|
||||||
$sTgReport = $oTgSendFormat->typeA();
|
$sTgReport = $oTgSendFormat->typeA();
|
||||||
|
|
||||||
// var_dump($sTgReport);
|
|
||||||
(new Telegram())->send(0, $sTgReport);
|
(new Telegram())->send(0, $sTgReport);
|
||||||
|
|
||||||
// 流量报告,机器
|
// 流量报告,机器
|
||||||
@ -668,7 +794,6 @@ final class Cron
|
|||||||
|
|
||||||
$sTgReport = $oTgSendFormat->typeA();
|
$sTgReport = $oTgSendFormat->typeA();
|
||||||
|
|
||||||
// var_dump($sTgReport);
|
|
||||||
(new Telegram())->send(0, $sTgReport);
|
(new Telegram())->send(0, $sTgReport);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -158,6 +158,17 @@ final class Tools
|
|||||||
{
|
{
|
||||||
return (int) $traffic * 1073741824;
|
return (int) $traffic * 1073741824;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function tomTbToB($traffic)
|
||||||
|
{
|
||||||
|
return bcmul($traffic, '1099511627776', 0); // 0 表示没有小数位
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function tomGbToB($traffic)
|
||||||
|
{
|
||||||
|
return bcmul($traffic, '1073741824', 0); // 0 表示没有小数位
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static function flowToMB($traffic): float
|
public static function flowToMB($traffic): float
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user