Sfoglia il codice sorgente

Добавлен генератор кода моделей

Вадим Королёв 1 anno fa
parent
commit
fd11128279

+ 5 - 2
.env.template

@@ -1,2 +1,5 @@
-# Удали .template из названия файла
-TELEGRAMORG_TOKEN=
+TELEGRAMORG_TOKEN=
+db_host=
+db_name=
+db_user=
+db_password=

+ 2 - 1
composer.json

@@ -14,7 +14,8 @@
     },
     "autoload": {
         "psr-4": {
-            "BotKit\\": "src/"
+            "BotKit\\": "src/",
+	    "BotKit\\Tools\\": "tools/"
         }
     }
 }

+ 88 - 88
src/Common/Bot.php

@@ -7,92 +7,92 @@ use BotKit\Events\Event;
 
 class Bot {
 
-	// Событие которое обрабатывает бот
-	private Event $event;
-
-	// Загружен ли драйвер
-	private bool $driver_loaded = false;
-
-	// Загружает драйвер
-	public function loadDriver($driver) {
-		if ($this->driver_loaded == true) {
-			// Драйвер уже выбран
-			return;
-		}
-
-		if ($driver->forThis()) {
-			$this->driver_loaded = true;
-			$this->driver = $driver;
-			$this->event = $driver->getEvent();
-		}
-	}
-
-	// Убеждается в том, что драйвер для бота загружен
-	public function ensureDriversLoaded() {
-		// Выбросить исключение если ни один драйвер не согласился обработать
-		// запрос
-		if ($this->driver_loaded == false) {
-			throw new \Exception("Bot has no loaded drivers");
-		}
-	}
-	
-
-	// Подключает обработчик события
-	public function on(
-		string $event_classname,
-		callable $check,
-		callable $callback
-	) : void
-	{
-
-		if (!is_a($this->event, $event_classname, true)) {
-			// Если подключается обработчик события класса $event_classname,
-			// а в этом запросе обрабатывается событие другого класса, то
-			// и привязывать обработчик нет необходимости
-			return;
-		}
-
-		// Проверка условия события
-		// TODO: добавить параметры команды
-		$check_params = [
-			'e' => $this->event,
-			'u' => $this->event->getUser(),
-			'driver' => $this->driver
-		];
-
-		$result = call_user_func_array($check, $check_params);
-		if ($result == false) {
-			// Обрабатываемое событие - не для этого обработчика
-			return;
-		}
-
-		// Вызов обработчика
-		$callback_params = [
-			'e' => $this->event,
-			'u' => $this->event->getUser(),
-			'driver' => $this->driver
-		];
-		call_user_func_array($callback, $callback_params);
-
-		// Сохранение пользователя...
-
-		// Завершение работы драйвера...
-
-		exit();
-	}
-
-	// Подключает обработчик события без условия
-	public function onEvent(string $event_classname, callable $callback) {
-		if (!is_a($this->event, $event_classname, true)) {
-			return;
-		}
-
-		// Вызов обработчика
-		$callback_params = [
-			'e' => $this->event,
-			'u' => $this->event->getUser(),
-			'driver' => $this->driver
-		];
-		call_user_func_array($callback, $callback_params);
-	}
+    // Событие которое обрабатывает бот
+    private Event $event;
+
+    // Загружен ли драйвер
+    private bool $driver_loaded = false;
+
+    // Загружает драйвер
+    public function loadDriver($driver) {
+        if ($this->driver_loaded == true) {
+            // Драйвер уже выбран
+            return;
+        }
+
+        if ($driver->forThis()) {
+            $this->driver_loaded = true;
+            $this->driver = $driver;
+            $this->event = $driver->getEvent();
+        }
+    }
+
+    // Убеждается в том, что драйвер для бота загружен
+    public function ensureDriversLoaded() {
+        // Выбросить исключение если ни один драйвер не согласился обработать
+        // запрос
+        if ($this->driver_loaded == false) {
+            throw new \Exception("Bot has no loaded drivers");
+        }
+    }
+
+    // Подключает обработчик события
+    public function on(
+        string $event_classname,
+        callable $check,
+        callable $callback
+    ) : void
+    {
+
+        if (!is_a($this->event, $event_classname, true)) {
+            // Если подключается обработчик события класса $event_classname,
+            // а в этом запросе обрабатывается событие другого класса, то
+            // и привязывать обработчик нет необходимости
+            return;
+        }
+
+        // Проверка условия события
+        // TODO: добавить параметры команды
+        $check_params = [
+            'e' => $this->event,
+            'u' => $this->event->getUser(),
+            'driver' => $this->driver
+        ];
+
+        $result = call_user_func_array($check, $check_params);
+        if ($result == false) {
+            // Обрабатываемое событие - не для этого обработчика
+            return;
+        }
+
+        // Вызов обработчика
+        $user = $this->event->getUser();
+        $callback_params = [
+            'e' => $this->event,
+            'u' => $user,
+            'driver' => $this->driver
+        ];
+        call_user_func_array($callback, $callback_params);
+
+        // Сохранение пользователя...
+
+        // Завершение работы драйвера...
+
+        exit();
+    }
+
+    // Подключает обработчик события без условия
+    public function onEvent(string $event_classname, callable $callback) {
+        if (!is_a($this->event, $event_classname, true)) {
+            return;
+        }
+
+        // Вызов обработчика
+        $callback_params = [
+            'e' => $this->event,
+            'u' => $this->event->getUser(),
+            'driver' => $this->driver
+        ];
+        call_user_func_array($callback, $callback_params);
+    }
 }

