Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
Arsen Mirzaev Tatyano-Muradovich | dd90f0adbe |
|
@ -32,7 +32,7 @@ class longpoll
|
||||||
disposition::filename as disposition_filename;
|
disposition::filename as disposition_filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
const COLLECTION_USERS = 'user';
|
const COLLECTION_ACCOUNTS = 'account';
|
||||||
const COLLECTION_GROUPS = 'group';
|
const COLLECTION_GROUPS = 'group';
|
||||||
const COLLECTION_CHATS = 'chat';
|
const COLLECTION_CHATS = 'chat';
|
||||||
const COLLECTION_MESSAGES = 'message';
|
const COLLECTION_MESSAGES = 'message';
|
||||||
|
@ -69,6 +69,7 @@ class longpoll
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
// Запись ошибки в буфер вывода
|
||||||
terminal::write($e->getMessage() . PHP_EOL . $e->getFile() . ':' . $e->getLine());
|
terminal::write($e->getMessage() . PHP_EOL . $e->getFile() . ':' . $e->getLine());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,8 +79,6 @@ class longpoll
|
||||||
/**
|
/**
|
||||||
* Событие: "message_new"
|
* Событие: "message_new"
|
||||||
*
|
*
|
||||||
* Новое сообщение
|
|
||||||
*
|
|
||||||
* @param array $data Данные сообщения
|
* @param array $data Данные сообщения
|
||||||
* @param int $group Идентификатор группы
|
* @param int $group Идентификатор группы
|
||||||
* @param string $event Идентификатор события
|
* @param string $event Идентификатор события
|
||||||
|
@ -91,17 +90,15 @@ class longpoll
|
||||||
if ($this->connection->create) {
|
if ($this->connection->create) {
|
||||||
// Запрошено создание коллекций в случае их отсутствия
|
// Запрошено создание коллекций в случае их отсутствия
|
||||||
|
|
||||||
collection::init($this->connection->session, static::COLLECTION_USERS);
|
// Инициализация коллекций
|
||||||
|
collection::init($this->connection->session, static::COLLECTION_ACCOUNTS);
|
||||||
collection::init($this->connection->session, static::COLLECTION_MESSAGES);
|
collection::init($this->connection->session, static::COLLECTION_MESSAGES);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($message = document::write($this->connection->session, static::COLLECTION_MESSAGES, static::messages($data, true))) {
|
if ($message = document::write($this->connection->session, static::COLLECTION_MESSAGES, static::messages($data, $data['message']['from_id']))) {
|
||||||
// Записано сообщение
|
// Записано сообщение
|
||||||
|
|
||||||
// Инициализация коллекции
|
// Инициализация субъектов
|
||||||
$collection = static::COLLECTION_MESSAGES;
|
|
||||||
|
|
||||||
// Инициализация аккаунтов
|
|
||||||
$from = ('mirzaev\\vk\\arangodb\\vk\\' . static::type($data['message']['from_id']))::init($this->connection->session, $data['message']['from_id']);
|
$from = ('mirzaev\\vk\\arangodb\\vk\\' . static::type($data['message']['from_id']))::init($this->connection->session, $data['message']['from_id']);
|
||||||
$to = ('mirzaev\\vk\\arangodb\\vk\\' . static::type($data['message']['peer_id']))::init($this->connection->session, $data['message']['peer_id']);
|
$to = ('mirzaev\\vk\\arangodb\\vk\\' . static::type($data['message']['peer_id']))::init($this->connection->session, $data['message']['peer_id']);
|
||||||
|
|
||||||
|
@ -111,14 +108,15 @@ class longpoll
|
||||||
if ($this->connection->create) {
|
if ($this->connection->create) {
|
||||||
// Запрошено создание коллекций в случае их отсутствия
|
// Запрошено создание коллекций в случае их отсутствия
|
||||||
|
|
||||||
|
// Инициализация коллекции
|
||||||
collection::init($this->connection->session, static::COLLECTION_ACCESSED, edge: true);
|
collection::init($this->connection->session, static::COLLECTION_ACCESSED, edge: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (document::write($this->connection->session, static::COLLECTION_ACCESSED, [], ['_from' => $from->getId(), '_to' => $message])) {
|
if (document::write($this->connection->session, static::COLLECTION_ACCESSED, ['_from' => $from->getId(), '_to' => $message])) {
|
||||||
// Записано ребро: АККАУНТ (отправитель) -> СООБЩЕНИЕ
|
// Записано ребро: АККАУНТ (отправитель) -> СООБЩЕНИЕ
|
||||||
}
|
}
|
||||||
|
|
||||||
if (document::write($this->connection->session, static::COLLECTION_ACCESSED, [], ['_from' => $message, '_to' => $to->getId()])) {
|
if (document::write($this->connection->session, static::COLLECTION_ACCESSED, ['_from' => $message, '_to' => $to->getId()])) {
|
||||||
// Записно ребро: СООБЩЕНИЕ -> АККАУНТ (получатель)
|
// Записно ребро: СООБЩЕНИЕ -> АККАУНТ (получатель)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,12 +125,16 @@ class longpoll
|
||||||
if ($this->journal && journal::init($this->connection->session, $message)->write('create', [
|
if ($this->journal && journal::init($this->connection->session, $message)->write('create', [
|
||||||
'account' => $from,
|
'account' => $from,
|
||||||
'changes' => [
|
'changes' => [
|
||||||
'new' => collection::search($this->connection->session, <<<AQL
|
'new' => collection::search($this->connection->session, sprintf(
|
||||||
FOR a IN $collection
|
<<<'AQL'
|
||||||
FILTER a._id == $message
|
FOR a IN %s
|
||||||
LIMIT 1
|
FILTER a._id == "%s"
|
||||||
RETURN a.data
|
LIMIT 1
|
||||||
AQL),
|
RETURN a.data
|
||||||
|
AQL,
|
||||||
|
static::COLLECTION_MESSAGES,
|
||||||
|
$message
|
||||||
|
)),
|
||||||
'old' => null
|
'old' => null
|
||||||
]
|
]
|
||||||
])) {
|
])) {
|
||||||
|
@ -150,8 +152,8 @@ class longpoll
|
||||||
* Обработка сообщений
|
* Обработка сообщений
|
||||||
*
|
*
|
||||||
* @param array $messages Сообщения или сообщение
|
* @param array $messages Сообщения или сообщение
|
||||||
* @param bool $download Активация скачивания файлов на сервер
|
* @param ?int $id Идентификатор аккаунта которому принадлежат вложения
|
||||||
* @param bool $clean Активация очистки массива от пустых данных сообщения
|
* @param bool $clean Очистить массив от пустых данных?
|
||||||
*
|
*
|
||||||
* @return array Обработанные сообщения (зависит от входных данных)
|
* @return array Обработанные сообщения (зависит от входных данных)
|
||||||
*
|
*
|
||||||
|
@ -163,94 +165,87 @@ class longpoll
|
||||||
* 5. Переделать $message['vk']['metadata']['conversation']['members']['amount_test'] (или удалить)
|
* 5. Переделать $message['vk']['metadata']['conversation']['members']['amount_test'] (или удалить)
|
||||||
* 6. Разобраться с "Мультидиалогом" для старых версий API и существует ли он в новых
|
* 6. Разобраться с "Мультидиалогом" для старых версий API и существует ли он в новых
|
||||||
*/
|
*/
|
||||||
public static function messages(array $messages, bool $download = false, bool $clean = true): array
|
public static function messages(array $messages, ?int $id = null, bool $clean = true): array
|
||||||
{
|
{
|
||||||
if (isset($messages['message'])) {
|
// Универсализация входных данных - передано одно сообщение
|
||||||
// Передано одно сообщение
|
if (isset($messages['message'])) $buffer[] = &$messages;
|
||||||
|
|
||||||
// Инициализация
|
|
||||||
$buffer[] = &$messages;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($buffer ?? $messages as &$message) {
|
foreach ($buffer ?? $messages as &$message) {
|
||||||
// Перебор сообщений
|
// Перебор сообщений
|
||||||
|
|
||||||
|
// Инициализация сообщения
|
||||||
$message = [
|
$message = [
|
||||||
'data' => [
|
'id' => [
|
||||||
'id' => [
|
'global' => $message['message']['id'],
|
||||||
'global' => $message['message']['id'],
|
'local' => $message['message']['conversation_message_id']
|
||||||
'local' => $message['message']['conversation_message_id']
|
|
||||||
],
|
|
||||||
'text' => $message['message']['text'] ?? $message['message']['body'],
|
|
||||||
'forward' => static::messages($message['message']['fwd_messages']),
|
|
||||||
'reply' => static::messages($message['message']['fwd_messages']),
|
|
||||||
'attachments' => static::attachments($message['message']['attachments'], $download, $clean)
|
|
||||||
],
|
],
|
||||||
'metadata' => [
|
'text' => $message['message']['text'] ?? $message['message']['body'],
|
||||||
'date' => [
|
'forward' => static::messages($message['message']['fwd_messages']),
|
||||||
'create' => $message['message']['date'] ?? null,
|
'reply' => static::messages($message['message']['fwd_messages']),
|
||||||
'update' => $message['message']['update_time'] ?? null
|
'attachments' => static::attachments($message['message']['attachments'], $id, $clean),
|
||||||
|
'date' => [
|
||||||
|
'create' => $message['message']['date'] ?? null,
|
||||||
|
'update' => $message['message']['update_time'] ?? null
|
||||||
|
],
|
||||||
|
'action' => [
|
||||||
|
'type' => $message['message']['action'] ?? null,
|
||||||
|
'target' => [
|
||||||
|
'id' => $message['message']['action']['member_id'] ?? null
|
||||||
],
|
],
|
||||||
'action' => [
|
'text' => $message['message']['action']['text'] ?? null,
|
||||||
'type' => $message['message']['action'] ?? null,
|
'email ' => $message['message']['action']['email'] ?? null,
|
||||||
'target' => [
|
'cover ' => $message['message']['action']['photo'] ?? null
|
||||||
'id' => $message['message']['action']['member_id'] ?? null
|
],
|
||||||
],
|
'hash' => $message['message']['random_id'] ?? null,
|
||||||
'text' => $message['message']['action']['text'] ?? null,
|
'type' => $message['message']['out'] ?? null,
|
||||||
'email ' => $message['message']['action']['email'] ?? null,
|
'admin' => [
|
||||||
'cover ' => $message['message']['action']['photo'] ?? null
|
'id' => $message['message']['admin_author_id'] ?? null
|
||||||
],
|
],
|
||||||
'hash' => $message['message']['random_id'] ?? null,
|
'pinned' => [
|
||||||
'type' => $message['message']['out'] ?? null,
|
'date' => $message['message']['pinned_at'] ?? null
|
||||||
|
],
|
||||||
|
'emoji' => $message['message']['emoji'] ?? null,
|
||||||
|
'readed' => $message['message']['read_state'] ?? null,
|
||||||
|
'listened' => $message['message']['was_listened'] ?? null,
|
||||||
|
'hidden' => $message['message']['is_hidden'] ?? null,
|
||||||
|
'cropped' => $message['message']['is_cropped'] ?? null,
|
||||||
|
'deleted' => $message['message']['deleted'] ?? null,
|
||||||
|
'conversation' =>
|
||||||
|
[
|
||||||
|
'id' => $message['message']['chat_id'] ?? null,
|
||||||
'admin' => [
|
'admin' => [
|
||||||
'id' => $message['message']['admin_author_id'] ?? null
|
'id' => $message['message']['admin_id'] ?? null
|
||||||
],
|
],
|
||||||
'pinned' => [
|
'title' => $message['message']['title'] ?? null,
|
||||||
'date' => $message['message']['pinned_at'] ?? null
|
'members' => [
|
||||||
|
'amount' => $message['message']['members_count'] ?? null,
|
||||||
|
'amount_test' => $message['message']['users_count'] ?? null
|
||||||
],
|
],
|
||||||
'emoji' => $message['message']['emoji'] ?? null,
|
'active' => $message['message']['chat_active'] ?? null,
|
||||||
'readed' => $message['message']['read_state'] ?? null,
|
'settings' => [
|
||||||
'listened' => $message['message']['was_listened'] ?? null,
|
'push' => $message['message']['push_settings'] ?? null
|
||||||
'hidden' => $message['message']['is_hidden'] ?? null,
|
]
|
||||||
'cropped' => $message['message']['is_cropped'] ?? null,
|
],
|
||||||
'deleted' => $message['message']['deleted'] ?? null,
|
'important' => $message['message']['important'] ?? null,
|
||||||
'conversation' =>
|
'source' => [
|
||||||
[
|
'from' => $message['message']['ref'] ?? null,
|
||||||
'id' => $message['message']['chat_id'] ?? null,
|
'data' => $message['message']['ref_source'] ?? null
|
||||||
'admin' => [
|
],
|
||||||
'id' => $message['message']['admin_id'] ?? null
|
'payload' => $message['message']['payload'] ?? null,
|
||||||
],
|
'geo' => [
|
||||||
'title' => $message['message']['title'] ?? null,
|
$message['message']['geo'] ?? null
|
||||||
'members' => [
|
],
|
||||||
'amount' => $message['message']['members_count'] ?? null,
|
'keyboard' => [
|
||||||
'amount_test' => $message['message']['users_count'] ?? null
|
'block' => $message['client_info']['keyboard'] ?? null,
|
||||||
],
|
'inline' => $message['client_info']['inline_keyboard'] ?? null,
|
||||||
'active' => $message['message']['chat_active'] ?? null,
|
'buttons' => $message['client_info']['button_actions'] ?? null,
|
||||||
'settings' => [
|
],
|
||||||
'push' => $message['message']['push_settings'] ?? null
|
'carousel' => $message['client_info']['carousel'] ?? null,
|
||||||
]
|
'language' => $message['client_info']['lang_id'] ?? null,
|
||||||
],
|
|
||||||
'important' => $message['message']['important'] ?? null,
|
|
||||||
'source' => [
|
|
||||||
'from' => $message['message']['ref'] ?? null,
|
|
||||||
'data' => $message['message']['ref_source'] ?? null
|
|
||||||
],
|
|
||||||
'payload' => $message['message']['payload'] ?? null,
|
|
||||||
'geo' => [
|
|
||||||
$message['message']['geo'] ?? null
|
|
||||||
],
|
|
||||||
'keyboard' => [
|
|
||||||
'block' => $message['client_info']['keyboard'] ?? null,
|
|
||||||
'inline' => $message['client_info']['inline_keyboard'] ?? null,
|
|
||||||
'buttons' => $message['client_info']['button_actions'] ?? null,
|
|
||||||
],
|
|
||||||
'carousel' => $message['client_info']['carousel'] ?? null,
|
|
||||||
'language' => $message['client_info']['lang_id'] ?? null,
|
|
||||||
]
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Очистка массива, если активировано
|
// Очистка массива
|
||||||
$clean and static::cleaner($messages);
|
$clean and static::cleaner($messages);
|
||||||
|
|
||||||
return $messages;
|
return $messages;
|
||||||
|
@ -260,12 +255,12 @@ class longpoll
|
||||||
* Обработка вложений
|
* Обработка вложений
|
||||||
*
|
*
|
||||||
* @param array $attachments Вложения
|
* @param array $attachments Вложения
|
||||||
* @param bool $download Активация скачивания файлов на сервер
|
* @param ?int $id Идентификатор аккаунта которому принадлежат изображения
|
||||||
* @param bool $clean Активация очистки массива от пустых данных сообщения
|
* @param bool $clean Очистить массив от пустых данных?
|
||||||
*
|
*
|
||||||
* @return array Обработанные вложения
|
* @return array Обработанные вложения
|
||||||
*/
|
*/
|
||||||
public static function attachments(array $attachments, bool $download = false, bool $clean = false): array
|
public static function attachments(array $attachments, ?int $id = null, bool $clean = true): array
|
||||||
{
|
{
|
||||||
foreach ($attachments as &$attachment) {
|
foreach ($attachments as &$attachment) {
|
||||||
// Перебор вложений
|
// Перебор вложений
|
||||||
|
@ -289,7 +284,7 @@ class longpoll
|
||||||
'key' => $attachment['photo']['access_key'] ?? null
|
'key' => $attachment['photo']['access_key'] ?? null
|
||||||
],
|
],
|
||||||
'text' => $attachment['photo']['text'] ?? null,
|
'text' => $attachment['photo']['text'] ?? null,
|
||||||
'storage' => static::sizes($attachment['photo']['sizes'], $download) ?? null
|
'storage' => static::sizes($attachment['photo']['sizes'], $id) ?? null
|
||||||
],
|
],
|
||||||
'metadata' => [
|
'metadata' => [
|
||||||
'type' => $attachment['type'] ?? null
|
'type' => $attachment['type'] ?? null
|
||||||
|
@ -298,36 +293,35 @@ class longpoll
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Очистка массива, если активировано
|
// Очистка массива
|
||||||
$clean and static::cleaner($attachments);
|
$clean and static::cleaner($attachments);
|
||||||
|
|
||||||
return $attachments;
|
return $attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Сортировка размеров файла из вложения
|
* Сортировка размеров изображения из вложения
|
||||||
*
|
|
||||||
* @param array $sizes Размеры файла согласно спецификации в API
|
|
||||||
* @param bool $download Активация скачивания файлов на сервер
|
|
||||||
* @param int|null $id Идентификатор аккаунта кому принадлежат изображения
|
|
||||||
*
|
|
||||||
* @return array Обработанные размеры
|
|
||||||
*
|
*
|
||||||
* @see https://vk.com/dev/photo_sizes
|
* @see https://vk.com/dev/photo_sizes
|
||||||
|
*
|
||||||
|
* @param array $sizes Размеры изображения согласно спецификации в API
|
||||||
|
* @param ?int $id Идентификатор аккаунта которому принадлежат изображения
|
||||||
|
*
|
||||||
|
* @return array Обработанные размеры
|
||||||
*/
|
*/
|
||||||
public static function sizes(array $sizes, bool $download = false, int|null $id = null): array
|
public static function sizes(array $sizes, ?int $id = null): array
|
||||||
{
|
{
|
||||||
foreach ($sizes as &$size) {
|
foreach ($sizes as &$size) {
|
||||||
// Перебор размеров
|
// Перебор размеров
|
||||||
|
|
||||||
if ($download) {
|
if (isset($id)) {
|
||||||
// Запрошено сохранение на сервер
|
// Запрошена запись файлов на сервер
|
||||||
|
|
||||||
// Инициализация
|
// Инициализация
|
||||||
$browser = new Guzzle();
|
$browser = new Guzzle();
|
||||||
|
|
||||||
// Инициализация директории
|
// Инициализация директории
|
||||||
if (!file_exists($path = static::$path_storage . (isset($id) ? static::$path_storage_accounts . PHP_EOL . $id : static::$path_storage_vk) . static::$path_storage_accounts_images . PHP_EOL . date('Y_m_d', time())))
|
if (!file_exists($path = static::$path_storage . static::$path_storage_accounts . PHP_EOL . $id . static::$path_storage_accounts_images . PHP_EOL . date('Y_m_d', time())))
|
||||||
if (!mkdir($path, 0755, true))
|
if (!mkdir($path, 0755, true))
|
||||||
throw new Exception('Не удалось инициализировать директорию: ' . $path);
|
throw new Exception('Не удалось инициализировать директорию: ' . $path);
|
||||||
|
|
||||||
|
@ -371,8 +365,13 @@ class longpoll
|
||||||
return $sizes;
|
return $sizes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
// Инициализация
|
* Очистить массив от пустых значений
|
||||||
|
*
|
||||||
|
* @param array $target Обрабатываемый массив
|
||||||
|
*
|
||||||
|
* @return bool Массив был изменён?
|
||||||
|
*/
|
||||||
public static function cleaner(array &$target): bool
|
public static function cleaner(array &$target): bool
|
||||||
{
|
{
|
||||||
// Инициализация
|
// Инициализация
|
||||||
|
@ -400,9 +399,16 @@ class longpoll
|
||||||
return $changes;
|
return $changes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function truncate()
|
/**
|
||||||
|
* Очистить базу данных
|
||||||
|
*
|
||||||
|
* Предполагается использование для автоматизации тестирования
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function truncate(): void
|
||||||
{
|
{
|
||||||
collection::truncate($this->connection->session, static::COLLECTION_USERS);
|
collection::truncate($this->connection->session, static::COLLECTION_ACCOUNTS);
|
||||||
collection::truncate($this->connection->session, static::COLLECTION_GROUPS);
|
collection::truncate($this->connection->session, static::COLLECTION_GROUPS);
|
||||||
collection::truncate($this->connection->session, static::COLLECTION_CHATS);
|
collection::truncate($this->connection->session, static::COLLECTION_CHATS);
|
||||||
collection::truncate($this->connection->session, static::COLLECTION_MESSAGES);
|
collection::truncate($this->connection->session, static::COLLECTION_MESSAGES);
|
||||||
|
@ -411,11 +417,11 @@ class longpoll
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Определить тип аккаунта
|
* Определить тип субъекта
|
||||||
*
|
*
|
||||||
* @param int $id Идентификатор
|
* @param int $id Идентификатор
|
||||||
*
|
*
|
||||||
* @return string Возвращает 'user', если не прошли другие проверки
|
* @return string Возвращает static::COLLECTION_ACCOUNTS, если не прошли другие проверки
|
||||||
*/
|
*/
|
||||||
public static function type(int $id): string
|
public static function type(int $id): string
|
||||||
{
|
{
|
||||||
|
@ -423,8 +429,9 @@ class longpoll
|
||||||
if ($id - 2000000000 >= 0) return static::COLLECTION_CHATS;
|
if ($id - 2000000000 >= 0) return static::COLLECTION_CHATS;
|
||||||
|
|
||||||
// Группа
|
// Группа
|
||||||
if (((string) $id)[0] === '-') return static::COLLECTION_GROUPS;
|
if ($id < 0) return static::COLLECTION_GROUPS;
|
||||||
|
|
||||||
return static::COLLECTION_USERS;
|
// Аккаунт
|
||||||
|
return static::COLLECTION_ACCOUNTS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace mirzaev\vk\arangodb\vk;
|
||||||
|
|
||||||
|
// Модуль ArangoDB для фреймворка ВКонтакте
|
||||||
|
use mirzaev\vk\arangodb\longpoll,
|
||||||
|
mirzaev\vk\arangodb\journal;
|
||||||
|
|
||||||
|
// Фреймворк ArangoDB
|
||||||
|
use mirzaev\arangodb\collection,
|
||||||
|
mirzaev\arangodb\document;
|
||||||
|
|
||||||
|
// Библиотека для работы с API ArabgoDB
|
||||||
|
use ArangoDBClient\Document as _document,
|
||||||
|
ArangoDBClient\Connection as _connection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Аккаунт ВКонтакте
|
||||||
|
*
|
||||||
|
* @package mirzaev\vk\arangodb\vk
|
||||||
|
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||||
|
*/
|
||||||
|
class account
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Инициализировать
|
||||||
|
*
|
||||||
|
* @param _connection $session Сессия соединения с базой данных
|
||||||
|
* @param int $id Идентификатор ВКонтакте
|
||||||
|
* @param bool $journal Записывать в журнал?
|
||||||
|
* @param bool $create Создавать коллекции при их отсутствии?
|
||||||
|
*
|
||||||
|
* @return ?_document Инстанция документа
|
||||||
|
*/
|
||||||
|
public static function init(_connection $session, int $id, bool $journal = true, bool $create = true): ?_document
|
||||||
|
{
|
||||||
|
if ($create) {
|
||||||
|
// Запрошено создание коллекций в случае их отсутствия
|
||||||
|
|
||||||
|
// Инициализация коллекции
|
||||||
|
collection::init($session, longpoll::COLLECTION_ACCOUNTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Поиск
|
||||||
|
if ($account = static::search($session, $id));
|
||||||
|
else if ($account = document::write($session, longpoll::COLLECTION_ACCOUNTS, ['id' => $id]) and $journal)
|
||||||
|
journal::init($session, $account)->write('create', [
|
||||||
|
'changes' => [
|
||||||
|
'new' => collection::search($session, sprintf(
|
||||||
|
<<<'AQL'
|
||||||
|
FOR x IN %s
|
||||||
|
FILTER x._id == "%s"
|
||||||
|
LIMIT 1
|
||||||
|
RETURN x
|
||||||
|
AQL,
|
||||||
|
longpoll::COLLECTION_ACCOUNTS,
|
||||||
|
$account
|
||||||
|
)),
|
||||||
|
'old' => null
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Поиск
|
||||||
|
return static::search($session, $id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Найти
|
||||||
|
*
|
||||||
|
* @param _connection $session Сессия соединения с базой данных
|
||||||
|
* @param int $id Идентификатор ВКонтакте
|
||||||
|
*
|
||||||
|
* @return ?_document Инстанция документа
|
||||||
|
*/
|
||||||
|
public static function search(_connection $session, int $id): ?_document
|
||||||
|
{
|
||||||
|
return collection::search($session, sprintf(
|
||||||
|
<<<'AQL'
|
||||||
|
FOR x IN %s
|
||||||
|
FILTER x.id == %u
|
||||||
|
LIMIT 1
|
||||||
|
RETURN x
|
||||||
|
AQL,
|
||||||
|
longpoll::COLLECTION_ACCOUNTS,
|
||||||
|
$id
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,14 +4,24 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace mirzaev\vk\arangodb\vk;
|
namespace mirzaev\vk\arangodb\vk;
|
||||||
|
|
||||||
use mirzaev\vk\arangodb\longpoll;
|
// Модуль ArangoDB для фреймворка ВКонтакте
|
||||||
use mirzaev\vk\arangodb\journal;
|
use mirzaev\vk\arangodb\longpoll,
|
||||||
use mirzaev\arangodb\collection;
|
mirzaev\vk\arangodb\journal;
|
||||||
use mirzaev\arangodb\document;
|
|
||||||
use ArangoDBClient\Document as _document;
|
|
||||||
|
|
||||||
use ArangoDBClient\Connection as _connection;
|
// Фреймворк ArangoDB
|
||||||
|
use mirzaev\arangodb\collection,
|
||||||
|
mirzaev\arangodb\document;
|
||||||
|
|
||||||
|
// Библиотека для работы с API ArabgoDB
|
||||||
|
use ArangoDBClient\Document as _document,
|
||||||
|
ArangoDBClient\Connection as _connection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Чат ВКонтакте
|
||||||
|
*
|
||||||
|
* @package mirzaev\vk\arangodb\vk
|
||||||
|
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||||
|
*/
|
||||||
class chat
|
class chat
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -19,64 +29,62 @@ class chat
|
||||||
*
|
*
|
||||||
* @param _connection $session Сессия соединения с базой данных
|
* @param _connection $session Сессия соединения с базой данных
|
||||||
* @param int $id Идентификатор ВКонтакте
|
* @param int $id Идентификатор ВКонтакте
|
||||||
* @param bool $journal Записывать в журнал
|
* @param bool $journal Записывать в журнал?
|
||||||
* @param bool $create Создавать коллекции при их отсутствии
|
* @param bool $create Создавать коллекции при их отсутствии?
|
||||||
*
|
*
|
||||||
* @return ?_document Инстанция документа
|
* @return ?_document Инстанция документа
|
||||||
*/
|
*/
|
||||||
public static function init(_connection $session, int $id, bool $journal = true, bool $create = true): ?_document
|
public static function init(_connection $session, int $id, bool $journal = true, bool $create = true): ?_document
|
||||||
{
|
{
|
||||||
// Инициализация коллекции
|
|
||||||
$collection = longpoll::COLLECTION_CHATS;
|
|
||||||
|
|
||||||
if ($create) {
|
if ($create) {
|
||||||
// Запрошено создание коллекций в случае их отсутствия
|
// Запрошено создание коллекций в случае их отсутствия
|
||||||
|
|
||||||
// Создание коллекции
|
// Создание коллекции
|
||||||
collection::init($session, $collection);
|
collection::init($session, longpoll::COLLECTION_CHATS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($account = collection::search($session, <<<AQL
|
// Поиск
|
||||||
FOR x IN $collection
|
if ($chat = static::search($session, $id));
|
||||||
FILTER x.data.data.id == $id
|
else if ($chat = document::write($session, longpoll::COLLECTION_CHATS, ['id' => $id]) and $journal)
|
||||||
LIMIT 1
|
journal::init($session, $chat)->write('create', [
|
||||||
RETURN x.data
|
|
||||||
AQL)) {
|
|
||||||
// Найден аккаунт
|
|
||||||
|
|
||||||
return $account;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($account = document::write($session, $collection, ['data' => ['id' => $id]])) {
|
|
||||||
// Аккаунт записан
|
|
||||||
|
|
||||||
// Журналирование
|
|
||||||
if ($journal && journal::init($session, $account)->write('create', [
|
|
||||||
'changes' => [
|
'changes' => [
|
||||||
'new' => collection::search($session, <<<AQL
|
'new' => collection::search($session, sprintf(
|
||||||
FOR a IN $collection
|
<<<'AQL'
|
||||||
FILTER a._id == $account
|
FOR x IN %s
|
||||||
|
FILTER x._id == "%s"
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
RETURN a.data
|
RETURN x
|
||||||
AQL),
|
AQL,
|
||||||
|
longpoll::COLLECTION_CHATS,
|
||||||
|
$chat
|
||||||
|
)),
|
||||||
'old' => null
|
'old' => null
|
||||||
]
|
]
|
||||||
])) {
|
]);
|
||||||
// Записаны данные в журнал
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($account = collection::search($session, <<<AQL
|
// Поиск
|
||||||
FOR x IN $collection
|
return static::search($session, $id);
|
||||||
FILTER x.data.data.id == $id
|
}
|
||||||
LIMIT 1
|
|
||||||
RETURN x
|
|
||||||
AQL)) {
|
|
||||||
// Найден аккаунт
|
|
||||||
|
|
||||||
return $account;
|
/**
|
||||||
}
|
* Найти в базе данных
|
||||||
}
|
*
|
||||||
|
* @param _connection $session Сессия соединения с базой данных
|
||||||
return null;
|
* @param int $id Идентификатор ВКонтакте
|
||||||
|
*
|
||||||
|
* @return ?_document Инстанция документа
|
||||||
|
*/
|
||||||
|
public static function search(_connection $session, int $id): ?_document
|
||||||
|
{
|
||||||
|
return collection::search($session, sprintf(
|
||||||
|
<<<'AQL'
|
||||||
|
FOR x IN %s
|
||||||
|
FILTER x.id == %u
|
||||||
|
LIMIT 1
|
||||||
|
RETURN x
|
||||||
|
AQL,
|
||||||
|
longpoll::COLLECTION_CHATS,
|
||||||
|
$id
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,64 +19,63 @@ class group
|
||||||
*
|
*
|
||||||
* @param _connection $session Сессия соединения с базой данных
|
* @param _connection $session Сессия соединения с базой данных
|
||||||
* @param int $id Идентификатор ВКонтакте
|
* @param int $id Идентификатор ВКонтакте
|
||||||
* @param bool $journal Записывать в журнал
|
* @param bool $journal Записывать в журнал?
|
||||||
* @param bool $create Создавать коллекции при их отсутствии
|
* @param bool $create Создавать коллекции при их отсутствии?
|
||||||
*
|
*
|
||||||
* @return ?_document Инстанция документа
|
* @return ?_document Инстанция документа
|
||||||
*/
|
*/
|
||||||
public static function init(_connection $session, int $id, bool $journal = true, bool $create = true): ?_document
|
public static function init(_connection $session, int $id, bool $journal = true, bool $create = true): ?_document
|
||||||
{
|
{
|
||||||
// Инициализация коллекции
|
|
||||||
$collection = longpoll::COLLECTION_GROUPS;
|
|
||||||
|
|
||||||
if ($create) {
|
if ($create) {
|
||||||
// Запрошено создание коллекций в случае их отсутствия
|
// Запрошено создание коллекций в случае их отсутствия
|
||||||
|
|
||||||
// Создание коллекции
|
// Создание коллекции
|
||||||
collection::init($session, $collection);
|
collection::init($session, longpoll::COLLECTION_GROUPS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($account = collection::search($session, <<<AQL
|
// Поиск
|
||||||
FOR x IN $collection
|
if ($group = static::search($session, $id));
|
||||||
FILTER x.data.data.id == $id
|
else if ($group = document::write($session, longpoll::COLLECTION_GROUPS, ['id' => $id]) and $journal)
|
||||||
LIMIT 1
|
journal::init($session, $group)->write('create', [
|
||||||
RETURN x.data
|
|
||||||
AQL)) {
|
|
||||||
// Найден аккаунт
|
|
||||||
|
|
||||||
return $account;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($account = document::write($session, $collection, ['data' => ['id' => $id]])) {
|
|
||||||
// Аккаунт записан
|
|
||||||
|
|
||||||
// Журналирование
|
|
||||||
if ($journal && journal::init($session, $account)->write('create', [
|
|
||||||
'changes' => [
|
'changes' => [
|
||||||
'new' => collection::search($session, <<<AQL
|
'new' => collection::search($session, sprintf(
|
||||||
FOR a IN $collection
|
<<<'AQL'
|
||||||
FILTER a._id == $account
|
FOR x IN %s
|
||||||
|
FILTER x._id == "%s"
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
RETURN a.data
|
RETURN x
|
||||||
AQL),
|
AQL,
|
||||||
|
longpoll::COLLECTION_GROUPS,
|
||||||
|
$group
|
||||||
|
)),
|
||||||
'old' => null
|
'old' => null
|
||||||
]
|
]
|
||||||
])) {
|
]);
|
||||||
// Записаны данные в журнал
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($account = collection::search($session, <<<AQL
|
|
||||||
FOR x IN $collection
|
|
||||||
FILTER x.data.data.id == $id
|
|
||||||
LIMIT 1
|
|
||||||
RETURN x
|
|
||||||
AQL)) {
|
|
||||||
// Найден аккаунт
|
|
||||||
|
|
||||||
return $account;
|
// Поиск
|
||||||
}
|
return static::search($session, $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
/**
|
||||||
|
* Найти в базе данных
|
||||||
|
*
|
||||||
|
* @param _connection $session Сессия соединения с базой данных
|
||||||
|
* @param int $id Идентификатор ВКонтакте
|
||||||
|
*
|
||||||
|
* @return ?_document Инстанция документа
|
||||||
|
*/
|
||||||
|
public static function search(_connection $session, int $id): ?_document
|
||||||
|
{
|
||||||
|
return collection::search($session, sprintf(
|
||||||
|
<<<'AQL'
|
||||||
|
FOR x IN %s
|
||||||
|
FILTER x.id == %d
|
||||||
|
LIMIT 1
|
||||||
|
RETURN x
|
||||||
|
AQL,
|
||||||
|
longpoll::COLLECTION_GROUPS,
|
||||||
|
$id
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace mirzaev\vk\arangodb\vk;
|
|
||||||
|
|
||||||
use mirzaev\vk\arangodb\longpoll;
|
|
||||||
use mirzaev\vk\arangodb\journal;
|
|
||||||
use mirzaev\arangodb\collection;
|
|
||||||
use mirzaev\arangodb\document;
|
|
||||||
use ArangoDBClient\Document as _document;
|
|
||||||
|
|
||||||
use ArangoDBClient\Connection as _connection;
|
|
||||||
|
|
||||||
class user
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Инициализация
|
|
||||||
*
|
|
||||||
* @param _connection $session Сессия соединения с базой данных
|
|
||||||
* @param int $id Идентификатор ВКонтакте
|
|
||||||
* @param bool $journal Записывать в журнал
|
|
||||||
* @param bool $create Создавать коллекции при их отсутствии
|
|
||||||
*
|
|
||||||
* @return ?_document Инстанция документа
|
|
||||||
*/
|
|
||||||
public static function init(_connection $session, int $id, bool $journal = true, bool $create = true): ?_document
|
|
||||||
{
|
|
||||||
// Инициализация коллекции
|
|
||||||
$collection = longpoll::COLLECTION_USERS;
|
|
||||||
|
|
||||||
if ($create) {
|
|
||||||
// Запрошено создание коллекций в случае их отсутствия
|
|
||||||
|
|
||||||
// Создание коллекции
|
|
||||||
collection::init($session, $collection);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($account = collection::search($session, <<<AQL
|
|
||||||
FOR x IN $collection
|
|
||||||
FILTER x.id == $id
|
|
||||||
LIMIT 1
|
|
||||||
RETURN x
|
|
||||||
AQL)) {
|
|
||||||
// Найден аккаунт
|
|
||||||
|
|
||||||
return $account;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($account = document::write($session, $collection, ['id' => $id])) {
|
|
||||||
// Аккаунт записан
|
|
||||||
|
|
||||||
// Журналирование
|
|
||||||
if ($journal && journal::init($session, $account)->write('create', [
|
|
||||||
'changes' => [
|
|
||||||
'new' => collection::search($session, <<<AQL
|
|
||||||
FOR a IN $collection
|
|
||||||
FILTER a._id == $account
|
|
||||||
LIMIT 1
|
|
||||||
RETURN a.data
|
|
||||||
AQL),
|
|
||||||
'old' => null
|
|
||||||
]
|
|
||||||
])) {
|
|
||||||
// Записаны данные в журнал
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($account = collection::search($session, <<<AQL
|
|
||||||
FOR x IN $collection
|
|
||||||
FILTER x.data.data.id == $id
|
|
||||||
LIMIT 1
|
|
||||||
RETURN x
|
|
||||||
AQL)) {
|
|
||||||
// Найден аккаунт
|
|
||||||
|
|
||||||
return $account;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue