Skip to content

Commit e80e117

Browse files
committed
Added AudioAttachmentRequest & ContactAttachmentRequest & FileAttachmentRequest & LocationAttachmentRequest & ShareAttachmentRequest & StickerAttachmentRequest & VideoAttachmentRequest
1 parent 0c1d515 commit e80e117

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1714
-105
lines changed

README.md

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
77

88
> [!CAUTION]
9-
> На мой взгляд `Max Messenger` является ни чем иным как малварью, созданной для слежки за гражданами РФ.
10-
> Настоятельно не рекомендую использовать на реальных устройствах, с настоящим номером телефона, и для личной переписки.
9+
> На мой взгляд `Max Messenger` является ни чем иным как малварью, созданной для слежки за гражданами РФ. Настоятельно
10+
> не рекомендую использовать его на реальных устройствах, с настоящим номером телефона, и для личной переписки.
1111
1212
> [!IMPORTANT]
1313
> Библиотека в стадии активной разработки.
@@ -25,46 +25,46 @@
2525

2626
#### Bots
2727

28-
- `[x] GET /me` (`getBotInfo`) — *Получение информации о боте.*
29-
- `[ ] PATCH /me` (`editBotInfo`) — *Редактирование информации о боте.*
28+
- [x] `GET /me` (`getBotInfo`) — *Получение информации о боте.*
29+
- [ ] `PATCH /me` (`editBotInfo`) — *Редактирование информации о боте.*
3030

3131
#### Chats
3232

33-
- `[ ] GET /chats` (`getChats`) — *Получение списка всех чатов бота.*
34-
- `[ ] GET /chats/{chatLink}` (`getChatByLink`) — *Получение информации о чате по ссылке.*
35-
- `[x] GET /chats/{chatId}` (`getChat`) — *Получение информации о чате по ID.*
36-
- `[ ] PATCH /chats/{chatId}` (`editChat`) — *Редактирование информации о чате.*
37-
- `[ ] DELETE /chats/{chatId}` (`deleteChat`) — *Удаление чата.*
38-
- `[ ] POST /chats/{chatId}/actions` (`sendAction`) — *Отправка действия в чат (например, "печатает...").*
39-
- `[ ] GET /chats/{chatId}/pin` (`getPinnedMessage`) — *Получение закрепленного сообщения.*
40-
- `[ ] PUT /chats/{chatId}/pin` (`pinMessage`) — *Закрепление сообщения.*
41-
- `[ ] DELETE /chats/{chatId}/pin` (`unpinMessage`) — *Открепление сообщения.*
42-
- `[ ] GET /chats/{chatId}/members/me` (`getMembership`) — *Получение информации о членстве бота в чате.*
43-
- `[ ] DELETE /chats/{chatId}/members/me` (`leaveChat`) — *Выход бота из чата.*
44-
- `[ ] GET /chats/{chatId}/members/admins` (`getAdmins`) — *Получение администраторов чата.*
45-
- `[ ] POST /chats/{chatId}/members/admins` (`postAdmins`) — *Назначение администраторов чата.*
46-
- `[ ] DELETE /chats/{chatId}/members/admins/{userId}` (`deleteAdmins`) — *Снятие прав администратора.*
47-
- `[ ] GET /chats/{chatId}/members` (`getMembers`) — *Получение участников чата.*
48-
- `[ ] POST /chats/{chatId}/members` (`addMembers`) — *Добавление участников в чат.*
49-
- `[ ] DELETE /chats/{chatId}/members` (`removeMember`) — *Удаление участника из чата.*
33+
- [ ] `GET /chats` (`getChats`) — *Получение списка всех чатов бота.*
34+
- [ ] `GET /chats/{chatLink}` (`getChatByLink`) — *Получение информации о чате по ссылке.*
35+
- [x] `GET /chats/{chatId}` (`getChat`) — *Получение информации о чате по ID.*
36+
- [ ] `PATCH /chats/{chatId}` (`editChat`) — *Редактирование информации о чате.*
37+
- [ ] `DELETE /chats/{chatId}` (`deleteChat`) — *Удаление чата.*
38+
- [ ] `POST /chats/{chatId}/actions` (`sendAction`) — *Отправка действия в чат (например, "печатает...").*
39+
- [ ] `GET /chats/{chatId}/pin` (`getPinnedMessage`) — *Получение закрепленного сообщения.*
40+
- [ ] `PUT /chats/{chatId}/pin` (`pinMessage`) — *Закрепление сообщения.*
41+
- [ ] `DELETE /chats/{chatId}/pin` (`unpinMessage`) — *Открепление сообщения.*
42+
- [ ] `GET /chats/{chatId}/members/me` (`getMembership`) — *Получение информации о членстве бота в чате.*
43+
- [ ] `DELETE /chats/{chatId}/members/me` (`leaveChat`) — *Выход бота из чата.*
44+
- [ ] `GET /chats/{chatId}/members/admins` (`getAdmins`) — *Получение администраторов чата.*
45+
- [ ] `POST /chats/{chatId}/members/admins` (`postAdmins`) — *Назначение администраторов чата.*
46+
- [ ] `DELETE /chats/{chatId}/members/admins/{userId}` (`deleteAdmins`) — *Снятие прав администратора.*
47+
- [ ] `GET /chats/{chatId}/members` (`getMembers`) — *Получение участников чата.*
48+
- [ ] `POST /chats/{chatId}/members` (`addMembers`) — *Добавление участников в чат.*
49+
- [ ] `DELETE /chats/{chatId}/members` (`removeMember`) — *Удаление участника из чата.*
5050

