2016-08-09 22:28:50 +02:00
#!/usr/bin/env php
2016-06-23 23:51:08 +02:00
< ? php
2016-11-16 15:18:35 +01:00
/*
2020-02-17 14:13:46 +01:00
Copyright 2016 - 2020 Daniil Gentili
2016-11-16 15:18:35 +01:00
( https :// daniil . it )
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 />.
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
*/
2017-08-25 18:28:08 +02:00
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
/**
2018-03-23 16:39:58 +01:00
* Various ways to load MadelineProto .
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
*/
2019-09-03 18:21:43 +02:00
2021-12-06 19:14:34 +01:00
use danog\MadelineProto\API ;
2019-09-03 18:21:43 +02:00
2019-12-26 19:17:31 +01:00
$loader = false ;
2021-09-06 16:52:05 +02:00
if ( \getenv ( 'ACTIONS_PHAR' )) {
$loader = include 'madeline.php' ;
2021-09-11 16:40:48 +02:00
\copy ( 'madelineBackup.php' , 'madeline.php' );
2021-04-09 17:21:37 +02:00
} elseif ( ! \file_exists ( __DIR__ . '/../vendor/autoload.php' ) || \getenv ( 'ACTIONS_FORCE_PREVIOUS' )) {
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
echo 'You did not run composer update, using madeline.php' . PHP_EOL ;
2021-04-05 17:58:35 +02:00
if ( ! \file_exists ( 'madeline.php' )) {
\copy ( 'https://phar.madelineproto.xyz/madeline.php' , 'madeline.php' );
2017-08-25 18:27:57 +02:00
}
2021-04-05 17:58:35 +02:00
include 'madeline.php' ;
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
} else {
require_once 'vendor/autoload.php' ;
2017-08-25 18:27:57 +02:00
}
2021-09-11 16:40:48 +02:00
\define ( 'MADELINEPROTO_TEST' , 'testing' );
2019-12-26 19:17:31 +01:00
if ( $loader ) {
foreach ( $loader -> getClassMap () as $class => $file ) {
2021-09-04 18:52:21 +02:00
if ( \in_array ( $class , [
'Amp\\Sync\\Internal\\MutexStorage' ,
'Amp\\Sync\\Internal\\SemaphoreStorage' ,
'Amp\\Parallel\\Sync\\Internal\\ParcelStorage' ,
'Amp\\Parallel\\Context\\Internal\\Thread' ,
'Monolog\\Test\\TestCase' ,
'Phabel\\Amp\\Sync\\Internal\\MutexStorage' ,
'Phabel\\Amp\\Sync\\Internal\\SemaphoreStorage' ,
'Phabel\\Amp\\Parallel\\Sync\\Internal\\ParcelStorage' ,
'Phabel\\Amp\\Parallel\\Context\\Internal\\Thread' ,
'Phabel\\Monolog\\Test\\TestCase' ,
2021-09-04 19:04:22 +02:00
'Phabel\\Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' ,
'Phabel\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' ,
2021-09-24 18:58:33 +02:00
'Phabel\\Composer\\Plugin' ,
'PhabelVendor\\Amp\\Sync\\Internal\\MutexStorage' ,
'PhabelVendor\\Amp\\Sync\\Internal\\SemaphoreStorage' ,
'PhabelVendor\\Amp\\Parallel\\Sync\\Internal\\ParcelStorage' ,
'PhabelVendor\\Amp\\Parallel\\Context\\Internal\\Thread' ,
'PhabelVendor\\Monolog\\Test\\TestCase' ,
'PhabelVendor\\Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' ,
'PhabelVendor\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' ,
2021-09-04 18:52:21 +02:00
])) {
2019-12-26 19:17:31 +01:00
continue ;
}
2021-09-24 18:58:33 +02:00
if ( \str_starts_with ( $class , 'PhabelVendor\\Symfony\\Component\\Console' ) || \str_starts_with ( $class , 'Phabel\\Symfony\\Component\\Console' ) || \str_ends_with ( $class , 'Test' ) || \class_exists ( $class ) || \interface_exists ( $class )) {
2021-04-05 18:29:46 +02:00
continue ;
}
2019-12-26 19:17:31 +01:00
require_once ( $file );
}
}
2018-03-23 16:39:58 +01:00
/*
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
* Load . env for settings
*/
2021-04-09 17:21:37 +02:00
if ( \file_exists ( '.env' ) && \class_exists ( Dotenv\Dotenv :: class )) {
2017-01-25 23:16:22 +01:00
echo 'Loading .env...' . PHP_EOL ;
2019-09-02 17:08:36 +02:00
$dotenv = Dotenv\Dotenv :: create ( \getcwd ());
2017-01-15 17:38:04 +01:00
$dotenv -> load ();
2021-04-06 00:11:32 +02:00
if ( \getenv ( 'TEST_SECRET_CHAT' ) == '' ) {
echo ( 'TEST_SECRET_CHAT is not defined in .env, please define it (copy .env.example).' . PHP_EOL );
die ( 1 );
}
2017-07-24 09:18:10 +02:00
}
2017-01-25 23:16:22 +01:00
echo 'Loading settings...' . PHP_EOL ;
2019-09-02 17:08:36 +02:00
$settings = \json_decode ( \getenv ( 'MTPROTO_SETTINGS' ), true ) ? : [];
2017-06-23 22:40:55 +02:00
2018-03-23 16:39:58 +01:00
/*
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
* Load MadelineProto
*/
echo 'Loading MadelineProto...' . PHP_EOL ;
2019-12-29 13:29:00 +01:00
$MadelineProto = new \danog\MadelineProto\API ( __DIR__ . '/../testing.madeline' , $settings );
2019-12-28 16:07:09 +01:00
$MadelineProto -> async ( true );
$MadelineProto -> loop ( function () use ( $MadelineProto ) {
yield $MadelineProto -> start ();
2020-01-03 13:09:42 +01:00
yield $MadelineProto -> fileGetContents ( 'https://google.com' );
2019-12-28 16:07:09 +01:00
try {
yield $MadelineProto -> getSelf ();
} catch ( \danog\MadelineProto\Exception $e ) {
if ( $e -> getMessage () === 'TOS action required, check the logs' ) {
yield $MadelineProto -> acceptTos ();
}
2018-06-29 13:50:14 +02:00
}
2019-07-06 19:27:13 +02:00
2019-12-28 16:07:09 +01:00
//var_dump(count($MadelineProto->getPwrChat('@madelineproto')['participants']));
2018-12-28 17:21:04 +01:00
2019-12-28 16:07:09 +01:00
/*
* Test logging
*/
$MadelineProto -> logger ( 'hey' , \danog\MadelineProto\Logger :: ULTRA_VERBOSE );
$MadelineProto -> logger ( 'hey' , \danog\MadelineProto\Logger :: VERBOSE );
$MadelineProto -> logger ( 'hey' , \danog\MadelineProto\Logger :: NOTICE );
$MadelineProto -> logger ( 'hey' , \danog\MadelineProto\Logger :: WARNING );
$MadelineProto -> logger ( 'hey' , \danog\MadelineProto\Logger :: ERROR );
$MadelineProto -> logger ( 'hey' , \danog\MadelineProto\Logger :: FATAL_ERROR );
2017-07-09 12:08:01 +02:00
2019-12-28 16:07:09 +01:00
/**
* A small example message to use for tests .
*/
2021-03-30 21:18:38 +02:00
$message = \getenv ( 'GITHUB_SHA' ) == '' ?
'I iz works always (io laborare sembre) (yo lavorar siempre) (mi labori ĉiam) (я всегда работать) (Ik werkuh altijd) (Ngimbonga ngaso sonke isikhathi ukusebenza)' :
2021-03-30 23:07:50 +02:00
( 'Github actions tests in progress: commit ' . \getenv ( 'GITHUB_SHA' ) . ', job ' . \getenv ( 'GITHUB_JOB' ) . ', PHP version: ' . PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION );
2017-03-31 17:35:20 +02:00
2019-12-28 16:07:09 +01:00
/*
* Try making a phone call
*/
2022-06-06 21:47:00 +02:00
if ( ! \getenv ( 'GITHUB_SHA' ) && \stripos (( yield $MadelineProto -> readline ( 'Do you want to make a call? (y/n): ' )) ? ? '' , 'y' ) !== false ) {
2019-12-28 16:07:09 +01:00
$controller = yield $MadelineProto -> requestCall ( \getenv ( 'TEST_SECRET_CHAT' )) -> play ( 'input.raw' ) -> then ( 'input.raw' ) -> playOnHold ([ 'input.raw' ]) -> setOutputFile ( 'output.raw' );
while ( $controller -> getCallState () < \danog\MadelineProto\VoIP :: CALL_STATE_READY ) {
2020-01-16 21:14:38 +01:00
yield $MadelineProto -> sleep ( 1 );
2019-12-28 16:07:09 +01:00
}
$MadelineProto -> logger ( $controller -> configuration );
while ( $controller -> getCallState () < \danog\MadelineProto\VoIP :: CALL_STATE_ENDED ) {
2020-01-16 21:14:38 +01:00
yield $MadelineProto -> sleep ( 1 );
2019-12-28 16:07:09 +01:00
}
2017-07-23 16:11:02 +02:00
}
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
2019-12-28 16:07:09 +01:00
/*
* Try receiving a phone call
*/
2022-06-06 21:47:00 +02:00
if ( ! \getenv ( 'GITHUB_SHA' ) && \stripos (( yield $MadelineProto -> readline ( 'Do you want to handle incoming calls? (y/n): ' )) ? ? '' , 'y' ) !== false ) {
2019-12-28 16:07:09 +01:00
$howmany = yield $MadelineProto -> readline ( 'How many calls would you like me to handle? ' );
$offset = 0 ;
while ( $howmany > 0 ) {
$updates = yield $MadelineProto -> getUpdates ([ 'offset' => $offset , 'limit' => 50 , 'timeout' => 0 ]); // Just like in the bot API, you can specify an offset, a limit and a timeout
foreach ( $updates as $update ) {
$MadelineProto -> logger ( $update );
$offset = $update [ 'update_id' ] + 1 ; // Just like in the bot API, the offset must be set to the last update_id
switch ( $update [ 'update' ][ '_' ]) {
2017-07-21 12:23:09 +02:00
case 'updatePhoneCall' :
2019-09-02 17:08:36 +02:00
if ( \is_object ( $update [ 'update' ][ 'phone_call' ]) && $update [ 'update' ][ 'phone_call' ] -> getCallState () === \danog\MadelineProto\VoIP :: CALL_STATE_INCOMING ) {
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
$update [ 'update' ][ 'phone_call' ] -> accept () -> play ( 'input.raw' ) -> then ( 'input.raw' ) -> playOnHold ([ 'input.raw' ]) -> setOutputFile ( 'output.raw' );
$howmany -- ;
}
}
2019-12-28 16:07:09 +01:00
}
2017-07-21 12:23:09 +02:00
}
2017-06-30 15:37:18 +02:00
}
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
2018-03-23 16:39:58 +01:00
/*
2019-12-28 16:07:09 +01:00
* Secret chat usage
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
*/
2022-06-06 21:47:00 +02:00
if ( ! \getenv ( 'GITHUB_SHA' ) && \stripos (( yield $MadelineProto -> readline ( 'Do you want to make the secret chat tests? (y/n): ' )) ? ? '' , 'y' ) !== false ) {
2021-12-06 19:14:34 +01:00
if ( ! \getenv ( 'TEST_SECRET_CHAT' )) {
throw new Exception ( 'No TEST_SECRET_CHAT environment variable was provided!' );
}
2019-12-28 16:07:09 +01:00
/**
* Request a secret chat .
*/
$secret_chat_id = yield $MadelineProto -> requestSecretChat ( \getenv ( 'TEST_SECRET_CHAT' ));
2021-12-06 19:14:34 +01:00
echo 'Waiting 10 seconds for ' . \getenv ( 'TEST_SECRET_CHAT' ) . ' (secret chat id ' . $secret_chat_id . ') to accept the secret chat...' . PHP_EOL ;
2019-12-28 16:07:09 +01:00
2021-12-06 19:14:34 +01:00
yield $MadelineProto -> sleep ( 10 );
2017-06-02 14:43:30 +02:00
2019-12-28 16:07:09 +01:00
/**
* Send a markdown - formatted text message with expiration after 10 seconds .
*/
$sentMessage = yield $MadelineProto -> messages -> sendEncrypted ([
'peer' => $secret_chat_id ,
'message' => [
'_' => 'decryptedMessage' ,
'media' => [ '_' => 'decryptedMessageMediaEmpty' ], // No media
'ttl' => 10 , // This message self-destructs 10 seconds after reception
'message' => '```' . $message . '```' , // Code Markdown
'parse_mode' => 'Markdown' ,
],
]);
$MadelineProto -> logger ( $sentMessage , \danog\MadelineProto\Logger :: NOTICE );
/**
* Send secret media .
*/
$secret_media = [];
// Photo uploaded as document, secret chat
$secret_media [ 'document_photo' ] = [
'peer' => $secret_chat_id ,
2019-12-29 13:25:31 +01:00
'file' => __DIR__ . '/faust.jpg' , // The file to send
2019-12-28 16:07:09 +01:00
'message' => [
'_' => 'decryptedMessage' ,
'ttl' => 0 , // This message does not self-destruct
'message' => '' , // No text message, only media
'media' => [
'_' => 'decryptedMessageMediaDocument' ,
2019-12-29 13:25:31 +01:00
'thumb' => \file_get_contents ( __DIR__ . '/faust.preview.jpg' ), // The thumbnail must be generated manually, it must be in jpg format, 90x90
2019-12-28 16:07:09 +01:00
'thumb_w' => 90 ,
'thumb_h' => 90 ,
2019-12-29 13:25:31 +01:00
'mime_type' => \mime_content_type ( __DIR__ . '/faust.jpg' ), // The file's mime type
2019-12-28 16:07:09 +01:00
'caption' => 'This file was uploaded using @MadelineProto' , // The caption
'file_name' => 'faust.jpg' , // The file's name
2019-12-29 13:25:31 +01:00
'size' => \filesize ( __DIR__ . '/faust.jpg' ), // The file's size
2019-12-28 16:07:09 +01:00
'attributes' => [
[ '_' => 'documentAttributeImageSize' , 'w' => 1280 , 'h' => 914 ], // Image's resolution
],
2018-03-23 16:39:58 +01:00
],
],
2019-12-28 16:07:09 +01:00
];
// Photo, secret chat
$secret_media [ 'photo' ] = [
'peer' => $secret_chat_id ,
2019-12-29 13:25:31 +01:00
'file' => __DIR__ . '/faust.jpg' ,
2019-12-28 16:07:09 +01:00
'message' => [
'_' => 'decryptedMessage' ,
'ttl' => 0 ,
'message' => '' ,
'media' => [
'_' => 'decryptedMessageMediaPhoto' ,
2019-12-29 13:25:31 +01:00
'thumb' => \file_get_contents ( __DIR__ . '/faust.preview.jpg' ),
2019-12-28 16:07:09 +01:00
'thumb_w' => 90 ,
'thumb_h' => 90 ,
'caption' => 'This file was uploaded using @MadelineProto' ,
2019-12-29 13:25:31 +01:00
'size' => \filesize ( __DIR__ . '/faust.jpg' ),
2019-12-28 16:07:09 +01:00
'w' => 1280 ,
'h' => 914 ,
],
2018-03-23 16:39:58 +01:00
],
2019-12-28 16:07:09 +01:00
];
2017-04-21 13:13:24 +02:00
2019-12-28 16:07:09 +01:00
// GIF, secret chat
2019-12-29 13:25:31 +01:00
$secret_media [ 'gif' ] = [ 'peer' => $secret_chat_id , 'file' => __DIR__ . '/pony.mp4' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( __DIR__ . '/pony.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( __DIR__ . '/pony.mp4' ), 'caption' => 'test' , 'file_name' => 'pony.mp4' , 'size' => \filesize ( __DIR__ . '/faust.jpg' ), 'attributes' => [[ '_' => 'documentAttributeAnimated' ]]]]];
2017-04-21 13:13:24 +02:00
2019-12-28 16:07:09 +01:00
// Sticker, secret chat
2019-12-29 13:25:31 +01:00
$secret_media [ 'sticker' ] = [ 'peer' => $secret_chat_id , 'file' => __DIR__ . '/lel.webp' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( __DIR__ . '/lel.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( __DIR__ . '/lel.webp' ), 'caption' => 'test' , 'file_name' => 'lel.webp' , 'size' => \filesize ( __DIR__ . '/lel.webp' ), 'attributes' => [[ '_' => 'documentAttributeSticker' , 'alt' => 'LEL' , 'stickerset' => [ '_' => 'inputStickerSetEmpty' ]]]]]];
2017-04-21 13:13:24 +02:00
2019-12-28 16:07:09 +01:00
// Document, secret chat
2019-12-29 13:25:31 +01:00
$secret_media [ 'document' ] = [ 'peer' => $secret_chat_id , 'file' => __DIR__ . '/60' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( __DIR__ . '/faust.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => 'magic/magic' , 'caption' => 'test' , 'file_name' => 'magic.magic' , 'size' => \filesize ( __DIR__ . '/60' ), 'attributes' => [[ '_' => 'documentAttributeFilename' , 'file_name' => 'fairy' ]]]]];
2017-04-21 13:13:24 +02:00
2019-12-28 16:07:09 +01:00
// Video, secret chat
2019-12-29 13:25:31 +01:00
$secret_media [ 'video' ] = [ 'peer' => $secret_chat_id , 'file' => __DIR__ . '/swing.mp4' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( __DIR__ . '/swing.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( __DIR__ . '/swing.mp4' ), 'caption' => 'test' , 'file_name' => 'swing.mp4' , 'size' => \filesize ( __DIR__ . '/swing.mp4' ), 'attributes' => [[ '_' => 'documentAttributeVideo' ]]]]];
2017-04-21 13:13:24 +02:00
2019-12-28 16:07:09 +01:00
// audio, secret chat
2019-12-29 13:25:31 +01:00
$secret_media [ 'audio' ] = [ 'peer' => $secret_chat_id , 'file' => __DIR__ . '/mosconi.mp3' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( __DIR__ . '/faust.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( __DIR__ . '/mosconi.mp3' ), 'caption' => 'test' , 'file_name' => 'mosconi.mp3' , 'size' => \filesize ( __DIR__ . '/mosconi.mp3' ), 'attributes' => [[ '_' => 'documentAttributeAudio' , 'voice' => false , 'title' => 'AH NON LO SO IO' , 'performer' => 'IL DIO GERMANO MOSCONI' ]]]]];
$secret_media [ 'voice' ] = [ 'peer' => $secret_chat_id , 'file' => __DIR__ . '/mosconi.mp3' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( __DIR__ . '/faust.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( __DIR__ . '/mosconi.mp3' ), 'caption' => 'test' , 'file_name' => 'mosconi.mp3' , 'size' => \filesize ( __DIR__ . '/mosconi.mp3' ), 'attributes' => [[ '_' => 'documentAttributeAudio' , 'voice' => true , 'title' => 'AH NON LO SO IO' , 'performer' => 'IL DIO GERMANO MOSCONI' ]]]]];
2017-06-01 18:53:05 +02:00
2019-12-28 16:07:09 +01:00
foreach ( $secret_media as $type => $smessage ) {
$MadelineProto -> logger ( " Encrypting and uploading $type ... " );
$type = yield $MadelineProto -> messages -> sendEncryptedFile ( $smessage );
}
2017-04-21 13:14:21 +02:00
}
2017-06-30 15:36:33 +02:00
2021-12-06 19:14:34 +01:00
if ( ! \getenv ( 'TEST_USERNAME' )) {
throw new Exception ( 'No TEST_USERNAME environment variable was provided!' );
}
2019-12-28 16:07:09 +01:00
$mention = yield $MadelineProto -> getInfo ( \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
$media = [];
2017-01-07 12:39:11 +01:00
2019-12-28 16:07:09 +01:00
// Image
2019-12-29 13:25:31 +01:00
$media [ 'photo' ] = [ '_' => 'inputMediaUploadedPhoto' , 'file' => __DIR__ . '/faust.jpg' ];
Documentation rework (#349)
* Documentation rework
* Apply fixes from StyleCI
* Documentation fixes
* Login as bot through web/cli API, allow using invite links in joinChannel, full invite links in importChatInvite and checkChatInvite, non-invite links in importChatInvite
* Apply fixes from StyleCI
* Logging fixes
* Build docs
* Add methods to modify start template, bugfix to logging and keyboard conversion
* Add TL documentator
* Document MTProto methods
* Documenting methods...
* 7% documented
* Bugfixes
* Update docs
* Update docs
* Simplify file management
* Implement automatic object conversion for media, and more awesome stuff
* Implement automatic object conversion for media, and more awesome stuff
* Implement event update handler and file upload/download callback
* Auto-detect mime type, duration, width and height of media
* Update docs
* Document new file functions
* Fix links
* Fix links
* Update bot.php to use event loop
* Implement webhook update handler and forking in main loop
* Build docs
* Better docs
* Fixes to secret chats
* Almost finished updating docs
* Bugfixes, implemented infinite loop for loop() method, almost finished docs
* Finish writing docs
* Add automatic documentation builder script
* Finished writing docs
2018-03-20 12:48:05 +01:00
2019-12-28 16:07:09 +01:00
// Sticker
2019-12-29 13:25:31 +01:00
$media [ 'sticker' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => __DIR__ . '/lel.webp' , 'attributes' => [[ '_' => 'documentAttributeSticker' , 'alt' => 'LEL' ]]];
2017-01-07 12:39:11 +01:00
2019-12-28 16:07:09 +01:00
// Video
2019-12-29 13:25:31 +01:00
$media [ 'video' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => __DIR__ . '/swing.mp4' , 'attributes' => [[ '_' => 'documentAttributeVideo' ]]];
2017-01-07 12:39:11 +01:00
2019-12-28 16:07:09 +01:00
// audio
2019-12-29 13:25:31 +01:00
$media [ 'audio' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => __DIR__ . '/mosconi.mp3' , 'attributes' => [[ '_' => 'documentAttributeAudio' , 'voice' => false , 'title' => 'AH NON LO SO IO' , 'performer' => 'IL DIO GERMANO MOSCONI' ]]];
2017-01-07 12:39:11 +01:00
2019-12-28 16:07:09 +01:00
// voice
2019-12-29 13:25:31 +01:00
$media [ 'voice' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => __DIR__ . '/mosconi.mp3' , 'attributes' => [[ '_' => 'documentAttributeAudio' , 'voice' => true , 'title' => 'AH NON LO SO IO' , 'performer' => 'IL DIO GERMANO MOSCONI' ]]];
2017-04-21 13:13:24 +02:00
2019-12-28 16:07:09 +01:00
// Document
2019-12-29 13:25:31 +01:00
$media [ 'document' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => __DIR__ . '/60' , 'mime_type' => 'magic/magic' , 'attributes' => [[ '_' => 'documentAttributeFilename' , 'file_name' => 'magic.magic' ]]];
2018-02-19 12:48:43 +01:00
2019-12-28 16:07:09 +01:00
$message = 'yay ' . \PHP_VERSION_ID ;
$mention = yield $MadelineProto -> getInfo ( \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
2021-04-23 15:51:33 +02:00
2019-12-28 16:07:09 +01:00
foreach ( \json_decode ( \getenv ( 'TEST_DESTINATION_GROUPS' ), true ) as $peer ) {
$sentMessage = yield $MadelineProto -> messages -> sendMessage ([ 'peer' => $peer , 'message' => $message , 'entities' => [[ '_' => 'inputMessageEntityMentionName' , 'offset' => 0 , 'length' => \mb_strlen ( $message ), 'user_id' => $mention ]]]);
$MadelineProto -> logger ( $sentMessage , \danog\MadelineProto\Logger :: NOTICE );
2017-03-31 17:36:55 +02:00
2019-12-28 16:07:09 +01:00
foreach ( $media as $type => $inputMedia ) {
$MadelineProto -> logger ( " Sending $type " );
2020-01-16 21:14:38 +01:00
yield $MadelineProto -> messages -> sendMedia ([ 'peer' => $peer , 'media' => $inputMedia , 'message' => '[' . $message . '](mention:' . $mention . ')' , 'parse_mode' => 'markdown' ]);
$MadelineProto -> logger ( " Uploading $type " );
$media = yield $MadelineProto -> messages -> uploadMedia ([ 'peer' => '@me' , 'media' => $inputMedia ]);
$MadelineProto -> logger ( " Downloading $type " );
yield $MadelineProto -> downloadToDir ( $media , '/tmp' );
$MadelineProto -> logger ( " Re-sending $type " );
2019-12-30 00:22:01 +01:00
$inputMedia [ 'file' ] = $media ;
yield $MadelineProto -> messages -> uploadMedia ([ 'peer' => '@me' , 'media' => $inputMedia ]);
2020-01-16 21:14:38 +01:00
$MadelineProto -> logger ( " Done $type " );
2019-12-28 16:07:09 +01:00
}
2017-01-07 12:39:11 +01:00
}
2016-12-30 16:32:25 +01:00
2019-12-28 16:07:09 +01:00
foreach ( \json_decode ( \getenv ( 'TEST_DESTINATION_GROUPS' ), true ) as $peer ) {
$sentMessage = yield $MadelineProto -> messages -> sendMessage ([ 'peer' => $peer , 'message' => $message , 'entities' => [[ '_' => 'inputMessageEntityMentionName' , 'offset' => 0 , 'length' => \mb_strlen ( $message ), 'user_id' => $mention ]]]);
$MadelineProto -> logger ( $sentMessage , \danog\MadelineProto\Logger :: NOTICE );
}
});