From cf415b70e9a27789370da54307686465efa28d8f Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 2 Dec 2025 20:00:34 +0300 Subject: [PATCH] Added DialogMuted & BotStopped update types --- src/Enums/UpdateType.php | 5 ++ src/Laravel/MaxBotManager.php | 26 +++++++++++ src/ModelFactory.php | 4 ++ src/Models/Updates/BotStoppedUpdate.php | 29 ++++++++++++ src/Models/Updates/DialogMutedUpdate.php | 31 +++++++++++++ src/UpdateDispatcher.php | 26 +++++++++++ tests/Models/Updates/BotStoppedUpdateTest.php | 45 ++++++++++++++++++ .../Models/Updates/DialogMutedUpdateTest.php | 46 +++++++++++++++++++ 8 files changed, 212 insertions(+) create mode 100644 src/Models/Updates/BotStoppedUpdate.php create mode 100644 src/Models/Updates/DialogMutedUpdate.php create mode 100644 tests/Models/Updates/BotStoppedUpdateTest.php create mode 100644 tests/Models/Updates/DialogMutedUpdateTest.php diff --git a/src/Enums/UpdateType.php b/src/Enums/UpdateType.php index a5b724c..20ee60c 100644 --- a/src/Enums/UpdateType.php +++ b/src/Enums/UpdateType.php @@ -15,9 +15,14 @@ enum UpdateType: string case MessageRemoved = 'message_removed'; case BotAdded = 'bot_added'; case BotRemoved = 'bot_removed'; + case DialogMuted = 'dialog_muted'; + case DialogUnmuted = 'dialog_unmuted'; + case DialogCleared = 'dialog_cleared'; + case DialogRemoved = 'dialog_removed'; case UserAdded = 'user_added'; case UserRemoved = 'user_removed'; case BotStarted = 'bot_started'; + case BotStopped = 'bot_stopped'; case ChatTitleChanged = 'chat_title_changed'; case MessageChatCreated = 'message_chat_created'; } diff --git a/src/Laravel/MaxBotManager.php b/src/Laravel/MaxBotManager.php index 48de2f2..640c749 100644 --- a/src/Laravel/MaxBotManager.php +++ b/src/Laravel/MaxBotManager.php @@ -229,6 +229,19 @@ class MaxBotManager $this->dispatcher->onBotRemoved($this->resolveHandler($handler)); } + /** + * Register a dialog mute handler. + * + * @param callable|string $handler Can be a closure, callable, or Laravel container binding. + * + * @throws BindingResolutionException + * @codeCoverageIgnore + */ + public function onDialogMuted(callable|string $handler): void + { + $this->dispatcher->onDialogMuted($this->resolveHandler($handler)); + } + /** * Register a user added handler. * @@ -268,6 +281,19 @@ class MaxBotManager $this->dispatcher->onBotStarted($this->resolveHandler($handler)); } + /** + * Register a bot stopped handler. + * + * @param callable|string $handler Can be a closure, callable, or Laravel container binding. + * + * @throws BindingResolutionException + * @codeCoverageIgnore + */ + public function onBotStopped(callable|string $handler): void + { + $this->dispatcher->onBotStopped($this->resolveHandler($handler)); + } + /** * Register a chat title changed handler. * diff --git a/src/ModelFactory.php b/src/ModelFactory.php index 074021f..9042efd 100644 --- a/src/ModelFactory.php +++ b/src/ModelFactory.php @@ -56,7 +56,9 @@ use BushlanovDev\MaxMessengerBot\Models\Updates\AbstractUpdate; use BushlanovDev\MaxMessengerBot\Models\Updates\BotAddedToChatUpdate; use BushlanovDev\MaxMessengerBot\Models\Updates\BotRemovedFromChatUpdate; use BushlanovDev\MaxMessengerBot\Models\Updates\BotStartedUpdate; +use BushlanovDev\MaxMessengerBot\Models\Updates\BotStoppedUpdate; use BushlanovDev\MaxMessengerBot\Models\Updates\ChatTitleChangedUpdate; +use BushlanovDev\MaxMessengerBot\Models\Updates\DialogMutedUpdate; use BushlanovDev\MaxMessengerBot\Models\Updates\MessageCallbackUpdate; use BushlanovDev\MaxMessengerBot\Models\Updates\MessageChatCreatedUpdate; use BushlanovDev\MaxMessengerBot\Models\Updates\MessageCreatedUpdate; @@ -385,9 +387,11 @@ readonly class ModelFactory UpdateType::MessageRemoved => MessageRemovedUpdate::fromArray($data), UpdateType::BotAdded => BotAddedToChatUpdate::fromArray($data), UpdateType::BotRemoved => BotRemovedFromChatUpdate::fromArray($data), + UpdateType::DialogMuted => DialogMutedUpdate::fromArray($data), UpdateType::UserAdded => UserAddedToChatUpdate::fromArray($data), UpdateType::UserRemoved => UserRemovedFromChatUpdate::fromArray($data), UpdateType::BotStarted => BotStartedUpdate::fromArray($data), + UpdateType::BotStopped => BotStoppedUpdate::fromArray($data), UpdateType::ChatTitleChanged => ChatTitleChangedUpdate::fromArray($data), UpdateType::MessageChatCreated => MessageChatCreatedUpdate::fromArray($data), default => throw new LogicException( diff --git a/src/Models/Updates/BotStoppedUpdate.php b/src/Models/Updates/BotStoppedUpdate.php new file mode 100644 index 0000000..c3484a1 --- /dev/null +++ b/src/Models/Updates/BotStoppedUpdate.php @@ -0,0 +1,29 @@ +addHandler(UpdateType::BotRemoved, $handler); } + /** + * A convenient alias for addHandler(UpdateType::DialogMuted, $handler). + * + * @param callable(Models\Updates\BotRemovedFromChatUpdate, Api): void $handler + * + * @return $this + * @codeCoverageIgnore + */ + public function onDialogMuted(callable $handler): self + { + return $this->addHandler(UpdateType::DialogMuted, $handler); + } + /** * A convenient alias for addHandler(UpdateType::UserAdded, $handler). * @@ -203,6 +216,19 @@ final class UpdateDispatcher return $this->addHandler(UpdateType::BotStarted, $handler); } + /** + * A convenient alias for addHandler(UpdateType::BotStopped, $handler). + * + * @param callable(Models\Updates\BotStartedUpdate, Api): void $handler + * + * @return $this + * @codeCoverageIgnore + */ + public function onBotStopped(callable $handler): self + { + return $this->addHandler(UpdateType::BotStopped, $handler); + } + /** * A convenient alias for addHandler(UpdateType::ChatTitleChanged, $handler). * diff --git a/tests/Models/Updates/BotStoppedUpdateTest.php b/tests/Models/Updates/BotStoppedUpdateTest.php new file mode 100644 index 0000000..c49ce41 --- /dev/null +++ b/tests/Models/Updates/BotStoppedUpdateTest.php @@ -0,0 +1,45 @@ + UpdateType::BotStopped->value, + 'timestamp' => 1678886400000, + 'chat_id' => 123, + 'user' => [ + 'user_id' => 123, + 'first_name' => 'John', + 'last_name' => 'Doe', + 'is_bot' => false, + 'last_activity_time' => 1678886400000, + ], + 'user_locale' => 'ru-ru', + ]; + + $update = BotStoppedUpdate::fromArray($data); + + $this->assertInstanceOf(BotStoppedUpdate::class, $update); + $this->assertSame(UpdateType::BotStopped, $update->updateType); + $this->assertSame(123, $update->user->userId); + $this->assertSame('John', $update->user->firstName); + $this->assertSame('Doe', $update->user->lastName); + $this->assertSame('ru-ru', $update->userLocale); + } +} diff --git a/tests/Models/Updates/DialogMutedUpdateTest.php b/tests/Models/Updates/DialogMutedUpdateTest.php new file mode 100644 index 0000000..e368bc9 --- /dev/null +++ b/tests/Models/Updates/DialogMutedUpdateTest.php @@ -0,0 +1,46 @@ + UpdateType::DialogMuted->value, + 'timestamp' => 1678886400000, + 'chat_id' => 123, + 'user' => [ + 'user_id' => 123, + 'first_name' => 'John', + 'last_name' => 'Doe', + 'is_bot' => false, + 'last_activity_time' => 1678886400000, + ], + 'mutedUntil' => 1678886400000, + 'user_locale' => 'ru-ru', + ]; + + $update = DialogMutedUpdate::fromArray($data); + + $this->assertInstanceOf(DialogMutedUpdate::class, $update); + $this->assertSame(UpdateType::DialogMuted, $update->updateType); + $this->assertSame(123, $update->user->userId); + $this->assertSame('John', $update->user->firstName); + $this->assertSame('Doe', $update->user->lastName); + $this->assertSame('ru-ru', $update->userLocale); + } +}