5151
#### Subscriptions
5252

53-
- `[x] GET /subscriptions` (`getSubscriptions`) — *Получение списка Webhook-подписок.*
54-
- `[x] POST /subscriptions` (`subscribe`) — *Создание Webhook-подписки.*
55-
- `[x] DELETE /subscriptions` (`unsubscribe`) — *Удаление Webhook-подписки.*
56-
- `[x] GET /updates` (`getUpdates`) — *Получение обновлений через Long-Polling.*
53+
- [x] `GET /subscriptions` (`getSubscriptions`) — *Получение списка Webhook-подписок.*
54+
- [x] `POST /subscriptions` (`subscribe`) — *Создание Webhook-подписки.*
55+
- [x] `DELETE /subscriptions` (`unsubscribe`) — *Удаление Webhook-подписки.*
56+
- [x] `GET /updates` (`getUpdates`) — *Получение обновлений через Long-Polling.*
5757

5858
#### Upload
5959

60-
- `[x] POST /uploads` (`getUploadUrl`) — *Получение URL для загрузки файла.*
60+
- [x] `POST /uploads` (`getUploadUrl`) — *Получение URL для загрузки файла.*
6161

6262
#### Messages
6363

64-
- `[ ] GET /messages` (`getMessages`) — *Получение списка сообщений из чата.*
65-
- `[x] POST /messages` (`sendMessage`) — *Отправка сообщения.*
66-
- `[ ] PUT /messages` (`editMessage`) — *Редактирование сообщения.*
67-
- `[ ] DELETE /messages` (`deleteMessage`) — *Удаление сообщения.*
68-
- `[ ] GET /messages/{messageId}` (`getMessageById`) — *Получение сообщения по ID.*
69-
- `[ ] GET /videos/{videoToken}` (`getVideoAttachmentDetails`) — *Получение детальной информации о видео.*
70-
- `[ ] POST /answers` (`answerOnCallback`) — *Ответ на нажатие callback-кнопки.*
64+
- [ ] `GET /messages` (`getMessages`) — *Получение списка сообщений из чата.*
65+
- [x] `POST /messages` (`sendMessage`) — *Отправка сообщения.*
66+
- [ ] `PUT /messages` (`editMessage`) — *Редактирование сообщения.*
67+
- [ ] `DELETE /messages` (`deleteMessage`) — *Удаление сообщения.*
68+
- [ ] `GET /messages/{messageId}` (`getMessageById`) — *Получение сообщения по ID.*
69+
- [ ] `GET /videos/{videoToken}` (`getVideoAttachmentDetails`) — *Получение детальной информации о видео.*
70+
- [ ] `POST /answers` (`answerOnCallback`) — *Ответ на нажатие callback-кнопки.*

badge-coverage.svg

Lines changed: 3 additions & 3 deletions
Loading

