Avoided memory leak, Button now implements ArrayAccess, improved documentation
This commit is contained in:
parent
fc607f18b2
commit
983912f188
22
README.md
22
README.md
@ -65,6 +65,7 @@ This library can also be used to create lua telegram bots (like bot API bots, on
|
|||||||
|
|
||||||
* PFS in secret chats
|
* PFS in secret chats
|
||||||
|
|
||||||
|
* [Clickable inline buttons](#inline-buttons)!
|
||||||
|
|
||||||
## PHP Requirements
|
## PHP Requirements
|
||||||
|
|
||||||
@ -174,6 +175,27 @@ You can find examples for nearly every MadelineProto function in
|
|||||||
* [`userbots/MadelineProto_bot.php`](https://github.com/danog/MadelineProto/blob/master/userbots/MadelineProto_bot.php) - More fun shiz
|
* [`userbots/MadelineProto_bot.php`](https://github.com/danog/MadelineProto/blob/master/userbots/MadelineProto_bot.php) - More fun shiz
|
||||||
* [`userbots/pwrtelegram_debug_bot`](https://github.com/danog/MadelineProto/blob/master/userbots/pwrtelegram_debug_bot.php) - More fun shiz
|
* [`userbots/pwrtelegram_debug_bot`](https://github.com/danog/MadelineProto/blob/master/userbots/pwrtelegram_debug_bot.php) - More fun shiz
|
||||||
|
|
||||||
|
### Inline buttons
|
||||||
|
|
||||||
|
You can easily click inline buttons using MadelineProto, just access the correct button:
|
||||||
|
|
||||||
|
```
|
||||||
|
$button = $update['update']['message']['reply_markup']['rows'][0]['buttons'][0];
|
||||||
|
```
|
||||||
|
|
||||||
|
You can then access properties (they vary depending on the [type of button](https://docs.madelineproto.xyz/API_docs/types/KeyboardButton.html)):
|
||||||
|
|
||||||
|
```
|
||||||
|
$text = $button['text'];
|
||||||
|
```
|
||||||
|
|
||||||
|
And click them:
|
||||||
|
|
||||||
|
```
|
||||||
|
$button->click();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### Storing sessions
|
### Storing sessions
|
||||||
|
|
||||||
To store information about an account session, serialization must be done.
|
To store information about an account session, serialization must be done.
|
||||||
|
@ -72,8 +72,6 @@ class API extends APIFactory
|
|||||||
$this->API = $unserialized->API;
|
$this->API = $unserialized->API;
|
||||||
$this->APIFactory();
|
$this->APIFactory();
|
||||||
}
|
}
|
||||||
Serialization::$instances[spl_object_hash($unserialized)] = $unserialized;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$this->API = new MTProto($params);
|
$this->API = new MTProto($params);
|
||||||
@ -85,13 +83,11 @@ class API extends APIFactory
|
|||||||
//\danog\MadelineProto\Logger::log(['Getting future salts...'], Logger::ULTRA_VERBOSE);
|
//\danog\MadelineProto\Logger::log(['Getting future salts...'], Logger::ULTRA_VERBOSE);
|
||||||
//$this->future_salts = $this->get_future_salts(['num' => 3]);
|
//$this->future_salts = $this->get_future_salts(['num' => 3]);
|
||||||
\danog\MadelineProto\Logger::log([\danog\MadelineProto\Lang::$current_lang['madelineproto_ready']], Logger::NOTICE);
|
\danog\MadelineProto\Logger::log([\danog\MadelineProto\Lang::$current_lang['madelineproto_ready']], Logger::NOTICE);
|
||||||
Serialization::$instances[spl_object_hash($this)] = $this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __wakeup()
|
public function __wakeup()
|
||||||
{
|
{
|
||||||
//if (method_exists($this->API, 'wakeup')) $this->API = $this->API->wakeup();
|
//if (method_exists($this->API, 'wakeup')) $this->API = $this->API->wakeup();
|
||||||
Serialization::$instances[spl_object_hash($this)] = $this;
|
|
||||||
$this->APIFactory();
|
$this->APIFactory();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +143,6 @@ class Connection
|
|||||||
break;
|
break;
|
||||||
case 'http':
|
case 'http':
|
||||||
case 'https':
|
case 'https':
|
||||||
case 'https_proxied':
|
|
||||||
$this->parsed = parse_url($ip);
|
$this->parsed = parse_url($ip);
|
||||||
if ($this->parsed['host'][0] === '[') {
|
if ($this->parsed['host'][0] === '[') {
|
||||||
$this->parsed['host'] = substr($this->parsed['host'], 1, -1);
|
$this->parsed['host'] = substr($this->parsed['host'], 1, -1);
|
||||||
@ -161,10 +160,6 @@ class Connection
|
|||||||
throw new Exception(\danog\MadelineProto\Lang::$current_lang['socket_con_error']);
|
throw new Exception(\danog\MadelineProto\Lang::$current_lang['socket_con_error']);
|
||||||
}
|
}
|
||||||
$this->sock->setBlocking(true);
|
$this->sock->setBlocking(true);
|
||||||
if ($this->protocol === 'https_proxied') {
|
|
||||||
$this->write("CONNECT {$this->parsed['host']}:$port HTTP/1.1\r\nHost: {$this->parsed['host']}:$port\r\n\r\n");
|
|
||||||
$this->read_message();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'udp':
|
case 'udp':
|
||||||
throw new Exception(\danog\MadelineProto\Lang::$current_lang['protocol_not_implemented']);
|
throw new Exception(\danog\MadelineProto\Lang::$current_lang['protocol_not_implemented']);
|
||||||
@ -182,7 +177,6 @@ class Connection
|
|||||||
case 'tcp_full':
|
case 'tcp_full':
|
||||||
case 'http':
|
case 'http':
|
||||||
case 'https':
|
case 'https':
|
||||||
case 'https_proxied':
|
|
||||||
case 'obfuscated2':
|
case 'obfuscated2':
|
||||||
try {
|
try {
|
||||||
unset($this->sock);
|
unset($this->sock);
|
||||||
@ -237,7 +231,6 @@ class Connection
|
|||||||
case 'tcp_full':
|
case 'tcp_full':
|
||||||
case 'http':
|
case 'http':
|
||||||
case 'https':
|
case 'https':
|
||||||
case 'https_proxied':
|
|
||||||
$wrote = 0;
|
$wrote = 0;
|
||||||
if (($wrote += $this->sock->write($what)) !== $length) {
|
if (($wrote += $this->sock->write($what)) !== $length) {
|
||||||
while (($wrote += $this->sock->write(substr($what, $wrote))) !== $length) {
|
while (($wrote += $this->sock->write(substr($what, $wrote))) !== $length) {
|
||||||
@ -282,7 +275,6 @@ class Connection
|
|||||||
case 'tcp_full':
|
case 'tcp_full':
|
||||||
case 'http':
|
case 'http':
|
||||||
case 'https':
|
case 'https':
|
||||||
case 'https_proxied':
|
|
||||||
$packet = '';
|
$packet = '';
|
||||||
while (strlen($packet) < $length) {
|
while (strlen($packet) < $length) {
|
||||||
$packet .= $this->sock->read($length - strlen($packet));
|
$packet .= $this->sock->read($length - strlen($packet));
|
||||||
@ -331,9 +323,9 @@ class Connection
|
|||||||
return $this->read($packet_length < 127 ? $packet_length << 2 : unpack('V', $this->read(3)."\0")[1] << 2);
|
return $this->read($packet_length < 127 ? $packet_length << 2 : unpack('V', $this->read(3)."\0")[1] << 2);
|
||||||
case 'http':
|
case 'http':
|
||||||
case 'https':
|
case 'https':
|
||||||
case 'https_proxied':
|
|
||||||
$response = $this->read_http_payload();
|
$response = $this->read_http_payload();
|
||||||
if ($response['code'] !== 200) {
|
if ($response['code'] !== 200) {
|
||||||
|
Logger::log([$response['body']]);
|
||||||
throw new Exception($response['description'], $response['code']);
|
throw new Exception($response['description'], $response['code']);
|
||||||
}
|
}
|
||||||
$close = $response['protocol'] === 'HTTP/1.0';
|
$close = $response['protocol'] === 'HTTP/1.0';
|
||||||
@ -374,8 +366,7 @@ class Connection
|
|||||||
break;
|
break;
|
||||||
case 'http':
|
case 'http':
|
||||||
case 'https':
|
case 'https':
|
||||||
case 'https_proxied':
|
$this->write('POST '.$this->parsed['path']." HTTP/1.1\r\nHost: ".$this->parsed['host'].":$port\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: keep-alive\r\nKeep-Alive: timeout=100000, max=10000000\r\nContent-Length: ".strlen($message)."\r\n\r\n".$message);
|
||||||
$this->write('POST '.$this->parsed['path']." HTTP/1.1\r\nHost: ".$this->parsed['host']."\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: keep-alive\r\nKeep-Alive: timeout=100000, max=10000000\r\nContent-Length: ".strlen($message)."\r\n\r\n".$message);
|
|
||||||
break;
|
break;
|
||||||
case 'udp':
|
case 'udp':
|
||||||
throw new Exception(\danog\MadelineProto\Lang::$current_lang['protocol_not_implemented']);
|
throw new Exception(\danog\MadelineProto\Lang::$current_lang['protocol_not_implemented']);
|
||||||
|
@ -160,6 +160,7 @@ $result = $'.$type.'->click();
|
|||||||
* `false` - If the button is an unsupported button, like keyboardButtonRequestPhone, keyboardButtonRequestGeoLocation, keyboardButtonSwitchInlinekeyboardButtonBuy; you will have to parse data from these buttons manually
|
* `false` - If the button is an unsupported button, like keyboardButtonRequestPhone, keyboardButtonRequestGeoLocation, keyboardButtonSwitchInlinekeyboardButtonBuy; you will have to parse data from these buttons manually
|
||||||
|
|
||||||
|
|
||||||
|
You can also access the properties of the constructor as a normal array, for example $button[\'name\']
|
||||||
';
|
';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,6 @@ namespace danog\MadelineProto;
|
|||||||
*/
|
*/
|
||||||
class Serialization
|
class Serialization
|
||||||
{
|
{
|
||||||
public static $instances = [];
|
|
||||||
|
|
||||||
public static function serialize_all($exception)
|
public static function serialize_all($exception)
|
||||||
{
|
{
|
||||||
echo $exception.PHP_EOL;
|
echo $exception.PHP_EOL;
|
||||||
@ -134,7 +132,6 @@ class Serialization
|
|||||||
if ($unserialized instanceof \danog\MadelineProto\API) {
|
if ($unserialized instanceof \danog\MadelineProto\API) {
|
||||||
$unserialized->session = $filename;
|
$unserialized->session = $filename;
|
||||||
}
|
}
|
||||||
self::$instances[spl_object_hash($unserialized)] = $unserialized;
|
|
||||||
|
|
||||||
return $unserialized;
|
return $unserialized;
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
namespace danog\MadelineProto\TL\Types;
|
namespace danog\MadelineProto\TL\Types;
|
||||||
|
|
||||||
class Button extends \Volatile implements \JsonSerializable
|
class Button implements \JsonSerializable, \ArrayAccess
|
||||||
{
|
{
|
||||||
use \danog\Serializable;
|
use \danog\Serializable;
|
||||||
private $info = [];
|
private $info = [];
|
||||||
@ -57,4 +57,20 @@ class Button extends \Volatile implements \JsonSerializable
|
|||||||
{
|
{
|
||||||
return (array) $this->data;
|
return (array) $this->data;
|
||||||
}
|
}
|
||||||
|
public function offsetSet($name, $value) {
|
||||||
|
if ($name === null) {
|
||||||
|
$this->data []= $value;
|
||||||
|
} else {
|
||||||
|
$this->data[$name] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function offsetGet($name) {
|
||||||
|
return $this->data[$name];
|
||||||
|
}
|
||||||
|
public function offsetUnset($name) {
|
||||||
|
unset($this->data[$name]);
|
||||||
|
}
|
||||||
|
public function offsetExists($name) {
|
||||||
|
return isset($this->data[$name]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,9 +46,9 @@ git add -A
|
|||||||
git commit -am "Release $TRAVIS_COMMIT"
|
git commit -am "Release $TRAVIS_COMMIT"
|
||||||
git push origin master
|
git push origin master
|
||||||
cd ..
|
cd ..
|
||||||
|
echo "$TRAVIS_COMMIT_MESSAGE" | grep "Apply fixes from StyleCI" && exit
|
||||||
|
|
||||||
[ -d JSON.sh ] || git clone https://github.com/dominictarr/JSON.sh
|
[ -d JSON.sh ] || git clone https://github.com/dominictarr/JSON.sh
|
||||||
|
|
||||||
for chat_id in $destinations;do
|
for chat_id in $destinations;do
|
||||||
ID=$(curl -s https://api.telegram.org/bot$token/sendMessage -F disable_web_page_preview=1 -F text=" <b>Recent Commits to MadelineProto:master</b>
|
ID=$(curl -s https://api.telegram.org/bot$token/sendMessage -F disable_web_page_preview=1 -F text=" <b>Recent Commits to MadelineProto:master</b>
|
||||||
<a href=\"https://github.com/danog/MadelineProto/commit/$TRAVIS_COMMIT\">$TRAVIS_COMMIT_MESSAGE</a>
|
<a href=\"https://github.com/danog/MadelineProto/commit/$TRAVIS_COMMIT\">$TRAVIS_COMMIT_MESSAGE</a>
|
||||||
|
Loading…
Reference in New Issue
Block a user