Fixes to TON
This commit is contained in:
parent
4917fafd3a
commit
1edcecb26b
@ -38,6 +38,11 @@ abstract class AbstractAPIFactory extends AsyncConstruct
|
|||||||
$this->async = &$async;
|
$this->async = &$async;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function async($async)
|
||||||
|
{
|
||||||
|
$this->async = $async;
|
||||||
|
}
|
||||||
|
|
||||||
public function __call($name, $arguments)
|
public function __call($name, $arguments)
|
||||||
{
|
{
|
||||||
$yielded = Tools::call($this->__call_async($name, $arguments));
|
$yielded = Tools::call($this->__call_async($name, $arguments));
|
||||||
|
@ -86,7 +86,7 @@ trait TD
|
|||||||
return $params;
|
return $params;
|
||||||
}
|
}
|
||||||
if (!isset($params['_'])) {
|
if (!isset($params['_'])) {
|
||||||
\array_walk($params, [$this, 'mtproto_to_td']);
|
\array_walk($params, [$this, 'mtprotoToTd']);
|
||||||
|
|
||||||
return $params;
|
return $params;
|
||||||
}
|
}
|
||||||
|
@ -211,11 +211,7 @@ class TL
|
|||||||
if (\strpos($line, ' ?= ') !== false) {
|
if (\strpos($line, ' ?= ') !== false) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$name = \preg_replace(['/#.*/', '/\\s.*/'], '', $line);
|
$line = \preg_replace(['/[(]([\w\.]+) ([\w\.]+)[)]/', '/\s+/'], ['$1<$2>', ' '], $line);
|
||||||
if (\in_array($name, ['bytes', 'int128', 'int256', 'int512', 'int', 'long', 'double', 'string', 'bytes', 'object', 'function'])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$line = \preg_replace('/[(]([\w\.]+) ([\w\.]+)[)]/', '$1<$2>', $line);
|
|
||||||
if (\strpos($line, ';') === false) {
|
if (\strpos($line, ';') === false) {
|
||||||
$lineBuf .= $line;
|
$lineBuf .= $line;
|
||||||
continue;
|
continue;
|
||||||
@ -225,7 +221,11 @@ class TL
|
|||||||
$lineBuf = '';
|
$lineBuf = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$clean = \preg_replace(['/:bytes /', '/;/', '/#[a-f0-9]+ /', '/ [a-zA-Z0-9_]+\\:flags\\.[0-9]+\\?true/', '/[<]/', '/[>]/', '/ /', '/^ /', '/ $/', '/\\?bytes /', '/{/', '/}/', '/\s+/'], [':string ', '', ' ', '', ' ', ' ', ' ', '', '', '?string ', '', '', ' '], $line);
|
$name = \preg_replace(['/#.*/', '/\\s.*/'], '', $line);
|
||||||
|
if (\in_array($name, ['bytes', 'int128', 'int256', 'int512', 'int', 'long', 'double', 'string', 'bytes', 'object', 'function'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$clean = \preg_replace(['/:bytes /', '/;/', '/#[a-f0-9]+ /', '/ [a-zA-Z0-9_]+\\:flags\\.[0-9]+\\?true/', '/[<]/', '/[>]/', '/ /', '/^ /', '/ $/', '/\\?bytes /', '/{/', '/}/'], [':string ', '', ' ', '', ' ', ' ', ' ', '', '', '?string ', '', ''], $line);
|
||||||
|
|
||||||
$id = \hash('crc32b', $clean);
|
$id = \hash('crc32b', $clean);
|
||||||
if (\preg_match('/^[^\s]+#([a-f0-9]*)/i', $line, $matches)) {
|
if (\preg_match('/^[^\s]+#([a-f0-9]*)/i', $line, $matches)) {
|
||||||
@ -262,6 +262,12 @@ class TL
|
|||||||
$TL_dict[$type][$key]['params'][] = ['name' => $explode[0], 'type' => $explode[1]];
|
$TL_dict[$type][$key]['params'][] = ['name' => $explode[0], 'type' => $explode[1]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
if (!$TL_dict[$type][$key][$type === 'constructors' ? 'predicate' : 'method']) {
|
||||||
|
var_dump($line);
|
||||||
|
\var_dump($TL_dict[$type][$key]);
|
||||||
|
}*/
|
||||||
|
|
||||||
$key++;
|
$key++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -443,19 +449,28 @@ class TL
|
|||||||
return \danog\MadelineProto\Tools::packSignedLong($object);
|
return \danog\MadelineProto\Tools::packSignedLong($object);
|
||||||
case 'int128':
|
case 'int128':
|
||||||
if (\strlen($object) !== 16) {
|
if (\strlen($object) !== 16) {
|
||||||
throw new Exception(\danog\MadelineProto\Lang::$current_lang['long_not_16']);
|
$object = \base64_decode($object);
|
||||||
|
if (\strlen($object) !== 16) {
|
||||||
|
throw new Exception(\danog\MadelineProto\Lang::$current_lang['long_not_16']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (string) $object;
|
return (string) $object;
|
||||||
case 'int256':
|
case 'int256':
|
||||||
if (\strlen($object) !== 32) {
|
if (\strlen($object) !== 32) {
|
||||||
throw new Exception(\danog\MadelineProto\Lang::$current_lang['long_not_32']);
|
$object = \base64_decode($object);
|
||||||
|
if (\strlen($object) !== 32) {
|
||||||
|
throw new Exception(\danog\MadelineProto\Lang::$current_lang['long_not_32']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (string) $object;
|
return (string) $object;
|
||||||
case 'int512':
|
case 'int512':
|
||||||
if (\strlen($object) !== 64) {
|
if (\strlen($object) !== 64) {
|
||||||
throw new Exception(\danog\MadelineProto\Lang::$current_lang['long_not_64']);
|
$object = \base64_decode($object);
|
||||||
|
if (\strlen($object) !== 64) {
|
||||||
|
throw new Exception(\danog\MadelineProto\Lang::$current_lang['long_not_64']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (string) $object;
|
return (string) $object;
|
||||||
@ -861,6 +876,8 @@ class TL
|
|||||||
*/
|
*/
|
||||||
public function deserialize($stream, $type = ['type' => ''])
|
public function deserialize($stream, $type = ['type' => ''])
|
||||||
{
|
{
|
||||||
|
//var_dump($type);
|
||||||
|
|
||||||
if (\is_string($stream)) {
|
if (\is_string($stream)) {
|
||||||
$res = \fopen('php://memory', 'rw+b');
|
$res = \fopen('php://memory', 'rw+b');
|
||||||
\fwrite($res, $stream);
|
\fwrite($res, $stream);
|
||||||
@ -965,6 +982,8 @@ class TL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//var_dump($constructorData);
|
||||||
|
|
||||||
if ($constructorData['predicate'] === 'gzip_packed') {
|
if ($constructorData['predicate'] === 'gzip_packed') {
|
||||||
if (!isset($type['subtype'])) {
|
if (!isset($type['subtype'])) {
|
||||||
$type['subtype'] = '';
|
$type['subtype'] = '';
|
||||||
|
@ -19,13 +19,25 @@
|
|||||||
|
|
||||||
namespace danog\MadelineProto\TON;
|
namespace danog\MadelineProto\TON;
|
||||||
|
|
||||||
|
use danog\MadelineProto\Magic;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TON API.
|
* TON API.
|
||||||
*/
|
*/
|
||||||
class API extends InternalDoc
|
class API extends InternalDoc
|
||||||
{
|
{
|
||||||
public function __construct()
|
/**
|
||||||
|
* Construct API
|
||||||
|
*
|
||||||
|
* @param array $settings Settings
|
||||||
|
*/
|
||||||
|
public function __construct(array $settings)
|
||||||
{
|
{
|
||||||
Magic::classExists();
|
Magic::classExists();
|
||||||
|
|
||||||
|
$this->API = new Lite($settings);
|
||||||
|
foreach (\get_class_methods($this->API) as $method) {
|
||||||
|
$this->methods[$method] = [$this->API, strtolower($method)];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,4 +77,26 @@ class APIFactory extends AbstractAPIFactory
|
|||||||
* @var liteServer
|
* @var liteServer
|
||||||
*/
|
*/
|
||||||
public $liteServer;
|
public $liteServer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just proxy async requests to API
|
||||||
|
*
|
||||||
|
* @param string $name Method name
|
||||||
|
* @param array $arguments Arguments
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function __call_async($name, $arguments)
|
||||||
|
{
|
||||||
|
$lower_name = \strtolower($name);
|
||||||
|
if ($this->namespace !== '' || !isset($this->methods[$lower_name])) {
|
||||||
|
$name = $this->namespace.$name;
|
||||||
|
$aargs = isset($arguments[1]) && \is_array($arguments[1]) ? $arguments[1] : [];
|
||||||
|
$aargs['apifactory'] = true;
|
||||||
|
$args = isset($arguments[0]) && \is_array($arguments[0]) ? $arguments[0] : [];
|
||||||
|
|
||||||
|
return $this->API->methodCallAsyncRead($name, $args, $aargs);
|
||||||
|
}
|
||||||
|
return $this->methods[$lower_name](...$arguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -863,8 +863,26 @@ interface engine
|
|||||||
|
|
||||||
class InternalDoc extends APIFactory
|
class InternalDoc extends APIFactory
|
||||||
{
|
{
|
||||||
public function test(array $extra = [])
|
/**
|
||||||
|
* Connect to the lite endpoints specified in the config file.
|
||||||
|
*
|
||||||
|
* @param string $config Path to config file
|
||||||
|
*
|
||||||
|
* @return \Generator
|
||||||
|
*/
|
||||||
|
public function connect(string $config, array $extra = [])
|
||||||
{
|
{
|
||||||
return $this->__call(__FUNCTION__, [$extra]);
|
return $this->__call(__FUNCTION__, [$config, $extra]);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Asynchronously run async callable.
|
||||||
|
*
|
||||||
|
* @param callable $func Function
|
||||||
|
*
|
||||||
|
* @return \Generator
|
||||||
|
*/
|
||||||
|
public function loop(callable $func, array $extra = [])
|
||||||
|
{
|
||||||
|
return $this->__call(__FUNCTION__, [$func, $extra]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
120
src/danog/MadelineProto/TON/Lite.php
Normal file
120
src/danog/MadelineProto/TON/Lite.php
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TON API 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>
|
||||||
|
* @copyright 2016-2019 Daniil Gentili <daniil@daniil.it>
|
||||||
|
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
|
||||||
|
*
|
||||||
|
* @link https://docs.madelineproto.xyz MadelineProto documentation
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace danog\MadelineProto\TON;
|
||||||
|
|
||||||
|
use danog\MadelineProto\Logger;
|
||||||
|
use danog\MadelineProto\TL\TL;
|
||||||
|
|
||||||
|
use function Amp\File\get;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TON API.
|
||||||
|
*/
|
||||||
|
class Lite
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Lite client config.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $config;
|
||||||
|
/**
|
||||||
|
* Misc settings.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $settings = [];
|
||||||
|
/**
|
||||||
|
* TL serializer instance.
|
||||||
|
*
|
||||||
|
* @var \danog\MadelineProto\TL\TL
|
||||||
|
*/
|
||||||
|
private $TL;
|
||||||
|
/**
|
||||||
|
* Logger instance.
|
||||||
|
*
|
||||||
|
* @var Logger
|
||||||
|
*/
|
||||||
|
public $logger;
|
||||||
|
/**
|
||||||
|
* Construct settings.
|
||||||
|
*
|
||||||
|
* @param array $settings
|
||||||
|
*/
|
||||||
|
public function __construct(array $settings)
|
||||||
|
{
|
||||||
|
$this->settings = $settings;
|
||||||
|
$this->logger = Logger::getLoggerFromSettings($this->settings);
|
||||||
|
$this->TL = new TL($this);
|
||||||
|
$this->TL->init(
|
||||||
|
[
|
||||||
|
'lite_api' => __DIR__.'/schemes/lite_api.tl',
|
||||||
|
'ton_api' => __DIR__.'/schemes/ton_api.tl',
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Connect to the lite endpoints specified in the config file.
|
||||||
|
*
|
||||||
|
* @param string $config Path to config file
|
||||||
|
*
|
||||||
|
* @return \Generator
|
||||||
|
*/
|
||||||
|
public function connect(string $config): \Generator
|
||||||
|
{
|
||||||
|
$config = \json_decode(yield get($config), true);
|
||||||
|
$config['_'] = 'liteclient.config.global';
|
||||||
|
$config = Tools::convertJsonTL($config);
|
||||||
|
$config['validator']['init_block'] = $config['validator']['init_block'] ?? $config['validator']['zero_state'];
|
||||||
|
|
||||||
|
$this->config = yield $this->TL->deserialize(
|
||||||
|
yield $this->TL->serializeObject(
|
||||||
|
['type' => ''],
|
||||||
|
$config,
|
||||||
|
'cleanup'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
var_dump($this->config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asynchronously run async callable.
|
||||||
|
*
|
||||||
|
* @param callable $func Function
|
||||||
|
*
|
||||||
|
* @return \Generator
|
||||||
|
*/
|
||||||
|
public function loop(callable $func): \Generator
|
||||||
|
{
|
||||||
|
return yield $func();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert parameters.
|
||||||
|
*
|
||||||
|
* @param array $parameters Parameters
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function botAPItoMTProto(array $parameters)
|
||||||
|
{
|
||||||
|
return $parameters;
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TON API module.
|
* TON tools module.
|
||||||
*
|
*
|
||||||
* This file is part of MadelineProto.
|
* 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 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.
|
||||||
@ -19,12 +19,25 @@
|
|||||||
|
|
||||||
namespace danog\MadelineProto\TON;
|
namespace danog\MadelineProto\TON;
|
||||||
|
|
||||||
/**
|
class Tools
|
||||||
* TON API.
|
|
||||||
*/
|
|
||||||
class ADNL
|
|
||||||
{
|
{
|
||||||
public function test()
|
/**
|
||||||
|
* Sanify TL obtained from JSON for TL serialization.
|
||||||
|
*
|
||||||
|
* @param array $input Data to sanitize
|
||||||
|
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function convertJsonTL(array $input): array
|
||||||
{
|
{
|
||||||
|
$cb = static function (&$val) use (&$cb) {
|
||||||
|
if (isset($val['@type'])) {
|
||||||
|
$val['_'] = $val['@type'];
|
||||||
|
} elseif (\is_array($val)) {
|
||||||
|
\array_walk($val, $cb);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
\array_walk($input, $cb);
|
||||||
|
return $input;
|
||||||
}
|
}
|
||||||
}
|
}
|
21
ton/lite-client.php
Normal file
21
ton/lite-client.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use danog\MadelineProto\Logger;
|
||||||
|
use danog\MadelineProto\TON\API;
|
||||||
|
|
||||||
|
require 'vendor/autoload.php';
|
||||||
|
|
||||||
|
$API = new API(
|
||||||
|
[
|
||||||
|
'logger' => [
|
||||||
|
'logger' => Logger::ECHO_LOGGER
|
||||||
|
]
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$API->async(true);
|
||||||
|
$API->loop(
|
||||||
|
function () use ($API) {
|
||||||
|
yield $API->connect(__DIR__.'/ton-lite-client-test1.config.json');
|
||||||
|
}
|
||||||
|
);
|
22
ton/ton-lite-client-test1.config.json
Normal file
22
ton/ton-lite-client-test1.config.json
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"liteservers": [
|
||||||
|
{
|
||||||
|
"ip": 1137658550,
|
||||||
|
"port": 4924,
|
||||||
|
"id": {
|
||||||
|
"@type": "pub.ed25519",
|
||||||
|
"key": "peJTw/arlRfssgTuf9BMypJzqOi7SXEqSPSWiEw2U1M="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"validator": {
|
||||||
|
"@type": "validator.config.global",
|
||||||
|
"zero_state": {
|
||||||
|
"workchain": -1,
|
||||||
|
"shard": -9223372036854775808,
|
||||||
|
"seqno": 0,
|
||||||
|
"root_hash": "F6OpKZKqvqeFp6CQmFomXNMfMj2EnaUSOXN+Mh+wVWk=",
|
||||||
|
"file_hash": "XplPz01CXAps5qeSWUtxcyBfdAo5zVb1N979KLSKD24="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -100,9 +100,9 @@ $doc->mkAnnotations();
|
|||||||
|
|
||||||
$ton = [
|
$ton = [
|
||||||
'tl_schema' => [
|
'tl_schema' => [
|
||||||
'lite_api' => "$d/src/danog/MadelineProto/TON/lite_api.tl",
|
'lite_api' => "$d/src/danog/MadelineProto/TON/schemes/lite_api.tl",
|
||||||
'ton_api' => "$d/src/danog/MadelineProto/TON/ton_api.tl",
|
'ton_api' => "$d/src/danog/MadelineProto/TON/schemes/ton_api.tl",
|
||||||
//'tonlib_api' => "$d/src/danog/MadelineProto/TON/tonlib_api.tl",
|
//'tonlib_api' => "$d/src/danog/MadelineProto/TON/schemes/tonlib_api.tl",
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user