+ 26 - 27
src/Common/Commands.php

@@ -8,34 +8,33 @@ use BotKit\Common\Message;
 use BotKit\Enums\Platform;
 
 class Commands {
-	public static function echoMessage($e, $u, $driver) {
-		$driver->reply($e, Message::create($e->getText()));
-		$driver->sendMessage($u, Message::create("DIRECT MESSAGE"));
-	}
+    public static function echoMessage($e, $u, $driver) {
+        $driver->reply($e, Message::create($e->getText()));
+        $driver->sendMessage($u, Message::create("DIRECT MESSAGE"));
+    }
 
-	// Функция приветствия пользователя
-	public static function greetMember($e, $u, $driver) {
-		
-		$username = self::getNick($u, $driver);
-		$driver->sendToChat(
-			$e->getChat(),
-			Message::create("Добро пожаловать в чат, ".$username)
-		);
-	}
+    // Функция приветствия пользователя
+    public static function greetMember($e, $u, $driver) {
+        $username = self::getNick($u, $driver);
+        $driver->sendToChat(
+            $e->getChat(),
+            Message::create("Добро пожаловать в чат, ".$username)
+        );
+    }
 
-	// Функция прощания с пользователем
-	public static function bye($e, $u, $driver) {
-		$username = self::getNick($u, $driver);
-		echo $username;
-		$driver->sendMessage($u, Message::create("Будем скучать, ".$username));
-	}
+    // Функция прощания с пользователем
+    public static function bye($e, $u, $driver) {
+        $username = self::getNick($u, $driver);
+        echo $username;
+        $driver->sendMessage($u, Message::create("Будем скучать, ".$username));
+    }
 
-	// Возвращает ник пользователя
-	private static function getNick($u, $driver) {
-		$username = $driver->getUserNick($u);
-		if (empty($username)) {
-			return $u->getPlatformID();
-		}
-		return $username;
-	}
+    // Возвращает ник пользователя
+    private static function getNick($u, $driver) {
+        $username = $driver->getUserNick($u);
+        if (empty($username)) {
+            return $u->getPlatformID();
+        }
+        return $username;
+    }
 }

+ 32 - 32
src/Common/Database.php

