Improve logging and settings logic

This commit is contained in:
Daniil Gentili 2019-06-20 20:21:31 +02:00
parent dbba5a1583
commit 0a33f69e8b
7 changed files with 137 additions and 111 deletions

View File

@ -1,5 +1,7 @@
#!/usr/bin/env php #!/usr/bin/env php
<?php <?php
use danog\MadelineProto\Stream\Proxy\SocksProxy;
/* /*
Copyright 2016-2019 Daniil Gentili Copyright 2016-2019 Daniil Gentili
(https://daniil.it) (https://daniil.it)
@ -9,7 +11,7 @@ MadelineProto is distributed in the hope that it will be useful, but WITHOUT ANY
See the GNU Affero General Public License for more details. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU General Public License along with MadelineProto. You should have received a copy of the GNU General Public License along with MadelineProto.
If not, see <http://www.gnu.org/licenses/>. If not, see <http://www.gnu.org/licenses/>.
*/ */
set_include_path(get_include_path().':'.realpath(dirname(__FILE__).'/MadelineProto/')); set_include_path(get_include_path().':'.realpath(dirname(__FILE__).'/MadelineProto/'));
/* /*
@ -56,7 +58,7 @@ class EventHandler extends \danog\MadelineProto\EventHandler
} }
} }
} }
$settings = ['logger' => ['logger_level' => 5], 'connection_settings' => ['all' => ['protocol' => 'tcp_abridged']]]; $settings = ['logger' => ['logger_level' => 5], 'connection_settings' => ['all' => ['protocol' => 'tcp_abridged', 'proxy' => SocksProxy::getName(), 'proxy_extra' => ['address' => '1.pwrtelegram.xyz', 'port' => 1080]]]];
$MadelineProto = new \danog\MadelineProto\API('bot.madeline', $settings); $MadelineProto = new \danog\MadelineProto\API('bot.madeline', $settings);
$MadelineProto->async(true); $MadelineProto->async(true);

View File

@ -49,6 +49,7 @@
"files": [ "files": [
"src/BigIntegor.php", "src/BigIntegor.php",
"src/YieldReturnValue.php", "src/YieldReturnValue.php",
"src/ReflectionGenerator.php",
"src/polyfill.php" "src/polyfill.php"
] ]
}, },

View File

@ -0,0 +1,36 @@
<?php
if (!class_exists('ReflectionGenerator')) {
class ReflectionGenerator
{
private $generator;
public function __construct(Generator $generator)
{
$this->generator = $generator;
}
public function getExecutingFile(): string
{
return '';
}
public function getExecutingGenerator(): Generator
{
return $this->generator;
}
public function getExecutingLine(): int
{
return 0;
}
public function getFunction(): ReflectionFunctionAbstract
{
return new ReflectionFunction(function () {});
}
public function getThis(): object
{
return $this;
}
public function getTrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT): array
{
return [];
}
}
}

View File

@ -57,17 +57,8 @@ class API extends APIFactory
public function __construct_async($params, $settings, $deferred) public function __construct_async($params, $settings, $deferred)
{ {
if (is_string($params)) { if (is_string($params)) {
if (!\danog\MadelineProto\Logger::$default) { Logger::constructorFromSettings($settings);
if (!isset($settings['logger']['logger_param'])) {
$settings['logger']['logger_param'] = Magic::$script_cwd.'/MadelineProto.log';
}
if (!isset($settings['logger']['logger'])) {
$settings['logger']['logger'] = php_sapi_name() === 'cli' ? 3 : 2;
}
\danog\MadelineProto\Logger::constructor($settings['logger']['logger'], $settings['logger']['logger_param'], '', isset($settings['logger']['logger_level']) ? $settings['logger']['logger_level'] : Logger::VERBOSE, isset($settings['logger']['max_size']) ? $settings['logger']['max_size'] : 100 * 1024 * 1024);
}
$realpaths = Serialization::realpaths($params); $realpaths = Serialization::realpaths($params);
$this->session = $realpaths['file']; $this->session = $realpaths['file'];
@ -157,15 +148,8 @@ class API extends APIFactory
} }
$params = $settings; $params = $settings;
} }
if (!\danog\MadelineProto\Logger::$default) { Logger::constructorFromSettings($settings);
if (!isset($settings['logger']['logger_param'])) {
$settings['logger']['logger_param'] = Magic::$script_cwd.'/MadelineProto.log';
}
if (!isset($settings['logger']['logger'])) {
$settings['logger']['logger'] = php_sapi_name() === 'cli' ? 3 : 2;
}
\danog\MadelineProto\Logger::constructor($settings['logger']['logger'], $settings['logger']['logger_param'], '', isset($settings['logger']['logger_level']) ? $settings['logger']['logger_level'] : Logger::VERBOSE, isset($settings['logger']['max_size']) ? $settings['logger']['max_size'] : 100 * 1024 * 1024);
}
if (!isset($params['app_info']['api_id']) || !$params['app_info']['api_id']) { if (!isset($params['app_info']['api_id']) || !$params['app_info']['api_id']) {
$app = yield $this->api_start_async($params); $app = yield $this->api_start_async($params);
$params['app_info']['api_id'] = $app['api_id']; $params['app_info']['api_id'] = $app['api_id'];

View File

@ -31,10 +31,10 @@ class Logger
{ {
use Tools; use Tools;
const foreground = ['default' => 39, 'black' => 30, 'red' => 31, 'green' => 32, 'yellow' => 33, 'blue' => 34, 'magenta' => 35, 'cyan' => 36, 'light_gray' => 37, 'dark_gray' => 90, 'light_red' => 91, 'light_green' => 92, 'light_yellow' => 93, 'light_blue' => 94, 'light_magenta' => 95, 'light_cyan' => 96, 'white' => 97]; const FOREGROUND = ['default' => 39, 'black' => 30, 'red' => 31, 'green' => 32, 'yellow' => 33, 'blue' => 34, 'magenta' => 35, 'cyan' => 36, 'light_gray' => 37, 'dark_gray' => 90, 'light_red' => 91, 'light_green' => 92, 'light_yellow' => 93, 'light_blue' => 94, 'light_magenta' => 95, 'light_cyan' => 96, 'white' => 97];
const background = ['default' => 49, 'black' => 40, 'red' => 41, 'magenta' => 45, 'yellow' => 43, 'green' => 42, 'blue' => 44, 'cyan' => 46, 'light_gray' => 47, 'dark_gray' => 100, 'light_red' => 101, 'light_green' => 102, 'light_yellow' => 103, 'light_blue' => 104, 'light_magenta' => 105, 'light_cyan' => 106, 'white' => 107]; const BACKGROUND = ['default' => 49, 'black' => 40, 'red' => 41, 'magenta' => 45, 'yellow' => 43, 'green' => 42, 'blue' => 44, 'cyan' => 46, 'light_gray' => 47, 'dark_gray' => 100, 'light_red' => 101, 'light_green' => 102, 'light_yellow' => 103, 'light_blue' => 104, 'light_magenta' => 105, 'light_cyan' => 106, 'white' => 107];
const set = ['bold' => 1, 'dim' => 2, 'underlined' => 3, 'blink' => 4, 'reverse' => 5, 'hidden' => 6]; const SET = ['bold' => 1, 'dim' => 2, 'underlined' => 3, 'blink' => 4, 'reverse' => 5, 'hidden' => 6];
const reset = ['all' => 0, 'bold' => 21, 'dim' => 22, 'underlined' => 24, 'blink' => 25, 'reverse' => 26, 'hidden' => 28]; const RESET = ['all' => 0, 'bold' => 21, 'dim' => 22, 'underlined' => 24, 'blink' => 25, 'reverse' => 26, 'hidden' => 28];
public $mode = 0; public $mode = 0;
public $optional = null; public $optional = null;
@ -60,21 +60,72 @@ class Logger
const ECHO_LOGGER = 3; const ECHO_LOGGER = 3;
const CALLABLE_LOGGER = 4; const CALLABLE_LOGGER = 4;
/* /**
* Constructor function * Construct global logger
* Accepts various logger modes: *
* 0 - No logger * @param [type] $mode
* 1 - Log to the default logger destination * @param [type] $optional
* 2 - Log to file defined in second parameter * @param string $prefix
* 3 - Echo logs * @param [type] $level
* 4 - Call callable provided in logger_param. logger_param must accept two parameters: array $message, int $level * @param [type] $max_size
* $message is an array containing the messages the log, $level, is the logging level * @return void
*/ */
public static function constructor($mode, $optional = null, $prefix = '', $level = self::NOTICE, $max_size = 100 * 1024 * 1024) public static function constructor($mode, $optional = null, $prefix = '', $level = self::NOTICE, $max_size = 100 * 1024 * 1024)
{ {
self::$default = new self($mode, $optional, $prefix, $level, $max_size); self::$default = new self($mode, $optional, $prefix, $level, $max_size);
} }
/**
* Construct global static logger from MadelineProto settings
*
* @param array $settings
* @return void
*/
public static function constructorFromSettings(array $settings) {
if (!self::$default) {
// The getLogger function will automatically init the static logger, but we'll do it again anyway
self::$default = self::getLoggerFromSettings(MTProto::getSettings($settings));
}
}
/**
* Get logger from MadelineProto settings
*
* @param array $settings
* @param string $prefix Optional prefix
* @return self
*/
public static function getLoggerFromSettings(array $settings, string $prefix = ''): self
{
if (isset($settings['logger']['rollbar_token']) && $settings['logger']['rollbar_token'] !== '' && class_exists('\\Rollbar\\Rollbar')) {
@\Rollbar\Rollbar::init(['environment' => 'production', 'root' => __DIR__, 'access_token' => isset($settings['logger']['rollbar_token']) && !in_array($settings['logger']['rollbar_token'], ['f9fff6689aea4905b58eec73f66c791d', '300afd7ccef346ea84d0c185ae831718', '11a8c2fe4c474328b40a28193f8d63f5', 'beef2d426496462ba34dcaad33d44a14']) || $settings['pwr']['pwr'] ? $settings['logger']['rollbar_token'] : 'c07d9b2f73c2461297b0beaef6c1662f'], false, false);
} else {
Exception::$rollbar = false;
RPCErrorException::$rollbar = false;
}
if (php_sapi_name() !== 'cli') {
if (isset($settings['logger']['logger_param']) && basename($settings['logger']['logger_param']) === 'MadelineProto.log') {
$settings['logger']['logger_param'] = Magic::$script_cwd.'/MadelineProto.log';
}
}
$logger = new self($settings['logger']['logger'], isset($settings['logger']['logger_param']) ? $settings['logger']['logger_param'] : '', $prefix, isset($settings['logger']['logger_level']) ? $settings['logger']['logger_level'] : Logger::VERBOSE, isset($settings['logger']['max_size']) ? $settings['logger']['max_size'] : 100 * 1024 * 1024);
if (!self::$default) {
self::$default = $logger;
}
if (php_sapi_name() !== 'cli') {
try {
error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', Magic::$script_cwd.'/MadelineProto.log');
error_log('Enabled PHP logging');
} catch (\danog\MadelineProto\Exception $e) {
$logger->logger('Could not enable PHP logging');
}
}
return $logger;
}
public function __construct($mode, $optional = null, $prefix = '', $level = self::NOTICE, $max_size = 100 * 1024 * 1024) public function __construct($mode, $optional = null, $prefix = '', $level = self::NOTICE, $max_size = 100 * 1024 * 1024)
{ {
if ($mode === null) { if ($mode === null) {
@ -97,12 +148,12 @@ class Logger
unlink($this->optional); unlink($this->optional);
} }
$this->colors[self::ULTRA_VERBOSE] = implode(';', [self::foreground['light_gray'], self::set['dim']]); $this->colors[self::ULTRA_VERBOSE] = implode(';', [self::FOREGROUND['light_gray'], self::SET['dim']]);
$this->colors[self::VERBOSE] = implode(';', [self::foreground['green'], self::set['bold']]); $this->colors[self::VERBOSE] = implode(';', [self::FOREGROUND['green'], self::SET['bold']]);
$this->colors[self::NOTICE] = implode(';', [self::foreground['yellow'], self::set['bold']]); $this->colors[self::NOTICE] = implode(';', [self::FOREGROUND['yellow'], self::SET['bold']]);
$this->colors[self::WARNING] = implode(';', [self::foreground['white'], self::set['dim'], self::background['red']]); $this->colors[self::WARNING] = implode(';', [self::FOREGROUND['white'], self::SET['dim'], self::BACKGROUND['red']]);
$this->colors[self::ERROR] = implode(';', [self::foreground['white'], self::set['bold'], self::background['red']]); $this->colors[self::ERROR] = implode(';', [self::FOREGROUND['white'], self::SET['bold'], self::BACKGROUND['red']]);
$this->colors[self::FATAL_ERROR] = implode(';', [self::foreground['red'], self::set['bold'], self::background['light_gray']]); $this->colors[self::FATAL_ERROR] = implode(';', [self::FOREGROUND['red'], self::SET['bold'], self::BACKGROUND['light_gray']]);
$this->newline = PHP_EOL; $this->newline = PHP_EOL;
if ($this->mode === 3) { if ($this->mode === 3) {
@ -138,14 +189,14 @@ class Logger
} }
if (!self::$printed) { if (!self::$printed) {
self::$printed = true; self::$printed = true;
$this->colors[self::NOTICE] = implode(';', [self::foreground['light_gray'], self::set['bold'], self::background['blue']]); $this->colors[self::NOTICE] = implode(';', [self::FOREGROUND['light_gray'], self::SET['bold'], self::BACKGROUND['blue']]);
$this->logger('MadelineProto'); $this->logger('MadelineProto');
$this->logger('Copyright (C) 2016-2019 Daniil Gentili'); $this->logger('Copyright (C) 2016-2019 Daniil Gentili');
$this->logger('Licensed under AGPLv3'); $this->logger('Licensed under AGPLv3');
$this->logger('https://github.com/danog/MadelineProto'); $this->logger('https://github.com/danog/MadelineProto');
$this->colors[self::NOTICE] = implode(';', [self::foreground['yellow'], self::set['bold']]); $this->colors[self::NOTICE] = implode(';', [self::FOREGROUND['yellow'], self::SET['bold']]);
} }
if ($this->mode === 4) { if ($this->mode === 4) {
return call_user_func_array($this->optional, [$param, $level]); return call_user_func_array($this->optional, [$param, $level]);

View File

@ -507,18 +507,17 @@ class MTProto extends AsyncConstruct implements TLCallback
$this->wrapper->serialize($this->wrapper->session); $this->wrapper->serialize($this->wrapper->session);
} }
} }
public static function getSettings($settings, $previousSettings = [])
public function parse_settings($settings)
{ {
if (isset($this->settings['connection_settings']['default_dc'])) { if (isset($previousSettings['connection_settings']['default_dc'])) {
$settings['connection_settings']['default_dc'] = $this->settings['connection_settings']['default_dc']; $settings['connection_settings']['default_dc'] = $previousSettings['connection_settings']['default_dc'];
} }
if (!isset($settings['app_info']['api_id']) || !$settings['app_info']['api_id']) { if (!isset($settings['app_info']['api_id']) || !$settings['app_info']['api_id']) {
if (isset($this->settings['app_info']['api_id']) && $this->settings['app_info']['api_id']) { if (isset($previousSettings['app_info']['api_id']) && $previousSettings['app_info']['api_id']) {
$settings['app_info']['api_id'] = $this->settings['app_info']['api_id']; $settings['app_info']['api_id'] = $previousSettings['app_info']['api_id'];
$settings['app_info']['api_hash'] = $this->settings['app_info']['api_hash']; $settings['app_info']['api_hash'] = $previousSettings['app_info']['api_hash'];
} else { } else {
throw new \danog\MadelineProto\Exception(\danog\MadelineProto\Lang::$current_lang['api_not_set'], 0, null, 'MadelineProto', 1); $settings['app_info'] = null;
} }
} }
// Detect device model // Detect device model
@ -795,10 +794,6 @@ class MTProto extends AsyncConstruct implements TLCallback
// Need info ? // Need info ?
'requests' => true, 'requests' => true,
]]; ]];
if (!is_array($settings)) {
$settings = [];
}
$settings = array_replace_recursive($default_settings, $settings); $settings = array_replace_recursive($default_settings, $settings);
if (isset(Lang::$lang[$settings['app_info']['lang_code']])) { if (isset(Lang::$lang[$settings['app_info']['lang_code']])) {
Lang::$current_lang = &Lang::$lang[$settings['app_info']['lang_code']]; Lang::$current_lang = &Lang::$lang[$settings['app_info']['lang_code']];
@ -826,6 +821,14 @@ class MTProto extends AsyncConstruct implements TLCallback
$settings['logger']['logger_level'] = 0; $settings['logger']['logger_level'] = 0;
break; break;
} }
return $settings;
}
public function parse_settings($settings)
{
$settings = self::getSettings($settings, $this->settings);
if ($this->settings['app_info'] === null) {
throw new \danog\MadelineProto\Exception(\danog\MadelineProto\Lang::$current_lang['api_not_set'], 0, null, 'MadelineProto', 1);
}
$this->settings = $settings; $this->settings = $settings;
if (!$this->settings['updates']['handle_updates']) { if (!$this->settings['updates']['handle_updates']) {
$this->updates = []; $this->updates = [];
@ -836,34 +839,7 @@ class MTProto extends AsyncConstruct implements TLCallback
public function setup_logger() public function setup_logger()
{ {
if (isset($this->settings['logger']['rollbar_token']) && $this->settings['logger']['rollbar_token'] !== '' && class_exists('\\Rollbar\\Rollbar')) { $this->logger = Logger::getLoggerFromSettings($this->settings, isset($this->authorization['user']) ? isset($this->authorization['user']['username']) ? $this->authorization['user']['username'] : $this->authorization['user']['id'] : '');
@\Rollbar\Rollbar::init(['environment' => 'production', 'root' => __DIR__, 'access_token' => isset($this->settings['logger']['rollbar_token']) && !in_array($this->settings['logger']['rollbar_token'], ['f9fff6689aea4905b58eec73f66c791d', '300afd7ccef346ea84d0c185ae831718', '11a8c2fe4c474328b40a28193f8d63f5', 'beef2d426496462ba34dcaad33d44a14']) || $this->settings['pwr']['pwr'] ? $this->settings['logger']['rollbar_token'] : 'c07d9b2f73c2461297b0beaef6c1662f'], false, false);
} else {
Exception::$rollbar = false;
RPCErrorException::$rollbar = false;
}
if (php_sapi_name() !== 'cli') {
if (isset($this->settings['logger']['logger_param']) && basename($this->settings['logger']['logger_param']) === 'MadelineProto.log') {
$this->settings['logger']['logger_param'] = Magic::$script_cwd.'/MadelineProto.log';
}
}
$this->logger = new \danog\MadelineProto\Logger($this->settings['logger']['logger'], isset($this->settings['logger']['logger_param']) ? $this->settings['logger']['logger_param'] : '', isset($this->authorization['user']) ? isset($this->authorization['user']['username']) ? $this->authorization['user']['username'] : $this->authorization['user']['id'] : '', isset($this->settings['logger']['logger_level']) ? $this->settings['logger']['logger_level'] : Logger::VERBOSE, isset($this->settings['logger']['max_size']) ? $this->settings['logger']['max_size'] : 100 * 1024 * 1024);
if (!\danog\MadelineProto\Logger::$default) {
\danog\MadelineProto\Logger::constructor($this->settings['logger']['logger'], $this->settings['logger']['logger_param'], isset($this->authorization['user']) ? isset($this->authorization['user']['username']) ? $this->authorization['user']['username'] : $this->authorization['user']['id'] : '', isset($this->settings['logger']['logger_level']) ? $this->settings['logger']['logger_level'] : Logger::VERBOSE, isset($this->settings['logger']['max_size']) ? $this->settings['logger']['max_size'] : 100 * 1024 * 1024);
}
if (php_sapi_name() !== 'cli') {
try {
error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', Magic::$script_cwd.'/MadelineProto.log');
error_log('Enabled PHP logging');
} catch (\danog\MadelineProto\Exception $e) {
$this->logger->logger('Could not enable PHP logging');
}
}
} }
public function reset_session($de = true, $auth_key = false) public function reset_session($de = true, $auth_key = false)

View File

@ -32,7 +32,7 @@ class MyTelegramOrgWrapper
private $token; private $token;
private $number; private $number;
private $creation_hash; private $creation_hash;
private $settings; private $settings = [];
private $async = true; private $async = true;
const MY_TELEGRAM_URL = 'https://my.telegram.org'; const MY_TELEGRAM_URL = 'https://my.telegram.org';
@ -43,42 +43,18 @@ class MyTelegramOrgWrapper
public function __construct($settings = []) public function __construct($settings = [])
{ {
if (!isset($settings['all'])) { $this->settings = MTProto::getSettings($settings, $this->settings);
$settings['connection_settings'] = ['all' => [
// These settings will be applied on every datacenter that hasn't a custom settings subarray...
'protocol' => Magic::$altervista ? 'http' : 'tcp_abridged',
// can be tcp_full, tcp_abridged, tcp_intermediate, http, https, obfuscated2, udp (unsupported)
'test_mode' => false,
// decides whether to connect to the main telegram servers or to the testing servers (deep telegram)
'ipv6' => \danog\MadelineProto\Magic::$ipv6,
// decides whether to use ipv6, ipv6 attribute of API attribute of API class contains autodetected boolean
'timeout' => 2,
// timeout for sockets
'proxy' => Magic::$altervista ? '\\HttpProxy' : '\\Socket',
// The proxy class to use
'proxy_extra' => Magic::$altervista ? ['address' => 'localhost', 'port' => 80] : [],
// Extra parameters to pass to the proxy class using setExtra
'obfuscated' => false,
'transport' => 'tcp',
'pfs' => extension_loaded('gmp'),
],
];
}
$this->settings = $settings;
$this->__wakeup(); $this->__wakeup();
} }
public function __wakeup() public function __wakeup()
{ {
$this->datacenter = new DataCenter( $this->datacenter = new DataCenter(
new class($this->settings) { new class($this->settings)
{
public function __construct($settings) public function __construct($settings)
{ {
$this->logger = new Logger( $this->logger = Logger::getLoggerFromSettings($settings);
isset($settings['logger']['logger']) ? $settings['logger']['logger'] : php_sapi_name() === 'cli' ? 3 : 2,
isset($settings['logger']['logger_param']) ? $settings['logger']['logger_param'] : Magic::$script_cwd.'/MadelineProto.log',
isset($settings['logger']['logger_level']) ? $settings['logger']['logger_level'] : Logger::VERBOSE,
isset($settings['logger']['max_size']) ? $settings['logger']['max_size'] : 100 * 1024 * 1024);
} }
}, },
[], [],