Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7a77283b6e | |||
| 4a40a82d5b | |||
| abe78182fe | |||
| 16fc468516 | |||
| 85d8bc4e6d | |||
| 5f8979a62d | |||
| 969e981874 | |||
| 99d27da162 | |||
| a0f8b4df05 |
+149
-11
@@ -6,6 +6,7 @@ class Bot
|
||||
public $adguard;
|
||||
public $update;
|
||||
public $ip;
|
||||
public $limit;
|
||||
|
||||
public function __construct($key, $i18n)
|
||||
{
|
||||
@@ -278,9 +279,18 @@ class Bot
|
||||
case preg_match('~^/userXr (\d+)$~', $this->input['callback'], $m):
|
||||
$this->userXr($m[1]);
|
||||
break;
|
||||
case preg_match('~^/timerXr (\d+)$~', $this->input['callback'], $m):
|
||||
$this->timerXr($m[1]);
|
||||
break;
|
||||
case preg_match('~^/switchXr (\d+)$~', $this->input['callback'], $m):
|
||||
$this->switchXr($m[1]);
|
||||
break;
|
||||
case preg_match('~^/delxr (\d+)$~', $this->input['callback'], $m):
|
||||
$this->delxr($m[1]);
|
||||
break;
|
||||
case preg_match('~^/listXr (\d+)$~', $this->input['callback'], $m):
|
||||
$this->listXr($m[1]);
|
||||
break;
|
||||
case preg_match('~^/switchTorrent (\d+)$~', $this->input['callback'], $m):
|
||||
$this->switchTorrent($m[1]);
|
||||
break;
|
||||
@@ -345,8 +355,8 @@ class Bot
|
||||
case preg_match('~^/domain$~', $this->input['callback'], $m):
|
||||
$this->domain();
|
||||
break;
|
||||
case preg_match('~^/xray$~', $this->input['callback'], $m):
|
||||
$this->xray();
|
||||
case preg_match('~^/xray(?: (\d+))?$~', $this->input['callback'], $m):
|
||||
$this->xray($m[1] ?: 0);
|
||||
break;
|
||||
case preg_match('~^/generateSecretXray$~', $this->input['callback'], $m):
|
||||
$this->generateSecretXray();
|
||||
@@ -890,6 +900,7 @@ class Bot
|
||||
{
|
||||
while (true) {
|
||||
$this->shutdownClient();
|
||||
$this->shutdownClientXr();
|
||||
$this->checkVersion();
|
||||
$this->checkBackup();
|
||||
$this->checkCert();
|
||||
@@ -1038,6 +1049,19 @@ class Bot
|
||||
}
|
||||
}
|
||||
|
||||
public function shutdownClientXr()
|
||||
{
|
||||
try {
|
||||
$c = $this->getXray();
|
||||
foreach ($c['inbounds'][0]['settings']['clients'] as $k => $v) {
|
||||
if (!empty($v['time']) && ($v['time'] < time())) {
|
||||
$this->switchXr($k, 1);
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
}
|
||||
}
|
||||
|
||||
public function renameClient(string $name, int $client)
|
||||
{
|
||||
$clients = $this->readClients();
|
||||
@@ -1874,6 +1898,21 @@ class Bot
|
||||
];
|
||||
}
|
||||
|
||||
public function timerXr($k)
|
||||
{
|
||||
$r = $this->send(
|
||||
$this->input['chat'],
|
||||
"@{$this->input['username']} enter time like https://www.php.net/manual/ru/function.strtotime.php:",
|
||||
$this->input['message_id'],
|
||||
reply: 'enter time like https://www.php.net/manual/ru/function.strtotime.php:',
|
||||
);
|
||||
$_SESSION['reply'][$r['result']['message_id']] = [
|
||||
'start_message' => $this->input['message_id'],
|
||||
'callback' => 'setTimerXr',
|
||||
'args' => [$k],
|
||||
];
|
||||
}
|
||||
|
||||
public function setAdKey($key)
|
||||
{
|
||||
$c = $this->getPacConf();
|
||||
@@ -3464,7 +3503,45 @@ DNS-over-HTTPS with IP:
|
||||
'email' => $user,
|
||||
];
|
||||
$this->restartXray($c);
|
||||
$this->xray();
|
||||
$this->userXr(count($c['inbounds'][0]['settings']['clients']) - 1);
|
||||
}
|
||||
|
||||
public function setTimerXr($time, $i)
|
||||
{
|
||||
$time = strtotime($time);
|
||||
if ($time === false) {
|
||||
$this->send($this->input['chat'], 'wrong format');
|
||||
return;
|
||||
}
|
||||
$c = $this->getXray();
|
||||
if (empty($time)) {
|
||||
unset($c['inbounds'][0]['settings']['clients'][$i]['time']);
|
||||
} else {
|
||||
if (!empty($c['inbounds'][0]['settings']['clients'][$i]['off'])) {
|
||||
$this->switchXr($i, 1);
|
||||
$c = $this->getXray();
|
||||
}
|
||||
$c['inbounds'][0]['settings']['clients'][$i]['time'] = $time;
|
||||
}
|
||||
file_put_contents('/config/xray.json', json_encode($c, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
|
||||
$this->userXr($i);
|
||||
}
|
||||
|
||||
public function switchXr($i, $nm = 0)
|
||||
{
|
||||
$c = $this->getXray();
|
||||
unset($c['inbounds'][0]['settings']['clients'][$i]['time']);
|
||||
if (empty($c['inbounds'][0]['settings']['clients'][$i]['off'])) {
|
||||
$c['inbounds'][0]['settings']['clients'][$i]['off'] = $c['inbounds'][0]['settings']['clients'][$i]['id'];
|
||||
$c['inbounds'][0]['settings']['clients'][$i]['id'] = trim($this->ssh('xray uuid', 'xr'));
|
||||
} else {
|
||||
$c['inbounds'][0]['settings']['clients'][$i]['id'] = $c['inbounds'][0]['settings']['clients'][$i]['off'];
|
||||
unset($c['inbounds'][0]['settings']['clients'][$i]['off']);
|
||||
}
|
||||
$this->restartXray($c);
|
||||
if (empty($nm)) {
|
||||
$this->userXr($i);
|
||||
}
|
||||
}
|
||||
|
||||
public function renXrUs($name, $i)
|
||||
@@ -3475,7 +3552,15 @@ DNS-over-HTTPS with IP:
|
||||
$this->userXr($i);
|
||||
}
|
||||
|
||||
public function xray()
|
||||
public function listXr($i)
|
||||
{
|
||||
$c = $this->getPacConf();
|
||||
$c['xtlslist'] = $i;
|
||||
$this->setPacConf($c);
|
||||
$this->xray();
|
||||
}
|
||||
|
||||
public function xray($page = 0)
|
||||
{
|
||||
if (!$this->ssh('pgrep xray', 'xr')) {
|
||||
$this->generateSecretXray();
|
||||
@@ -3500,13 +3585,52 @@ DNS-over-HTTPS with IP:
|
||||
],
|
||||
];
|
||||
foreach ($c['inbounds'][0]['settings']['clients'] as $k => $v) {
|
||||
if (!empty($v['off'])) {
|
||||
$off++;
|
||||
} else {
|
||||
$on++;
|
||||
}
|
||||
}
|
||||
$type = $this->getPacConf()['xtlslist'];
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('on') . " $on " . (!$type ? "✅" : ''),
|
||||
'callback_data' => "/listXr 0",
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('off') . " $off " . ($type ? "✅" : ''),
|
||||
'callback_data' => "/listXr 1",
|
||||
],
|
||||
];
|
||||
$clients = array_filter($c['inbounds'][0]['settings']['clients'], fn($e) => !$type ? empty($e['off']) : !empty($e['off']));
|
||||
uasort($clients, fn($a, $b) => ($a['time'] ?: PHP_INT_MAX) <=> ($b['time'] ?: PHP_INT_MAX));
|
||||
|
||||
$all = (int) ceil(count($clients) / $this->limit);
|
||||
$page = min($page, $all - 1);
|
||||
$page = $page == -2 ? $all - 1 : $page;
|
||||
$clients = $page != -1 ? array_slice($clients, $page * $this->limit, $this->limit, true) : $clients;
|
||||
foreach ($clients as $k => $v) {
|
||||
$time = $v['time'] ? $this->getTime($v['time']) : '';
|
||||
$data[] = [
|
||||
[
|
||||
'text' => "{$v['email']}",
|
||||
'text' => "{$v['email']}" . ($time ? ": $time" : ''),
|
||||
'callback_data' => "/userXr $k",
|
||||
],
|
||||
];
|
||||
}
|
||||
if ($page != -1 && $all > 1) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => '<<',
|
||||
'callback_data' => "/xray " . ($page - 1 >= 0 ? $page - 1 : $all - 1),
|
||||
],
|
||||
[
|
||||
'text' => '>>',
|
||||
'callback_data' => "/xray " . ($page < $all - 1 ? $page + 1 : 0),
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('back'),
|
||||
@@ -3543,6 +3667,16 @@ DNS-over-HTTPS with IP:
|
||||
$text[] = "v2ray: <a href='$v2ray'>$v2ray</a>\n";
|
||||
$text[] = "sing-box: <a href='$sing'>$sing</a>";
|
||||
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $c['inbounds'][0]['settings']['clients'][$i]['time'] ? "timer: " . $this->getTime($c['inbounds'][0]['settings']['clients'][$i]['time']) : $this->i18n('timer'),
|
||||
'callback_data' => "/timerXr $i",
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n($c['inbounds'][0]['settings']['clients'][$i]['off'] ? 'off' : 'on'),
|
||||
'callback_data' => "/switchXr $i",
|
||||
],
|
||||
];
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('show QR'),
|
||||
@@ -3587,7 +3721,9 @@ DNS-over-HTTPS with IP:
|
||||
if (!empty($fs)) {
|
||||
return $this->userXr($k, 0, 1);
|
||||
}
|
||||
$flag = false;
|
||||
if (empty($v['off'])) {
|
||||
$flag = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3624,7 +3760,10 @@ DNS-over-HTTPS with IP:
|
||||
if (!empty($fs)) {
|
||||
return $this->userXr($k, 1);
|
||||
}
|
||||
$flag = false;
|
||||
if (empty($v['off'])) {
|
||||
$flag = false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3632,8 +3771,6 @@ DNS-over-HTTPS with IP:
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
$c = json_decode(file_get_contents('/config/sing.json'), true);
|
||||
|
||||
if ($c['dns']['servers'][0]['address'] == '~dns~') {
|
||||
@@ -3641,7 +3778,8 @@ DNS-over-HTTPS with IP:
|
||||
}
|
||||
|
||||
$c['outbounds'][0]['server'] = $domain;
|
||||
$c['outbounds'][0]['tls']['reality']['public_key'] = $key;
|
||||
$c['outbounds'][0]['uuid'] = $key;
|
||||
$c['outbounds'][0]['tls']['reality']['public_key'] = $pac['xray'];
|
||||
$c['outbounds'][0]['tls']['server_name'] = $xr['inbounds'][0]['streamSettings']['realitySettings']['serverNames'][0];
|
||||
$c['outbounds'][0]['tls']['reality']['short_id'] = $xr['inbounds'][0]['streamSettings']['realitySettings']['shortIds'][0];
|
||||
$c['route']['rules'][1]['domain_suffix'] = array_keys(array_filter($pac['includelist']));
|
||||
@@ -4098,7 +4236,7 @@ DNS-over-HTTPS with IP:
|
||||
file_put_contents('/update/branch', trim(str_replace('origin/', '', $v)));
|
||||
}
|
||||
}
|
||||
$this->menu('config');
|
||||
$this->menu('update');
|
||||
}
|
||||
|
||||
public function logs()
|
||||
|
||||
+24
-3
@@ -1,4 +1,25 @@
|
||||
<div style="position:relative;width:100%;height:100%">
|
||||
<img style="position:absolute;top:0;right:0;width:35%" src="toncoin.png" alt="">
|
||||
<iframe style="width:100%;height:100%" src="https://www.donationalerts.com/r/mercurykd" frameborder="0"></iframe>
|
||||
<meta charset="utf-8">
|
||||
<script src="jquery-3.7.1.min.js"></script>
|
||||
<script>
|
||||
jQuery(function($){
|
||||
$('#copy').on('click', function (e){
|
||||
$(this).text('copied');
|
||||
var $temp = $("<input>");
|
||||
$("body").append($temp);
|
||||
$temp.val($(this).attr('data-id')).select();
|
||||
document.execCommand("copy");
|
||||
$temp.remove();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<div style="position:relative;width:100%;height:100%; background-color: white;">
|
||||
<div style="position:absolute;top:0;right:0;width:35%;text-align:center;background-color: #17212b;">
|
||||
<img src="toncoin.png" width="100%" alt="">
|
||||
<a href="javascript:;" id="copy" style="color:white;text-decoration:none" data-id="UQCDDkaX3fCAFBek28Hx4TfvDDRqeizOW74blVMVAM4_m4OW">copy</a>
|
||||
</div>
|
||||
<a style="background-color: #8B3FFD;height: 46px;display:inline-block;padding:0 54px;color: white;border-radius: 12px;text-decoration: none;font-size: 20px;line-height: 46px;font-family: arial;" href="https://yoomoney.ru/to/410011827900450">
|
||||
<svg style="width: 24px;fill: white;position: relative;top: 4px;" class="qa-fundraise-button-logo mui-m0okdh" viewBox="0 0 16 16"><path d="M4.638 8.5a5.67 5.67 0 015.681-5.68A5.693 5.693 0 0116 8.5a5.693 5.693 0 01-5.68 5.682A5.67 5.67 0 014.637 8.5zm3.56 0c0 1.151.97 2.122 2.121 2.122 1.15 0 2.085-.97 2.121-2.121 0-1.15-.97-2.121-2.12-2.121-1.151 0-2.122.97-2.122 2.12zm-3.596 4.243v-8.27H0l2.589 8.27h2.013z" clip-rule="evenodd"></path></svg>
|
||||
Перевести
|
||||
</a>
|
||||
<iframe style="width:100%;height:100%" src="https://pay.cloudtips.ru/p/757de378" frameborder="0"></iframe>
|
||||
</div>
|
||||
Reference in New Issue
Block a user