diff --git a/src/danog/MadelineProto/API.php b/src/danog/MadelineProto/API.php index e0181da3..0c7ddb18 100644 --- a/src/danog/MadelineProto/API.php +++ b/src/danog/MadelineProto/API.php @@ -36,16 +36,24 @@ class API extends APIFactory $this->API->v = $this->API->getV(); \danog\MadelineProto\Logger::log(['MadelineProto is ready!'], Logger::NOTICE); } - public function __wakeup() { + + public function __wakeup() + { //if (method_exists($this->API, 'wakeup')) $this->API = $this->API->wakeup(); $this->APIFactory(); } - public function __destruct() { + public function __destruct() + { restore_error_handler(); } - public function __sleep() { return ['API']; } + + public function __sleep() + { + return ['API']; + } + public function APIFactory() { foreach ($this->API->get_method_namespaces() as $namespace) { diff --git a/src/danog/MadelineProto/DataCenter.php b/src/danog/MadelineProto/DataCenter.php index 505d3586..a615fe0a 100644 --- a/src/danog/MadelineProto/DataCenter.php +++ b/src/danog/MadelineProto/DataCenter.php @@ -38,6 +38,7 @@ class DataCenter $socket->close_and_reopen(); } } + public function dc_disconnect($dc_number) { if ($this->curdc === $dc_number) { @@ -85,8 +86,7 @@ class DataCenter return array_keys($this->dclist[$test][$ipv6]); } - - + /* public function &__get($name) { diff --git a/src/danog/MadelineProto/DocsBuilder.php b/src/danog/MadelineProto/DocsBuilder.php index 775a76b9..89f368d8 100755 --- a/src/danog/MadelineProto/DocsBuilder.php +++ b/src/danog/MadelineProto/DocsBuilder.php @@ -325,7 +325,7 @@ description: List of methods } $layer = isset($this->constructors->layer[$key]) ? '_'.$this->constructors->layer[$key] : ''; $rtype = $this->constructors->type[$key]; - + $type = str_replace(['.', '<', '>'], ['_', '_of_', ''], $rtype); $real_type = preg_replace('/.*_of_/', '', $type); $constructor = str_replace(['.', '<', '>'], ['_', '_of_', ''], $rconstructor); @@ -338,7 +338,6 @@ description: List of methods $types[$real_type]['constructors'][] = $key; } - $params = ''; foreach ($this->constructors->params[$key] as $param) { if (in_array($param['name'], ['flags', 'random_id', 'random_bytes'])) { @@ -524,7 +523,6 @@ description: List of constructors \danog\MadelineProto\Logger::log(['Generating types documentation...'], \danog\MadelineProto\Logger::NOTICE); foreach ($types as $otype => $keys) { - $new_namespace = preg_replace('/_.*/', '', $method); $br = $new_namespace != $last_namespace ? '***

' : ''; @@ -602,7 +600,9 @@ $'.$type.' = -147286699; // Numeric chat id returned by request_secret_chat, can '.$methods.' '; -if (file_exists('types/'.$type.'.md')) var_dump($type); + if (file_exists('types/'.$type.'.md')) { + var_dump($type); + } file_put_contents('types/'.$type.'.md', $header.$constructors.$methods); $last_namespace = $new_namespace; } diff --git a/src/danog/MadelineProto/MTProto.php b/src/danog/MadelineProto/MTProto.php index 4a7e8015..6dadb88b 100644 --- a/src/danog/MadelineProto/MTProto.php +++ b/src/danog/MadelineProto/MTProto.php @@ -51,7 +51,7 @@ class MTProto public $bigint = false; public $run_workers = false; public $threads = false; - + public function __construct($settings = []) { //if ($this->unserialized($settings)) return true; @@ -107,7 +107,7 @@ class MTProto $this->v = $this->getV(); $this->should_serialize = true; } - + public function __sleep() { $t = get_object_vars($this); @@ -142,7 +142,9 @@ class MTProto if (!isset($this->v) || $this->v !== $this->getV()) { \danog\MadelineProto\Logger::log(['Serialization is out of date, reconstructing object!'], Logger::WARNING); $settings = $this->settings; - if (isset($settings['updates']['callback'][0]) && $settings['updates']['callback'][0] === $this) $settings['updates']['callback'] = 'get_updates_update_handler'; + if (isset($settings['updates']['callback'][0]) && $settings['updates']['callback'][0] === $this) { + $settings['updates']['callback'] = 'get_updates_update_handler'; + } unset($settings['tl_schema']); $this->reset_session(true, true); $this->__construct($settings); @@ -153,7 +155,6 @@ class MTProto \danog\MadelineProto\Logger::log(['Getting updates after deserialization...'], Logger::NOTICE); $this->get_updates_difference(); } - } public function __destruct() @@ -161,14 +162,15 @@ class MTProto if (isset($this->reader_pool)) { $this->run_workers = false; while ($number = $this->reader_pool->collect()) { - \danog\MadelineProto\Logger::log(['Shutting down reader pool, '.$number .' jobs left'], \danog\MadelineProto\Logger::NOTICE); + \danog\MadelineProto\Logger::log(['Shutting down reader pool, '.$number.' jobs left'], \danog\MadelineProto\Logger::NOTICE); } $this->reader_pool->shutdown(); } } + public function setup_threads() { - if ($this->threads = $this->run_workers = class_exists('\Pool') && in_array(php_sapi_name(), ['cli', 'phpdbg']) && $this->settings['threading']['allow_threading'] && extension_loaded("pthreads")) { + if ($this->threads = $this->run_workers = class_exists('\Pool') && in_array(php_sapi_name(), ['cli', 'phpdbg']) && $this->settings['threading']['allow_threading'] && extension_loaded('pthreads')) { \danog\MadelineProto\Logger::log(['THREADING IS ENABLED'], \danog\MadelineProto\Logger::NOTICE); $this->start_threads(); } @@ -364,7 +366,6 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB case 'FATAL ERROR': $settings['logger']['logger_level'] = 0; break; } - $this->settings = $settings; // Setup logger $this->setup_logger(); @@ -373,10 +374,9 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB public function setup_logger() { - \danog\MadelineProto\Logger::constructor( $this->settings['logger']['logger'], - $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); } @@ -384,7 +384,7 @@ isset($this->authorization['user']) ? (isset($this->authorization['user']['usern { foreach ($this->datacenter->sockets as $id => $socket) { if ($de) { - \danog\MadelineProto\Logger::log(['Resetting session id'.($auth_key ? ', authorization key':'').' and seq_no in DC '.$id.'...'], Logger::VERBOSE); + \danog\MadelineProto\Logger::log(['Resetting session id'.($auth_key ? ', authorization key' : '').' and seq_no in DC '.$id.'...'], Logger::VERBOSE); $socket->session_id = $this->random(8); $socket->session_in_seq_no = 0; $socket->session_out_seq_no = 0; @@ -413,13 +413,17 @@ isset($this->authorization['user']) ? (isset($this->authorization['user']['usern $this->connect_to_all_dcs(); } } + private $initing_authorization = false; + // Creates authorization keys public function init_authorization() { $this->initing_authorization = true; foreach ($this->datacenter->sockets as $id => $socket) { - if (strpos($id, 'media')) continue; + if (strpos($id, 'media')) { + continue; + } if ($socket->session_id === null) { $socket->session_id = $this->random(8); $socket->session_in_seq_no = 0; @@ -450,7 +454,9 @@ isset($this->authorization['user']) ? (isset($this->authorization['user']['usern if (($int_dc = preg_replace('|/D+|', '', $new_dc)) == $authorized_dc) { continue; } - if ($int_dc != $new_dc) continue; + if ($int_dc != $new_dc) { + continue; + } \danog\MadelineProto\Logger::log(['Copying authorization from dc '.$authorized_dc.' to dc '.$new_dc.'...'], Logger::VERBOSE); $this->should_serialize = true; $exported_authorization = $this->method_call('auth.exportAuthorization', ['dc_id' => $new_dc], ['datacenter' => $authorized_dc]); @@ -467,15 +473,15 @@ isset($this->authorization['user']) ? (isset($this->authorization['user']['usern 'invokeWithLayer', [ 'layer' => $this->settings['tl_schema']['layer'], - 'query' => $this->serialize_method('initConnection', + 'query' => $this->serialize_method('initConnection', [ - 'api_id' => $this->settings['app_info']['api_id'], - 'api_hash' => $this->settings['app_info']['api_hash'], - 'device_model' => strpos($options['datacenter'], 'cdn') === false ? $this->settings['app_info']['device_model'] : "n/a", - 'system_version' => strpos($options['datacenter'], 'cdn') === false ? $this->settings['app_info']['system_version'] : "n/a", - 'app_version' => $this->settings['app_info']['app_version'], - 'lang_code' => $this->settings['app_info']['lang_code'], - 'query' => $this->serialize_method($method, $arguments) + 'api_id' => $this->settings['app_info']['api_id'], + 'api_hash' => $this->settings['app_info']['api_hash'], + 'device_model' => strpos($options['datacenter'], 'cdn') === false ? $this->settings['app_info']['device_model'] : 'n/a', + 'system_version' => strpos($options['datacenter'], 'cdn') === false ? $this->settings['app_info']['system_version'] : 'n/a', + 'app_version' => $this->settings['app_info']['app_version'], + 'lang_code' => $this->settings['app_info']['lang_code'], + 'query' => $this->serialize_method($method, $arguments), ] ), ], @@ -499,7 +505,7 @@ isset($this->authorization['user']) ? (isset($this->authorization['user']['usern unset($this->config['dc_options']); \danog\MadelineProto\Logger::log(['Updated config!', $this->config], Logger::NOTICE); } - + public function parse_dc_options($dc_options) { foreach ($dc_options as $dc) { diff --git a/src/danog/MadelineProto/MTProtoTools/AuthKeyHandler.php b/src/danog/MadelineProto/MTProtoTools/AuthKeyHandler.php index aa49b919..39488e1d 100644 --- a/src/danog/MadelineProto/MTProtoTools/AuthKeyHandler.php +++ b/src/danog/MadelineProto/MTProtoTools/AuthKeyHandler.php @@ -72,18 +72,18 @@ trait AuthKeyHandler $this->should_serialize = true; } } - + /* * *********************************************************************** * Find our key in the server_public_key_fingerprints vector */ - + foreach ($this->rsa_keys as $fp => $curkey) { if (in_array($fp, $ResPQ['server_public_key_fingerprints'])) { $key = $curkey; } } - + if (!isset($key)) { throw new \danog\MadelineProto\SecurityException("Couldn't find any of our keys in the server_public_key_fingerprints vector."); } diff --git a/src/danog/MadelineProto/MTProtoTools/CallHandler.php b/src/danog/MadelineProto/MTProtoTools/CallHandler.php index 3dd747ac..8b54f86b 100644 --- a/src/danog/MadelineProto/MTProtoTools/CallHandler.php +++ b/src/danog/MadelineProto/MTProtoTools/CallHandler.php @@ -61,7 +61,9 @@ trait CallHandler $server_answer = null; $update_count = 0; $only_updates = false; - if ($canunset = !$this->getting_state && !$this->threads && !$this->run_workers) $this->getting_state = true; + if ($canunset = !$this->getting_state && !$this->threads && !$this->run_workers) { + $this->getting_state = true; + } while ($server_answer === null && $res_count++ < $this->settings['max_tries']['response'] + 1) { // Loop until we get a response, loop for a max of $this->settings['max_tries']['response'] times try { \danog\MadelineProto\Logger::log(['Getting response (try number '.$res_count.' for '.$method.')...'], \danog\MadelineProto\Logger::ULTRA_VERBOSE); @@ -96,7 +98,7 @@ trait CallHandler continue; } } - + if ($canunset) { $this->getting_state = false; $this->handle_pending_updates(); @@ -162,12 +164,13 @@ trait CallHandler $this->handle_pending_updates(); } } - + if ($server_answer === null) { if ($last_recv === $this->last_recv && $this->datacenter->sockets[$args['datacenter']]->temp_auth_key != null) { \danog\MadelineProto\Logger::log(['WARNING: Resetting auth key...'], \danog\MadelineProto\Logger::WARNING); $this->datacenter->sockets[$args['datacenter']]->temp_auth_key = null; $this->init_authorization(); + return $this->method_call($method, $args, $aargs); } throw new \danog\MadelineProto\Exception('An error occurred while calling method '.$method.' ('.$last_error.').'); @@ -178,9 +181,10 @@ trait CallHandler $server_answer = [$server_answer]; foreach ($message_chunks as $message) { $args['message'] = $message; - $server_answer []= $this->method_call($method, $args, $aargs); + $server_answer[] = $this->method_call($method, $args, $aargs); } } + return $server_answer; } diff --git a/src/danog/MadelineProto/MTProtoTools/Crypt.php b/src/danog/MadelineProto/MTProtoTools/Crypt.php index e5a9b241..dfe61200 100644 --- a/src/danog/MadelineProto/MTProtoTools/Crypt.php +++ b/src/danog/MadelineProto/MTProtoTools/Crypt.php @@ -35,7 +35,7 @@ trait Crypt return $cipher->encrypt($message); } - + public function ctr_encrypt($message, $key, $iv, $length) { $cipher = new \phpseclib\Crypt\AES(\phpseclib\Crypt\AES::MODE_CTR); diff --git a/src/danog/MadelineProto/MTProtoTools/MessageHandler.php b/src/danog/MadelineProto/MTProtoTools/MessageHandler.php index 444766b8..a55d8bec 100644 --- a/src/danog/MadelineProto/MTProtoTools/MessageHandler.php +++ b/src/danog/MadelineProto/MTProtoTools/MessageHandler.php @@ -22,6 +22,7 @@ trait MessageHandler * :param message: byte string to send. */ private $last_recv = 0; + public function send_message($message_data, $content_related, $aargs = []) { if (!isset($aargs['message_id']) || $aargs['message_id'] === null) { @@ -55,7 +56,6 @@ trait MessageHandler */ public function recv_message($datacenter) { - $payload = $this->datacenter->sockets[$datacenter]->read_message(); if (strlen($payload) === 4) { $error = \danog\PHP\Struct::unpack('method_call('updates.getChannelDifference', ['channel' => $input, 'filter' => ['_' => 'channelMessagesFilterEmpty'], 'pts' => $this->get_channel_state($channel)['pts'], 'limit' => 30], ['datacenter' => $this->datacenter->curdc]); } catch (\danog\MadelineProto\RPCErrorException $e) { - if ($e->getMessage() === 'CHANNEL_PRIVATE') return false; else throw $e; + if ($e->getMessage() === 'CHANNEL_PRIVATE') { + return false; + } else { + throw $e; + } } \danog\MadelineProto\Logger::log(['Got '.$difference['_']], \danog\MadelineProto\Logger::VERBOSE); $this->get_channel_state($channel)['sync_loading'] = false; diff --git a/src/danog/MadelineProto/Stream.php b/src/danog/MadelineProto/Stream.php index ea05f795..a7ffe160 100644 --- a/src/danog/MadelineProto/Stream.php +++ b/src/danog/MadelineProto/Stream.php @@ -13,7 +13,7 @@ If not, see . namespace danog\MadelineProto; /** - * Just a stream wrapper + * Just a stream wrapper. */ class Stream { diff --git a/src/danog/MadelineProto/TL/Conversion/BotAPI.php b/src/danog/MadelineProto/TL/Conversion/BotAPI.php index 9d3ea5b0..058b15c7 100644 --- a/src/danog/MadelineProto/TL/Conversion/BotAPI.php +++ b/src/danog/MadelineProto/TL/Conversion/BotAPI.php @@ -448,35 +448,43 @@ trait BotAPI return $arguments; } - function split_to_chunks($text){ - $total_length = 4096; - $text_arr = multipleExplodeKeepDelimiters(array("\n"),$text); - $i=0; - $message[0]=""; - foreach ($text_arr as $word){ - if ( strlen($message[$i] . $word . ' ') <= $total_length ){ - if ($text_arr[count($text_arr)-1] == $word){ - $message[$i] .= $word; - } else { - $message[$i] .= $word . ' '; - } - } else { - $i++; - if ($text_arr[count($text_arr)-1] == $word){ - $message[$i] = $word; - } else { - $message[$i] = $word . ' '; - } - } - } - return $message; + + public function split_to_chunks($text) + { + $total_length = 4096; + $text_arr = multipleExplodeKeepDelimiters(["\n"], $text); + $i = 0; + $message[0] = ''; + foreach ($text_arr as $word) { + if (strlen($message[$i].$word.' ') <= $total_length) { + if ($text_arr[count($text_arr) - 1] == $word) { + $message[$i] .= $word; + } else { + $message[$i] .= $word.' '; + } + } else { + $i++; + if ($text_arr[count($text_arr) - 1] == $word) { + $message[$i] = $word; + } else { + $message[$i] = $word.' '; + } + } + } + + return $message; } -function multipleExplodeKeepDelimiters($delimiters, $string) { - $initialArray = explode(chr(1), str_replace($delimiters, chr(1), $string)); - $finalArray = array(); - foreach($initialArray as $item) { - if(strlen($item) > 0) array_push($finalArray, $item . $string[strpos($string, $item) + strlen($item)]); + + public function multipleExplodeKeepDelimiters($delimiters, $string) + { + $initialArray = explode(chr(1), str_replace($delimiters, chr(1), $string)); + $finalArray = []; + foreach ($initialArray as $item) { + if (strlen($item) > 0) { + array_push($finalArray, $item.$string[strpos($string, $item) + strlen($item)]); + } + } + + return $finalArray; } - return $finalArray; -} } diff --git a/src/danog/MadelineProto/TL/TL.php b/src/danog/MadelineProto/TL/TL.php index 4d26a623..590c75d0 100644 --- a/src/danog/MadelineProto/TL/TL.php +++ b/src/danog/MadelineProto/TL/TL.php @@ -182,7 +182,9 @@ trait TL if ($this->constructors->find_by_id($id) === false) { unset($this->td_descriptions['constructors'][$name]); } else { - if (!count($this->td_descriptions['constructors'][$name]['params'])) continue; + if (!count($this->td_descriptions['constructors'][$name]['params'])) { + continue; + } foreach ($this->td_descriptions['constructors'][$name]['params'] as $k => $param) { $this->td_descriptions['constructors'][$name]['params'][$k] = str_replace('nullable', 'optional', $param); } diff --git a/src/danog/MadelineProto/Threads/SocketReader.php b/src/danog/MadelineProto/Threads/SocketReader.php index 9d204e47..eb5ba1d1 100644 --- a/src/danog/MadelineProto/Threads/SocketReader.php +++ b/src/danog/MadelineProto/Threads/SocketReader.php @@ -18,6 +18,7 @@ namespace danog\MadelineProto\Threads; class SocketReader extends \Threaded implements \Collectable { public $ready = false; + public function __construct($me, $current) { return; @@ -42,7 +43,7 @@ class SocketReader extends \Threaded implements \Collectable */ public function run() { -var_dump("BLOCK"); + var_dump('BLOCK'); while (true); require_once __DIR__.'/../SecurityException.php'; require_once __DIR__.'/../RPCErrorException.php'; @@ -51,7 +52,7 @@ var_dump("BLOCK"); require_once __DIR__.'/../TL/Exception.php'; require_once __DIR__.'/../NothingInTheSocketException.php'; require_once __DIR__.'/../Exception.php'; - + $handler_pool = new \Pool($this->API->settings['threading']['handler_workers']); $this->ready = true; @@ -64,7 +65,7 @@ var_dump("BLOCK"); //} catch (\danog\MadelineProto\NothingInTheSocketException $e) { \danog\MadelineProto\Logger::log(['Nothing in the socket for dc '.$this->current], \danog\MadelineProto\Logger::VERBOSE); } //} while ($number = $handler_pool->collect()) { - \danog\MadelineProto\Logger::log(['Shutting down handler pool for dc '.$this->current.', '.$number .' jobs left'], \danog\MadelineProto\Logger::NOTICE); + \danog\MadelineProto\Logger::log(['Shutting down handler pool for dc '.$this->current.', '.$number.' jobs left'], \danog\MadelineProto\Logger::NOTICE); } $this->setGarbage(); } diff --git a/src/danog/MadelineProto/Tools.php b/src/danog/MadelineProto/Tools.php index f7ccc989..2b3bf348 100644 --- a/src/danog/MadelineProto/Tools.php +++ b/src/danog/MadelineProto/Tools.php @@ -44,7 +44,9 @@ trait Tools { if (is_array($d)) { foreach ($d as $k => $v) { - if ($k === 'bytes') $d[$k] = $this->utf8ize($v); + if ($k === 'bytes') { + $d[$k] = $this->utf8ize($v); + } } } elseif (is_string($d)) { return utf8_encode($d); @@ -57,15 +59,23 @@ trait Tools { return is_array($elem) || (is_object($elem) && get_class($elem) === 'Volatile'); } - public function array_replace_recursive($a, ...$b) { + + public function array_replace_recursive($a, ...$b) + { return array_replace_recursive($this->array_cast_recursive($a), ...$this->array_cast_recursive($b)); } - public function array_cast_recursive($array) { + + public function array_cast_recursive($array) + { if ($this->is_array($array)) { - if (!is_array($array)) $array = $array; - foreach ($array as $key => $value) { $array[$key] = $this->array_cast_recursive($value); } + if (!is_array($array)) { + $array = $array; + } + foreach ($array as $key => $value) { + $array[$key] = $this->array_cast_recursive($value); + } } + return $array; } } - diff --git a/tests/testing.php b/tests/testing.php index 51121b76..e501d345 100755 --- a/tests/testing.php +++ b/tests/testing.php @@ -59,13 +59,12 @@ if ($MadelineProto === false) { \danog\MadelineProto\Logger::log(['Registering new user'], \danog\MadelineProto\Logger::NOTICE); $authorization = $MadelineProto->complete_signup(readline('Please enter your first name: '), readline('Please enter your last name (can be empty): ')); } - + echo 'Serializing MadelineProto to session.madeline...'.PHP_EOL; echo 'Wrote '.\danog\MadelineProto\Serialization::serialize('session.madeline', $MadelineProto).' bytes'.PHP_EOL; } else { $MadelineProto->bot_login(getenv('BOT_TOKEN')); } - } $message = (getenv('TRAVIS_COMMIT') == '') ? 'I iz works always (io laborare sembre) (yo lavorar siempre) (mi labori ĉiam) (я всегда работать) (Ik werkuh altijd)' : ('Travis ci tests in progress: commit '.getenv('TRAVIS_COMMIT').', job '.getenv('TRAVIS_JOB_NUMBER').', PHP version: '.getenv('TRAVIS_PHP_VERSION')); @@ -74,7 +73,6 @@ echo 'Wrote '.\danog\MadelineProto\Serialization::serialize('session.madeline', echo 'Size of MadelineProto instance is '.strlen(serialize($MadelineProto)).' bytes'.PHP_EOL; if (stripos(readline('Do you want to make the secret chat tests? (y/n)'), 'y') !== false) { - /* $call = $MadelineProto->API->request_call(getenv('TEST_SECRET_CHAT')); @@ -85,16 +83,16 @@ while ($MadelineProto->call_status($call) !== $MadelineProto->API->READY) { var_dump($MadelineProto->get_call($call)); */ $secret = $MadelineProto->API->request_secret_chat(getenv('TEST_SECRET_CHAT')); -echo 'Waiting for '.getenv('TEST_SECRET_CHAT').' to accept the secret chat...'.PHP_EOL; -while ($MadelineProto->secret_chat_status($secret) !== 2) { + echo 'Waiting for '.getenv('TEST_SECRET_CHAT').' to accept the secret chat...'.PHP_EOL; + while ($MadelineProto->secret_chat_status($secret) !== 2) { + $MadelineProto->get_updates(); + } $MadelineProto->get_updates(); -} -$MadelineProto->get_updates(); -$InputEncryptedChat = $MadelineProto->get_secret_chat($secret)['InputEncryptedChat']; -$sentMessage = $MadelineProto->messages->sendEncrypted(['peer' => $InputEncryptedChat, 'message' => ['_' => 'decryptedMessage', 'media' => ['_' => 'decryptedMessageMediaEmpty'], 'ttl' => 10, 'message' => $message, 'entities' => [['_' => 'messageEntityCode', 'offset' => 0, 'length' => mb_strlen($message)]]]]); // should work with all layers + $InputEncryptedChat = $MadelineProto->get_secret_chat($secret)['InputEncryptedChat']; + $sentMessage = $MadelineProto->messages->sendEncrypted(['peer' => $InputEncryptedChat, 'message' => ['_' => 'decryptedMessage', 'media' => ['_' => 'decryptedMessageMediaEmpty'], 'ttl' => 10, 'message' => $message, 'entities' => [['_' => 'messageEntityCode', 'offset' => 0, 'length' => mb_strlen($message)]]]]); // should work with all layers \danog\MadelineProto\Logger::log([$sentMessage], \danog\MadelineProto\Logger::NOTICE); -$secret_media = []; + $secret_media = []; // Photo uploaded as document, secret chat $inputEncryptedFile = $MadelineProto->upload_encrypted('tests/faust.jpg', 'fausticorn.jpg'); // This gets an inputFile object with file name magic @@ -104,32 +102,30 @@ $secret_media['document_photo'] = ['peer' => $secret, 'file' => $inputEncryptedF $secret_media['photo'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaPhoto', 'thumb' => file_get_contents('tests/faust.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'caption' => 'This file was uploaded using MadelineProto', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'size' => filesize('tests/faust.jpg'), 'w' => 1280, 'h' => 914]]]; // GIF, secret chat $inputEncryptedFile = $MadelineProto->upload_encrypted('tests/pony.mp4'); -$secret_media['gif'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/pony.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/pony.mp4'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'pony.mp4', 'size' => filesize('tests/faust.jpg'), 'attributes' => [['_' => 'documentAttributeAnimated']]]]]; + $secret_media['gif'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/pony.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/pony.mp4'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'pony.mp4', 'size' => filesize('tests/faust.jpg'), 'attributes' => [['_' => 'documentAttributeAnimated']]]]]; // Sticker, secret chat $inputEncryptedFile = $MadelineProto->upload_encrypted('tests/lel.webp'); -$secret_media['sticker'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/lel.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/lel.webp'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'lel.webp', 'size' => filesize('tests/lel.webp'), 'attributes' => [['_' => 'documentAttributeSticker', 'alt' => 'LEL', 'stickerset' => ['_' => 'inputStickerSetEmpty']]]]]]; - + $secret_media['sticker'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/lel.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/lel.webp'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'lel.webp', 'size' => filesize('tests/lel.webp'), 'attributes' => [['_' => 'documentAttributeSticker', 'alt' => 'LEL', 'stickerset' => ['_' => 'inputStickerSetEmpty']]]]]]; // Document, secrey chat $time = time(); -$inputEncryptedFile = $MadelineProto->upload_encrypted('tests/60', 'magic'); // This gets an inputFile object with file name magic + $inputEncryptedFile = $MadelineProto->upload_encrypted('tests/60', 'magic'); // This gets an inputFile object with file name magic var_dump(time() - $time); -$secret_media['document'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/faust.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => 'magic/magic', 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'magic.magic', 'size' => filesize('tests/60'), 'attributes' => [['_' => 'documentAttributeFilename', 'file_name' => 'fairy']]]]]; - + $secret_media['document'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/faust.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => 'magic/magic', 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'magic.magic', 'size' => filesize('tests/60'), 'attributes' => [['_' => 'documentAttributeFilename', 'file_name' => 'fairy']]]]]; // Video, secret chat $inputEncryptedFile = $MadelineProto->upload_encrypted('tests/swing.mp4'); -$secret_media['video'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/swing.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/swing.mp4'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'swing.mp4', 'size' => filesize('tests/swing.mp4'), 'attributes' => [['_' => 'documentAttributeVideo', 'duration' => 5, 'w' => 1280, 'h' => 720]]]]]; + $secret_media['video'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/swing.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/swing.mp4'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'swing.mp4', 'size' => filesize('tests/swing.mp4'), 'attributes' => [['_' => 'documentAttributeVideo', 'duration' => 5, 'w' => 1280, 'h' => 720]]]]]; // audio, secret chat $inputEncryptedFile = $MadelineProto->upload_encrypted('tests/mosconi.mp3'); -$secret_media['audio'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/faust.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/mosconi.mp3'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'mosconi.mp3', 'size' => filesize('tests/mosconi.mp3'), 'attributes' => [['_' => 'documentAttributeAudio', 'voice' => false, 'duration' => 1, 'title' => 'AH NON LO SO IO', 'performer' => 'IL DIO GERMANO MOSCONI']]]]]; + $secret_media['audio'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/faust.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/mosconi.mp3'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'mosconi.mp3', 'size' => filesize('tests/mosconi.mp3'), 'attributes' => [['_' => 'documentAttributeAudio', 'voice' => false, 'duration' => 1, 'title' => 'AH NON LO SO IO', 'performer' => 'IL DIO GERMANO MOSCONI']]]]]; -$secret_media['voice'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/faust.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/mosconi.mp3'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'mosconi.mp3', 'size' => filesize('tests/mosconi.mp3'), 'attributes' => [['_' => 'documentAttributeAudio', 'voice' => true, 'duration' => 1, 'title' => 'AH NON LO SO IO', 'performer' => 'IL DIO GERMANO MOSCONI']]]]]; -foreach ($secret_media as $type => $smessage) { - $type = $MadelineProto->messages->sendEncryptedFile($smessage); -} + $secret_media['voice'] = ['peer' => $secret, 'file' => $inputEncryptedFile, 'message' => ['_' => 'decryptedMessage', 'ttl' => 0, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'thumb' => file_get_contents('tests/faust.preview.jpg'), 'thumb_w' => 90, 'thumb_h' => 90, 'mime_type' => mime_content_type('tests/mosconi.mp3'), 'caption' => 'test', 'key' => $inputEncryptedFile['key'], 'iv' => $inputEncryptedFile['iv'], 'file_name' => 'mosconi.mp3', 'size' => filesize('tests/mosconi.mp3'), 'attributes' => [['_' => 'documentAttributeAudio', 'voice' => true, 'duration' => 1, 'title' => 'AH NON LO SO IO', 'performer' => 'IL DIO GERMANO MOSCONI']]]]]; + foreach ($secret_media as $type => $smessage) { + $type = $MadelineProto->messages->sendEncryptedFile($smessage); + } } $mention = $MadelineProto->get_info(getenv('TEST_USERNAME')); // Returns an array with all of the constructors that can be extracted from a username or an id $mention = $mention['user_id']; // Selects only the numeric user id @@ -151,22 +147,17 @@ $media['gif'] = ['_' => 'inputMediaUploadedDocument', 'file' => $inputFile, 'mim $inputFile = $MadelineProto->upload('tests/lel.webp'); $media['sticker'] = ['_' => 'inputMediaUploadedDocument', 'file' => $inputFile, 'mime_type' => mime_content_type('tests/lel.webp'), 'caption' => 'test', 'attributes' => [['_' => 'documentAttributeSticker', 'alt' => 'LEL', 'stickerset' => ['_' => 'inputStickerSetEmpty']]]]; - // Video $inputFile = $MadelineProto->upload('tests/swing.mp4'); $media['video'] = ['_' => 'inputMediaUploadedDocument', 'file' => $inputFile, 'mime_type' => mime_content_type('tests/swing.mp4'), 'caption' => 'test', 'attributes' => [['_' => 'documentAttributeVideo', 'duration' => 5, 'w' => 1280, 'h' => 720]]]; - // audio $inputFile = $MadelineProto->upload('tests/mosconi.mp3'); $media['audio'] = ['_' => 'inputMediaUploadedDocument', 'file' => $inputFile, 'mime_type' => mime_content_type('tests/mosconi.mp3'), 'caption' => 'test', 'attributes' => [['_' => 'documentAttributeAudio', 'voice' => false, 'duration' => 1, 'title' => 'AH NON LO SO IO', 'performer' => 'IL DIO GERMANO MOSCONI']]]; - - // voice $media['voice'] = ['_' => 'inputMediaUploadedDocument', 'file' => $inputFile, 'mime_type' => mime_content_type('tests/mosconi.mp3'), 'caption' => 'test', 'attributes' => [['_' => 'documentAttributeAudio', 'voice' => true, 'duration' => 1, 'title' => 'AH NON LO SO IO', 'performer' => 'IL DIO GERMANO MOSCONI']]]; - // Document $time = time(); $inputFile = $MadelineProto->upload('tests/60', 'magic'); // This gets an inputFile object with file name magic @@ -201,5 +192,4 @@ foreach (json_decode(getenv('TEST_DESTINATION_GROUPS'), true) as $peer) { \danog\MadelineProto\Logger::log([$sentMessage], \danog\MadelineProto\Logger::NOTICE); } var_dump($MadelineProto->API->get_updates()); -var_dump("HERE"); - +var_dump('HERE');