Forráskód Böngészése

Добавлено изменение сообщений

Вадим Королёв 1 éve
szülő
commit
87ef7e3152
6 módosított fájl, 103 hozzáadás és 112 törlés
  1. 8 34
      index.php
  2. 16 37
      src/Common/Bot.php
  3. 7 4
      src/Common/Commands.php
  4. 5 0
      src/Drivers/Driver.php
  5. 65 34
      src/Drivers/TestDriver.php
  6. 2 3
      src/Events/CallbackEvent.php

+ 8 - 34
index.php

@@ -8,55 +8,29 @@ use BotKit\Common\Bot;
 use BotKit\Common\Commands;
 use BotKit\Drivers\TestDriver;
 use BotKit\Events\PlainMessageEvent;
+use BotKit\Events\UnknownEvent;
 use BotKit\Events\MemberJoinedEvent;
 use BotKit\Events\MemberLeftEvent;
 use BotKit\Enums\State;
 use BotKit\Enums\CallbackType;
 
 $bot = new Bot();
-$bot->loadDriver(new TestDriver());
+$drv = new TestDriver();
+$bot->loadDriver($drv);
 $bot->ensureDriversLoaded();
 
 // Нажатие на кнопку условий использования
-//~ $bot->onCallback(
-    //~ CallbackType::TOS,
-    //~ "BotKit\Common\Commands::showTermsOfService"
-//~ );
-
-// Команда помощь
-$bot->onCommand(
-    "/help",
-    "BotKit\Common\Commands::help"
-);
-
-// Помощь по теме
-$bot->onCommand(
-    "/help {topic}",
-    "BotKit\Common\Commands::helpTopic"
+$bot->onCallback(
+    CallbackType::TOS,
+    "BotKit\Common\Commands::showTermsOfService"
 );
 
-$bot->on(
-    PlainMessageEvent::class,
-    function ($e, $u, $driver) {
-        $result = $u->getState() == State::HelloWorld;
-        return $result;
-    },
-    "BotKit\Common\Commands::helloWorld"
-);
 $bot->on(
     PlainMessageEvent::class,
     function ($e, $u, $driver) {
         return $u->getState() == State::Registering;
     },
-    "BotKit\Common\Commands::registered"
-);
-
-$bot->onEvent(
-    MemberJoinedEvent::class,
-    "BotKit\Common\Commands::greetMember"
+    "BotKit\Common\Commands::helloWorld"
 );
 
-$bot->onEvent(
-    MemberLeftEvent::class,
-    "BotKit\Common\Commands::bye"
-);
+$bot->onEvent(UnknownEvent::class, "BotKit\Common\Commands::fallback");

+ 16 - 37
src/Common/Bot.php

@@ -6,6 +6,8 @@ namespace BotKit\Common;
 use BotKit\Events\Event;
 use BotKit\Models\UserModel;
 use BotKit\Events\PlainMessageEvent;
+use BotKit\Events\CallbackEvent;
+use BotKit\Enums\CallbackType;
 
 class Bot {
 
@@ -145,41 +147,18 @@ class Bot {
     }
 
     // Подключает обработчик обратного вызова
-    //~ public function onCallback(CallbackType $cbType, callable $responseCallback) {
-        //~ if (!is_a($this->event, ::class, true)) {
-            //~ // Не событие обратного вызова
-            //~ return;
-        //~ }
-
-        //~ // Определяем что будет параметрами
-		//~ $pattern = '/^'.preg_replace(
-			//~ ['/\//','/{(\w+)}/'],
-			//~ ['\\\/', '(?<$1>.*)'],
-			//~ $template
-		//~ ).'$/';
-
-
-        //~ if (!preg_match($pattern, $this->event->getText(), $named_groups)) {
-            //~ // Обрабатываемое событие - не для этого обработчика
-            //~ return;
-		//~ };
-
-        //~ // Оставляем только строковые ключи, т.к. в processRequest
-        //~ // $named_groups будут соединены со стандартными параметрами, которые
-        //~ // передаются только по названиям, не по позициям. Если в $named_groups
-        //~ // попадётся числовой ключ, позиционный аргумент передастся после
-        //~ // ключевого, что приведёт к ошибке
-        //~ $named_groups_filter = array_filter(
-            //~ $named_groups,
-            //~ function ($k) {
-                //~ return is_string($k);
-            //~ },
-            //~ ARRAY_FILTER_USE_KEY
-        //~ );
-
-        //~ // Вызов обработки с пойманными параметрами
-        //~ $this->processRequest($callback, $named_groups_filter);
-    //~ }
-
-    
+    public function onCallback(CallbackType $callbackType, callable $responseCallback) {
+        if (!is_a($this->event, CallbackEvent::class)) {
+            // Не событие обратного вызова
+            return;
+        }
+
+        if ($this->event->getCallbackType() != $callbackType) {
+            // Этот тип обратного вызова не подходит
+            return;
+        }
+
+        // Вызов обработки
+        $this->processRequest($responseCallback, []);
+    }
 }

+ 7 - 4
src/Common/Commands.php

@@ -14,9 +14,10 @@ class Commands {
 
     // Отправка условий использования
     public static function showTermsOfService($e, $u, $driver) {
-        $driver->reply(
-            $e,
+        $driver->editMessage(
+            $e->getMessageID(),
             Message::create("[Условия использования]")
+            ->withImage(ImageAttachment::fromUrl('https://images.wallpaperscraft.ru/image/single/pustynia_peski_diuny_1207604_800x1200.jpg'))
         );
     }
 
@@ -47,9 +48,11 @@ class Commands {
     public static function helpTopic($e, $u, $driver, $topic) {
         $driver->reply($e, Message::create("Помощь по ".$topic));
     }
-    
 
-    
+    // Помощь по теме
+    public static function fallback($e, $u, $driver) {
+        $driver->reply($e, Message::create("FALLBACK"));
+    }
 
     public static function registered($e, $u, $driver) {
         // Проверить: сообщение из чата или от пользователя

+ 5 - 0
src/Drivers/Driver.php

@@ -27,6 +27,11 @@ interface Driver {
     // Отсылает сообщение пользователю
     public function sendMessage(User $u, Message $msg);
 
+    // Изменяет сообщение
+    // messageId - ID сообщения на платформе
+    // msg - новые данные сообщения
+    public function editMessage($messageId, Message $msg) : void;
+
     // Отправляет сообщение в чат
     public function sendToChat(Chat $chat, Message $msg);
 

+ 65 - 34
src/Drivers/TestDriver.php

@@ -6,6 +6,7 @@ namespace BotKit\Drivers;
 use BotKit\Events\Event;
 use BotKit\Events\PlainMessageEvent;
 use BotKit\Events\UnknownEvent;
+use BotKit\Events\CallbackEvent;
 use BotKit\Events\MemberJoinedEvent;
 use BotKit\Events\MemberLeftEvent;
 use BotKit\Common\User;
@@ -17,6 +18,7 @@ use BotKit\EventAttachments\ImageAttachment;
 use BotKit\Enums\Platform;
 use BotKit\Enums\State;
 use BotKit\Enums\KeyboardButtonColor;
+use BotKit\Enums\CallbackType;
 use BotKit\Models\UserModel;
 use BotKit\KeyboardButtons\CallbackButton;
 
@@ -58,36 +60,20 @@ class TestDriver implements Driver {
 
         if ($data->type == 'callback') {
             // Обратный вызов
+            $user = $this->getUser($details->userId);
+            return new CallbackEvent(
+                $details->msgId,
+                $user,
+                $chat,
+                CallbackType::from($details->callbackType),
+                $details->params
+            );
+        }
 
-            $user = $this->getUser();
-        } else if ($data->type == 'botKitMsg') {
+        if ($data->type == 'botKitMsg') {
             // Обычное текстовое сообщение
-
-            // Получение объекта из БД
-            $obj = UserModel::where([
-                ['platform_id', '=', $details->userID],
-                ['platform', '=', $this->platform->value]
-            ]);
-
-            if ($obj === false) {
-                // Пользователя нет в БД
-                $obj = UserModel::create(
-                    $details->userID,
-                    $this->platform->value,
-                    State::HelloWorld->value
-                );
-            }
-
-            $state_obj = State::from($obj['state']);
-
-            $user = new User(
-                $details->userID,
-                $state_obj,
-                "Test username",
-                $obj
-            );
+            $user = $this->getUser($details->userID);
             $text = $details->text;
-
             return new PlainMessageEvent(
                 $details->id,
                 $user,
@@ -113,6 +99,14 @@ class TestDriver implements Driver {
         $this->sendInternal($msg, -1);
     }
 
+    public function editMessage($messageId, Message $msg) : void {
+        $this->actions[] = [
+            "action" => "editMessage",
+            "messageId" => $messageId,
+            "newMessage" => $this->getMessageData($msg, -1)
+        ];
+    }
+
     public function sendToChat(Chat $chat, Message $msg) {
         $this->sendInternal($msg, -1);
     }
@@ -197,6 +191,16 @@ class TestDriver implements Driver {
 
     // Отправляет сообщение
     private function sendInternal(Message $msg, int $reply_to_id) : void {
+        
+
+        $this->actions[] = [
+            "action" => "newMessage",
+            "message" => $this->getMessageData($msg, $reply_to_id)
+        ];
+    }
+
+    // Возвращает разметку для сообщения
+    private function getMessageData(Message $msg, int $reply_to_id) : array {
         $attachments = [];
 
         // Поиск клавиатур
@@ -243,6 +247,7 @@ class TestDriver implements Driver {
                         "type" => $button_type,
                         "color" => $button_color,
                         "label" => $button->getText(),
+                        "callbackType" => $button->getType(),
                         "payload" => $button->getPayload()
                     ];
                 }
@@ -266,13 +271,10 @@ class TestDriver implements Driver {
             }
         }
 
-        $this->actions[] = [
-            "action" => "newMessage",
-            "message" => [
-                "text" => $msg->getText(),
-                "reply_to" => $reply_to_id,
-                "attachments" => $attachments
-            ]
+        return [
+            "text" => $msg->getText(),
+            "reply_to" => $reply_to_id,
+            "attachments" => $attachments
         ];
     }
 
@@ -287,4 +289,33 @@ class TestDriver implements Driver {
             "info" => $info 
         ];
     }
+
+    // Возвращает объект пользвателя
+    public function getUser($userID) : User {
+        // Получение объекта из БД
+        $obj = UserModel::where([
+            ['platform_id', '=', $userID],
+            ['platform', '=', $this->platform->value]
+        ]);
+
+        if ($obj === false) {
+            // Пользователя нет в БД
+            $obj = UserModel::create(
+                $userID,
+                $this->platform->value,
+                State::HelloWorld->value
+            );
+        }
+
+        $state_obj = State::from($obj['state']);
+
+        $user = new User(
+            $userID,
+            $state_obj,
+            "Test username",
+            $obj
+        );
+
+        return $user;
+    }
 }

+ 2 - 3
src/Events/CallbackEvent.php

@@ -3,6 +3,7 @@ namespace BotKit\Events;
 
 use BotKit\Common\User;
 use BotKit\Common\Chat;
+use BotKit\Enums\CallbackType;
 
 class CallbackEvent extends Event {
     public function __construct(
@@ -32,13 +33,11 @@ class CallbackEvent extends Event {
         return $this->chat;
     }
 
-    public function getCallbackType() : string {
+    public function getCallbackType() : CallbackType {
         return $this->callbackType;
     }
 
     public function getParams() : array {
         return $this->params;
     }
-
-    
 }