|
|
|
@@ -139,12 +139,18 @@ class Bot
|
|
|
|
|
case preg_match('~^/mirror$~', $this->input['message'], $m):
|
|
|
|
|
$this->menu('mirror');
|
|
|
|
|
break;
|
|
|
|
|
case preg_match('~^/autoupdate$~', $this->input['message'], $m):
|
|
|
|
|
$this->autoupdate();
|
|
|
|
|
break;
|
|
|
|
|
case preg_match('~^/appOutbound$~', $this->input['callback'], $m):
|
|
|
|
|
$this->appOutbound();
|
|
|
|
|
break;
|
|
|
|
|
case preg_match('~^/addSubdomain$~', $this->input['callback'], $m):
|
|
|
|
|
$this->addSubdomain();
|
|
|
|
|
break;
|
|
|
|
|
case preg_match('~^/addLinkDomain$~', $this->input['callback'], $m):
|
|
|
|
|
$this->addLinkDomain();
|
|
|
|
|
break;
|
|
|
|
|
case preg_match('~^/id$~', $this->input['message'], $m):
|
|
|
|
|
$this->send($this->input['chat'], $this->input['from'], $this->input['message_id']);
|
|
|
|
|
break;
|
|
|
|
@@ -1090,6 +1096,10 @@ class Bot
|
|
|
|
|
]
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
if ($this->getPacConf()['autoupdate']) {
|
|
|
|
|
$this->input['chat'] = $this->input['from'] = $c['admin'][0];
|
|
|
|
|
$this->applyupdatebot();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@@ -1101,7 +1111,7 @@ class Bot
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
require __DIR__ . '/config.php';
|
|
|
|
|
if (!empty($c['admin']) && (empty($this->time2) || ((time() - $this->time2) > 3600))) {
|
|
|
|
|
if (!empty($c['admin']) && date('H') == 12 && (empty($this->time2) || ((time() - $this->time2) > 4600))) {
|
|
|
|
|
$this->time2 = time();
|
|
|
|
|
$cert = $this->expireCert();
|
|
|
|
|
if (!empty($cert) && $cert - 60 * 60 * 24 * 14 < time()) {
|
|
|
|
@@ -1356,7 +1366,8 @@ class Bot
|
|
|
|
|
$out[] = 'update xray';
|
|
|
|
|
$this->update($this->input['chat'], $this->input['message_id'], implode("\n", $out));
|
|
|
|
|
$this->restartXray($json['xray']);
|
|
|
|
|
$this->setUpstreamDomain($json['xray']['inbounds'][0]['streamSettings']['realitySettings']['serverNames'][0]);
|
|
|
|
|
$this->adguardXrayClients();
|
|
|
|
|
$this->setUpstreamDomain($json['pac']['transport'] == 'Websocket' ? 't' : ($json['pac']['reality']['domain'] ?: $json['xray']['inbounds'][0]['streamSettings']['realitySettings']['serverNames'][0]));
|
|
|
|
|
}
|
|
|
|
|
// ocserv
|
|
|
|
|
if (!empty($json['oc'])) {
|
|
|
|
@@ -1590,7 +1601,7 @@ class Bot
|
|
|
|
|
{
|
|
|
|
|
$conf = $this->getPacConf();
|
|
|
|
|
$ip = $this->ip;
|
|
|
|
|
$domain = $conf['domain'] ?: $ip;
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$scheme = empty($ssl = $this->nginxGetTypeCert()) ? 'http' : 'https';
|
|
|
|
|
$ss = $this->getSSConfig();
|
|
|
|
|
$port = !empty($ss['plugin']) ? (!empty($ssl) ? 443 : 80) : getenv('SSPORT');
|
|
|
|
@@ -2077,10 +2088,41 @@ class Bot
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function addLinkDomain()
|
|
|
|
|
{
|
|
|
|
|
$r = $this->send(
|
|
|
|
|
$this->input['chat'],
|
|
|
|
|
"@{$this->input['username']} enter domain for link",
|
|
|
|
|
$this->input['message_id'],
|
|
|
|
|
reply: 'enter domain for link',
|
|
|
|
|
);
|
|
|
|
|
$_SESSION['reply'][$r['result']['message_id']] = [
|
|
|
|
|
'start_message' => $this->input['message_id'],
|
|
|
|
|
'callback' => 'setLinkDomain',
|
|
|
|
|
'args' => [],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function setLinkDomain($text)
|
|
|
|
|
{
|
|
|
|
|
$c = $this->getPacConf();
|
|
|
|
|
if (empty($text)) {
|
|
|
|
|
unset($c['linkdomain']);
|
|
|
|
|
} else {
|
|
|
|
|
$c['linkdomain'] = trim($text);
|
|
|
|
|
}
|
|
|
|
|
$this->setPacConf($c);
|
|
|
|
|
$this->menu('config');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function setSubdomain($text)
|
|
|
|
|
{
|
|
|
|
|
$c = $this->getPacConf();
|
|
|
|
|
$c['subdomain'] = array_filter(explode(',', $text), fn($e) => !empty(trim($e)));
|
|
|
|
|
if (empty($text)) {
|
|
|
|
|
unset($c['subdomain']);
|
|
|
|
|
} else {
|
|
|
|
|
$c['subdomain'] = array_filter(explode(',', $text), fn($e) => !empty(trim($e)));
|
|
|
|
|
}
|
|
|
|
|
$this->setPacConf($c);
|
|
|
|
|
$this->menu('config');
|
|
|
|
|
}
|
|
|
|
@@ -2152,6 +2194,61 @@ class Bot
|
|
|
|
|
$this->menu('adguard');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function guidv4($data = null) {
|
|
|
|
|
// Generate 16 bytes (128 bits) of random data or use the data passed into the function.
|
|
|
|
|
$data = $data ?? random_bytes(16);
|
|
|
|
|
assert(strlen($data) == 16);
|
|
|
|
|
|
|
|
|
|
// Set version to 0100
|
|
|
|
|
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
|
|
|
|
|
// Set bits 6-7 to 10
|
|
|
|
|
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
|
|
|
|
|
|
|
|
|
|
// Output the 36 character UUID.
|
|
|
|
|
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function adguardXrayClients()
|
|
|
|
|
{
|
|
|
|
|
$xr = $this->getXray();
|
|
|
|
|
$ad = yaml_parse_file($this->adguard);
|
|
|
|
|
foreach ($xr['inbounds'][0]['settings']['clients'] as $k => $v) {
|
|
|
|
|
$tmp[] = [
|
|
|
|
|
'safe_search' => [
|
|
|
|
|
'enabled' => true,
|
|
|
|
|
'bing' => true,
|
|
|
|
|
'duckduckgo' => true,
|
|
|
|
|
'google' => true,
|
|
|
|
|
'pixabay' => true,
|
|
|
|
|
'yandex' => true,
|
|
|
|
|
'youtube' => true,
|
|
|
|
|
],
|
|
|
|
|
'blocked_services' => [
|
|
|
|
|
'schedule' => ['time_zone' => date_default_timezone_get()],
|
|
|
|
|
'ids' => [],
|
|
|
|
|
],
|
|
|
|
|
'name' => $v['email'],
|
|
|
|
|
'ids' => [$v['id']],
|
|
|
|
|
'tags' => [],
|
|
|
|
|
'upstreams' => [],
|
|
|
|
|
'uid' => $v['id'],
|
|
|
|
|
'upstreams_cache_size' => 0,
|
|
|
|
|
'upstreams_cache_enabled' => false,
|
|
|
|
|
'use_global_settings' => true,
|
|
|
|
|
'filtering_enabled' => false,
|
|
|
|
|
'parental_enabled' => false,
|
|
|
|
|
'safebrowsing_enabled' => false,
|
|
|
|
|
'use_global_blocked_services' => true,
|
|
|
|
|
'ignore_querylog' => false,
|
|
|
|
|
'ignore_statistics' => false,
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
$ad['clients']['persistent'] = $tmp;
|
|
|
|
|
yaml_emit_file($this->adguard, $ad);
|
|
|
|
|
$this->stopAd();
|
|
|
|
|
$this->startAd();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function checkdns()
|
|
|
|
|
{
|
|
|
|
|
$r = $this->send(
|
|
|
|
@@ -3175,7 +3272,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
$mpac = stat(__DIR__ . '/zapretlists/mpac');
|
|
|
|
|
$pac = stat(__DIR__ . '/zapretlists/pac');
|
|
|
|
|
$conf = $this->getPacConf();
|
|
|
|
|
$ip = $conf['domain'] ?: $this->ip;
|
|
|
|
|
$ip = $this->getDomain();
|
|
|
|
|
$hash = substr(md5($this->key), 0, 8);
|
|
|
|
|
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
|
|
|
|
|
$text = <<<text
|
|
|
|
@@ -3587,7 +3684,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
{
|
|
|
|
|
$conf = $this->getPacConf();
|
|
|
|
|
$ip = $this->ip;
|
|
|
|
|
$domain = $conf['domain'] ?: $ip;
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$scheme = empty($ssl = $this->nginxGetTypeCert()) ? 'http' : 'https';
|
|
|
|
|
$ss = $this->getSSConfig();
|
|
|
|
|
$v2ray = !empty($ss['plugin']) ? 'ON' : 'OFF';
|
|
|
|
@@ -3767,7 +3864,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
{
|
|
|
|
|
$c = $this->getXray();
|
|
|
|
|
$pac = $this->getPacConf();
|
|
|
|
|
$domain = $pac['domain'] ?: $this->ip;
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
|
|
|
|
|
$hash = substr(md5($this->key), 0, 8);
|
|
|
|
|
$si = "$scheme://{$domain}/pac/" . base64_encode(serialize([
|
|
|
|
@@ -3841,8 +3938,9 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
public function naiveMenu()
|
|
|
|
|
{
|
|
|
|
|
$pac = $this->getPacConf();
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$text[] = "Menu -> NaiveProxy";
|
|
|
|
|
$text[] = "<code>https://{$pac['naive']['user']}:{$pac['naive']['pass']}@np.{$pac['domain']}</code>";
|
|
|
|
|
$text[] = "<code>https://{$pac['naive']['user']}:{$pac['naive']['pass']}@np.$domain</code>";
|
|
|
|
|
$data[] = [
|
|
|
|
|
[
|
|
|
|
|
'text' => $this->i18n('change login'),
|
|
|
|
@@ -3934,6 +4032,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
public function ocMenu()
|
|
|
|
|
{
|
|
|
|
|
$pac = $this->getPacConf();
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$ocserv = file_get_contents('/config/ocserv.conf');
|
|
|
|
|
preg_match('~^camouflage_secret[^\n]+?"([^"]+)*"~sm', $ocserv, $m);
|
|
|
|
|
$cs = $m[1];
|
|
|
|
@@ -3942,7 +4041,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
$pass = htmlspecialchars($pac['ocserv']);
|
|
|
|
|
$text[] = "Menu -> OpenConnect";
|
|
|
|
|
if (!empty($m[1])) {
|
|
|
|
|
$text[] = "<code>https://oc.{$pac['domain']}/?$cs</code>";
|
|
|
|
|
$text[] = "<code>https://oc.$domain/?$cs</code>";
|
|
|
|
|
}
|
|
|
|
|
$text[] = "password: <span class='tg-spoiler'>$pass</span>";
|
|
|
|
|
$data[] = [
|
|
|
|
@@ -4005,6 +4104,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
if ($i == $k) {
|
|
|
|
|
unset($r['inbounds'][0]['settings']['clients'][$k]);
|
|
|
|
|
$this->restartXray($r);
|
|
|
|
|
$this->adguardXrayClients();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@@ -4038,6 +4138,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
'email' => $user,
|
|
|
|
|
];
|
|
|
|
|
$this->restartXray($c);
|
|
|
|
|
$this->adguardXrayClients();
|
|
|
|
|
$this->userXr(count($c['inbounds'][0]['settings']['clients']) - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -4084,6 +4185,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
$c = $this->getXray();
|
|
|
|
|
$c['inbounds'][0]['settings']['clients'][$i]['email'] = $name;
|
|
|
|
|
$this->restartXray($c);
|
|
|
|
|
$this->adguardXrayClients();
|
|
|
|
|
$this->userXr($i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -4159,7 +4261,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
public function templates($type)
|
|
|
|
|
{
|
|
|
|
|
$pac = $this->getPacConf();
|
|
|
|
|
$domain = $pac['domain'] ?: $this->ip;
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$hash = substr(md5($this->key), 0, 8);
|
|
|
|
|
$text[] = "Menu -> " . $this->i18n('xray') . " -> $type templates";
|
|
|
|
|
$templates = $pac["{$type}templates"];
|
|
|
|
@@ -4482,7 +4584,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
{
|
|
|
|
|
$c = $this->getXray()['inbounds'][0]['settings']['clients'][$i];
|
|
|
|
|
$pac = $this->getPacConf();
|
|
|
|
|
$domain = $pac['domain'] ?: $this->ip;
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
|
|
|
|
|
$hash = substr(md5($this->key), 0, 8);
|
|
|
|
|
|
|
|
|
@@ -4569,10 +4671,16 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getDomain()
|
|
|
|
|
{
|
|
|
|
|
$c = $this->getPacConf();
|
|
|
|
|
return $c['linkdomain'] ?: ($c['domain'] ?: $this->ip);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function v2raySubscription($key, $fs = 0)
|
|
|
|
|
{
|
|
|
|
|
$pac = $this->getPacConf();
|
|
|
|
|
$domain = $pac['domain'] ?: $this->ip;
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$xr = $this->getXray();
|
|
|
|
|
|
|
|
|
|
$flag = true;
|
|
|
|
@@ -4612,7 +4720,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
{
|
|
|
|
|
$type = $_GET['t'] == 's' ? 'v2ray' : 'sing';
|
|
|
|
|
$pac = $this->getPacConf();
|
|
|
|
|
$domain = $pac['domain'] ?: $this->ip;
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$xr = $this->getXray();
|
|
|
|
|
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
|
|
|
|
|
$hash = substr(md5($this->key), 0, 8);
|
|
|
|
@@ -4625,6 +4733,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
}
|
|
|
|
|
$template = base64_decode($v["{$type}template"]);
|
|
|
|
|
$uid = $v['id'];
|
|
|
|
|
$email = $v['email'];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@@ -4692,7 +4801,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
|
|
|
|
|
switch ($_GET['t']) {
|
|
|
|
|
case 's':
|
|
|
|
|
$c['outbounds'][0]['settings']['vnext'][0]['address'] = $domain;
|
|
|
|
|
$c['outbounds'][0]['settings']['vnext'][0]['address'] = $_GET['cdn'] ?: $domain;
|
|
|
|
|
$c['outbounds'][0]['settings']['vnext'][0]['users'][0] = [
|
|
|
|
|
'id' => $uid,
|
|
|
|
|
'encryption' => 'none',
|
|
|
|
@@ -4706,14 +4815,14 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
],
|
|
|
|
|
"tlsSettings" => [
|
|
|
|
|
"allowInsecure" => false,
|
|
|
|
|
"serverName" => $domain,
|
|
|
|
|
"serverName" => $_GET['cdn'] ?: $domain,
|
|
|
|
|
"fingerprint" => "chrome"
|
|
|
|
|
]
|
|
|
|
|
];
|
|
|
|
|
unset($c['outbounds'][0]['mux']);
|
|
|
|
|
} else {
|
|
|
|
|
$c['outbounds'][0]['settings']['vnext'][0]['users'][0]["flow"] = "xtls-rprx-vision";
|
|
|
|
|
$c['outbounds'][0]['streamSettings'] = [
|
|
|
|
|
$c['outbounds'][0]['settings']['vnext'][0]['users'][0]["flow"] = "xtls-rprx-vision";
|
|
|
|
|
$c['outbounds'][0]['streamSettings'] = [
|
|
|
|
|
"network" => "tcp",
|
|
|
|
|
"security" => "reality",
|
|
|
|
|
"realitySettings" => [
|
|
|
|
@@ -4741,10 +4850,10 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
break;
|
|
|
|
|
case 'si':
|
|
|
|
|
if ($c['dns']['servers'][0]['address'] == '~dns~') {
|
|
|
|
|
$c['dns']['servers'][0]['address'] = "tls://" . ($pac['adguardkey'] ? "{$pac['adguardkey']}." : '') . "$domain";
|
|
|
|
|
$c['dns']['servers'][0]['address'] = "https://$domain/dns-query/$uid";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$c['outbounds'][0]['server'] = $domain;
|
|
|
|
|
$c['outbounds'][0]['server'] = $_GET['cdn'] ?: $domain;
|
|
|
|
|
$c['outbounds'][0]['uuid'] = $uid;
|
|
|
|
|
if ($pac['transport'] == 'Websocket') {
|
|
|
|
|
unset($c['outbounds'][0]['tls']['reality']);
|
|
|
|
@@ -4753,7 +4862,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
"type" => "ws",
|
|
|
|
|
"path" => "/ws"
|
|
|
|
|
];
|
|
|
|
|
$c['outbounds'][0]['tls']['server_name'] = $domain;
|
|
|
|
|
$c['outbounds'][0]['tls']['server_name'] = $_GET['cdn'] ?: $domain;
|
|
|
|
|
} else {
|
|
|
|
|
unset($c['outbounds'][0]["transport"]);
|
|
|
|
|
$c['outbounds'][0]['flow'] = 'xtls-rprx-vision';
|
|
|
|
@@ -4833,7 +4942,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
public function createRuleSet($route, $uid)
|
|
|
|
|
{
|
|
|
|
|
$pac = $this->getPacConf();
|
|
|
|
|
$domain = $pac['domain'] ?: $this->ip;
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
|
|
|
|
|
$hash = substr(md5($this->key), 0, 8);
|
|
|
|
|
|
|
|
|
@@ -5050,7 +5159,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
{
|
|
|
|
|
$conf = $this->getPacConf();
|
|
|
|
|
$ip = $this->ip;
|
|
|
|
|
$domain = $conf['domain'] ?: $ip;
|
|
|
|
|
$domain = $this->getDomain();
|
|
|
|
|
$scheme = empty($ssl = $this->nginxGetTypeCert()) ? 'http' : 'https';
|
|
|
|
|
$text = "$scheme://$domain/adguard\nLogin: admin\nPass: <span class='tg-spoiler'>{$conf['adpswd']}</span>\n\n";
|
|
|
|
|
if ($ssl) {
|
|
|
|
@@ -5225,9 +5334,13 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
'callback_data' => $conf['domain'] ? '/deldomain' : '/domain',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'text' => $this->i18n('subdomain'),
|
|
|
|
|
'text' => $this->i18n('+ subdomain'),
|
|
|
|
|
'callback_data' => '/addSubdomain',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'text' => $this->i18n('domain for link'),
|
|
|
|
|
'callback_data' => '/addLinkDomain',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
if ($conf['domain']) {
|
|
|
|
@@ -5723,7 +5836,7 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
$conf[] = '';
|
|
|
|
|
$conf[] = $peer['# PublicKey'] ? '# [Peer]' : '[Peer]';
|
|
|
|
|
if (!empty($peer['Endpoint'])) {
|
|
|
|
|
$peer['Endpoint'] = ($pac['domain'] && !$pac[$this->getInstanceWG(1) . 'amnezia'] ? $pac['domain'] : $this->ip) . ":" . getenv($this->getInstanceWG(1) ? 'WG1PORT' : 'WGPORT');
|
|
|
|
|
$peer['Endpoint'] = $this->getDomain() . ":" . getenv($this->getInstanceWG(1) ? 'WG1PORT' : 'WGPORT');
|
|
|
|
|
}
|
|
|
|
|
foreach ($peer as $k => $v) {
|
|
|
|
|
$conf[] = "$k = $v";
|
|
|
|
@@ -5882,6 +5995,14 @@ DNS-over-HTTPS with IP:
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function autoupdate()
|
|
|
|
|
{
|
|
|
|
|
$p = $this->getPacConf();
|
|
|
|
|
$p['autoupdate'] = !$p['autoupdate'];
|
|
|
|
|
$this->setPacConf($p);
|
|
|
|
|
$this->send($this->input['from'], $this->i18n('autoupdate') . ' ' . $this->i18n($p['autoupdate'] ? 'on' : 'off'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function disconnect(...$args)
|
|
|
|
|
{
|
|
|
|
|
$this->send($this->input['chat'], "disconnect: \n" . var_export($args, true) . "\n", $this->input['message_id']);
|
|
|
|
|