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
/*
2017-01-25 23:16:22 +01:00
Copyright 2016 - 2017 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 />.
*/
2017-01-22 15:50:35 +01:00
chdir ( dirname ( __FILE__ ) . '/../' );
2016-08-07 23:23:10 +02:00
require_once 'vendor/autoload.php' ;
2016-12-26 18:23:46 +01:00
if ( file_exists ( 'web_data.php' )) {
2016-12-26 20:24:24 +01:00
require_once 'web_data.php' ;
2016-12-26 18:23:46 +01:00
}
2017-01-20 21:02:21 +01:00
echo 'Deserializing MadelineProto from session.madeline...' . PHP_EOL ;
2017-02-11 14:59:38 +01:00
$MadelineProto = false ;
try {
$MadelineProto = \danog\MadelineProto\Serialization :: deserialize ( 'session.madeline' );
} catch ( \danog\MadelineProto\Exception $e ) {
}
2017-01-17 14:29:37 +01:00
if ( file_exists ( '.env' )) {
2017-01-25 23:16:22 +01:00
echo 'Loading .env...' . PHP_EOL ;
2017-01-22 15:50:35 +01:00
$dotenv = new Dotenv\Dotenv ( getcwd ());
2017-01-15 17:38:04 +01:00
$dotenv -> load ();
2017-01-17 14:29:37 +01:00
}
2017-01-25 23:16:22 +01:00
echo 'Loading settings...' . PHP_EOL ;
2017-01-17 14:29:37 +01:00
$settings = json_decode ( getenv ( 'MTPROTO_SETTINGS' ), true ) ? : [];
if ( $MadelineProto === false ) {
2017-01-25 23:16:22 +01:00
echo 'Loading MadelineProto...' . PHP_EOL ;
2016-12-26 18:23:46 +01:00
$MadelineProto = new \danog\MadelineProto\API ( $settings );
2017-01-27 13:19:16 +01:00
if ( getenv ( 'TRAVIS_COMMIT' ) == '' ) {
$checkedPhone = $MadelineProto -> auth -> checkPhone ( // auth.checkPhone becomes auth->checkPhone
[
'phone_number' => getenv ( 'MTPROTO_NUMBER' ),
]
);
2017-01-27 22:05:24 +01:00
\danog\MadelineProto\Logger :: log ([ $checkedPhone ], \danog\MadelineProto\Logger :: NOTICE );
2017-01-27 13:19:16 +01:00
$sentCode = $MadelineProto -> phone_login ( getenv ( 'MTPROTO_NUMBER' ));
2017-01-27 22:05:24 +01:00
\danog\MadelineProto\Logger :: log ([ $sentCode ], \danog\MadelineProto\Logger :: NOTICE );
2017-01-27 13:19:16 +01:00
echo 'Enter the code you received: ' ;
$code = fgets ( STDIN , ( isset ( $sentCode [ 'type' ][ 'length' ]) ? $sentCode [ 'type' ][ 'length' ] : 5 ) + 1 );
$authorization = $MadelineProto -> complete_phone_login ( $code );
2017-01-27 22:05:24 +01:00
\danog\MadelineProto\Logger :: log ([ $authorization ], \danog\MadelineProto\Logger :: NOTICE );
2017-01-27 20:04:42 +01:00
if ( $authorization [ '_' ] === 'account.noPassword' ) {
throw new \danog\MadelineProto\Exception ( '2FA is enabled but no password is set!' );
}
if ( $authorization [ '_' ] === 'account.password' ) {
\danog\MadelineProto\Logger :: log ([ '2FA is enabled' ], \danog\MadelineProto\Logger :: NOTICE );
2017-01-27 22:05:24 +01:00
$authorization = $MadelineProto -> complete_2fa_login ( readline ( 'Please enter your password (hint ' . $authorization [ 'hint' ] . '): ' ));
2017-01-27 20:04:42 +01:00
}
2017-02-21 19:04:37 +01:00
if ( $authorization [ '_' ] === 'account.needSignup' ) {
\danog\MadelineProto\Logger :: log ([ 'Registering new user' ], \danog\MadelineProto\Logger :: NOTICE );
$authorization = $MadelineProto -> complete_signup ( $code , readline ( 'Please enter your first name: ' ), readline ( 'Please enter your last name (can be empty): ' ));
}
2017-01-27 13:19:16 +01:00
echo 'Serializing MadelineProto to session.madeline...' . PHP_EOL ;
echo 'Wrote ' . \danog\MadelineProto\Serialization :: serialize ( 'session.madeline' , $MadelineProto ) . ' bytes' . PHP_EOL ;
2017-01-27 22:05:24 +01:00
} else {
$MadelineProto -> bot_login ( getenv ( 'BOT_TOKEN' ));
}
Added documentation, simplified code, organized exceptions, added some more examples in testing.php, decided to unset flags in deserialized responses, moved message id arrays to Connection classes, added wrappers for logging in to telegram as a bot or as a user and for logging out, fixed deserializing of gzip packed objects, added more logging, fixed bugs, added methods to get and parse configuration, saved some fairies, fixed exporting/importing of authorization, added some wakeup methods to prevent problems during serialization, added support for ipv6 and automagical detection too. I think we can safely say this is now a beta.
2016-11-25 00:15:22 +01:00
}
2017-02-16 04:55:10 +01:00
$message = ( getenv ( 'TRAVIS_COMMIT' ) == '' ) ? 'I iz works always (io laborare sembre) (yo lavorar siempre) (mi labori ĉiam) (я всегда работать) (Ik werkuh altijd)' : ( 'Travis ci tests in progress: commit ' . getenv ( 'TRAVIS_COMMIT' ) . ', job ' . getenv ( 'TRAVIS_JOB_NUMBER' ) . ', PHP version: ' . getenv ( 'TRAVIS_PHP_VERSION' ));
2017-03-24 21:01:08 +01:00
//$secret = $MadelineProto->API->request_secret_chat(getenv('TEST_SECRET_CHAT'));
2017-03-11 19:54:51 +01:00
//$MadelineProto->API->request_secret_chat('@Harold_Saxon');
echo 'Serializing MadelineProto to session.madeline...' . PHP_EOL ;
echo 'Wrote ' . \danog\MadelineProto\Serialization :: serialize ( 'session.madeline' , $MadelineProto ) . ' bytes' . PHP_EOL ;
echo 'Size of MadelineProto instance is ' . strlen ( serialize ( $MadelineProto )) . ' bytes' . PHP_EOL ;
2017-03-25 02:41:09 +01:00
2017-01-20 21:02:21 +01:00
$mention = $MadelineProto -> get_info ( getenv ( 'TEST_USERNAME' )); // Returns an array with all of the constructors that can be extracted from a username or an id
2016-12-30 16:32:25 +01:00
$mention = $mention [ 'user_id' ]; // Selects only the numeric user id
2016-12-23 21:06:38 +01:00
2017-01-07 12:39:11 +01:00
$media = [];
2017-03-11 19:54:51 +01:00
$secret_media = [];
2017-01-07 12:39:11 +01:00
// Photo uploaded as document
2017-01-22 15:50:35 +01:00
$inputFile = $MadelineProto -> upload ( 'tests/faust.jpg' , 'fausticorn.jpg' ); // This gets an inputFile object with file name magic
$media [ 'document_photo' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => $inputFile , 'mime_type' => mime_content_type ( 'tests/faust.jpg' ), 'caption' => 'This file was uploaded using MadelineProto' , 'attributes' => [[ '_' => 'documentAttributeImageSize' , 'w' => 1280 , 'h' => 914 ]]];
2017-01-07 12:39:11 +01:00
2017-03-11 19:54:51 +01:00
// Photo uploaded as document, secret chat
//$inputFile = $MadelineProto->upload_encrypted('tests/faust.jpg', 'fausticorn.jpg'); // This gets an inputFile object with file name magic
//$secret_media['document_photo'] = ['peer' => $secret, 'file' => $inputFile, 'message' => ['ttl' => PHP_INT_MAX, 'message' => '', 'media' => ['_' => 'decryptedMessageMediaDocument', 'mime_type' => mime_content_type('tests/faust.jpg'), 'caption' => 'This file was uploaded using MadelineProto', 'attributes' => [['_' => 'documentAttributeImageSize', 'w' => 1280, 'h' => 914]]]]];
2017-01-07 12:39:11 +01:00
// Photo
2017-01-22 15:50:35 +01:00
$media [ 'photo' ] = [ '_' => 'inputMediaUploadedPhoto' , 'file' => $inputFile , 'mime_type' => mime_content_type ( 'tests/faust.jpg' ), 'caption' => 'This photo was uploaded using MadelineProto' ];
2017-01-07 12:39:11 +01:00
// GIF
2017-01-22 15:50:35 +01:00
$inputFile = $MadelineProto -> upload ( 'tests/pony.mp4' );
$media [ 'gif' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => $inputFile , 'mime_type' => mime_content_type ( 'tests/pony.mp4' ), 'caption' => 'test' , 'attributes' => [[ '_' => 'documentAttributeAnimated' ]]];
2017-01-07 12:39:11 +01:00
// Sticker
2017-01-22 15:50:35 +01:00
$inputFile = $MadelineProto -> upload ( 'tests/lel.webp' );
$media [ 'sticker' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => $inputFile , 'mime_type' => mime_content_type ( 'tests/lel.webp' ), 'caption' => 'test' , 'attributes' => [[ '_' => 'documentAttributeSticker' , 'alt' => 'LEL' , 'stickerset' => [ '_' => 'inputStickerSetEmpty' ]]]];
2017-01-07 12:39:11 +01:00
// Video
2017-01-22 15:50:35 +01:00
$inputFile = $MadelineProto -> upload ( 'tests/swing.mp4' );
$media [ 'video' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => $inputFile , 'mime_type' => mime_content_type ( 'tests/swing.mp4' ), 'caption' => 'test' , 'attributes' => [[ '_' => 'documentAttributeVideo' , 'duration' => 5 , 'w' => 1280 , 'h' => 720 ]]];
2017-01-07 12:39:11 +01:00
// audio
2017-01-22 15:50:35 +01:00
$inputFile = $MadelineProto -> upload ( 'tests/mosconi.mp3' );
2017-01-28 17:03:44 +01:00
$media [ 'audio' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => $inputFile , 'mime_type' => mime_content_type ( 'tests/mosconi.mp3' ), 'caption' => 'test' , 'attributes' => [[ '_' => 'documentAttributeAudio' , 'voice' => false , 'duration' => 1 , 'title' => 'AH NON LO SO IO' , 'performer' => 'IL DIO GERMANO MOSCONI' ]]];
2017-01-07 12:39:11 +01:00
// voice
2017-01-28 17:03:44 +01:00
$media [ 'voice' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => $inputFile , 'mime_type' => mime_content_type ( 'tests/mosconi.mp3' ), 'caption' => 'test' , 'attributes' => [[ '_' => 'documentAttributeAudio' , 'voice' => true , 'duration' => 1 , 'title' => 'AH NON LO SO IO' , 'performer' => 'IL DIO GERMANO MOSCONI' ]]];
2017-01-07 12:39:11 +01:00
// Document
$time = time ();
2017-01-22 15:50:35 +01:00
$inputFile = $MadelineProto -> upload ( 'tests/60' , 'magic' ); // This gets an inputFile object with file name magic
2017-01-07 12:39:11 +01:00
var_dump ( time () - $time );
$media [ 'document' ] = [ '_' => 'inputMediaUploadedDocument' , 'file' => $inputFile , 'mime_type' => 'magic/magic' , 'caption' => 'This file was uploaded using MadelineProto' , 'attributes' => [[ '_' => 'documentAttributeFilename' , 'file_name' => 'magic.magic' ]]];
2017-01-20 21:02:21 +01:00
foreach ( json_decode ( getenv ( 'TEST_DESTINATION_GROUPS' ), true ) as $peer ) {
2017-02-16 04:55:10 +01:00
$sentMessage = $MadelineProto -> messages -> sendMessage ([ 'peer' => $peer , 'message' => $message , 'entities' => [[ '_' => 'inputMessageEntityMentionName' , 'offset' => 0 , 'length' => mb_strlen ( $message ), 'user_id' => $mention ]]]);
2017-01-27 22:05:24 +01:00
\danog\MadelineProto\Logger :: log ([ $sentMessage ], \danog\MadelineProto\Logger :: NOTICE );
2017-01-07 12:39:11 +01:00
foreach ( $media as $type => $inputMedia ) {
2017-03-11 19:54:51 +01:00
$type = $MadelineProto -> messages -> sendMedia ([ 'peer' => $peer , 'media' => $inputMedia ]);
2017-01-07 12:39:11 +01:00
}
2016-11-29 01:47:59 +01:00
}
2016-12-26 18:23:46 +01:00
sleep ( 5 );
2016-12-30 16:32:25 +01:00
var_dump ( $MadelineProto -> API -> get_updates ());
2016-12-26 18:23:46 +01:00
2016-12-30 21:21:36 +01:00
echo 'Serializing MadelineProto to session.madeline...' . PHP_EOL ;
echo 'Wrote ' . \danog\MadelineProto\Serialization :: serialize ( 'session.madeline' , $MadelineProto ) . ' bytes' . PHP_EOL ;
2016-11-29 01:47:59 +01:00
echo 'Size of MadelineProto instance is ' . strlen ( serialize ( $MadelineProto )) . ' bytes' . PHP_EOL ;
2016-12-30 16:32:25 +01:00
2017-01-20 21:02:21 +01:00
if ( $bot_token = getenv ( 'BOT_TOKEN' )) {
2016-12-26 18:23:46 +01:00
$MadelineProto = new \danog\MadelineProto\API ( $settings );
2017-01-20 21:02:21 +01:00
$authorization = $MadelineProto -> bot_login ( $bot_token );
2017-01-27 22:05:24 +01:00
\danog\MadelineProto\Logger :: log ([ $authorization ], \danog\MadelineProto\Logger :: NOTICE );
Added APIFactory for calling namespaced mtproto methods, cleaned up testing.php and API.php, moved authorization keys, session_id, seq_no and time delta to the Connection class, added close_and_reopen method to the Connection class, improved DataCenter class, renamed Logging class to Logger, added a bit more logging, added setup_logger, switch_dc, init_authorization methods to the MTProto class, added parameter to disable automatic switching to nearest DC in write_client_info, added a try catch block in the create_auth_key method, fixed switching of DCs in wait_for_response method, added arguments check in the method calling methods, added a message id check in MessageHandler, added method_name_namespaced array in TL for APIFactory, renamed a lot of stuff and removed a few checks in the TL class, moved sendCode test call to testing.php
2016-11-16 15:05:27 +01:00
}
2016-12-30 16:32:25 +01:00
$message = 'yay' ;
2017-01-20 21:02:21 +01:00
$mention = $MadelineProto -> get_info ( getenv ( 'TEST_USERNAME' )); // Returns an array with all of the constructors that can be extracted from a username or an id
2016-12-30 16:32:25 +01:00
$mention = $mention [ 'user_id' ]; // Selects only the numeric user id
2017-01-20 21:02:21 +01:00
foreach ( json_decode ( getenv ( 'TEST_DESTINATION_GROUPS' ), true ) as $peer ) {
2017-02-16 04:55:10 +01:00
$sentMessage = $MadelineProto -> messages -> sendMessage ([ 'peer' => $peer , 'message' => $message , 'entities' => [[ '_' => 'inputMessageEntityMentionName' , 'offset' => 0 , 'length' => mb_strlen ( $message ), 'user_id' => $mention ]]]);
2017-01-27 22:05:24 +01:00
\danog\MadelineProto\Logger :: log ([ $sentMessage ], \danog\MadelineProto\Logger :: NOTICE );
2016-11-29 01:47:59 +01:00
}
2016-12-30 16:32:25 +01:00
sleep ( 5 );
var_dump ( $MadelineProto -> API -> get_updates ());