Skip to content

Commit f4da78c

Browse files
committed
Improve legacy file ID parsing (fixes #4)
1 parent 5b1b693 commit f4da78c

File tree

1 file changed

+34
-36
lines changed

1 file changed

+34
-36
lines changed

src/FileId.php

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -156,20 +156,17 @@ public static function fromBotAPI(string $fileId): self
156156
if ($typeId <= FileIdType::PHOTO->toInnerID()) {
157157
if ($subVersion < 32) {
158158
$volume_id = Tools::unpackLong($read(8));
159-
$local_id = Tools::unpackInt($read(4));
160159
}
161160

162161
/** @var int */
163-
$arg = $subVersion >= 4 ? \unpack('V', $read(4))[1] : 0;
162+
$arg = $subVersion >= 22 ? \unpack('V', $read(4))[1] : 0;
164163
$photosize_source = PhotoSizeSourceType::from($arg);
165164
switch ($photosize_source) {
166165
case PhotoSizeSourceType::LEGACY:
167166
$photoSizeSource = new PhotoSizeSourceLegacy(Tools::unpackLong($read(8)));
168167
break;
169168
case PhotoSizeSourceType::FULL_LEGACY:
170-
$volume_id = Tools::unpackLong($read(8));
171169
$photoSizeSource = new PhotoSizeSourceLegacy(Tools::unpackLong($read(8)));
172-
$local_id = Tools::unpackInt($read(4));
173170
break;
174171
case PhotoSizeSourceType::THUMBNAIL:
175172
/** @var array{file_type: int, thumbnail_type: string} */
@@ -205,17 +202,13 @@ public static function fromBotAPI(string $fileId): self
205202
Tools::unpackLong($read(8))
206203
);
207204

208-
$volume_id = Tools::unpackLong($read(8));
209-
$local_id = Tools::unpackInt($read(4));
210205
break;
211206
case PhotoSizeSourceType::STICKERSET_THUMBNAIL_LEGACY:
212207
$photoSizeSource = new PhotoSizeSourceStickersetThumbnail(
213208
Tools::unpackLong($read(8)),
214209
Tools::unpackLong($read(8)),
215210
);
216211

217-
$volume_id = Tools::unpackLong($read(8));
218-
$local_id = Tools::unpackInt($read(4));
219212
break;
220213
case PhotoSizeSourceType::STICKERSET_THUMBNAIL_VERSION:
221214
$photoSizeSource = new PhotoSizeSourceStickersetThumbnailVersion(
@@ -225,6 +218,9 @@ public static function fromBotAPI(string $fileId): self
225218
);
226219
break;
227220
}
221+
if ($photosize_source === PhotoSizeSourceType::FULL_LEGACY || ($subVersion >= 22 && $subVersion < 32)) {
222+
$local_id = Tools::unpackInt($read(4));
223+
}
228224
}
229225
$l = \fstat($fileId)['size'] - \ftell($fileId);
230226
$l -= $version >= 4 ? 2 : 1;
@@ -276,54 +272,56 @@ public function getBotAPI(): string
276272

277273
if ($this->photoSizeSource !== null) {
278274
$photoSize = $this->photoSizeSource;
279-
$writeExtra = false;
275+
if ($this->subVersion < 32) {
276+
$fileId .= Tools::packLong($this->volumeId);
277+
}
278+
280279
switch (true) {
281280
case $photoSize instanceof PhotoSizeSourceLegacy:
282-
if ($this->volumeId === null) {
283-
$writeExtra = true;
284-
$fileId .= \pack('V', PhotoSizeSourceType::LEGACY->value);
285-
$fileId .= Tools::packLong($photoSize->secret);
286-
} else {
287-
$fileId .= \pack('V', PhotoSizeSourceType::FULL_LEGACY->value);
288-
$fileId .= Tools::packLong($this->volumeId);
289-
$fileId .= Tools::packLong($photoSize->secret);
290-
$fileId .= \pack('l', $this->localId);
291-
}
281+
$fileId .= Tools::packLong($photoSize->secret);
292282
break;
293283
case $photoSize instanceof PhotoSizeSourceThumbnail:
294-
$fileId .= \pack('V', PhotoSizeSourceType::THUMBNAIL->value);
284+
if ($this->subVersion >= 22) {
285+
$fileId .= \pack('V', PhotoSizeSourceType::THUMBNAIL->value);
286+
}
295287
$fileId .= \pack('Va4', $photoSize->thumbFileType->toInnerID(), $photoSize->thumbType);
296288
break;
297289
case $photoSize instanceof PhotoSizeSourceDialogPhoto:
298-
$fileId .= \pack(
299-
'V',
300-
($writeExtra = $this->volumeId !== null) ?
301-
(
302-
$photoSize->isSmallDialogPhoto()
303-
? PhotoSizeSourceType::DIALOGPHOTO_SMALL_LEGACY->value
304-
: PhotoSizeSourceType::DIALOGPHOTO_BIG_LEGACY->value
305-
) : (
306-
$photoSize->isSmallDialogPhoto()
307-
? PhotoSizeSourceType::DIALOGPHOTO_SMALL->value
308-
: PhotoSizeSourceType::DIALOGPHOTO_BIG->value
309-
)
310-
);
290+
if ($this->subVersion >= 22) {
291+
$fileId .= \pack(
292+
'V',
293+
$this->volumeId !== null ?
294+
(
295+
$photoSize->isSmallDialogPhoto()
296+
? PhotoSizeSourceType::DIALOGPHOTO_SMALL_LEGACY->value
297+
: PhotoSizeSourceType::DIALOGPHOTO_BIG_LEGACY->value
298+
) : (
299+
$photoSize->isSmallDialogPhoto()
300+
? PhotoSizeSourceType::DIALOGPHOTO_SMALL->value
301+
: PhotoSizeSourceType::DIALOGPHOTO_BIG->value
302+
)
303+
);
304+
}
311305
$fileId .= Tools::packLong($photoSize->dialogId);
312306
$fileId .= Tools::packLong($photoSize->dialogAccessHash);
313307
break;
314308
case $photoSize instanceof PhotoSizeSourceStickersetThumbnail:
315-
$writeExtra = $this->volumeId !== null;
309+
if ($this->subVersion >= 22) {
310+
$fileId .= \pack('V', PhotoSizeSourceType::STICKERSET_THUMBNAIL->value);
311+
}
316312
$fileId .= Tools::packLong($photoSize->stickerSetId);
317313
$fileId .= Tools::packLong($photoSize->stickerSetAccessHash);
318314
break;
319315
case $photoSize instanceof PhotoSizeSourceStickersetThumbnailVersion:
316+
if ($this->subVersion >= 22) {
317+
$fileId .= \pack('V', PhotoSizeSourceType::STICKERSET_THUMBNAIL_VERSION->value);
318+
}
320319
$fileId .= Tools::packLong($photoSize->stickerSetId);
321320
$fileId .= Tools::packLong($photoSize->stickerSetAccessHash);
322321
$fileId .= \pack('l', $photoSize->stickerSetVersion);
323322
break;
324323
}
325-
if ($writeExtra && $this->volumeId !== null && $this->localId !== null) {
326-
$fileId .= Tools::packLong($this->volumeId);
324+
if ($this->localId !== null) {
327325
$fileId .= \pack('l', $this->localId);
328326
}
329327
}

0 commit comments

Comments
 (0)