composer.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
"require-dev": {
2525
"friendsofphp/php-cs-fixer": "^3.77",
2626
"jaschilz/php-coverage-badger": "^2.0",
27+
"mikey179/vfsstream": "^1.6",
28+
"php-mock/php-mock-phpunit": "^2.13",
2729
"phpstan/phpstan": "^2.1",
2830
"phpunit/phpunit": "^12.0",
2931
"roave/security-advisories": "dev-latest"

src/Api.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
use BushlanovDev\MaxMessengerBot\Exceptions\SerializationException;
1414
use BushlanovDev\MaxMessengerBot\Models\AbstractModel;
1515
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\AbstractAttachmentRequest;
16+
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\AudioAttachmentRequest;
17+
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\FileAttachmentRequest;
1618
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\PhotoAttachmentRequest;
19+
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\VideoAttachmentRequest;
1720
use BushlanovDev\MaxMessengerBot\Models\BotInfo;
1821
use BushlanovDev\MaxMessengerBot\Models\Chat;
1922
use BushlanovDev\MaxMessengerBot\Models\Message;
@@ -71,12 +74,10 @@ public function __construct(
7174
) {
7275
if ($client === null) {
7376
if (!class_exists(\GuzzleHttp\Client::class) || !class_exists(\GuzzleHttp\Psr7\HttpFactory::class)) {
74-
// @codeCoverageIgnoreStart
7577
throw new LogicException(
7678
'No client was provided and "guzzlehttp/guzzle" is not found. ' .
7779
'Please run "composer require guzzlehttp/guzzle" or create and pass your own implementation of ClientApiInterface.'
7880
);
79-
// @codeCoverageIgnoreEnd
8081
}
8182

8283
$guzzle = new \GuzzleHttp\Client();
@@ -429,7 +430,7 @@ public function uploadAttachment(UploadType $type, string $filePath): AbstractAt
429430
throw new InvalidArgumentException("File not found or not readable: $filePath");
430431
}
431432

432-
$fileHandle = fopen($filePath, 'r');
433+
$fileHandle = @fopen($filePath, 'r');
433434
if ($fileHandle === false) {
434435
throw new RuntimeException("Could not open file for reading: $filePath");
435436
}
@@ -450,6 +451,9 @@ public function uploadAttachment(UploadType $type, string $filePath): AbstractAt
450451

451452
return match ($type) {
452453
UploadType::Image => PhotoAttachmentRequest::fromToken($uploadResult['token']),
454+
UploadType::Video => new VideoAttachmentRequest($uploadResult['token']),
455+
UploadType::Audio => new AudioAttachmentRequest($uploadResult['token']),
456+
UploadType::File => new FileAttachmentRequest($uploadResult['token']), // @phpstan-ignore-line
453457
default => throw new LogicException(
454458
"Attachment creation for type '$type->value' is not yet implemented."
455459
),

src/Enums/AttachmentType.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ enum AttachmentType: string
1111
case Audio = 'audio';
1212
case File = 'file';
1313
case Sticker = 'sticker';
14-
case Contract = 'contract';
14+
case Contact = 'contact';
1515
case InlineKeyboard = 'inline_keyboard';
1616
case Location = 'location';
1717
case Share = 'share';

src/Models/Attachments/Payloads/AbstractAttachmentPayload.php renamed to src/Models/Attachments/Payloads/AbstractAttachmentRequestPayload.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66

77
use BushlanovDev\MaxMessengerBot\Models\AbstractModel;
88

9-
abstract readonly class AbstractAttachmentPayload extends AbstractModel
9+
abstract readonly class AbstractAttachmentRequestPayload extends AbstractModel
1010
{
1111
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads;
6+
7+
/**
8+
* Payload for a contact attachment request.
9+
*/
10+
final readonly class ContactAttachmentRequestPayload extends AbstractAttachmentRequestPayload
11+
{
12+
/**
13+
* @param string|null $name Contact name.
14+
* @param int|null $contactId Contact identifier if it is a registered Max user.
15+
* @param string|null $vcfInfo Full information about the contact in VCF format.
16+
* @param string|null $vcfPhone Contact phone in VCF format.
17+
*/
18+
public function __construct(
19+
public ?string $name = null,
20+
public ?int $contactId = null,
21+
public ?string $vcfInfo = null,
22+
public ?string $vcfPhone = null,
23+
) {
24+
}
25+
}

src/Models/Attachments/Payloads/InlineKeyboardPayload.php renamed to src/Models/Attachments/Payloads/InlineKeyboardAttachmentRequestPayload.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\AbstractButton;
88

9-
final readonly class InlineKeyboardPayload extends AbstractAttachmentPayload
9+
final readonly class InlineKeyboardAttachmentRequestPayload extends AbstractAttachmentRequestPayload
1010
{
1111
/**
1212
* @param AbstractButton[][] $buttons
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads;
6+
7+
/**
8+
* Payload for a location attachment request.
9+
*/
10+
final readonly class LocationAttachmentRequestPayload extends AbstractAttachmentRequestPayload
11+
{
12+
/**
13+
* @param float $latitude Latitude as a floating-point number.
14+
* @param float $longitude Longitude as a floating-point number.
15+
*/
16+
public function __construct(
17+
public float $latitude,
18+
public float $longitude,
19+
) {
20+
}
21+
}

src/Models/Attachments/Payloads/PhotoAttachmentPayload.php renamed to src/Models/Attachments/Payloads/PhotoAttachmentRequestPayload.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
/**
1111
* Request to attach image. All fields are mutually exclusive.
1212
*/
13-
final readonly class PhotoAttachmentPayload extends AbstractAttachmentPayload
13+
final readonly class PhotoAttachmentRequestPayload extends AbstractAttachmentRequestPayload
1414
{
1515
/**
1616
* @param string|null $url Any external image URL you want to attach.
@@ -25,7 +25,7 @@ public function __construct(
2525
) {
2626
if (count(array_filter([$this->url, $this->token, $this->photos])) !== 1) {
2727
throw new InvalidArgumentException(
28-
'Provide exactly one of "url", "token", or "photos" for PhotoAttachmentPayload.'
28+
'Provide exactly one of "url", "token", or "photos" for PhotoAttachmentRequestPayload.'
2929
);
3030
}
3131
}

0 commit comments

Comments
 (0)