diff --git a/src/TgBotLib/Abstracts/EventType.php b/src/TgBotLib/Abstracts/EventType.php new file mode 100644 index 0000000..bc3037b --- /dev/null +++ b/src/TgBotLib/Abstracts/EventType.php @@ -0,0 +1,40 @@ +ssl = true; $this->last_update_id = 0; $this->command_handlers = []; + $this->event_handlers = []; } /** @@ -160,7 +170,7 @@ ]); $response = curl_exec($ch); - print_r($response); + print_r($response . PHP_EOL); if ($response === false) throw new TelegramException('curl error: ' . curl_error($ch), curl_errno($ch)); @@ -224,6 +234,30 @@ $this->command_handlers[$command] = $handler; } + /** + * Sets an event handler for the specified event + * + * @param string $event + * @param EventInterface $handler + * @return void + * @noinspection PhpUnused + */ + public function setEventHandler(string $event, EventInterface $handler): void + { + switch($event) + { + case EventType::GenericUpdate: + case EventType::Message: + case EventType::EditedMessage: + break; + + default: + throw new InvalidArgumentException('Invalid event type'); + } + + $this->event_handlers[$event] = $handler; + } + /** * Removes the command handler for the specified command * @@ -236,6 +270,18 @@ unset($this->command_handlers[$command]); } + /** + * Removes the event handler for the specified event + * + * @param string $event + * @return void + * @noinspection PhpUnused + */ + public function removeEventHandler(string $event): void + { + unset($this->event_handlers[$event]); + } + /** * Handles a single update object * @@ -244,6 +290,125 @@ */ public function handleUpdate(Update $update): void { + // Process event handlers + foreach($this->event_handlers as $event => $handler) + { + switch($event) + { + case EventType::GenericUpdate: + $handler->handle($this, $update); + break; + + case EventType::Message: + if(($update->getMessage() ?? null) !== null) + $handler->handle($this, $update); + break; + + case EventType::EditedMessage: + if(($update->getEditedMessage() ?? null) !== null) + $handler->handle($this, $update); + break; + + case EventType::GenericCommandMessage: + if(($update->getMessage() ?? null) !== null && ($update->getMessage()->getText() ?? null) !== null) + { + $text = $update->getMessage()->getText(); + if(str_starts_with($text, '/')) + { + $handler->handle($this, $update); + } + } + break; + + case EventType::ChatMemberJoined: + if(($update->getMessage() ?? null) !== null && ($update->getMessage()->getNewChatMembers() ?? null) !== null) + { + $handler->handle($this, $update); + } + break; + + case EventType::ChatMemberLeft: + if(($update->getMessage() ?? null) !== null && ($update->getMessage()->getLeftChatMember() ?? null) !== null) + { + $handler->handle($this, $update); + } + break; + + case EventType::ChatMemberKicked: + if(($update->getMyChatMember() ?? null) !== null && ($update->getMyChatMember()->getNewChatMember() ?? null) !== null) + { + if( + $update->getMyChatMember()->getNewChatMember()->getStatus() === ChatMemberStatus::Kicked && + $update->getMyChatMember()->getNewChatMember()->getUntilDate() === null + ) + { + $handler->handle($this, $update); + } + } + break; + + case EventType::ChatMemberBanned: + if(($update->getMyChatMember() ?? null) !== null && ($update->getMyChatMember()->getNewChatMember() ?? null) !== null) + { + if( + $update->getMyChatMember()->getNewChatMember()->getStatus() === ChatMemberStatus::Kicked && + $update->getMyChatMember()->getNewChatMember()->getUntilDate() !== null + ) + { + $handler->handle($this, $update); + } + } + break; + + case EventType::ChatMemberUnrestricted: + case EventType::ChatMemberDemoted: + case EventType::ChatMemberUnbanned: + if(($update->getMyChatMember() ?? null) !== null && ($update->getMyChatMember()->getNewChatMember() ?? null) !== null) + { + if($update->getMyChatMember()->getNewChatMember()->getStatus() === ChatMemberStatus::Member) + { + $handler->handle($this, $update); + } + } + break; + + case EventType::ChatMemberPromoted: + if(($update->getMyChatMember() ?? null) !== null && ($update->getMyChatMember()->getNewChatMember() ?? null) !== null) + { + if($update->getMyChatMember()->getNewChatMember()->getStatus() === ChatMemberStatus::Administrator) + { + $handler->handle($this, $update); + } + } + break; + + case EventType::ChatMemberRestricted: + if(($update->getMyChatMember() ?? null) !== null && ($update->getMyChatMember()->getNewChatMember() ?? null) !== null) + { + if($update->getMyChatMember()->getNewChatMember()->getStatus() === ChatMemberStatus::Restricted) + { + $handler->handle($this, $update); + } + } + break; + + case EventType::ChatTitleChanged: + if(($update->getMessage() ?? null) !== null && ($update->getMessage()->getNewChatTitle() ?? null) !== null) + { + $handler->handle($this, $update); + } + break; + + case EventType::ChatPhotoChanged: + if(($update->getMessage() ?? null) !== null && ($update->getMessage()->getNewChatPhoto() ?? null) !== null) + { + $handler->handle($this, $update); + } + break; + } + } + + // Process command handlers if(($update->getMessage() ?? null) !== null && ($update->getMessage()->getText() ?? null) !== null) { $text = $update->getMessage()->getText(); @@ -256,6 +421,8 @@ } } } + + } /** diff --git a/src/TgBotLib/Interfaces/EventInterface.php b/src/TgBotLib/Interfaces/EventInterface.php new file mode 100644 index 0000000..3dad5e9 --- /dev/null +++ b/src/TgBotLib/Interfaces/EventInterface.php @@ -0,0 +1,18 @@ +