2017-06-01 22:21:15 +02:00
#!/usr/bin/env php
< ? php
2019-10-28 22:39:23 +01:00
/**
* Secret chat bot .
*
2020-02-17 14:13:46 +01:00
* Copyright 2016 - 2020 Daniil Gentili
2019-10-28 22:39:23 +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 />.
*
* @ author Daniil Gentili < daniil @ daniil . it >
2020-02-17 14:13:46 +01:00
* @ copyright 2016 - 2020 Daniil Gentili < daniil @ daniil . it >
2019-10-28 22:39:23 +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
2019-10-28 22:39:23 +01:00
*/
2020-02-25 19:10:49 +01:00
use danog\MadelineProto\APIWrapper ;
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
* Various ways to load MadelineProto
*/
2019-12-26 15:14:27 +01:00
if ( \file_exists ( __DIR__ . '/../vendor/autoload.php' )) {
2019-10-28 22:39:23 +01:00
include 'vendor/autoload.php' ;
} else {
2019-10-28 19:48:59 +01:00
if ( ! \file_exists ( 'madeline.php' )) {
\copy ( 'https://phar.madelineproto.xyz/madeline.php' , '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
}
include 'madeline.php' ;
2017-06-01 22:21:15 +02:00
}
2020-02-23 19:28:42 +01:00
class SecretHandler extends \danog\MadelineProto\EventHandler
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
{
private $sent = [ - 440592694 => true ];
2020-02-25 19:10:49 +01:00
public function __construct ( ? APIWrapper $API )
2020-02-23 19:28:42 +01:00
{
parent :: __construct ( $API );
$this -> sent = [];
}
/**
* @ var int | string Username or ID of bot admin
*/
const ADMIN = " danogentili " ; // Change this
/**
* Get peer ( s ) where to report errors .
*
* @ return int | string | array
*/
public function getReportPeers ()
{
return [ self :: ADMIN ];
}
/**
* Handle updates from users .
*
* @ param array $update Update
*
* @ return \Generator
*/
public function onUpdateNewMessage ( array $update ) : \Generator
{
if ( $update [ 'message' ][ 'message' ] === 'request' ) {
yield $this -> requestSecretChat ( $update );
}
2020-10-18 18:41:53 +02:00
if ( $update [ 'message' ][ 'message' ] === 'ping' ) {
yield $this -> messages -> sendMessage ([ 'message' => 'lmao' , 'peer' => $update ]);
}
2020-02-23 19:28:42 +01:00
}
/**
* Handle secret chat messages .
*
* @ param array $update Update
*
* @ return \Generator
*/
public function onUpdateNewEncryptedMessage ( array $update ) : \Generator
2018-03-23 16:39:58 +01:00
{
2020-10-18 15:41:06 +02:00
if ( isset ( $update [ 'message' ][ 'decrypted_message' ][ 'media' ])) {
$this -> logger ( yield $this -> downloadToDir ( $update , '.' ));
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
}
2020-10-18 15:41:06 +02:00
if ( isset ( $this -> sent [ $update [ 'message' ][ 'chat_id' ]])) {
return ;
}
$secret_media = [];
// Photo uploaded as document, secret chat
$secret_media [ 'document_photo' ] = [ 'peer' => $update , 'file' => 'tests/faust.jpg' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( 'tests/faust.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( 'tests/faust.jpg' ), 'caption' => 'This file was uploaded using MadelineProto' , 'file_name' => 'faust.jpg' , 'size' => \filesize ( 'tests/faust.jpg' ), 'attributes' => [[ '_' => 'documentAttributeImageSize' , 'w' => 1280 , 'h' => 914 ]]]]];
// Photo, secret chat
$secret_media [ 'photo' ] = [ 'peer' => $update , 'file' => 'tests/faust.jpg' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaPhoto' , 'thumb' => \file_get_contents ( 'tests/faust.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'caption' => 'This file was uploaded using MadelineProto' , 'size' => \filesize ( 'tests/faust.jpg' ), 'w' => 1280 , 'h' => 914 ]]];
// GIF, secret chat
$secret_media [ 'gif' ] = [ 'peer' => $update , 'file' => 'tests/pony.mp4' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( 'tests/pony.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( 'tests/pony.mp4' ), 'caption' => 'test' , 'file_name' => 'pony.mp4' , 'size' => \filesize ( 'tests/faust.jpg' ), 'attributes' => [[ '_' => 'documentAttributeAnimated' ]]]]];
// Sticker, secret chat
$secret_media [ 'sticker' ] = [ 'peer' => $update , 'file' => 'tests/lel.webp' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( 'tests/lel.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( 'tests/lel.webp' ), 'caption' => 'test' , 'file_name' => 'lel.webp' , 'size' => \filesize ( 'tests/lel.webp' ), 'attributes' => [[ '_' => 'documentAttributeSticker' , 'alt' => 'LEL' , 'stickerset' => [ '_' => 'inputStickerSetEmpty' ]]]]]];
// Document, secrey chat
$secret_media [ 'document' ] = [ 'peer' => $update , 'file' => 'tests/60' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( 'tests/faust.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => 'magic/magic' , 'caption' => 'test' , 'file_name' => 'magic.magic' , 'size' => \filesize ( 'tests/60' ), 'attributes' => [[ '_' => 'documentAttributeFilename' , 'file_name' => 'fairy' ]]]]];
// Video, secret chat
$secret_media [ 'video' ] = [ 'peer' => $update , 'file' => 'tests/swing.mp4' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( 'tests/swing.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( 'tests/swing.mp4' ), 'caption' => 'test' , 'file_name' => 'swing.mp4' , 'size' => \filesize ( 'tests/swing.mp4' ), 'attributes' => [[ '_' => 'documentAttributeVideo' , 'duration' => 5 , 'w' => 1280 , 'h' => 720 ]]]]];
// audio, secret chat
$secret_media [ 'audio' ] = [ 'peer' => $update , 'file' => 'tests/mosconi.mp3' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( 'tests/faust.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( 'tests/mosconi.mp3' ), 'caption' => 'test' , 'file_name' => 'mosconi.mp3' , 'size' => \filesize ( 'tests/mosconi.mp3' ), 'attributes' => [[ '_' => 'documentAttributeAudio' , 'voice' => false , 'duration' => 1 , 'title' => 'AH NON LO SO IO' , 'performer' => 'IL DIO GERMANO MOSCONI' ]]]]];
$secret_media [ 'voice' ] = [ 'peer' => $update , 'file' => 'tests/mosconi.mp3' , 'message' => [ '_' => 'decryptedMessage' , 'ttl' => 0 , 'message' => '' , 'media' => [ '_' => 'decryptedMessageMediaDocument' , 'thumb' => \file_get_contents ( 'tests/faust.preview.jpg' ), 'thumb_w' => 90 , 'thumb_h' => 90 , 'mime_type' => \mime_content_type ( 'tests/mosconi.mp3' ), 'caption' => 'test' , 'file_name' => 'mosconi.mp3' , 'size' => \filesize ( 'tests/mosconi.mp3' ), 'attributes' => [[ '_' => 'documentAttributeAudio' , 'voice' => true , 'duration' => 1 , 'title' => 'AH NON LO SO IO' , 'performer' => 'IL DIO GERMANO MOSCONI' ]]]]];
foreach ( $secret_media as $type => $smessage ) {
$promises = $this -> messages -> sendEncryptedFile ( $smessage );
}
yield $promises ;
$i = 0 ;
while ( $i < 10 ) {
$this -> logger ( " SENDING MESSAGE $i TO " . $update [ 'message' ][ 'chat_id' ]);
// You can also use the sendEncrypted parameter for more options in secret chats
yield $this -> messages -> sendMessage ([ 'peer' => $update , 'message' => ( string ) ( $i ++ )]);
}
$this -> sent [ $update [ 'message' ][ 'chat_id' ]] = true ;
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
}
2017-06-01 22:21:15 +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-10-28 19:48:59 +01:00
if ( \file_exists ( '.env' )) {
2017-06-01 22:21:15 +02:00
echo 'Loading .env...' . PHP_EOL ;
2019-10-28 19:48:59 +01:00
$dotenv = Dotenv\Dotenv :: create ( \getcwd ());
2017-06-01 22:21:15 +02:00
$dotenv -> load ();
}
echo 'Loading settings...' . PHP_EOL ;
2019-10-28 19:48:59 +01:00
$settings = \json_decode ( \getenv ( 'MTPROTO_SETTINGS' ), true ) ? : [];
2017-06-01 22:21:15 +02:00
2018-03-30 18:07:54 +02:00
$MadelineProto = new \danog\MadelineProto\API ( 's.madeline' , $settings );
2020-02-23 19:28:42 +01:00
// Reduce boilerplate with new wrapper method
2020-03-06 13:09:52 +01:00
$MadelineProto -> startAndLoop ( SecretHandler :: class );