diff --git a/README.md b/README.md index b432597..c9b3ef7 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ $dispatcher->addHandler(UpdateType::BotStarted, function (BotStartedUpdate $upda ```php $api->subscribe( - url: 'https://example.com/webhook', // URL на который будут приходить хуки + url: 'https://example.com/webhook', // HTTPS URL на который будут приходить хуки secret: 'super_secret', // Секретная фраза для проверки хуков updateTypes: [ // Типы хуков которые вы хотите получать (либо ничего не указывать, чтобы получать все) diff --git a/composer.json b/composer.json index 8561291..917a574 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,7 @@ "psr/http-client": "^1.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0||^2.0", - "psr/log": "^3.0" + "psr/log": "^1.1||^2.0||^3.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.77", diff --git a/docs/README.md b/docs/README.md index 1004d8c..430aa46 100644 --- a/docs/README.md +++ b/docs/README.md @@ -275,11 +275,11 @@ $subscriptions = $api->getSubscriptions(); Подписывает бота на получение обновлений через WebHook. После вызова этого метода бот будет получать уведомления о новых событиях в чатах на указанный URL. -Ваш сервер должен прослушивать один из следующих портов: 80, 8080, 443, 8443, 16384-32383. +Судя по обновленной [документации](https://dev.max.ru/docs-api/methods/POST/subscriptions) поддерживается только 443 порт! ```php $api->subscribe( - url: 'https://example.com/webhook', // URL на который будут приходить хуки. Должен начинаться с http(s):// + url: 'https://example.com/webhook', // HTTPS URL на который будут приходить хуки. Должен начинаться с https:// secret: 'super_secret', // Секретная фраза для проверки хуков (необязательно) updateTypes: [UpdateType::MessageCreated], // Типы хуков которые вы хотите получать (либо ничего не указывать, чтобы получать все) ); diff --git a/src/Api.php b/src/Api.php index 8cd774d..1417e8e 100644 --- a/src/Api.php +++ b/src/Api.php @@ -48,7 +48,7 @@ use RuntimeException; */ class Api { - public const string LIBRARY_VERSION = '1.5.0'; + public const string LIBRARY_VERSION = '1.6.2'; public const string API_VERSION = '1.2.5'; diff --git a/src/Enums/AttachmentType.php b/src/Enums/AttachmentType.php index 4e3d35d..ccc0484 100644 --- a/src/Enums/AttachmentType.php +++ b/src/Enums/AttachmentType.php @@ -13,8 +13,6 @@ enum AttachmentType: string case Sticker = 'sticker'; case Contact = 'contact'; case InlineKeyboard = 'inline_keyboard'; - case ReplyKeyboard = 'reply_keyboard'; case Location = 'location'; case Share = 'share'; - case Data = 'data'; } diff --git a/src/Enums/ChatAdminPermission.php b/src/Enums/ChatAdminPermission.php index 609d231..74cdb63 100644 --- a/src/Enums/ChatAdminPermission.php +++ b/src/Enums/ChatAdminPermission.php @@ -15,5 +15,9 @@ enum ChatAdminPermission: string case ChangeChatInfo = 'change_chat_info'; case PinMessage = 'pin_message'; case Write = 'write'; + case CanCall = 'can_call'; case EditLink = 'edit_link'; + case PostEditDeleteMessage = 'post_edit_delete_message'; + case EditMessage = 'edit_message'; + case DeleteMessage = 'delete_message'; } diff --git a/src/ModelFactory.php b/src/ModelFactory.php index 2963b24..9c1c08a 100644 --- a/src/ModelFactory.php +++ b/src/ModelFactory.php @@ -25,12 +25,10 @@ use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\Reply\SendContactBut use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\Reply\SendGeoLocationButton; use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\Reply\SendMessageButton; use BushlanovDev\MaxMessengerBot\Models\Attachments\ContactAttachment; -use BushlanovDev\MaxMessengerBot\Models\Attachments\DataAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\FileAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\InlineKeyboardAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\LocationAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\PhotoAttachment; -use BushlanovDev\MaxMessengerBot\Models\Attachments\ReplyKeyboardAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\ShareAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\StickerAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\VideoAttachment; @@ -243,14 +241,6 @@ readonly class ModelFactory public function createAttachment(array $data): AbstractAttachment { $attachmentType = AttachmentType::tryFrom($data['type'] ?? ''); - if ($attachmentType === AttachmentType::ReplyKeyboard - && isset($data['buttons']) && is_array($data['buttons'])) { - $data['buttons'] = array_map( - fn($rowOfButtons) => array_map([$this, 'createReplyButton'], $rowOfButtons), - $data['buttons'], - ); - } - if ($attachmentType === AttachmentType::InlineKeyboard && isset($data['payload']['buttons']) && is_array($data['payload']['buttons'])) { $data['payload']['buttons'] = array_map( @@ -260,8 +250,6 @@ readonly class ModelFactory } return match ($attachmentType) { - AttachmentType::Data => DataAttachment::fromArray($data), - AttachmentType::Share => ShareAttachment::fromArray($data), AttachmentType::Image => PhotoAttachment::fromArray($data), AttachmentType::Video => VideoAttachment::fromArray($data), AttachmentType::Audio => AudioAttachment::fromArray($data), @@ -269,8 +257,8 @@ readonly class ModelFactory AttachmentType::Sticker => StickerAttachment::fromArray($data), AttachmentType::Contact => ContactAttachment::fromArray($data), AttachmentType::InlineKeyboard => InlineKeyboardAttachment::fromArray($data), - AttachmentType::ReplyKeyboard => ReplyKeyboardAttachment::fromArray($data), AttachmentType::Location => LocationAttachment::fromArray($data), + AttachmentType::Share => ShareAttachment::fromArray($data), default => throw new LogicException('Unknown or unsupported attachment type: ' . ($data['type'] ?? 'none')), }; } diff --git a/src/Models/Attachments/DataAttachment.php b/src/Models/Attachments/DataAttachment.php deleted file mode 100644 index ae24be5..0000000 --- a/src/Models/Attachments/DataAttachment.php +++ /dev/null @@ -1,21 +0,0 @@ - [ ['user_id' => 101, 'permissions' => ['write'], 'alias' => null], ['user_id' => 202, 'permissions' => ['pin_message'], 'alias' => null], + ['user_id' => 303, 'permissions' => ['edit_message', 'can_call'], 'alias' => 'SuperUser'], ], ]; $rawResponse = ['success' => true]; diff --git a/tests/ModelFactoryTest.php b/tests/ModelFactoryTest.php index 4bbdc6f..c2b1ea4 100644 --- a/tests/ModelFactoryTest.php +++ b/tests/ModelFactoryTest.php @@ -18,7 +18,6 @@ use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\Inline\RequestGeoLoc use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\Reply\AbstractReplyButton; use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\Reply\SendContactButton; use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\Reply\SendMessageButton; -use BushlanovDev\MaxMessengerBot\Models\Attachments\DataAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\InlineKeyboardAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\LocationAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\KeyboardPayload; @@ -26,7 +25,6 @@ use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoAttachmentPayl use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoAttachmentRequestPayload; use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\ShareAttachmentRequestPayload; use BushlanovDev\MaxMessengerBot\Models\Attachments\PhotoAttachment; -use BushlanovDev\MaxMessengerBot\Models\Attachments\ReplyKeyboardAttachment; use BushlanovDev\MaxMessengerBot\Models\Attachments\ShareAttachment; use BushlanovDev\MaxMessengerBot\Models\BotCommand; use BushlanovDev\MaxMessengerBot\Models\BotInfo; @@ -85,7 +83,6 @@ use Psr\Log\LoggerInterface; #[UsesClass(PhotoAttachmentRequestPayload::class)] #[UsesClass(VideoUrls::class)] #[UsesClass(AbstractAttachment::class)] -#[UsesClass(DataAttachment::class)] #[UsesClass(ShareAttachment::class)] #[UsesClass(ShareAttachmentRequestPayload::class)] #[UsesClass(LinkMarkup::class)] @@ -96,7 +93,6 @@ use Psr\Log\LoggerInterface; #[UsesClass(AbstractReplyButton::class)] #[UsesClass(SendContactButton::class)] #[UsesClass(SendMessageButton::class)] -#[UsesClass(ReplyKeyboardAttachment::class)] #[UsesClass(AbstractInlineButton::class)] #[UsesClass(ChatButton::class)] #[UsesClass(RequestContactButton::class)] @@ -593,7 +589,6 @@ final class ModelFactoryTest extends TestCase 'seq' => 102, 'text' => 'Message with data attachment', 'attachments' => [ - ['type' => 'data', 'data' => 'payload_from_reply_button'], [ 'type' => 'share', 'payload' => ['url' => 'http://a.com'], @@ -615,16 +610,13 @@ final class ModelFactoryTest extends TestCase $this->assertInstanceOf(Message::class, $message); $this->assertInstanceOf(MessageBody::class, $message->body); $this->assertIsArray($attachments); - $this->assertCount(3, $attachments); + $this->assertCount(2, $attachments); - $this->assertInstanceOf(DataAttachment::class, $attachments[0]); - $this->assertSame('payload_from_reply_button', $attachments[0]->data); + $this->assertInstanceOf(ShareAttachment::class, $message->body->attachments[0]); + $this->assertSame('Test Share', $attachments[0]->title); - $this->assertInstanceOf(ShareAttachment::class, $message->body->attachments[1]); - $this->assertSame('Test Share', $attachments[1]->title); - - $this->assertInstanceOf(PhotoAttachment::class, $attachments[2]); - $this->assertSame(1, $attachments[2]->payload->photoId); + $this->assertInstanceOf(PhotoAttachment::class, $attachments[1]); + $this->assertSame(1, $attachments[1]->payload->photoId); } #[Test] @@ -665,26 +657,6 @@ final class ModelFactoryTest extends TestCase $this->factory->createMarkupElement(['type' => 'brand_new_unsupported_type']); } - #[Test] - public function createAttachmentCorrectlyHydratesReplyKeyboard(): void - { - $data = [ - 'type' => 'reply_keyboard', - 'buttons' => [ - [['type' => 'message', 'text' => 'Hello']], - [['type' => 'user_contact', 'text' => 'My Contact']] - ] - ]; - - $attachment = $this->factory->createAttachment($data); - - $this->assertInstanceOf(ReplyKeyboardAttachment::class, $attachment); - $this->assertCount(2, $attachment->buttons); - $this->assertInstanceOf(SendMessageButton::class, $attachment->buttons[0][0]); - $this->assertInstanceOf(SendContactButton::class, $attachment->buttons[1][0]); - $this->assertSame('My Contact', $attachment->buttons[1][0]->text); - } - #[Test] public function createReplyButtonThrowsExceptionForUnknownType(): void { @@ -769,14 +741,6 @@ final class ModelFactoryTest extends TestCase public static function attachmentTypeProvider(): array { return [ - 'Data Attachment' => [ - ['type' => 'data', 'data' => 'test_payload'], - DataAttachment::class, - function (TestCase $test, DataAttachment $attachment) { - $test->assertSame('test_payload', $attachment->data); - } - ], - 'Location Attachment' => [ ['type' => 'location', 'latitude' => 55.751244, 'longitude' => 37.618423], LocationAttachment::class, diff --git a/tests/Models/Attachments/DataAttachmentTest.php b/tests/Models/Attachments/DataAttachmentTest.php deleted file mode 100644 index f3905de..0000000 --- a/tests/Models/Attachments/DataAttachmentTest.php +++ /dev/null @@ -1,49 +0,0 @@ -assertSame(AttachmentType::Data, $attachment->type); - $this->assertSame('some_payload_from_button', $attachment->data); - - $expectedArray = [ - 'type' => 'data', - 'data' => 'some_payload_from_button', - ]; - - $this->assertEquals($expectedArray, $attachment->toArray()); - } - - #[Test] - public function canBeCreatedFromArray(): void - { - $data = [ - 'type' => 'data', - 'data' => 'payload123', - ]; - - $attachment = DataAttachment::fromArray($data); - - $this->assertInstanceOf(DataAttachment::class, $attachment); - $this->assertSame(AttachmentType::Data, $attachment->type); - $this->assertSame('payload123', $attachment->data); - } -} diff --git a/tests/Models/Attachments/Payloads/ReplyKeyboardAttachmentRequestPayloadTest.php b/tests/Models/Attachments/Payloads/ReplyKeyboardAttachmentRequestPayloadTest.php deleted file mode 100644 index 65c90a8..0000000 --- a/tests/Models/Attachments/Payloads/ReplyKeyboardAttachmentRequestPayloadTest.php +++ /dev/null @@ -1,99 +0,0 @@ - [ - [ - [ - 'type' => 'message', - 'text' => 'Help', - 'payload' => null, - 'intent' => 'default', - ], - ], - [ - [ - 'type' => 'user_contact', - 'text' => 'Share Contact', - ], - ], - ], - 'direct' => false, - 'direct_user_id' => null, - ]; - - $this->assertEquals($expected, $payload->toArray()); - } - - #[Test] - public function toArrayWithAllParameters(): void - { - $buttons = [ - [new SendMessageButton('Confirm', 'confirm-action', Intent::Positive)], - ]; - - $payload = new ReplyKeyboardAttachmentRequestPayload( - buttons: $buttons, - direct: true, - directUserId: 987654321, - ); - - $expected = [ - 'buttons' => [ - [ - [ - 'type' => 'message', - 'text' => 'Confirm', - 'payload' => 'confirm-action', - 'intent' => 'positive', - ], - ], - ], - 'direct' => true, - 'direct_user_id' => 987654321, - ]; - - $this->assertEquals($expected, $payload->toArray()); - } - - #[Test] - public function toArrayWithEmptyButtons(): void - { - $payload = new ReplyKeyboardAttachmentRequestPayload(buttons: []); - - $expected = [ - 'buttons' => [], - 'direct' => false, - 'direct_user_id' => null, - ]; - - $this->assertEquals($expected, $payload->toArray()); - } -} diff --git a/tests/Models/Attachments/ReplyKeyboardAttachmentTest.php b/tests/Models/Attachments/ReplyKeyboardAttachmentTest.php deleted file mode 100644 index e894068..0000000 --- a/tests/Models/Attachments/ReplyKeyboardAttachmentTest.php +++ /dev/null @@ -1,43 +0,0 @@ - 'reply_keyboard', - 'buttons' => [ - [['type' => 'message', 'text' => 'Hello']], - [['type' => 'user_contact', 'text' => 'My Contact']] - ] - ]; - - $factory = new ModelFactory(); - $attachment = $factory->createAttachment($data); - - $this->assertInstanceOf(ReplyKeyboardAttachment::class, $attachment); - $this->assertCount(2, $attachment->buttons); - $this->assertInstanceOf(SendContactButton::class, $attachment->buttons[1][0]); - $this->assertSame('My Contact', $attachment->buttons[1][0]->text); - } -} diff --git a/tests/Models/Attachments/Requests/ReplyKeyboardAttachmentRequestTest.php b/tests/Models/Attachments/Requests/ReplyKeyboardAttachmentRequestTest.php deleted file mode 100644 index 9d3b788..0000000 --- a/tests/Models/Attachments/Requests/ReplyKeyboardAttachmentRequestTest.php +++ /dev/null @@ -1,59 +0,0 @@ - 'reply_keyboard', - 'payload' => [ - 'buttons' => [ - [ - [ - 'type' => 'message', - 'text' => 'Help', - 'payload' => 'help_payload', - 'intent' => 'positive', - ], - ], - [ - [ - 'type' => 'user_contact', - 'text' => 'Share Contact', - ], - ], - ], - 'direct' => true, - 'direct_user_id' => null, - ], - ]; - - $this->assertEquals($expectedArray, $request->toArray()); - } -}