1
0
mirror of https://github.com/danog/MadelineProto.git synced 2024-11-27 03:34:42 +01:00

Merge branch 'v8' into secret_refactoring

This commit is contained in:
Daniil Gentili 2023-09-19 16:44:12 +02:00
commit a01fa820c6
Signed by: danog
GPG Key ID: 8C1BE3B34B230CA7
6 changed files with 58 additions and 47 deletions

View File

@ -106,7 +106,13 @@ final class CheckLoop extends Loop
$this->connection->methodRecall(message_id: $message_id, postpone: true);
break;
case 4:
if ($chr & 32) {
if ($chr & 128) {
$this->logger->logger("Message $message received by server and was already sent, requesting reply...", Logger::ERROR);
$reply[] = $message_id;
} elseif ($chr & 64) {
$this->logger->logger("Message $message received by server and was already processed, requesting reply...", Logger::ERROR);
$reply[] = $message_id;
} elseif ($chr & 32) {
if ($message->getSent() + $this->resendTimeout < \time()) {
if ($message->isCancellationRequested()) {
unset($this->connection->new_outgoing[$message_id], $this->connection->outgoing_messages[$message_id]);
@ -119,12 +125,6 @@ final class CheckLoop extends Loop
} else {
$this->logger->logger("Message $message received by server and is being processed, waiting...", Logger::ERROR);
}
} elseif ($chr & 64) {
$this->logger->logger("Message $message received by server and was already processed, requesting reply...", Logger::ERROR);
$reply[] = $message_id;
} elseif ($chr & 128) {
$this->logger->logger("Message $message received by server and was already sent, requesting reply...", Logger::ERROR);
$reply[] = $message_id;
} else {
$this->logger->logger("Message $message received by server, waiting...", Logger::ERROR);
$reply[] = $message_id;

View File

@ -308,10 +308,10 @@ trait PeerHandler
return DialogId::fromSupergroupOrChannel((int) $matches[1]);
}
if (\preg_match('/^chat#(\\d*)/', $id, $matches)) {
$id = '-'.$matches[1];
return -((int) $matches[1]);
}
if (\preg_match('/^user#(\\d*)/', $id, $matches)) {
return $matches[1];
return (int) $matches[1];
}
}
}

View File

