2016-09-12 22:28:27 +02:00
< ? php
2018-02-24 17:54:13 +01:00
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
/**
* ResponseHandler module .
*
* This file is part of MadelineProto .
* MadelineProto is free software : you can redistribute it and / or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation , either version 3 of the License , or ( at your option ) any later version .
* MadelineProto is distributed in the hope that it will be useful , but WITHOUT ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
* 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 .
* If not , see < http :// www . gnu . org / licenses />.
*
* @ author Daniil Gentili < daniil @ daniil . it >
2020-02-17 14:13:46 +01:00
* @ copyright 2016 - 2020 Daniil Gentili < daniil @ daniil . it >
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
* @ license https :// opensource . org / licenses / AGPL - 3.0 AGPLv3
*
2019-10-31 15:07:35 +01:00
* @ link https :// docs . madelineproto . xyz MadelineProto documentation
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
*/
2018-02-24 17:54:39 +01:00
2019-08-31 23:07:20 +02:00
namespace danog\MadelineProto\MTProtoSession ;
2016-09-12 22:28:27 +02:00
2020-10-18 14:46:34 +02:00
use Amp\Failure ;
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
use Amp\Loop ;
2019-12-29 14:53:03 +01:00
use danog\MadelineProto\Logger ;
2020-07-28 20:39:32 +02:00
use danog\MadelineProto\Loop\Update\UpdateLoop ;
2019-09-02 15:30:29 +02:00
use danog\MadelineProto\MTProto ;
2020-10-18 14:46:34 +02:00
use danog\MadelineProto\MTProto\IncomingMessage ;
use danog\MadelineProto\MTProto\OutgoingMessage ;
use danog\MadelineProto\Tools ;
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
2016-09-12 22:28:27 +02:00
/**
* Manages responses .
2020-10-03 15:04:35 +02:00
*
* @ extend Session
2016-09-12 22:28:27 +02:00
*/
2016-12-19 16:56:52 +01:00
trait ResponseHandler
2016-09-12 22:28:27 +02:00
{
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
public $n = 0 ;
2020-10-18 14:46:34 +02:00
public function handleMessages () : void
2016-09-12 22:28:27 +02:00
{
2019-08-31 22:43:58 +02:00
while ( $this -> new_incoming ) {
\reset ( $this -> new_incoming );
$current_msg_id = \key ( $this -> new_incoming );
2020-10-18 14:46:34 +02:00
/** @var IncomingMessage */
$message = $this -> new_incoming [ $current_msg_id ];
unset ( $this -> new_incoming [ $current_msg_id ]);
$this -> logger -> logger ( $message -> log ( $this -> datacenter ), Logger :: ULTRA_VERBOSE );
$type = $message -> getType ();
if ( $type !== 'msg_container' ) {
$this -> checkInSeqNo ( $message );
2019-06-01 13:13:59 +02:00
}
2020-10-18 14:46:34 +02:00
switch ( $type ) {
2016-11-29 18:45:06 +01:00
case 'msgs_ack' :
2020-10-18 14:46:34 +02:00
foreach ( $message -> read ()[ 'msg_ids' ] as $msg_id ) {
2018-02-24 17:54:13 +01:00
// Acknowledge that the server received my message
2020-10-18 14:46:34 +02:00
$this -> ackOutgoingMessageId ( $msg_id );
2016-11-29 18:45:06 +01:00
}
break ;
case 'rpc_result' :
2020-10-18 14:46:34 +02:00
$this -> ackIncomingMessage ( $message );
// no break
2016-11-29 18:45:06 +01:00
case 'future_salts' :
2019-05-10 13:34:44 +02:00
case 'msgs_state_info' :
2016-11-29 18:45:06 +01:00
case 'bad_server_salt' :
case 'bad_msg_notification' :
case 'pong' :
2020-10-18 14:46:34 +02:00
$this -> handleResponse ( $message );
2016-11-29 18:45:06 +01:00
break ;
case 'new_session_created' :
2020-10-18 14:46:34 +02:00
$this -> ackIncomingMessage ( $message );
$this -> shared -> getTempAuthKey () -> setServerSalt ( $message -> read ()[ 'server_salt' ]);
2020-07-28 20:39:32 +02:00
if ( $this -> API -> authorized === MTProto :: LOGGED_IN && ! $this -> API -> isInitingAuthorization () && $this -> API -> datacenter -> getDataCenterConnection ( $this -> API -> datacenter -> curdc ) -> hasTempAuthKey () && isset ( $this -> API -> updaters [ UpdateLoop :: GENERIC ])) {
$this -> API -> updaters [ UpdateLoop :: GENERIC ] -> resumeDefer ();
2016-12-30 16:36:44 +01:00
}
2016-11-29 18:45:06 +01:00
break ;
case 'msg_container' :
2020-10-18 14:46:34 +02:00
foreach ( $message -> read ()[ 'messages' ] as $message ) {
2020-02-07 21:13:49 +01:00
$this -> msgIdHandler -> checkMessageId ( $message [ 'msg_id' ], [ 'outgoing' => false , 'container' => true ]);
2020-10-18 14:46:34 +02:00
$newMessage = new IncomingMessage ( $message [ 'body' ], $message [ 'msg_id' ], true );
$newMessage -> setSeqNo ( $message [ 'seqno' ]);
$this -> new_incoming [ $message [ 'msg_id' ]] = $this -> incoming_messages [ $message [ 'msg_id' ]] = $newMessage ;
2016-11-29 18:45:06 +01:00
}
2020-10-18 14:46:34 +02:00
unset ( $newMessage , $message );
2019-08-31 22:43:58 +02:00
\ksort ( $this -> new_incoming );
2016-11-29 18:45:06 +01:00
break ;
case 'msg_copy' :
2020-10-18 14:46:34 +02:00
$this -> ackIncomingMessage ( $message );
$content = $message -> read ();
$referencedMsgId = $content [ 'msg_id' ];
if ( isset ( $this -> incoming_messages [ $referencedMsgId ])) {
$this -> ackIncomingMessage ( $this -> incoming_messages [ $referencedMsgId ]);
2016-11-29 18:45:06 +01:00
} else {
2020-10-18 14:46:34 +02:00
$this -> msgIdHandler -> checkMessageId ( $referencedMsgId , [ 'outgoing' => false , 'container' => true ]);
$message = new IncomingMessage ( $content [ 'orig_message' ], $referencedMsgId );
$this -> new_incoming [ $referencedMsgId ] = $this -> incoming_messages [ $referencedMsgId ] = $message ;
unset ( $message );
2016-11-29 18:45:06 +01:00
}
2020-10-18 14:46:34 +02:00
unset ( $content , $referencedMsgId );
2016-11-29 18:45:06 +01:00
break ;
case 'http_wait' :
2020-10-18 14:46:34 +02:00
$this -> logger -> logger ( $message -> read (), Logger :: NOTICE );
2016-11-29 18:45:06 +01:00
break ;
2016-12-21 11:31:34 +01:00
case 'msgs_state_req' :
2020-10-18 14:46:34 +02:00
$this -> sendMsgsStateInfo ( $message -> read ()[ 'msg_ids' ], $current_msg_id );
2016-12-21 11:31:34 +01:00
break ;
case 'msgs_all_info' :
2020-10-18 14:46:34 +02:00
$this -> onMsgsAllInfo ( $message -> read ());
2016-12-21 11:31:34 +01:00
break ;
case 'msg_detailed_info' :
2020-10-18 14:46:34 +02:00
$this -> onMsgDetailedInfo ( $message -> read ());
2019-05-10 13:34:44 +02:00
break ;
2017-01-15 03:05:37 +01:00
case 'msg_new_detailed_info' :
2020-10-18 14:46:34 +02:00
$this -> onNewMsgDetailedInfo ( $message -> read ());
2016-12-21 11:31:34 +01:00
break ;
case 'msg_resend_req' :
2020-10-18 14:46:34 +02:00
$this -> onMsgResendReq ( $message -> read (), $current_msg_id );
2016-12-21 11:31:34 +01:00
break ;
case 'msg_resend_ans_req' :
2020-10-18 14:46:34 +02:00
$this -> onMsgResendAnsReq ( $message -> read (), $current_msg_id );
2016-12-21 11:31:34 +01:00
break ;
2016-11-29 18:45:06 +01:00
default :
2020-10-18 14:46:34 +02:00
$this -> ackIncomingMessage ( $message );
$response_type = $this -> API -> getTL () -> getConstructors () -> findByPredicate ( $message -> getContent ()[ '_' ])[ 'type' ];
if ( $response_type == 'Updates' ) {
if ( ! $this -> isCdn ()) {
Tools :: callForkDefer ( $this -> API -> handleUpdates ( $message -> read ()));
}
break ;
}
$this -> logger -> logger ( 'Trying to assign a response of type ' . $response_type . ' to its request...' , Logger :: VERBOSE );
foreach ( $this -> new_outgoing as $expecting_msg_id => $expecting ) {
if ( ! $type = $expecting -> getType ()) {
continue ;
}
$this -> logger -> logger ( " Does the request of return type $type match? " , Logger :: VERBOSE );
if ( $response_type === $type ) {
$this -> logger -> logger ( 'Yes' , Logger :: VERBOSE );
$this -> handleResponse ( $message , $expecting_msg_id );
break 2 ;
}
$this -> logger -> logger ( 'No' , Logger :: VERBOSE );
2016-11-29 18:45:06 +01:00
}
2020-10-18 14:46:34 +02:00
$this -> logger -> logger ( 'Dunno how to handle ' . PHP_EOL . \var_export ( $message -> read (), true ), Logger :: FATAL_ERROR );
2016-11-29 18:45:06 +01:00
break ;
}
2016-11-29 01:47:59 +01:00
}
2020-10-18 14:46:34 +02:00
if ( $this -> pendingOutgoing ) {
2019-08-31 22:43:58 +02:00
$this -> writer -> resume ();
}
2016-11-29 01:47:59 +01:00
}
2020-10-18 14:46:34 +02:00
public function handleReject ( OutgoingMessage $message , \Throwable $data ) : void
{
$this -> gotResponseForOutgoingMessage ( $message );
Loop :: defer ( fn () => $message -> reply ( new Failure ( $data )));
}
2019-09-18 16:01:27 +02:00
/**
2020-10-18 14:46:34 +02:00
* Handle RPC response .
2019-09-18 16:01:27 +02:00
*
2020-10-18 14:46:34 +02:00
* @ param IncomingMessage $message Incoming message
* @ param string $requestId Request ID
2019-09-18 21:21:34 +02:00
*
2019-09-18 16:01:27 +02:00
* @ return void
*/
2020-10-18 14:46:34 +02:00
private function handleResponse ( IncomingMessage $message , $requestId = null ) : void
2017-03-24 21:01:36 +01:00
{
2020-10-18 14:46:34 +02:00
$requestId ? ? = $message -> getRequestId ();
$response = $message -> read ();
if ( ! isset ( $this -> outgoing_messages [ $requestId ])) {
$requestId = MsgIdHandler :: toString ( $requestId );
$this -> logger -> logger ( " Got a reponse $message with message ID $requestId , but there is no request! " , Logger :: FATAL_ERROR );
return ;
}
/** @var OutgoingMessage */
$request = $this -> outgoing_messages [ $requestId ];
if ( $request -> getState () & OutgoingMessage :: STATE_REPLIED ) {
2020-10-18 15:41:06 +02:00
$this -> logger -> logger ( " Already got a response to $request , but there is another reply $message with message ID $requestId ! " , Logger :: FATAL_ERROR );
2020-10-18 14:46:34 +02:00
return ;
}
if ( $response [ '_' ] === 'rpc_result' ) {
$response = $response [ 'result' ];
}
$constructor = $response [ '_' ] ? ? '' ;
if ( $constructor === 'rpc_error' ) {
try {
$exception = $this -> handleRpcError ( $request , $response );
} catch ( \Throwable $e ) {
$exception = $e ;
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
}
2020-10-18 14:46:34 +02:00
if ( $exception ) {
$this -> handleReject ( $request , $exception );
}
return ;
2017-05-19 16:36:05 +02:00
}
2020-10-18 14:46:34 +02:00
if ( $constructor === 'bad_server_salt' || $constructor === 'bad_msg_notification' ) {
$this -> logger -> logger ( 'Received bad_msg_notification: ' . MTProto :: BAD_MSG_ERROR_CODES [ $response [ 'error_code' ]], Logger :: WARNING );
switch ( $response [ 'error_code' ]) {
case 48 :
$this -> shared -> getTempAuthKey () -> setServerSalt ( $response [ 'new_server_salt' ]);
$this -> methodRecall ( '' , [ 'message_id' => $requestId , 'postpone' => true ]);
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
return ;
2020-10-18 14:46:34 +02:00
case 20 :
$this -> methodRecall ( '' , [ 'message_id' => $requestId , 'postpone' => true ]);
return ;
case 16 :
case 17 :
$this -> time_delta = ( int ) ( new \tgseclib\Math\BigInteger ( \strrev ( $message -> getMsgId ()), 256 )) -> bitwise_rightShift ( 32 ) -> subtract ( new \tgseclib\Math\BigInteger ( \time ())) -> toString ();
$this -> logger -> logger ( 'Set time delta to ' . $this -> time_delta , Logger :: WARNING );
$this -> API -> resetMTProtoSession ();
$this -> shared -> setTempAuthKey ( null );
Tools :: callFork (( function () use ( $requestId ) : \Generator {
yield from $this -> API -> initAuthorization ();
$this -> methodRecall ( '' , [ 'message_id' => $requestId ]);
})());
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
return ;
}
2020-10-18 14:46:34 +02:00
$this -> handleReject ( $request , new \danog\MadelineProto\RPCErrorException ( 'Received bad_msg_notification: ' . MTProto :: BAD_MSG_ERROR_CODES [ $response [ 'error_code' ]], $response [ 'error_code' ], $request -> getConstructor ()));
return ;
2017-05-16 15:12:04 +02:00
}
2020-10-18 14:46:34 +02:00
if ( $request -> isMethod () && $request -> getConstructor () !== 'auth.bindTempAuthKey' && $this -> shared -> hasTempAuthKey () && ! $this -> shared -> getTempAuthKey () -> isInited ()) {
2019-09-01 23:39:29 +02:00
$this -> shared -> getTempAuthKey () -> init ( true );
2018-12-31 14:02:24 +01:00
}
2020-10-18 14:46:34 +02:00
$botAPI = $request -> getBotAPI ();
2019-11-01 12:45:15 +01:00
if ( isset ( $response [ '_' ]) && ! $this -> isCdn () && $this -> API -> getTL () -> getConstructors () -> findByPredicate ( $response [ '_' ])[ 'type' ] === 'Updates' ) {
2020-10-18 14:46:34 +02:00
$body = $request -> getBodyOrEmpty ();
$trimmed = [];
if ( isset ( $body [ 'peer' ])) {
$trimmed [ 'peer' ] = \is_string ( $body [ 'peer' ]) ? $body [ 'peer' ] : $this -> API -> getId ( $body [ 'peer' ]);
2020-09-13 01:06:08 +02:00
}
2020-10-18 14:46:34 +02:00
if ( isset ( $body [ 'message' ])) {
$trimmed [ 'message' ] = ( string ) $body [ 'message' ];
2020-09-13 01:06:08 +02:00
}
2020-10-18 14:46:34 +02:00
$response [ 'request' ] = [ '_' => $request -> getConstructor (), 'body' => $trimmed ];
unset ( $body );
Tools :: callForkDefer ( $this -> API -> handleUpdates ( $response ));
2019-05-30 15:17:26 +02:00
}
2020-10-18 14:46:34 +02:00
$this -> gotResponseForOutgoingMessage ( $request );
$r = $response [ '_' ] ? ? \json_encode ( $response );
2020-01-31 19:29:43 +01:00
$this -> logger -> logger ( " Defer sending { $r } to deferred " , Logger :: ULTRA_VERBOSE );
2020-10-18 14:46:34 +02:00
if ( ! $botAPI ) {
Tools :: callForkDefer (( function () use ( $request , $message , $response ) : \Generator {
yield from $message -> yieldSideEffects ();
$request -> reply ( $response );
})());
} else {
Tools :: callForkDefer (( function () use ( $request , $message , $response ) : \Generator {
yield from $message -> yieldSideEffects ();
$response = yield from $this -> API -> MTProtoToBotAPI ( $response );
$request -> reply ( $response );
})());
}
}
public function handleRpcError ( OutgoingMessage $request , array $response ) : ? \Throwable
{
if ( $request -> isMethod () && $request -> getConstructor () !== 'auth.bindTempAuthKey' && $this -> shared -> hasTempAuthKey () && ! $this -> shared -> getTempAuthKey () -> isInited ()) {
$this -> shared -> getTempAuthKey () -> init ( true );
}
if ( \in_array ( $response [ 'error_message' ], [ 'PERSISTENT_TIMESTAMP_EMPTY' , 'PERSISTENT_TIMESTAMP_INVALID' ])) {
return new \danog\MadelineProto\PTSException ( $response [ 'error_message' ]);
}
if ( $response [ 'error_message' ] === 'PERSISTENT_TIMESTAMP_OUTDATED' ) {
$response [ 'error_code' ] = 500 ;
}
if ( \strpos ( $response [ 'error_message' ], 'FILE_REFERENCE_' ) === 0 ) {
$this -> logger -> logger ( " Got { $response [ 'error_message' ] } , refreshing file reference and repeating method call... " );
$request -> setRefreshReferences ( true );
$this -> methodRecall ( '' , [ 'message_id' => $request -> getMsgId (), 'postpone' => true ]);
return null ;
}
switch ( $response [ 'error_code' ]) {
case 500 :
case - 500 :
if ( $response [ 'error_message' ] === 'MSG_WAIT_FAILED' ) {
$this -> call_queue [ $request -> getQueueId ()] = [];
$this -> methodRecall ( '' , [ 'message_id' => $request -> getMsgId (), 'postpone' => true ]);
return null ;
2019-06-02 11:34:19 +02:00
}
2020-10-18 14:46:34 +02:00
if ( \in_array ( $response [ 'error_message' ], [ 'MSGID_DECREASE_RETRY' , 'HISTORY_GET_FAILED' , 'RPC_CONNECT_FAILED' , 'RPC_CALL_FAIL' , 'PERSISTENT_TIMESTAMP_OUTDATED' , 'RPC_MCGET_FAIL' , 'no workers running' , 'No workers running' ])) {
Loop :: delay ( 1 * 1000 , [ $this , 'methodRecall' ], [ 'message_id' => $request -> getMsgId ()]);
return null ;
}
return new \danog\MadelineProto\RPCErrorException ( $response [ 'error_message' ], $response [ 'error_code' ], $request -> getConstructor ());
case 303 :
$this -> API -> datacenter -> curdc = $datacenter = ( int ) \preg_replace ( '/[^0-9]+/' , '' , $response [ 'error_message' ]);
if ( $request -> isFileRelated () && $this -> API -> datacenter -> has ( $datacenter . '_media' )) {
$datacenter .= '_media' ;
}
if ( $request -> isUserRelated ()) {
$this -> API -> settings -> setDefaultDc ( $this -> API -> authorized_dc = $this -> API -> datacenter -> curdc );
}
Loop :: defer ([ $this , 'methodRecall' ], [ 'message_id' => $request -> getMsgId (), 'datacenter' => $datacenter ]);
//$this->API->methodRecall('', ['message_id' => $requestId, 'datacenter' => $datacenter, 'postpone' => true]);
return null ;
case 401 :
switch ( $response [ 'error_message' ]) {
case 'USER_DEACTIVATED' :
case 'USER_DEACTIVATED_BAN' :
case 'SESSION_REVOKED' :
case 'SESSION_EXPIRED' :
$this -> logger -> logger ( $response [ 'error_message' ], Logger :: FATAL_ERROR );
foreach ( $this -> API -> datacenter -> getDataCenterConnections () as $socket ) {
$socket -> setTempAuthKey ( null );
$socket -> setPermAuthKey ( null );
$socket -> resetSession ();
}
if ( \in_array ( $response [ 'error_message' ], [ 'USER_DEACTIVATED' , 'USER_DEACTIVATED_BAN' ], true )) {
$this -> logger -> logger ( '!!!!!!! WARNING !!!!!!!' , Logger :: FATAL_ERROR );
$this -> logger -> logger ( " Telegram's flood prevention system suspended this account. " , Logger :: ERROR );
$this -> logger -> logger ( 'To continue, manual verification is required.' , Logger :: FATAL_ERROR );
$phone = isset ( $this -> API -> authorization [ 'user' ][ 'phone' ]) ? '+' . $this -> API -> authorization [ 'user' ][ 'phone' ] : 'you are currently using' ;
$this -> logger -> logger ( 'Send an email to recover@telegram.org, asking to unban the phone number ' . $phone . ', and shortly describe what will you do with this phone number.' , Logger :: FATAL_ERROR );
$this -> logger -> logger ( 'Then login again.' , Logger :: FATAL_ERROR );
$this -> logger -> logger ( 'If you intentionally deleted this account, ignore this message.' , Logger :: FATAL_ERROR );
}
$this -> API -> resetSession ();
$this -> gotResponseForOutgoingMessage ( $request );
Tools :: callFork (( function () use ( $request , $response ) : \Generator {
yield from $this -> API -> initAuthorization ();
$this -> handleReject ( $request , new \danog\MadelineProto\RPCErrorException ( $response [ 'error_message' ], $response [ 'error_code' ], $request -> getConstructor ()));
})());
return null ;
case 'AUTH_KEY_UNREGISTERED' :
case 'AUTH_KEY_INVALID' :
if ( $this -> API -> authorized !== MTProto :: LOGGED_IN ) {
$this -> gotResponseForOutgoingMessage ( $request );
Tools :: callFork (( function () use ( $request , $response ) : \Generator {
yield from $this -> API -> initAuthorization ();
$this -> handleReject ( $request , new \danog\MadelineProto\RPCErrorException ( $response [ 'error_message' ], $response [ 'error_code' ], $request -> getConstructor ()));
})());
return null ;
}
$this -> session_id = null ;
$this -> shared -> setTempAuthKey ( null );
$this -> shared -> setPermAuthKey ( null );
$this -> logger -> logger ( 'Auth key not registered, resetting temporary and permanent auth keys...' , Logger :: ERROR );
if ( $this -> API -> authorized_dc === $this -> datacenter && $this -> API -> authorized === MTProto :: LOGGED_IN ) {
$this -> logger -> logger ( 'Permanent auth key was main authorized key, logging out...' , Logger :: FATAL_ERROR );
foreach ( $this -> API -> datacenter -> getDataCenterConnections () as $socket ) {
$socket -> setTempAuthKey ( null );
$socket -> setPermAuthKey ( null );
}
$this -> logger -> logger ( '!!!!!!! WARNING !!!!!!!' , Logger :: FATAL_ERROR );
$this -> logger -> logger ( " Telegram's flood prevention system suspended this account. " , Logger :: ERROR );
$this -> logger -> logger ( 'To continue, manual verification is required.' , Logger :: FATAL_ERROR );
$phone = isset ( $this -> API -> authorization [ 'user' ][ 'phone' ]) ? '+' . $this -> API -> authorization [ 'user' ][ 'phone' ] : 'you are currently using' ;
$this -> logger -> logger ( 'Send an email to recover@telegram.org, asking to unban the phone number ' . $phone . ', and quickly describe what will you do with this phone number.' , Logger :: FATAL_ERROR );
$this -> logger -> logger ( 'Then login again.' , Logger :: FATAL_ERROR );
$this -> logger -> logger ( 'If you intentionally deleted this account, ignore this message.' , Logger :: FATAL_ERROR );
$this -> API -> resetSession ();
$this -> gotResponseForOutgoingMessage ( $request );
Tools :: callFork (( function () use ( $request , & $response ) : \Generator {
yield from $this -> API -> initAuthorization ();
$this -> handleReject ( $request , new \danog\MadelineProto\RPCErrorException ( $response [ 'error_message' ], $response [ 'error_code' ], $request -> getConstructor ()));
})());
return null ;
}
Tools :: callFork (( function () use ( $request ) : \Generator {
yield from $this -> API -> initAuthorization ();
$this -> methodRecall ( '' , [ 'message_id' => $request -> getMsgId ()]);
})());
return null ;
case 'AUTH_KEY_PERM_EMPTY' :
$this -> logger -> logger ( 'Temporary auth key not bound, resetting temporary auth key...' , Logger :: ERROR );
$this -> shared -> setTempAuthKey ( null );
Tools :: callFork (( function () use ( $request ) : \Generator {
yield from $this -> API -> initAuthorization ();
$this -> methodRecall ( '' , [ 'message_id' => $request -> getMsgId ()]);
})());
return null ;
}
return new \danog\MadelineProto\RPCErrorException ( $response [ 'error_message' ], $response [ 'error_code' ], $request -> getConstructor ());
case 420 :
$seconds = \preg_replace ( '/[^0-9]+/' , '' , $response [ 'error_message' ]);
$limit = $request -> getFloodWaitLimit () ? ? $this -> API -> settings -> getRPC () -> getFloodTimeout ();
if ( \is_numeric ( $seconds ) && $seconds < $limit ) {
$this -> logger -> logger ( " Flood, waiting '. $seconds .' seconds before repeating async call of $request ... " , Logger :: NOTICE );
$request -> setSent (( $request -> getSent () ? ? \time ()) + $seconds );
Loop :: delay ( $seconds * 1000 , [ $this , 'methodRecall' ], [ 'message_id' => $request -> getMsgId ()]);
return null ;
}
// no break
default :
return new \danog\MadelineProto\RPCErrorException ( $response [ 'error_message' ], $response [ 'error_code' ], $request -> getConstructor ());
}
2017-03-24 21:01:08 +01:00
}
2016-09-12 22:28:27 +02:00
}