@@ -5,40 +5,40 @@
 namespace BotKit\Common;
 
 class Database {
-	private static $db;
-	private $connection;
-	
-	private function __construct($dsn, $user, $password) {
-		// https://mariadb.com/resources/blog/developer-quickstart-php-data-objects-and-mariadb/
-		$options = [
-			\PDO::ATTR_EMULATE_PREPARES   => false,
-			\PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
-			\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
-		];
-		$this->connection = new \PDO($dsn, $user, $password);
-	}
+    private static $db;
+    private $connection;
+    
+    private function __construct($dsn, $user, $password) {
+        // https://mariadb.com/resources/blog/developer-quickstart-php-data-objects-and-mariadb/
+        $options = [
+            \PDO::ATTR_EMULATE_PREPARES   => false,
+            \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
+            \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
+        ];
+        $this->connection = new \PDO($dsn, $user, $password);
+    }
 
-	// Инициализирует БД
-	public static function init($host=null,$db_name=null,$user=null,$password=null): void {
+    // Инициализирует БД
+    public static function init($host=null,$db_name=null,$user=null,$password=null): void {
 
-		$host		= $host 	? $host 	: $_ENV['db_host'];
-		$db_name	= $db_name 	? $db_name 	: $_ENV['db_name'];
-		$user		= $user 	? $user 	: $_ENV['db_user'];
-		$password	= $password ? $password : $_ENV['db_password'];
+        $host       = $host     ? $host     : $_ENV['db_host'];
+        $db_name    = $db_name  ? $db_name  : $_ENV['db_name'];
+        $user       = $user     ? $user     : $_ENV['db_user'];
+        $password   = $password ? $password : $_ENV['db_password'];
 
-		if (self::$db == null) {
-			self::$db = new Database(
-				"mysql:host=".$host.";dbname=".$db_name.";charset=utf8mb4",
-				$user,
-				$password
-			);
-		}
-	}
+        if (self::$db == null) {
+            self::$db = new Database(
+                "mysql:host=".$host.";dbname=".$db_name.";charset=utf8mb4",
+                $user,
+                $password
+            );
+        }
+    }
 
-	public static function getConnection() {
-		if (self::$db == null) {
-			self::init();
-		}
-		return self::$db->connection;
-	}
+    public static function getConnection() {
+        if (self::$db == null) {
+            self::init();
+        }
+        return self::$db->connection;
+    }
 }

+ 7 - 5
src/Common/User.php

@@ -4,19 +4,21 @@
 namespace BotKit\Common;
 
 use BotKit\Enums\State;
+use BotKit\Models\Model;
 
 class User {
     public function __construct(
-	private $platform_id,	// ID на платформе
-	private State $state,	// Состояние
-	private ?string $nick	// Короткий идентификатор пользователя
+        private $platform_id,   // ID на платформе
+        private State $state,   // Состояние
+        private ?string $nick,  // Короткий идентификатор пользователя
+        private Model $dbobj    // Модель из БД
     ) {}
 
     public function getPlatformID() {
-	return $this->platform_id;
+        return $this->platform_id;
     }
 
     public function getNick() : ?string {
-	return $this->nick;
+        return $this->nick;
     }
 }

+ 15 - 15
src/Drivers/Driver.php

@@ -12,24 +12,24 @@ use BotKit\Events\PlainMessageEvent;
 
 interface Driver {
 
-	// Возвращает true, если драйвер считает, что именно ему необходимо обработать этот запрос
-	public function forThis() : bool;
+    // Возвращает true, если драйвер считает, что именно ему необходимо обработать этот запрос
+    public function forThis() : bool;
 
-	// Возвращает событие на основании данных запроса
-	public function getEvent() : Event;
+    // Возвращает событие на основании данных запроса
+    public function getEvent() : Event;
 
-	// Отвечает на текстовое сообщение
-	// Если empathise=true, сообщение должно быть явным ответом
-	// $e - событие, на которое создаётся ответ
-	// $msg - сообщение ответа
-	public function reply(PlainMessageEvent $e, Message $msg, bool $empathise = true);
+    // Отвечает на текстовое сообщение
+    // Если empathise=true, сообщение должно быть явным ответом
+    // $e - событие, на которое создаётся ответ
+    // $msg - сообщение ответа
+    public function reply(PlainMessageEvent $e, Message $msg, bool $empathise = true);
 
-	// Отсылает сообщение пользователю
-	public function sendMessage(User $u, Message $msg);
+    // Отсылает сообщение пользователю
+    public function sendMessage(User $u, Message $msg);
 
-	// Отправляет сообщение в чат
-	public function sendToChat(Chat $chat, Message $msg);
+    // Отправляет сообщение в чат
+    public function sendToChat(Chat $chat, Message $msg);
 
-	// Возвращает ник пользователя, например @aquadim
-	public function getUserNick(User $u) : string;
+    // Возвращает ник пользователя, например @aquadim
+    public function getUserNick(User $u) : string;
 }

+ 26 - 3
src/Drivers/TgBotDriver.php