@ -642,32 +642,37 @@ final class TL implements TLInterface
{
$serialized = '';
$arguments = $this->API->botAPIToMTProto($arguments instanceof Button ? $arguments->jsonSerialize() : $arguments);
foreach ($tl['params'] as $cur_flag) {
if (isset($cur_flag['pow'])) {
$arguments[$cur_flag['flag']] ??= 0;
switch ($cur_flag['type']) {
case 'true':
$arguments[$cur_flag['flag']] = isset($arguments[$cur_flag['name']]) && $arguments[$cur_flag['name']] ? $arguments[$cur_flag['flag']] | $cur_flag['pow'] : $arguments[$cur_flag['flag']] & ~$cur_flag['pow'];
unset($arguments[$cur_flag['name']]);
break;
default:
$arguments[$cur_flag['flag']] = isset($arguments[$cur_flag['name']]) && $arguments[$cur_flag['name']] !== null ? $arguments[$cur_flag['flag']] | $cur_flag['pow'] : $arguments[$cur_flag['flag']] & ~$cur_flag['pow'];
break;
}
foreach ($tl['flags'] as [
'flag' => $flag,
'name' => $name,
'type' => $type,
'pow' => $pow
]) {
$arguments[$flag] ??= 0;
if ($type === 'true') {
$arguments[$flag] = isset($arguments[$name]) && $arguments[$name]
? $arguments[$flag] | $pow
: $arguments[$flag] & ~$pow;
} else {
$arguments[$flag] = isset($arguments[$name]) && $arguments[$name] !== null
? $arguments[$flag] | $pow
: $arguments[$flag] & ~$pow;
}
}
foreach ($tl['params'] as $current_argument) {
if (!isset($arguments[$current_argument['name']])) {
if (isset($current_argument['pow']) && ($current_argument['type'] === 'true' || ($arguments[$current_argument['flag']] & $current_argument['pow']) === 0)) {
//$this->API->logger->logger('Skipping '.$current_argument['name'].' of type '.$current_argument['type');
$name = $current_argument['name'];
$type = $current_argument['type'];
if (!isset($arguments[$name])) {
if (isset($current_argument['pow']) && ($type === 'true' || ($arguments[$current_argument['flag']] & $current_argument['pow']) === 0)) {
//$this->API->logger->logger('Skipping '.$name.' of type '.$current_argument['type');
continue;
}
if ($current_argument['name'] === 'random_bytes') {
if ($name === 'random_bytes') {
$serialized .= $this->serializeObject(['type' => 'bytes'], Tools::random(15 + 4 * Tools::randomInt(modulus: 3)), 'random_bytes');
continue;
}
if ($current_argument['name'] === 'random_id') {
switch ($current_argument['type']) {
if ($name === 'random_id') {
switch ($type) {
case 'long':
$serialized .= Tools::random(8);
continue 2;
@ -683,59 +688,60 @@ final class TL implements TLInterface
}
}
}
if ($current_argument['type'] === 'long') {
if ($type === 'long') {
$serialized .= "\0\0\0\0\0\0\0\0";
continue;
}
if ($current_argument['type'] === 'double') {
if ($type === 'double') {
$serialized .= "\0\0\0\0\0\0\0\0";
continue;
}
if ($tl['type'] === 'InputMedia' && $current_argument['name'] === 'mime_type') {
$serialized .= ($this->serializeObject($current_argument, $arguments['file']['mime_type'], $current_argument['name'], $layer));
if ($tl['type'] === 'InputMedia' && $name === 'mime_type') {
$serialized .= ($this->serializeObject($current_argument, $arguments['file']['mime_type'], $name, $layer));
continue;
}
if (\in_array($current_argument['type'], ['bytes', 'string', 'int'], true)) {
if (\in_array($type, ['bytes', 'string', 'int'], true)) {
$serialized .= "\0\0\0\0";
continue;
}
if (($id = $this->constructors->findByPredicate(\lcfirst($current_argument['type']).'Empty', $tl['layer'] ?? -1)) && $id['type'] === $current_argument['type']) {
if (($id = $this->constructors->findByPredicate(\lcfirst($type).'Empty', $tl['layer'] ?? -1)) && $id['type'] === $type) {
$serialized .= $id['id'];
continue;
}
if (($id = $this->constructors->findByPredicate('input'.$current_argument['type'].'Empty', $tl['layer'] ?? -1)) && $id['type'] === $current_argument['type']) {
if (($id = $this->constructors->findByPredicate('input'.$type.'Empty', $tl['layer'] ?? -1)) && $id['type'] === $type) {
$serialized .= $id['id'];
continue;
}
switch ($current_argument['type']) {
switch ($type) {
case 'Vector t':
case 'vector':
$arguments[$current_argument['name']] = [];
$value = [];
break;
case 'DataJSON':
case '%DataJSON':
$arguments[$current_argument['name']] = null;
$value = null;
break;
default:
throw new Exception(Lang::$current_lang['params_missing'].' '.$current_argument['name']);
throw new Exception(Lang::$current_lang['params_missing'].' '.$name);
}
} else {
$value = $arguments[$name];
}
if (\in_array($current_argument['type'], ['DataJSON', '%DataJSON'], true)) {
$arguments[$current_argument['name']] = ['_' => 'dataJSON', 'data' => \json_encode($arguments[$current_argument['name']])];
if (\in_array($type, ['DataJSON', '%DataJSON'], true)) {
$value = ['_' => 'dataJSON', 'data' => \json_encode($value)];
}
if (isset($current_argument['subtype']) && \in_array($current_argument['subtype'], ['DataJSON', '%DataJSON'], true)) {
\array_walk($arguments[$current_argument['name']], function (&$arg): void {
\array_walk($value, function (&$arg): void {
$arg = ['_' => 'dataJSON', 'data' => \json_encode($arg)];
});
}
if ($current_argument['type'] === 'InputFile' && (!\is_array($arguments[$current_argument['name']]) || !(isset($arguments[$current_argument['name']]['_']) && $this->constructors->findByPredicate($arguments[$current_argument['name']]['_'])['type'] === 'InputFile'))) {
$arguments[$current_argument['name']] = ($this->API->upload($arguments[$current_argument['name']]));
if ($type === 'InputFile' && (!\is_array($value) || !(isset($value['_']) && $this->constructors->findByPredicate($value['_'])['type'] === 'InputFile'))) {
$value = ($this->API->upload($value));
}
if ($current_argument['type'] === 'InputEncryptedChat' && (!\is_array($arguments[$current_argument['name']]) || isset($arguments[$current_argument['name']]['_']) && $this->constructors->findByPredicate($arguments[$current_argument['name']]['_'])['type'] !== $current_argument['type'])) {
$arguments[$current_argument['name']] = $this->API->getSecretChatController($arguments[$current_argument['name']])->inputChat;
if ($type === 'InputEncryptedChat' && (!\is_array($value) || isset($value['_']) && $this->constructors->findByPredicate($value['_'])['type'] !== $type)) {
$value = $this->API->getSecretChatController($value)->inputChat;
}
//$this->API->logger->logger('Serializing '.$current_argument['name'].' of type '.$current_argument['type');
$serialized .= ($this->serializeObject($current_argument, $arguments[$current_argument['name']], $current_argument['name'], $layer));
$serialized .= ($this->serializeObject($current_argument, $value, $name, $layer));
}
return $serialized;
}

View File

@ -42,6 +42,7 @@ final class TLConstructors
$this->by_id[$json_dict['id']] = [
'predicate' => $predicate,
'params' => $json_dict['params'],
'flags' => [],
'type' => ($scheme_type === 'mtproto' && $json_dict['type'] === 'Message' ? 'MT' : '').$json_dict['type'],
'encrypted' => $scheme_type !== 'mtproto'
];

View File

@ -39,6 +39,7 @@ final class TLMethods
'method' => $json_dict['method'],
'type' => $json_dict['type'],
'params' => $json_dict['params'],
'flags' => [],
'encrypted' => $scheme_type !== 'mtproto'
];
$this->by_method[$json_dict['method']] = $json_dict['id'];

View File

@ -59,6 +59,9 @@ trait TLParams
}
$this->by_id[$key]['params'][$kkey] = $param;
if (isset($param['pow'])) {
$this->by_id[$key]['flags'][$kkey] = $param;
}
}
}
}