2016-06-23 23:51:08 +02:00
|
|
|
|
<?php
|
|
|
|
|
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . DIRECTORY_SEPARATOR . 'libpy2php');
|
|
|
|
|
require_once ('libpy2php.php');
|
|
|
|
|
$__author__ = 'agrigoryev';
|
|
|
|
|
require_once ('os.php');
|
|
|
|
|
class TlConstructor {
|
|
|
|
|
function __construct($json_dict) {
|
|
|
|
|
$this->id = pyjslib_int($json_dict['id']);
|
|
|
|
|
$this->type = $json_dict['type'];
|
|
|
|
|
$this->predicate = $json_dict['predicate'];
|
|
|
|
|
$this->params = [];
|
|
|
|
|
foreach ($json_dict['params'] as $param) {
|
|
|
|
|
if (($param['type'] == 'Vector<long>')) {
|
|
|
|
|
$param['type'] = 'Vector t';
|
|
|
|
|
$param['subtype'] = 'long';
|
|
|
|
|
} else if (($param['type'] == 'vector<%Message>')) {
|
|
|
|
|
$param['type'] = 'vector';
|
|
|
|
|
$param['subtype'] = 'message';
|
|
|
|
|
} else if (($param['type'] == 'vector<future_salt>')) {
|
|
|
|
|
$param['type'] = 'vector';
|
|
|
|
|
$param['subtype'] = 'future_salt';
|
|
|
|
|
} else {
|
|
|
|
|
$param['subtype'] = null;
|
|
|
|
|
}
|
|
|
|
|
$this->params[] = $param;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
class TlMethod {
|
|
|
|
|
function __construct($json_dict) {
|
|
|
|
|
$this->id = pyjslib_int($json_dict['id']);
|
|
|
|
|
$this->type = $json_dict['type'];
|
|
|
|
|
$this->method = $json_dict['method'];
|
|
|
|
|
$this->params = $json_dict['params'];
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-06-28 17:21:10 +02:00
|
|
|
|
class TLObject extends ArrayObject {
|
2016-06-23 23:51:08 +02:00
|
|
|
|
function __construct($tl_elem) {
|
2016-06-28 17:49:51 +02:00
|
|
|
|
parent::__construct();
|
2016-06-23 23:51:08 +02:00
|
|
|
|
$this->name = $tl_elem->predicate;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
class TL {
|
|
|
|
|
function __construct($filename) {
|
2016-06-26 14:53:16 +02:00
|
|
|
|
$TL_dict = json_decode(file_get_contents($filename), true);
|
2016-06-23 23:51:08 +02:00
|
|
|
|
$this->constructors = $TL_dict['constructors'];
|
|
|
|
|
$this->constructor_id = [];
|
|
|
|
|
$this->constructor_type = [];
|
|
|
|
|
foreach ($this->constructors as $elem) {
|
|
|
|
|
$z = new TlConstructor($elem);
|
|
|
|
|
$this->constructor_id[$z->id] = $z;
|
|
|
|
|
$this->constructor_type[$z->predicate] = $z;
|
|
|
|
|
}
|
|
|
|
|
$this->methods = $TL_dict['methods'];
|
|
|
|
|
$this->method_id = [];
|
|
|
|
|
$this->method_name = [];
|
|
|
|
|
foreach ($this->methods as $elem) {
|
|
|
|
|
$z = new TlMethod($elem);
|
|
|
|
|
$this->method_id[$z->id] = $z;
|
|
|
|
|
$this->method_name[$z->method] = $z;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-06-28 17:49:51 +02:00
|
|
|
|
$tl = new TL("https://core.telegram.org/schema/mtproto-json");
|
|
|
|
|
//$tl = new TL(__DIR__ . '/TL_schema.JSON');
|
2016-06-23 23:51:08 +02:00
|
|
|
|
function serialize_obj($type_, $kwargs) {
|
2016-06-28 17:21:10 +02:00
|
|
|
|
global $tl;
|
2016-06-27 16:52:28 +02:00
|
|
|
|
$bytes_io = fopen("php://memory", "w+b");
|
2016-06-23 23:51:08 +02:00
|
|
|
|
try {
|
|
|
|
|
$tl_constructor = $tl->constructor_type[$type_];
|
|
|
|
|
}
|
|
|
|
|
catch(KeyError $e) {
|
|
|
|
|
throw new $Exception(sprintf('Could not extract type: %s', $type_));
|
|
|
|
|
}
|
2016-06-27 16:52:28 +02:00
|
|
|
|
fwrite($bytes_io, pack_le('i', $tl_constructor->id));
|
2016-06-23 23:51:08 +02:00
|
|
|
|
foreach ($tl_constructor->params as $arg) {
|
2016-06-27 22:52:07 +02:00
|
|
|
|
serialize_param($bytes_io, $arg['type'], $kwargs[$arg['name']]);
|
2016-06-23 23:51:08 +02:00
|
|
|
|
}
|
2016-06-27 16:52:28 +02:00
|
|
|
|
return fread_all($bytes_io);
|
2016-06-23 23:51:08 +02:00
|
|
|
|
}
|
|
|
|
|
function serialize_method($type_, $kwargs) {
|
2016-06-27 16:52:28 +02:00
|
|
|
|
global $tl;
|
|
|
|
|
$bytes_io = fopen("php://memory", "rw+b");
|
|
|
|
|
|
2016-06-23 23:51:08 +02:00
|
|
|
|
try {
|
|
|
|
|
$tl_method = $tl->method_name[$type_];
|
|
|
|
|
}
|
|
|
|
|
catch(KeyError $e) {
|
|
|
|
|
throw new $Exception(sprintf('Could not extract type: %s', $type_));
|
|
|
|
|
}
|
2016-06-27 16:52:28 +02:00
|
|
|
|
fwrite($bytes_io, pack_le('i', $tl_method->id));
|
2016-06-23 23:51:08 +02:00
|
|
|
|
foreach ($tl_method->params as $arg) {
|
2016-06-27 22:52:07 +02:00
|
|
|
|
serialize_param($bytes_io, $arg['type'], $kwargs[$arg['name']]);
|
2016-06-23 23:51:08 +02:00
|
|
|
|
}
|
2016-06-27 16:52:28 +02:00
|
|
|
|
return fread_all($bytes_io);
|
2016-06-23 23:51:08 +02:00
|
|
|
|
}
|
|
|
|
|
function serialize_param($bytes_io, $type_, $value) {
|
|
|
|
|
if (($type_ == 'int')) {
|
2016-06-27 16:52:28 +02:00
|
|
|
|
assert(is_numeric($value));
|
2016-06-23 23:51:08 +02:00
|
|
|
|
assert(($value->bit_length() <= 32));
|
2016-06-27 16:52:28 +02:00
|
|
|
|
fwrite($bytes_io, pack_le('i', $value));
|
2016-06-23 23:51:08 +02:00
|
|
|
|
} else if (($type_ == 'long')) {
|
2016-06-27 16:52:28 +02:00
|
|
|
|
assert(is_numeric($value));
|
|
|
|
|
fwrite($bytes_io, pack_le('q', $value));
|
2016-06-23 23:51:08 +02:00
|
|
|
|
} else if (in_array($type_, ['int128', 'int256'])) {
|
2016-06-27 16:52:28 +02:00
|
|
|
|
assert(!empty($value));
|
|
|
|
|
fwrite($bytes_io, $value);
|
2016-06-23 23:51:08 +02:00
|
|
|
|
} else if (($type_ == 'string') || 'bytes') {
|
|
|
|
|
$l = count($value);
|
|
|
|
|
if (($l < 254)) {
|
2016-06-27 16:52:28 +02:00
|
|
|
|
fwrite($bytes_io, pack_le('b', $l));
|
|
|
|
|
fwrite($bytes_io, $value);
|
|
|
|
|
fwrite($bytes_io, (' |