@@ -15,6 +15,7 @@ use BotKit\EventAttachments\DocumentAttachment;
 use BotKit\EventAttachments\ImageAttachment;
 use BotKit\Enums\Platform;
 use BotKit\Enums\State;
+use BotKit\Models\UserModel;
 
 class TgBotDriver implements Driver {
     // Токен бота
@@ -44,6 +45,7 @@ class TgBotDriver implements Driver {
 
     public function getEvent() : Event {
         $data = json_decode(file_get_contents("php://input"));
+        $db = Database::getConnection();
 
         if (property_exists($data, 'message')) {
             $chat = new Chat($data->message->chat->id);
@@ -51,10 +53,17 @@ class TgBotDriver implements Driver {
             if (property_exists($data->message, 'text')) {
                 // Обычное текстовое сообщение
 
+                // Получение объекта из БД
+                $obj = UserModel::getObject(
+                    $data->message->from->id,
+                    $this->platform
+                );
+
                 $user = new User(
                     $data->message->from->id,
                     State::Any,
-                    $data->message->from->username
+                    $data->message->from->username,
+                    $obj
                 );
                 $text = $data->message->text;
 
@@ -81,19 +90,33 @@ class TgBotDriver implements Driver {
             }
 
             if (property_exists($data->message, 'new_chat_member')) {
+                // Получение объекта из БД
+                $obj = UserModel::getObject(
+                    $data->message->from->id,
+                    $this->platform
+                );
+                
                 $user = new User(
                     $data->message->new_chat_member->id,
                     State::Any,
-                    $data->message->new_chat_member->username
+                    $data->message->new_chat_member->username,
+                    $obj
                 );
                 return new MemberJoinedEvent($user, $chat);
             }
     
             if (property_exists($data->message, 'left_chat_member')) {
+                // Получение объекта из БД
+                $obj = UserModel::getObject(
+                    $data->message->from->id,
+                    $this->platform
+                );
+
                 $user = new User(
                     $data->message->left_chat_member->id,
                     State::Any,
-                    $data->message->left_chat_member->username
+                    $data->message->left_chat_member->username,
+                    $obj
                 );
                 return new MemberLeftEvent($user, $chat);
             }

+ 18 - 18
src/Models/Model.php

@@ -7,35 +7,35 @@ namespace BotKit\Models;
 use BotKit\Common\Database;
 
 class Model {
-	protected static $allowed_columns;
+    protected static $allowed_columns;
 
-	protected static function allowedColumnsSQL() {
-		return implode(',', static::$allowed_columns);
-	}
+    protected static function allowedColumnsSQL() {
+        return implode(',', static::$allowed_columns);
+    }
 
-	// Возвращает все записи из таблицы
-	public static function all() {
-		$db = Database::getConnection();
-		return $db->query("SELECT ".static::allowedColumnsSQL()." FROM ".static::$table_name);
-	}
+    // Возвращает все записи из таблицы
+    public static function all() {
+        $db = Database::getConnection();
+        return $db->query("SELECT ".static::allowedColumnsSQL()." FROM ".static::$table_name);
+    }
 
-	// Возвращает записи по условиям
-	// Все условия должны быть истины, т. к. для построения запроса используется 'AND'
-	public static function where($conditions) {
+    // Возвращает записи по условиям
+    // Все условия должны быть истины, т. к. для построения запроса используется 'AND'
+    public static function where($conditions) {
         $db = Database::getConnection();
 
         // Построение текста условий
-		$conditions_sql = '';
+        $conditions_sql = '';
         $first_condition = true;
-		foreach ($conditions as $condition) {
+        foreach ($conditions as $condition) {
             if ($first_condition == false) {
                 $conditions_sql .= " AND ";
             }
-			$conditions_sql .= $condition[0].$condition[1].':'.$condition[0];
+            $conditions_sql .= $condition[0].$condition[1].':'.$condition[0];
             $first_condition = false;
-		}
+        }
 
-		$stm = $db->prepare(
+        $stm = $db->prepare(
             "SELECT ".static::allowedColumnsSQL()." FROM ".static::$table_name." WHERE ".$conditions_sql
         );
         foreach ($conditions as $condition) {
@@ -43,5 +43,5 @@ class Model {
         }
         $stm->execute();
         return $stm->fetchAll();
-	}
+    }
 }