diff --git a/composer.json b/composer.json index 2bedacb..80d56cc 100644 --- a/composer.json +++ b/composer.json @@ -1,14 +1,13 @@ { - "name": "hood/vk", + "name": "mirzaev/vk", "type": "framework", "description": "Фреймворк VK API", "keywords": [ "vk", - "api", - "hood" + "api" ], - "homepage": "https://git.hood.su/vk", - "license": "AGPL-3.0-or-later", + "homepage": "https://git.hood.su/mirzaev/vk", + "license": "WTFPL", "authors": [ { "name": "Arsen Mirzaev Tatyano-Muradovich", @@ -23,13 +22,13 @@ } ], "support": { - "docs": "https://git.hood.su/hood/vk/manual", - "issues": "https://git.hood.su/hood/vk/issues" + "docs": "https://git.hood.su/mirzaev/vk/manual", + "issues": "https://git.hood.su/mirzaev/vk/issues" }, "require": { "php": "~8.0", "psr/log": "~1.0", - "hood/accounts": "~0.1.x-dev", + "mirzaev/accounts": "~0.1.x-dev", "monolog/monolog": "~1.6", "jasny/error-handler": "~0.2", "guzzlehttp/guzzle": "~7.2" @@ -39,12 +38,12 @@ }, "autoload": { "psr-4": { - "hood\\vk\\": "hood/vk/system" + "mirzaev\\vk\\": "mirzaev/vk/system" } }, "autoload-dev": { "psr-4": { - "hood\\vk\\tests\\": "hood/vk/tests" + "mirzaev\\vk\\tests\\": "mirzaev/vk/tests" } } } diff --git a/composer.lock b/composer.lock index 3084fcb..ecd09d6 100644 --- a/composer.lock +++ b/composer.lock @@ -12,22 +12,22 @@ "packages": [ { "name": "guzzlehttp/guzzle", - "version": "7.2.0", + "version": "7.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79" + "reference": "7008573787b430c1c1f650e3722d9bba59967628" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0aa74dfb41ae110835923ef10a9d803a22d50e79", - "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628", + "reference": "7008573787b430c1c1f650e3722d9bba59967628", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7", + "guzzlehttp/psr7": "^1.7 || ^2.0", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0" }, @@ -35,6 +35,7 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", "ext-curl": "*", "php-http/client-integration-tests": "^3.0", "phpunit/phpunit": "^8.5.5 || ^9.3.5", @@ -48,7 +49,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.1-dev" + "dev-master": "7.3-dev" } }, "autoload": { @@ -88,6 +89,10 @@ "rest", "web service" ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.3.0" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -290,23 +295,27 @@ "type": "Hood" } ], +<<<<<<< HEAD <<<<<<< HEAD "time": "2020-10-25T06:14:50+00:00" ======= "time": "2020-10-10T11:47:56+00:00" +======= + "time": "2021-03-23T11:33:13+00:00" +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2 }, { "name": "guzzlehttp/promises", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "60d379c243457e073cff02bc323a2a86cb355631" + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", - "reference": "60d379c243457e073cff02bc323a2a86cb355631", + "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", "shasum": "" }, "require": { @@ -344,20 +353,24 @@ "keywords": [ "promise" ], - "time": "2020-09-30T07:37:28+00:00" + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.1" + }, + "time": "2021-03-07T09:25:29+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.7.0", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", "shasum": "" }, "require": { @@ -415,7 +428,11 @@ "uri", "url" ], - "time": "2020-09-30T07:37:11+00:00" + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.8.2" + }, + "time": "2021-04-26T09:17:50+00:00" }, { "name": "hood/accounts", @@ -459,6 +476,11 @@ "hood", "vk" ], + "support": { + "chat": "https://vk.me/darkweb228", + "docs": "https://git.hood.su/hood/accounts/manual", + "issues": "https://git.hood.su/hood/accounts/issues" + }, "funding": [ { "url": "https://git.hood.su/hood/accounts/thanks", @@ -514,6 +536,10 @@ "exception handler", "middleware" ], + "support": { + "issues": "https://github.com/jasny/error-handler/issues", + "source": "https://github.com/jasny/error-handler" + }, "abandoned": true, "time": "2017-01-25T01:27:18+00:00" }, @@ -600,6 +626,10 @@ "logging", "psr-3" ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/1.26.0" + }, "funding": [ { "url": "https://github.com/Seldaek", @@ -663,6 +693,9 @@ "psr", "psr-18" ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, "time": "2020-06-29T06:28:15+00:00" }, { @@ -713,6 +746,9 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "time": "2016-08-06T14:39:51+00:00" }, { @@ -760,6 +796,9 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, "time": "2020-03-23T09:12:05+00:00" }, <<<<<<< HEAD @@ -845,6 +884,10 @@ } ], "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, "time": "2019-03-08T08:55:37+00:00" } ], @@ -898,6 +941,10 @@ "constructor", "instantiate" ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -974,6 +1021,10 @@ "object", "object graph" ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, "funding": [ { <<<<<<< HEAD @@ -1048,6 +1099,10 @@ "parser", "php" ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" + }, "time": "2020-12-20T10:01:03+00:00" }, { @@ -1139,21 +1194,25 @@ "time": "2020-08-10T19:35:50+00:00" ======= "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, "time": "2020-06-27T14:33:11+00:00" >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 }, { "name": "phar-io/version", - "version": "3.0.4", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451" + "reference": "bae7c545bef187884426f042434e561ab1ddb182" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/e4782611070e50613683d2b9a57730e9a3ba5451", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", "shasum": "" }, "require": { @@ -1187,7 +1246,11 @@ } ], "description": "Library for handling version information and constraints", - "time": "2020-12-13T23:18:30+00:00" + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.1.0" + }, + "time": "2021-02-23T14:00:09+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -1236,6 +1299,10 @@ "reflection", "static analysis" ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, "time": "2020-06-27T09:03:43+00:00" }, { @@ -1288,6 +1355,10 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, "time": "2020-09-03T19:13:55+00:00" }, { @@ -1337,20 +1408,24 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, "time": "2020-09-17T18:55:26+00:00" }, { "name": "phpspec/prophecy", - "version": "1.12.2", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "245710e971a030f42e08f4912863805570f23d39" + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39", - "reference": "245710e971a030f42e08f4912863805570f23d39", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", "shasum": "" }, "require": { @@ -1400,20 +1475,24 @@ "spy", "stub" ], - "time": "2020-12-19T10:15:11+00:00" + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + }, + "time": "2021-03-17T13:42:18+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.5", + "version": "9.2.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1" + "reference": "f6293e1b30a2354e8428e004689671b83871edde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", + "reference": "f6293e1b30a2354e8428e004689671b83871edde", "shasum": "" }, "require": { @@ -1467,13 +1546,17 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], - "time": "2020-11-28T06:44:49+00:00" + "time": "2021-03-28T07:26:59+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1524,6 +1607,10 @@ "filesystem", "iterator" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4072,6 +4159,10 @@ "keywords": [ "process" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4152,6 +4243,10 @@ "keywords": [ "template" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4210,6 +4305,10 @@ "keywords": [ "timer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4221,16 +4320,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.2", + "version": "9.5.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4" + "reference": "c73c6737305e779771147af66c96ca6a7ed8a741" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f661659747f2f87f9e72095bb207bceb0f151cb4", - "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c73c6737305e779771147af66c96ca6a7ed8a741", + "reference": "c73c6737305e779771147af66c96ca6a7ed8a741", "shasum": "" }, "require": { @@ -4306,6 +4405,10 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.4" + }, "funding": [ { "url": "https://phpunit.de/donate.html", @@ -4316,7 +4419,7 @@ "type": "github" } ], - "time": "2021-02-02T14:45:58+00:00" + "time": "2021-03-23T07:16:29+00:00" }, { "name": "sebastian/cli-parser", @@ -4362,6 +4465,10 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4414,6 +4521,10 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4465,6 +4576,10 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4588,6 +4703,10 @@ "compare", "equality" ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4646,6 +4765,10 @@ ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4743,6 +4866,10 @@ "unidiff", "unified diff" ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4803,6 +4930,10 @@ "environment", "hhvm" ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4880,6 +5011,10 @@ "export", "exporter" ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4940,6 +5075,10 @@ "keywords": [ "global state" ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4993,6 +5132,10 @@ ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5046,6 +5189,10 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5097,6 +5244,10 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5210,6 +5361,10 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5266,6 +5421,10 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5318,6 +5477,10 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/2.3.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5367,6 +5530,10 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -5435,6 +5602,9 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5489,6 +5659,10 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/master" + }, "funding": [ { "url": "https://github.com/theseer", @@ -5499,30 +5673,35 @@ }, { "name": "webmozart/assert", - "version": "1.9.1", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", + "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -5544,7 +5723,11 @@ "check", "validate" ], - "time": "2020-07-08T17:02:28+00:00" + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" } ], "aliases": [], @@ -5558,5 +5741,5 @@ "php": "~8.0" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.0.0" } diff --git a/hood/vk/system/api/api.php b/hood/vk/system/api/api.php deleted file mode 100644 index c4f14a6..0000000 --- a/hood/vk/system/api/api.php +++ /dev/null @@ -1,202 +0,0 @@ -_init(); - } - } - - /** - * Инициализация (безопасная) - */ - public function init(): array - { - if (!isset($blocked)) { - // Нет блокировки (запуск в первый раз) - - // Блокировка - static $blocked = true; - - try { - $this->_init(); - } catch (Throwable $t) { - throw new Exception('Не удалось инициализировать API', $t->getCode(), $t->getPrevious()); - } - } - - return $this->settings; - } - - /** - * Реинициализация - */ - public function reinit(): array - { - // Реинициализация - //unset($this->settings); - $this->settings = []; - - try { - $this->_init(); - } catch (Throwable $t) { - throw new Exception('Не удалось инициализировать API', $t->getCode(), $t->getPrevious()); - } - - return $this->settings; - } - - /** - * Инициализация - */ - protected function _init(): void - { - // Ключ - $this->settings['access_token'] = $this->robot->key; - - // Версия API - $this->settings['v'] = $this->version; - } - - /** - * Выбрать получателя - * - * Определяет получателей по входным параметрам - * - * @see hood\vk\api\methods\messages Сообщения - */ - public function chooseDestination(string|array|int $destination): void - { - if (is_int($destination)) { - // Идентификатор - - $this->settings['peer_id'] = $destination; - } else if (is_array($destination)) { - // Идентификаторы - - $this->settings['user_ids'] = $destination; - } else { - // Домен - - $this->settings['domain'] = $destination; - } - } - - /** - * Записать свойство - * - * @param string $name Название - * @param mixed $value Значение - */ - public function __set(string $name, mixed $value): void - { - match ($name) { - 'robot' => !isset($this->robot) ? $this->robot = $value : throw new Exception('Запрещено перезаписывать робота'), - 'settings' => !isset($this->settings) ? $this->settings = $value : throw new Exception('Запрещено перезаписывать настройки'), - default => $this->settings[$name] = $value - }; - } - - /** - * Прочитать свойство - * - * @param string $name Название - */ - public function __get(string $name): mixed - { - return match ($name) { - 'robot' => $this->robot ?? throw new Exception('Робот не инициализирован'), - 'settings' => $this->settings ?? throw new Exception('Настройки не инициализированы'), - default => $this->settings[$name] ?? throw new Exception('Параметр не найден: settings[\'' . $name . '\']') - }; - } - - /** - * Записать по смещению - */ - public function offsetSet(mixed $offset, mixed $value): void - { - if ($offset == 'settings') { - !isset($this->settings) ? $this->settings = $value : throw new Exception('Запрещено перезаписывать настройки'); - } else if (isset($this->settings)) { - $this->settings[$offset] = $value; - } else { - throw new Exception('Настройки не инициализированы'); - } - } - - /** - * Прочитать по смещению - */ - public function offsetGet(mixed $offset): mixed - { - if ($offset == 'settings' && isset($this->settings)) { - return $this->settings; - } else if (isset($this->settings)) { - if (isset($this->settings[$offset])) { - return $this->settings[$offset]; - } else { - throw new Exception('Не найдено: settings[\'' . $offset . '\']'); - } - } else { - throw new Exception('Настройки не инициализированы'); - } - } - - /** - * Проверка существования смещения - */ - public function offsetExists(mixed $offset): bool - { - if ($offset == 'settings' && isset($this->settings)) { - return isset($this->settings); - } else if (isset($this->settings)) { - return isset($this->settings[$offset]); - } else { - throw new Exception('Настройки не инициализированы'); - } - } - - /** - * Удалить по смещению - */ - public function offsetUnset(mixed $offset): void - { - if ($offset == 'settings' && isset($this->settings)) { - unset($this->settings); - } else if (isset($this->settings)) { - unset($this->settings[$offset]); - } else { - throw new Exception('Настройки не инициализированы'); - } - } -} diff --git a/hood/vk/system/api/attachments.php b/hood/vk/system/api/attachments.php deleted file mode 100644 index 566f1e7..0000000 --- a/hood/vk/system/api/attachments.php +++ /dev/null @@ -1,75 +0,0 @@ -attachments) + count($attachments) > 10) { - throw new Exception('Превышен лимит вложений (10)'); - } - - // Запись вложений - $this->attachments = array_merge($this->attachments, $attachments); - - return $this; - } - - /** - * Очистить вложения - */ - public function Clear(): self - { - // Очистка вложений - $this->attachments = []; - - return $this; - } - - /** - * Прочитать свойство - * - * @param string $name Название - * - * @return mixed - */ - public function __get(string $name): mixed - { - return match ($name) { - 'attachments' => $this->attachments, - default => throw new Exception('Свойство не найдено: ' . $name) - }; - } -} diff --git a/hood/vk/system/api/callback.php b/hood/vk/system/api/callback.php deleted file mode 100644 index 13a5377..0000000 --- a/hood/vk/system/api/callback.php +++ /dev/null @@ -1,52 +0,0 @@ -secret_key = $_ENV['CALLBACK_SECRET_KEY']; - $this->url = $_ENV['SERVER_DOMAIN']; - $this->group_id = $group->id; - $this->group_id->request('groups.addCallbackServer', [ - 'group_id' => $this->group_id, - 'url' => $this->url, - 'title' => $this->group_id . 'CallBackServer', - 'secret_key' => $this->secret_key - ]); - // $this->confirmation_token = request('groups.getCallbackConfirmationCode', [$this->group_id]); - echo $this->confirmation_token; - } - - public function sendOk(){ - echo 'ok'; - } -} \ No newline at end of file diff --git a/hood/vk/system/api/methods/messages.php b/hood/vk/system/api/methods/messages.php deleted file mode 100644 index 824fe99..0000000 --- a/hood/vk/system/api/methods/messages.php +++ /dev/null @@ -1,461 +0,0 @@ ->>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - -/** - * Сообщение - * -<<<<<<< HEAD - * public static function put(RobotAbstract $from, int $to, string $message, int $mode = 2) Отправить сообщение -======= - * @method public static function put(RobotAbstract $from, int $to, string $message, int $mode = 2) Отправить сообщение ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - * - * @see https://vk.com/dev/messages.send - * @see https://vk.com/dev/messages.getById - * - * @package hood\vk\api - * @author Arsen Mirzaev Tatyano-Muradovich - * - * @todo Доработать строгий режим отправки: проверку сообщения в беседе (не имеет ID сообщений) - */ -final class messages extends method -{ - /** -<<<<<<< HEAD - * $mode Режим отправки -======= - * @param int $mode Режим отправки ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - */ - protected int $mode = 1; - - /** -<<<<<<< HEAD - * Создать сообщение - * - * Если переданы все параметры, то сразу отправляет - * - * $robot Робот - * $message Текст - * $destination Получатель - * $attachments Вложения - * - * @return self - */ - public function __construct( - protected robot $robot, - protected string $message, - protected int|string|array|null $destination = null, - protected array $attachments = [] - ) { - // Отправка, если все параметры инициализированы - return $this->send($destination); -======= - * @param string|null $text Текст - */ - protected string|null $text = null; - - /** - * @var array Массив вложений - */ - protected array $attachments; - - /** - * @var attachments Вложения - */ - protected attachments $attachment; - - /** - * Создать сообщение - * - * @param robot $robot Робот - */ - public function __construct( - protected robot $robot - ) { - } - - /** - * Записать текст - * - * @param string $text Текст - * - * @return self - */ - public function text(string $text): self - { - // Записать текст - if (!isset($this->text)) { - $this->text = $text; - } else { - $this->text .= $text; - } - - return $this; - } - - /** - * Записать фото - * - * @param $img Фото - * - * @return self - */ - public function image(...$imgs): self - { - // Перебор фото - foreach ($imgs as $img) { - - // Загрузить фото - $id = $this->robot->photo->getPhoto($img); - - // Записать к вложениям - $this->attachment($id); - } - - return $this; - } - - /** - * Записать вложение - * - * @param $attachments Вложения - */ - public function attachment(string ...$attachments): self - { - if (isset($this->attachment)) { - // Если вложения инициализированны - - // Записать вложение - $this->attachment->attachment(...$attachments); - } else { - // Если вложения не инициализированны - - // Инициализация вложений - $this->attachment = new attachments($this->robot); - - // Записать вложение - $this->attachment->attachment(...$attachments); - } - - return $this; ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - } - - /** - * Отправить сообщение - * -<<<<<<< HEAD - * $destination Получатель - * - * @see https://vk.com/dev/messages.send - * - * Ответ сервера -======= - * @param int|string|array $destination Получатель - * - * @see https://vk.com/dev/messages.send - * - * @return array Ответ сервера ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - */ - public function send(int|string|array $destination): array - { - // Идентификатор сообщения - $random_id = time(); - - if ($this->mode = 1) { - // Перемножение (по умолчанию) - $random_id *= rand(); - } - -<<<<<<< HEAD - # Ключ - match (true) { - // Робот-группа - $this->robot instanceof group => $settings['access_token'] = $this->robot->key, - // Робот-пользователь - $this->robot instanceof User => $settings['access_token'] = $this->robot->key - }; - - // Версия API - $settings['v'] = $this->robot->version; - - // Цель отправки - match (true) { - // Отправить по идентификатору - is_int($destination) => $settings['peer_id'] = $destination, - // Массовая отправка по идентификаторам - is_array($destination) => $settings['user_ids'] = $destination, - // Отправить по домену - default => $settings['domain'] = $destination - }; - - // Сообщение - $settings['message'] = $this->message; - - // Идентификатор сообщения - $settings['random_id'] = $random_id; - - // Фильтрация вложений - $forward_messages = []; - foreach ($this->attachments as &$attachment) { - //var_dump($attachment); - if (iconv_substr($attachment, 0, 7, "UTF-8") === 'message') { - // Если среди вложений найдено сообщение для пересылки - $forward_messages[] = $attachment; - unset($attachment); - } - } - - if (!empty($forward_messages)) { - // Если есть пересылаемые сообщения - $settings['forward_messages'] = implode(',', $forward_messages); - } - - //var_dump($attachments); - if (!empty($this->attachments)) { - // Если есть вложения - //echo 'lol'; - $settings['attachment'] = implode(',', $this->attachments); - //var_dump($settings['attachment']); - } - - // Запрос - $request = $this->robot->browser->request(method: 'POST', uri: 'messages.send', options: ['form_params' => $settings]); - - // Очистка - unset($settings); -======= - // Реиницилазиция - $this->robot->api->reinit(); - - // Цель отправки - $this->robot->api->chooseDestination($destination); - - // Текст сообщения - $this->robot->api['message'] = $this->text; - - // Идентификатор сообщения - $this->robot->api['random_id'] = $random_id; - - // Фильтрация вложений, если они инициализированны - if (isset($this->attachments)) { - $forward_messages = []; - foreach ($this->attachments as &$attachment) { - if (iconv_substr($attachment, 0, 7, "UTF-8") === 'message') { - - // Если среди вложений найдено сообщение для пересылки - $forward_messages[] = $attachment; - unset($attachment); - } - } - - if (!empty($forward_messages)) { - // Если есть пересылаемые сообщения - $this->robot->api['forward_messages'] = implode(',', $forward_messages); - } - - if (!empty($this->attachments)) { - // Если есть вложения - $this->robot->api['attachment'] = implode(',', $this->attachments); - } - } - - - // Запрос - $request = $this->robot->browser->request(method: 'POST', uri: 'messages.send', options: ['form_params' => $this->robot->api['settings']]); - - // Очистка - //unset($settings); ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - - if ($this->mode >= 2) { - // Если установлен режим 2 (усиленная проверка отправленного сообщения) - - if (!empty($request["response"])) { - // Если пришел ID сообщения - -<<<<<<< HEAD - // Ключ - match (true) { - // Робот-группа - $this->robot instanceof Group => $settings['access_token'] = $this->robot->key, - // Робот-пользователь - $this->robot instanceof User => $settings['access_token'] = $this->robot->key - }; - - // Версия API - $settings['v'] = $this->robot->version; - - // Запрашиваемые сообщения - $settings['message_ids'] = $request["response"]; - - // Запрос - if ($this->robot->browser->post(uri: 'https://api.vk.com/method/messages.getById', options: $settings)['response']['count'] === 0) { -======= - // Реиницилазиция - $this->robot->api->reinit(); - - // Запрашиваемые сообщения - $this->robot->api['message_ids'] = $request["response"]; - - // Запрос - if ($this->robot->browser->post(uri: 'https://api.vk.com/method/messages.getById', options: $this->robot->api['settings'])['response']['count'] === 0) { ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - // Если сообщения не существует, то повторить отправку - $this->send($destination); - } - } else { - // Что-то придумать :) - } - } - - return (array) $request; - } - - /** -<<<<<<< HEAD - * Получить информацию о сообщении - * - * Информация о сообщении - */ - public function info(): array - { - # Ключ - match (true) { - // Робот-группа - $this->robot instanceof group => $settings['access_token'] = $this->robot->key, - // Робот-пользователь - $this->robot instanceof User => $settings['access_token'] = $this->robot->key, - }; - - // Цель отправки - match (true) { - // Отправить по идентификатору - is_int($this->destination) => $settings['peer_id'] = $this->destination, - // Массовая отправка по идентификаторам - is_array($this->destination) => $settings['user_ids'] = $this->destination, - // Отправить по домену - default => $settings['domain'] = $this->destination - }; - - // Версия API - $settings['v'] = $this->robot->version; - - // Сообщение - $settings['message'] = $this->message; - - // Режим отправки - $settings['mode'] = $this->mode; -======= - * Записать свойство - * - * @param string $name Название - * @param mixed $value Значение - * - * @return void - */ - public function __set(string $name, mixed $value): void - { - match ($name) { - 'attachment' => !isset($this->attachments) ? $this->attachments = $value : throw new Exception('Запрещено перезаписывать вложения'), - 'attachments' => !isset($this->attachments) ? $this->attachments = $value : throw new Exception('Запрещено перезаписывать массив вложений'), - default => throw new Exception('Свойство не найдено: ' . $name) - }; - } - - /** - * Прочитать свойство - * - * @param string $name Название - * - * @return mixed - */ - public function __get(string $name): mixed - { - return match ($name) { - 'text' => $this->text ?? throw new Exception('Текст не задан'), - 'attachment' => $this->attachment->attachments ?? $this->attachment = new attachments($this->robot), - 'attachments' => isset($this->attachment) ? $this->attachment->attachments : throw new Exception('Вложения не инициализированны'), - default => throw new Exception('Свойство не найдено: ' . $name) - }; - } - - /** - * Получить информацию о сообщении - * - * @return array Информация о сообщении - */ - public function info(): array - { - //Инициализация - //$settings = $this->init(); - $this->robot->api->init(); - - // Цель отправки - $this->robot->api->chooseDestination($this->destination); - - // Сообщение - $this->robot->api['message'] = $this->message; - - // Режим отправки - $this->robot->api['mode'] = $this->mode; ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - - // Фильтрация вложений - $forward_messages = []; - foreach ($this->attachments as &$attachment) { - if (iconv_substr(str: $attachment, offset: 0, length: 7, charset: "UTF-8") === 'message') { - // Если среди вложений найдено сообщение для пересылки -<<<<<<< HEAD -======= - ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - $forward_messages[] = $attachment; - unset($attachment); - } - } - - if (!empty($forward_messages)) { - // Если есть пересылаемые сообщения -<<<<<<< HEAD - $settings['forward_messages'] = implode(',', $forward_messages); -======= - - $this->robot->api['forward_messages'] = implode(',', $forward_messages); ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - } - - if (!empty($attachments)) { - // Если есть вложения -<<<<<<< HEAD - $settings['attachment'] = implode(',', $attachments); - } - - return $settings; -======= - - $this->robot->api['attachment'] = implode(',', $this->attachments); - } - - /////////////////////////////////////////////////............................ Что это? - return $settings ?? []; ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - } -} diff --git a/hood/vk/system/api/methods/method.php b/hood/vk/system/api/methods/method.php deleted file mode 100644 index cbf0eb8..0000000 --- a/hood/vk/system/api/methods/method.php +++ /dev/null @@ -1,61 +0,0 @@ - - */ -abstract class method -{ - /** - * Создать - * - * Ответ сервера - */ - public static function put(): array - { - return ['error' => 'Метод не поддерживается']; - } - - /** - * Изменить - * - * Ответ сервера - */ - public static function post(): array - { - return ['error' => 'Метод не поддерживается']; - } - - /** - * Получить - * - * Ответ сервера - */ - public static function get(): array - { - return ['error' => 'Метод не поддерживается']; - } - - /** - * Удалить - * - * Ответ сервера - */ - public static function delete(): array - { - return ['error' => 'Метод не поддерживается']; - } -} diff --git a/hood/vk/tests/api/apiTest.php b/hood/vk/tests/api/apiTest.php deleted file mode 100644 index 31d2c07..0000000 --- a/hood/vk/tests/api/apiTest.php +++ /dev/null @@ -1,227 +0,0 @@ -ssl = self::$ssl ?? true; - - if (empty(self::$key)) { - // Если не указан ключ - - // Проверка входных данных - if (empty(self::$login)) { - self::$markTestSkipped('Не найден входной аккаунта'); - } else if (empty(self::$password)) { - self::$markTestSkipped('Не найден пароль аккаунта'); - } - - // Деаутентификация (на всякий случай) - self::$account->deauth(); - - // Аутентификация и генерация ключа - self::$key = self::$account->auth(self::$login, self::$password)->key(self::$project_id); - } - - $this->assertNotNull(self::$key, 'Ошибка при инициализации ключа аккаунта'); - } - - /** - * @testdox Деинициализация аккаунта - * @afterClass - */ - public static function testAccountDeinit(): void - { - // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../../accounts'); - - // Деаутентификация - self::$account->deauth(); - } - - /** - * @testdox Инициализация робота - * @before - */ - public function testRobotGroupInit(): void - { - // Инициализация ядра - self::$core = core::init(); - - // Сохранение количества роботов - $count = self::$core->robots; - - // Инициализация робота - self::$robot = self::$core->group(empty(self::$group_id) ? rand(0, 10) : self::$group_id); - - // Проверка - $this->assertEquals(self::$core->robots, $count + 1, 'Ошибка при инициализации робота'); - } - - /** - * @testdox Деинициализация робота - * @after - */ - public function testRobotGroupDeinit(): void - { - // Очистка реестра - self::$core->delete(); - - // Проверка - $this->assertEmpty(self::$core->get(self::$robot->id), 'Ошибка при деинициализации робота'); - } - - /** - * @testdox Инициализация (безопасная) - */ - public function testInit(): void - { - // Безопасная инициализация - self::$robot->key(self::$group_key)->api->init(); - } - - /** - * @testdox Реинициализация - */ - public function testReinit(): void - { - // Реинициализация - self::$robot->key(self::$group_key)->api->reinit(); - } - - /** - * @testdox Запись робота (повторная) - */ - public function testWriteRobot(): void - { - // Проверка выброса исключения - $this->expectExceptionMessage('Запрещено перезаписывать робота'); - - // Повторная запись робота - self::$robot->key(self::$group_key)->api->robot = 'robot'; - } - - /** - * @tesetdox Чтение робота - */ - public function testReadRobot(): void - { - // Чтение робота - $this->assertNotNull(self::$robot->key(self::$group_key)->api->robot); - } - - /** - * @testdox Запись настроек - */ - public function testWriteSettings(): void - { - // Проверка выброса исключения - $this->expectExceptionMessage('Запрещено перезаписывать настройки'); - - // Запись настроек - self::$robot->key(self::$group_key)->api['settings'] = 'settings'; - } - - /** - * @testdox Чтение элемента настроек - */ - public function testReadSettingsElement(): void - { - // Проверка выброса исключения - $this->expectExceptionMessage('Не найдено: settings[\'element\']'); - - // Чтение элемента настроек - self::$robot->key(self::$group_key)->api['element']; - } - - /** - * @testdox Запись элемента настроек - */ - public function testWriteSettingsElement(): void - { - // Запись элемента настроек - self::$robot->key(self::$group_key)->api['element'] = 'element'; - - // Проверка - $this->assertNotNull(self::$robot->api['element']); - } - - /** - * @testdox Выбор получателя по идентификатору - */ - public function testchooseDestinationById(): void - { - // Выбор получателя по идентификатору - self::$robot->key(self::$group_key)->api->chooseDestination(12345); - - // Проверка - $this->assertNotNull(self::$robot->api['peer_id']); - } - - /** - * @testdox Выбор получателей по идентификаторам - */ - public function testchooseDestinationByIds(): void - { - // Выбор получателей по идентификаторам - self::$robot->key(self::$group_key)->api->chooseDestination([12345, 12345]); - - // Проверка - $this->assertNotNull(self::$robot->api['user_ids']); - } - - /** - * @testdox Выбор получателя по домену - */ - public function testchooseDestinationByDomain(): void - { - // Выбор получателя по домену - self::$robot->key(self::$group_key)->api->chooseDestination('domain'); - - // Проверка - $this->assertNotNull(self::$robot->api['domain']); - } -} diff --git a/hood/vk/tests/api/attachmentsTest.php b/hood/vk/tests/api/attachmentsTest.php deleted file mode 100644 index 63fb445..0000000 --- a/hood/vk/tests/api/attachmentsTest.php +++ /dev/null @@ -1,187 +0,0 @@ -ssl = self::$ssl ?? true; - - if (empty(self::$key)) { - // Если не указан ключ - - // Проверка входных данных - if (empty(self::$login)) { - self::$markTestSkipped('Не найден входной аккаунта'); - } else if (empty(self::$password)) { - self::$markTestSkipped('Не найден пароль аккаунта'); - } - - // Деаутентификация (на всякий случай) - self::$account->deauth(); - - // Аутентификация и генерация ключа - self::$key = self::$account->auth(self::$login, self::$password)->key(self::$project_id); - } - - $this->assertNotNull(self::$key, 'Ошибка при инициализации ключа аккаунта'); - } - - /** - * @testdox Деинициализация аккаунта - * @afterClass - */ - public static function testAccountDeinit(): void - { - // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../../accounts'); - - // Деаутентификация - self::$account->deauth(); - } - - /** - * @testdox Инициализация робота - * @before - */ - public function testRobotGroupInit(): void - { - // Инициализация ядра - self::$core = core::init(); - - // Сохранение количества роботов - $count = self::$core->robots; - - // Инициализация робота - self::$robot = self::$core->group(empty(self::$group_id) ? rand(0, 10) : self::$group_id); - - // Проверка - $this->assertEquals(self::$core->robots, $count + 1, 'Ошибка при инициализации робота'); - } - - /** - * @testdox Деинициализация робота - * @after - */ - public function testRobotGroupDeinit(): void - { - // Очистка реестра - self::$core->delete(); - - // Проверка - $this->assertEmpty(self::$core->get(self::$robot->id), 'Ошибка при деинициализации робота'); - } - - /** - * @testdox Инициализация вложений - * @before - */ - public function testAttachmentsInit(): void - { - if (isset(self::$robot)) { - self::$attachments = new Attachments(self::$robot); - } - } - - /** - * @testdox Чтение вложений - */ - public function testReadAttachments(): void - { - // Проверка - $this->assertNotNull(self::$attachments->attachments); - } - - /** - * @testdox Запись вложения - */ - public function testWriteAttachment(): void - { - // Запись вложения - self::$attachments->attachment('text'); - } - - /** - * @testdox Запись вложения (повторная) - */ - public function testWriteAttachmentWhenItIsAlreadyWrited(): void - { - //Запись вложения - self::$attachments->attachment('text'); - - // Повторная запись вложения - self::$attachments->attachment('text'); - - // Проверка - $this->assertSame(['text', 'text'], self::$attachments->attachments); - } - - /** - * @testdox Запись более 10 вложений - */ - public function testWriteAttachmentWhenLimitIsExceed() - { - // Проверка выброса исключения - $this->expectExceptionMessage('Превышен лимит вложений (10)'); - - //Запись вложений - self::$attachments->attachment('text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text'); - } - - /** - * @testdox Очистка вложений - */ - public function testClearAttachments(): void - { - // Очистка вложений - self::$attachments->clear(); - } -} diff --git a/hood/vk/tests/api/methods/messagesTest.php b/hood/vk/tests/api/methods/messagesTest.php deleted file mode 100644 index 55b8cab..0000000 --- a/hood/vk/tests/api/methods/messagesTest.php +++ /dev/null @@ -1,262 +0,0 @@ ->>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - -use hood\accounts\vk as account; - -/** -<<<<<<< HEAD - * @testdox Робот-группа -======= - * @testdox Сообщения ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - */ -final class messagesTest extends TestCase -{ - use settings; - - /** - * @var core $core Ядро фреймворка - */ - private static core $core; - - /** - * @var account $account Аккаунт - */ - protected static account $account; - - /** - * @var robot $robot Робот - */ - private static robot $robot; - -<<<<<<< HEAD - - /** - * @testdox Деинициализация аккаунта - * @afterClass - */ - public static function testAccountDeinit(): void - { - // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../accounts'); - - // Деаутентификация - self::$account->deauth(); - } - -======= ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - /** - * @testdox Инициализация аккаунта - * @beforeClass - */ - public function testAccountInit(): void - { - // Проверка входных данных - if (empty(self::$project_id)) { - self::$markTestSkipped('Не найден идентификатор проекта'); - } - - // Инициализация аккаунта -<<<<<<< HEAD - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../accounts'); -======= - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../../accounts'); ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - - // Запись режима SSL-протокола - self::$account->ssl = self::$ssl ?? true; - - if (empty(self::$key)) { - // Если не указан ключ - - // Проверка входных данных - if (empty(self::$login)) { - self::$markTestSkipped('Не найден входной аккаунта'); - } else if (empty(self::$password)) { - self::$markTestSkipped('Не найден пароль аккаунта'); - } - - // Деаутентификация (на всякий случай) - self::$account->deauth(); - - // Аутентификация и генерация ключа - self::$key = self::$account->auth(self::$login, self::$password)->key(self::$project_id); - } - - $this->assertNotNull(self::$key, 'Ошибка при инициализации ключа аккаунта'); - } - - /** -<<<<<<< HEAD - * @testdox Деинициализация робота - * @after - */ - public function testRobotGroupDeinit(): void - { - // Очистка реестра - self::$core->delete(); - - // Проверка - $this->assertEmpty(self::$core->get(self::$robot->id), 'Ошибка при деинициализации робота'); -======= - * @testdox Деинициализация аккаунта - * @afterClass - */ - public static function testAccountDeinit(): void - { - // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../../accounts'); - - // Деаутентификация - self::$account->deauth(); ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 - } - - /** - * @testdox Инициализация робота - * @before - */ - public function testRobotGroupInit(): void - { - // Инициализация ядра - self::$core = core::init(); - - // Сохранение количества роботов - $count = self::$core->robots; - - // Инициализация робота - self::$robot = self::$core->group(empty(self::$group_id) ? rand(0, 10) : self::$group_id); - - // Проверка - $this->assertEquals(self::$core->robots, $count + 1, 'Ошибка при инициализации робота'); - } - -<<<<<<< HEAD - - /** - * @testdox Инициализация робота - */ - public function testApiMethodMessagesNew(): void - { - var_dump(self::$robot->message('Тестирование отправки сообщения', self::$target_id ?? 'pizba228')); - } -======= - /** - * @testdox Деинициализация робота - * @after - */ - public function testRobotGroupDeinit(): void - { - // Очистка реестра - self::$core->delete(); - - // Проверка - $this->assertEmpty(self::$core->get(self::$robot->id), 'Ошибка при деинициализации робота'); - } - - /** - * @testdox Чтение текста - */ - public function testReadText(): void - { - // Проверка выброса исключения - $this->expectExceptionMessage('Текст не задан'); - - // Чтение текста - self::$robot->message()->text; - } - - /** - * @testdox Запись текста - */ - public function testWriteText(): void - { - // Запись текста - self::$robot->message()->text('text'); - } - - /** - * @testdox Запись текста (повторная) - */ - public function testWriteTextWhenHeIsAlreadyWrited(): void - { - // Запись текста - $message = self::$robot->message()->text('text'); - - // Повторная запись текста - $message->text('text'); - - // Проверка - $this->assertSame('texttext', $message->text); - } - - /** - * @testdox Запись фото - */ - public function testWriteImage(): void - { - // Запись фото - self::$robot->message()->text('img'); - } - - /** - * @testdox Чтение Вложений - */ - public function testReadAttachments(): void - { - // Проверка выброса исключеия - $this->expectExceptionMessage('Вложения не инициализированны'); - - // Проверка - self::$robot->message()->attachments; - } - - /** - * @testdox Запись вложений - */ - public function testWriteAttachments(): void - { - // Запись вложений - self::$robot->message()->attachment('text'); - } - - /** - * @testdox Отправка сообщения - */ - public function testSend(): void - { - // Отправка сообщения - self::$robot->key(self::$group_key)->message()->send('123'); - } - - /** - * @testdox Отправка сообщеий (с вложениями) - */ - public function testSendWithAttachments(): void - { - // Запись вложений - $message = self::$robot->key(self::$group_key)->message()->attachment('text'); - - // Отправка сообщения - $message->send('123'); - } - - /** - * @t estdox Отправка сообщеий (с пересылаемым сообщением) - */ ->>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 -} diff --git a/hood/vk/tests/settings.php.example b/hood/vk/tests/settings.php.example deleted file mode 100644 index c6d8e48..0000000 --- a/hood/vk/tests/settings.php.example +++ /dev/null @@ -1,68 +0,0 @@ -secret_key = $_ENV['CALLBACK_SECRET_KEY']; +// $this->url = $_ENV['SERVER_DOMAIN']; +// $this->group_id = $group->id; +// $this->group_id->request('groups.addCallbackServer', [ +// 'group_id' => $this->group_id, +// 'url' => $this->url, +// 'title' => $this->group_id . 'CallBackServer', +// 'secret_key' => $this->secret_key +// ]); +// // $this->confirmation_token = request('groups.getCallbackConfirmationCode', [$this->group_id]); +// echo $this->confirmation_token; +// } + +// public function sendOk(){ +// echo 'ok'; +// } +// } diff --git a/hood/vk/system/api/longpoll.php b/mirzaev/vk/system/api/longpoll.php similarity index 86% rename from hood/vk/system/api/longpoll.php rename to mirzaev/vk/system/api/longpoll.php index 73b595e..3912c60 100644 --- a/hood/vk/system/api/longpoll.php +++ b/mirzaev/vk/system/api/longpoll.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace hood\vk\api; +namespace mirzaev\vk\api; use Exception; -use hood\vk\core, - hood\vk\robots\robot; +use mirzaev\vk\core, + mirzaev\vk\robots\robot; /** * LongPoll @@ -23,7 +23,7 @@ use hood\vk\core, * @see https://vk.com/dev/groups.getLongPollServer * @see https://vk.com/dev/groups.setLongPollSettings * - * @package hood\vk\api + * @package mirzaev\vk\api * @author Arsen Mirzaev Tatyano-Muradovich * * @todo Добавить обработку ошибок ($request['errors];) @@ -60,13 +60,10 @@ final class longpoll */ public function __construct(private robot $robot) { - // Инициализация робота - match (true) { - !isset($robot->id) => throw new Exception('Необходимо указать идентификатор ВКонтакте'), - !isset($robot->key) => throw new Exception('Необходимо указать ключ для доступа к LongPoll'), - !isset($robot->version) => throw new Exception('Необходимо указать версию используемого API ВКонтакте'), - default => null - }; + // Инициализация + if (empty($robot->id)) throw new Exception('Необходимо указать идентификатор ВКонтакте'); + if (empty($robot->key)) throw new Exception('Необходимо указать ключ для доступа к LongPoll'); + if (empty($robot->api['v'])) throw new Exception('Необходимо указать версию используемого API ВКонтакте'); // Остановка процессов-дубликатов if (!file_exists(core::init()->path_temp)) { @@ -174,7 +171,15 @@ final class longpoll /** * Получить события * +<<<<<<< HEAD:hood/vk/system/api/longpoll.php * $wait Время ожидания новых событий (в секундах) +======= + * @param int $wait Время ожидания новых событий (в секундах) + * + * @todo Проверка на ошибки запроса, включая на наличие доступа к лонгполл у ключа + * + * @return array +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/longpoll.php */ public function get(int $wait = 25): array { @@ -183,6 +188,7 @@ final class longpoll // Запрос на получение доступа и данных LongPoll-сервера $response = json_decode($this->robot->browser->request(method: 'POST', uri: 'groups.getLongPollServer', options: [ +<<<<<<< HEAD:hood/vk/system/api/longpoll.php 'form_params' => [ 'group_id' => $this->robot->id, 'v' => $this->robot->version, @@ -190,15 +196,28 @@ final class longpoll ], ])->getBody()->getContents())->response; +======= + 'form_params' => $this->robot->api['settings'] + ])->getBody()->getContents()); + + if (isset($response->error)) { + // Что-то сделать + + var_export($response->error); die; + } + + // Инициализация + $response = $response->response; +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/longpoll.php // Ключ доступа - $this->key = $response->key; + $this->key = $response->key; // Сервер хранящий события - $this->server = $response->server; + $this->server = $response->server; // Идентификатор последнего события - $this->ts = $response->ts; + $this->ts = $response->ts; } // Запрос на получение событий diff --git a/mirzaev/vk/system/api/methods/messages.php b/mirzaev/vk/system/api/methods/messages.php new file mode 100644 index 0000000..65aa82e --- /dev/null +++ b/mirzaev/vk/system/api/methods/messages.php @@ -0,0 +1,263 @@ + + * + * @todo Доработать строгий режим отправки: проверку сообщения в беседе (не имеет ID сообщений) + */ +final class messages extends method +{ + /** + * @var int $mode Режим отправки + */ + protected int $mode = 1; + + /** + * @var array[int] Сообщения для пересылки + */ + protected array $forward; + + /** + * @var int Сообщение для ответа + */ + protected int $reply; + + /** + * Конструктор + * + * @param robot $robot Робот + * @param string|null $text Текст + * @param int|string|array $destination = null + */ + public function __construct( + protected robot $robot, + protected string|null $text = null, + int|string|array $destination = null + ) { + if (isset($this->text, $destination)) { + // Быстрая отправка + + $this->send($destination); + } + } + + /** + * Записать текст + * + * @param string $text Текст + */ + public function text(string $text): self + { + // Записать текст + if (!isset($this->text)) { + $this->text = $text; + } else { + $this->text .= $text; + } + + return $this; + } + + /** + * Записать сообщения для пересылки + * + * @param $ids Идентификаторы сообщений + */ + public function forward(...$ids): self + { + // Запись + $this->forward = array_merge($this->forward ?? [], $ids); + + return $this; + } + + /** + * Записать сообщение для ответа + * + * @param $id Идентификатор сообщения + */ + public function reply(int $id): self + { + // Запись + $this->reply = $id; + + return $this; + } + + /** + * Отправить сообщение + * + * @param int|string|array $destination Получатель + * + * @see https://vk.com/dev/messages.send + * + * @return array Ответ сервера + * + * @todo Написать обработчик ошибок возвращаемых ВКонтакте + */ + public function send(int|string|array $destination): array + { + // Идентификатор + $random_id = time(); + + if ($this->mode = 1) { + // Перемножение (по умолчанию) + $random_id *= rand(); + } + + // Реиницилазиция + $this->robot->api->reinit(); + + // Цель отправки + $this->robot->api->chooseDestination($destination); + + // Идентификатор сообщения + $this->robot->api['random_id'] = $random_id; + + // Текст + $this->robot->api['message'] = $this->text; + + // Пересылаемые сообщения + if (!empty($this->forwardMessages)) { + + $this->robot->api['forward_messages'] = implode(',', $this->forwardMessages); + } + + // Ответные сообщения + if (isset($this->ReplyMessage)) { + + $this->robot->api['reply_to'] = $this->ReplyMessage; + } + + // Вложения + if ( isset($this->data) && $this->__get('data') !== []) { // !empty($this->data->data) почемуто не работает + + $this->robot->api['attachment'] = implode(',', $this->__get('data')); + } + + // Запрос + $request = json_decode($this->robot->browser->request('POST', 'messages.send', ['form_params' => $this->robot->api->settings])->getBody()->getContents()); + + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); + } + + if ($this->mode >= 2) { + // Если установлен режим 2 (усиленная проверка отправленного сообщения) + + if (!empty($request["response"])) { + // Ответ получен + + // Реиницилазиция + $this->robot->api->reinit(); + + // Запрашиваемые сообщения + $this->robot->api['message_ids'] = $request["response"]; + + // Запрос + if ($this->robot->browser->request('POST', 'messages.getById', ['form_params' => $this->robot->api->settings])['response']['count'] === 0) { + // Сообщения не существует + //!!!!!!!!!!!!!!!!!!!!!!!!!!! + //!!!!!!!!!!!!!!!!!!!!!!!!!! + //!!!!!!!!!!!!!!!!!!!!!!!!! + + // Повторная отправка + $this->send($destination); + } + } else { + } + } + + return $request->response; + } + + /** + * Записать свойство + * + * @param string $name Название + * @param mixed $value Значение + * + * @return void + */ + public function __set(string $name, mixed $value): void + { + match ($name) { + default => throw new Exception("Свойство $name не найдено", 404) + }; + } + + /** + * Прочитать свойство + * + * @param string $name Название + * + * @return mixed + */ + public function __get(string $name): mixed + { + return match ($name) { + 'text' => $this->text ?? throw new Exception('Текст не инициализирован'), + 'forward' => empty($this->forward) ? throw new Exception('Сообщения для пересылки не инициализированы') : $this->forward, + 'reply' => isset($this->reply) ? $this->reply : throw new Exception('Сообщение для ответа не инициализировано'), + default => throw new Exception("Свойство $name не найдено", 404) + }; + } + + /** + * Получить информацию о сообщении по id + * + * @param string $message_ids Идентификатор сообщения + * + * @return object Информация о сообщении + */ + + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // доделать + + public function getById(int $message_ids): object + { + // Реиницилазиция + $this->robot->api->reinit(); + + // Идентификаторы сообщений. Максимум 100 идентификаторов + $this->robot->api['message_ids'] = $message_ids; + + + if ($this->robot instanceof group) { + // Если это группа + + // Идентификатор группы + isset($this->robot->id) ? $this->robot->api['group_id'] = $this->robot->id : throw new Exception('Необходимо указать идентификатор сообщества'); + } + + // Запрос + $request = json_decode(($this->robot->browser->request('POST', 'messages.getById', ['form_params' => $this->robot->api->settings])->getBody()->getContents())); + + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); + } + + return $request->response; + } +} diff --git a/mirzaev/vk/system/api/methods/method.php b/mirzaev/vk/system/api/methods/method.php new file mode 100644 index 0000000..dda0a95 --- /dev/null +++ b/mirzaev/vk/system/api/methods/method.php @@ -0,0 +1,91 @@ +>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/method.php + * @author Arsen Mirzaev Tatyano-Muradovich + */ +abstract class method +{ + /** + * Создать +<<<<<<< HEAD:hood/vk/system/api/methods/method.php + * + * Ответ сервера +======= + * + * @return array Ответ сервера +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/method.php + */ + public static function put(): array + { + return ['error' => 'Метод не поддерживается']; + } + + /** + * Изменить +<<<<<<< HEAD:hood/vk/system/api/methods/method.php + * + * Ответ сервера +======= + * + * @return array Ответ сервера +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/method.php + */ + public static function post(): array + { + return ['error' => 'Метод не поддерживается']; + } + + /** + * Получить +<<<<<<< HEAD:hood/vk/system/api/methods/method.php + * + * Ответ сервера +======= + * + * @return array Ответ сервера +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/method.php + */ + public static function get(): array + { + return ['error' => 'Метод не поддерживается']; + } + + /** + * Удалить +<<<<<<< HEAD:hood/vk/system/api/methods/method.php + * + * Ответ сервера +======= + * + * @return array Ответ сервера +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/method.php + */ + public static function delete(): array + { + return ['error' => 'Метод не поддерживается']; + } +} diff --git a/hood/vk/system/api/methods/photos.php b/mirzaev/vk/system/api/methods/photos.php similarity index 80% rename from hood/vk/system/api/methods/photos.php rename to mirzaev/vk/system/api/methods/photos.php index a05b1d4..7919ed4 100644 --- a/hood/vk/system/api/methods/photos.php +++ b/mirzaev/vk/system/api/methods/photos.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace hood\vk\api\methods; +namespace mirzaev\vk\api\methods; -use hood\vk\robots\robot, - hood\vk\robots\group; +use mirzaev\vk\robots\robot, + mirzaev\vk\robots\group; -use hood\accounts\vk as account; +use mirzaev\accounts\vk as account; use Exception; @@ -23,7 +23,7 @@ use Exception; * @see https://vk.com/dev/photos.getUploadServer * @see https://vk.com/dev/messages.getById * - * @package hood\vk\api\methods + * @package mirzaev\vk\api\methods * @author Arsen Mirzaev Tatyano-Muradovich * * @todo Добавить обработку ошибок ($request['errors];) @@ -31,6 +31,7 @@ use Exception; final class photos extends method { /** +<<<<<<< HEAD:hood/vk/system/api/methods/photos.php * $url */ protected $url; @@ -46,6 +47,8 @@ final class photos extends method * $latitude Географическая широта (-90, 90) * $longitude Географическая долгота (-180, 180) ======= +======= +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/photos.php * Создать сообщение * * @param robot $robot Робот @@ -125,6 +128,7 @@ final class photos extends method } /** +<<<<<<< HEAD:hood/vk/system/api/methods/photos.php * Загрузить * * @param Type $var @@ -149,6 +153,8 @@ final class photos extends method } /** +======= +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/photos.php * Получить сервер для загрузки изображений * <<<<<<< HEAD @@ -256,6 +262,7 @@ final class photos extends method return (array) $request; } +<<<<<<< HEAD:hood/vk/system/api/methods/photos.php /** <<<<<<< HEAD * загрузить фото и получить его id @@ -286,11 +293,14 @@ final class photos extends method * Загрузить фото и получить его id * * $robot робот +======= + /** + * Получить адрес сервера сообщений +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/photos.php * - * $img фото + * @return object */ - - public function getPhoto($img) + public function getMessageServer(): object { // Реиницилазиция $this->robot->api->reinit(); @@ -301,23 +311,41 @@ final class photos extends method // Идентификатор назначения (0 Для ботов) $this->robot->api['peer_id'] = 0; - // Получить адрес сервера для загрузки фотографии в личное сообщение - $url = json_decode($this->robot->browser->request('POST', 'photos.getMessagesUploadServer', [ + // Получить адрес сервера + $request = json_decode($this->robot->browser->request('POST', 'photos.getMessagesUploadServer', [ 'form_params' => $this->robot->api['settings'] - ])->getBody()->getContents())->response->upload_url; + ])->getBody()->getContents()); + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); + } + + return $request->response; + } + + /** + * Загрузить фото + */ + public function upload($photo, string $url): object + { // Загрузить фото +<<<<<<< HEAD:hood/vk/system/api/methods/photos.php $response = json_decode($this->robot->browser->request('POST', $url, [ >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 +======= + $request = json_decode($this->robot->browser->request('POST', $url, [ +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/photos.php 'multipart' => [ [ 'Content-type' => 'multipart/form-data', 'name' => 'photo', - 'contents' => $img + 'contents' => $photo ] ] ])->getBody()->getContents()); +<<<<<<< HEAD:hood/vk/system/api/methods/photos.php <<<<<<< HEAD //сохранить $response = json_decode($robot->browser->request('POST', 'photos.saveMessagesPhoto', [ @@ -335,6 +363,33 @@ final class photos extends method } } ======= +======= + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); + } + + return $request; + } + + /** + * Получить id фото для сообщения + * + * $robot робот + * + * $pathPhoto Путь к фото + */ + public function getPhoto(string $pathPhoto): string + { + // Получить адрес сервера сообщений + $url = $this->getMessageServer()->upload_url; + + // Открыть фото + $pathPhoto = fopen($pathPhoto, 'r'); + + //Загрузить фото + $response = $this->upload($pathPhoto, $url); +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/api/methods/photos.php // Реинициализация $this->robot->api->reinit(); @@ -353,16 +408,18 @@ final class photos extends method $this->robot->api['hash'] = $response->hash; // Сохранить фото - $response = json_decode($this->robot->browser->request('POST', 'photos.saveMessagesPhoto', [ + $request = json_decode($this->robot->browser->request('POST', 'photos.saveMessagesPhoto', [ 'form_params' => $this->robot->api['settings'] ])->getBody()->getContents()); - // Ссылка на фото - if (isset($response->response)) { - return 'photo' . $response->response[0]->owner_id . '_' . $response->response[0]->id; - } else { - throw new Exception('Фото не загружено'); + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); } + $request; + // Ссылка на фото + return 'photo' . $request->response[0]->owner_id . '_' . $request->response[0]->id; + } } >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 diff --git a/mirzaev/vk/system/api/settings.php b/mirzaev/vk/system/api/settings.php new file mode 100644 index 0000000..b3292d8 --- /dev/null +++ b/mirzaev/vk/system/api/settings.php @@ -0,0 +1,309 @@ + + */ +class settings implements ArrayAccess +{ + /** + * Версия API ВКонтакте по умолчанию + * + * Должна иметь тип string потому, что PHP при стандартных настройках удаляет нули у float + */ + protected const VK_API_VERSION_DEFAULT = '5.130'; + + /** + * Конструктор + */ + public function __construct( + protected robot $robot, + protected array $settings = [] + ) { + if (empty($settings)) { + // Настройки не получены + + // Инициализация + $this->_init(); + } + } + + /** + * Инициализация (безопасная) + * + * @var float $version Версия API (переопределять не рекомендуется) + */ + public function init(string $version = self::VK_API_VERSION_DEFAULT): self + { + // Инициализация + static $blocked = false; + + if ($blocked) { + // Блокировка найдена + + throw new Exception('Повторная инициализация запрещена', 500); + } + + // Блокировка + $blocked = true; + + // Инициализация + try { + $this->_init($version); + } catch (Throwable $t) { + throw new Exception('Не удалось инициализировать API', 500, $t->getPrevious()); + } + + return $this; + } + + /** + * Реинициализация + * + * @var float $version Версия API (переопределять не рекомендуется) + */ + public function reinit(string $version = null): self + { + // Буфер + $version = $version ?? $this->settings['v'] ?? null; + + // Деинициализация + $this->settings = []; + + // Инициализация + try { + $this->_init($version); + } catch (Throwable $t) { + throw new Exception('Не удалось инициализировать API', 500, $t->getPrevious()); + } + + return $this; + } + + /** + * Инициализация + * + * @var float $version Версия API (переопределять не рекомендуется) + */ + protected function _init(string $version = self::VK_API_VERSION_DEFAULT): self + { + // Ключ + $this->settings['access_token'] = $this->robot->key; + + // Версия API + $this->settings['v'] = $version; + + return $this; + } + + /** + * Определить и записать получателя + * + * @see mirzaev\vk\api\methods\messages Сообщения + */ + public function destination(string|array|int $target): self + { + if (is_int($target)) { + // Идентификатор + + $this->settings['peer_id'] = $target; + + return $this; + } else if (is_array($target)) { + // Идентификаторы + + $this->settings['user_ids'] = $target; + + return $this; + } else if (is_string($target)) { + // Домен + + $this->settings['domain'] = $target; + + return $this; + } + + throw new Exception('Не удалось определить получателя', 500); + } + + /** + * Записать свойство + * + * @param string $name Название + * @param mixed $value Значение + */ + public function __set(string $name, mixed $value): void + { + match ($name) { + 'settings' => isset($this->settings) ? throw new Exception('Запрещено перезаписывать настройки', 500) : $this->settings = $value, + 'robot' => isset($this->robot) ? throw new Exception('Запрещено перезаписывать Робота', 500) : $this->robot = $value, + 'data', 'attachments' => $this->offsetSet('attachments', $value), + default => $this->offsetSet($name, $value) + }; + } + + /** + * Прочитать свойство + * + * @param string $name Название + */ + public function __get(string $name): mixed + { + return match ($name) { + 'settings' => $this->settings ?? throw new Exception('Настройки не инициализированы', 500), + 'robot' => $this->robot ?? throw new Exception('Робот не инициализирован', 500), + 'data', 'attachments' => $this->offsetGet('attachments'), + default => $this->offsetGet($name) + }; + } + + // public function __unset(string $name): void + // { + // match ($name) { + // 'settings' => throw new Exception('Запрещено удалять настройки', 500), + // 'robot' => throw new Exception('Запрещено удалять робота', 500), + // 'data', 'attachments' => $this->offsetUnset('attachments'), + // default => $this->offsetUnset($name) + // }; + // } + + /** + * Записать по смещению + */ + public function offsetSet(mixed $offset, mixed $value): mixed + { + if (isset($this->settings)) { + if (strcasecmp($offset, 'settings') === 0) { + // Полная запись + + throw new Exception('Запрещено перезаписывать настройки', 500); + } else if ( + (strcasecmp($offset, 'data') === 0) + || (strcasecmp($offset, 'attachment') === 0) + || (strcasecmp($offset, 'attachments') === 0) + ) { + // Записать вложения + + if (is_array($value)) { + // Жесткая запись + + return $this->settings['attachments'] = $value; + } + + if (empty($this->settings['attachments']) || count($this->settings['attachments']) < 10) { + // Записано менее чем 10 вложений (от 0 до 9) + + // Запись (конкатенация) + return $this->settings['attachments'][] = $value; + } + + throw new Exception('Превышено ограничение на 10 вложений', 500); + } else { + // Запись по ключу или смещению + + return $this->settings[$offset] = $value; + } + } + + throw new Exception('Настройки не инициализированы', 500); + } + + /** + * Прочитать по смещению + */ + public function &offsetGet(mixed $offset): mixed + { + if (isset($this->settings)) { + if (strcasecmp($offset, 'settings') === 0) { + // Полное чтение + + return $this->settings; + } else if (strcasecmp($offset, 'data') === 0 || strcasecmp($offset, 'attachments') === 0) { + // Прочитать вложения + + return $this->settings['attachments']; + } else if (array_key_exists($offset, $this->settings)) { + // Прочитать по ключу или смещению + + return $this->settings[$offset]; + } + + throw new Exception(is_int($offset) ? "Смещение $offset не найдено" : "Ключ $offset не найден", 404); + } + + throw new Exception('Настройки не инициализированы', 500); + } + + /** + * Проверка существования смещения + */ + public function offsetExists(mixed $offset): bool + { + if (isset($this->settings)) { + if (strcasecmp($offset, 'settings') === 0) { + // Полная проверка + + return isset($this->settings); + } else if (strcasecmp($offset, 'data') === 0 || strcasecmp($offset, 'attachments') === 0) { + // Проверка вложений + + return array_key_exists('attachments', $this->settings); + } else { + // Проверка по ключу или смещению + + return array_key_exists($offset, $this->settings); + } + } + + throw new Exception('Настройки не инициализированы', 500); + } + + /** + * Удалить по смещению + */ + public function offsetUnset(mixed $offset): void + { + if (isset($this->settings)) { + if (strcasecmp($offset, 'settings') === 0) { + // Полное удаление + + unset($this->settings); + + return; + } else if (strcasecmp($offset, 'data') === 0 || strcasecmp($offset, 'attachments') === 0) { + // Удаление вложений + + unset($this->settings['attachments']); + + return; + } else { + // Удаление по ключу или смещению + + unset($this->settings[$offset]); + + return; + } + } + + throw new Exception('Настройки не инициализированы', 500); + } +} diff --git a/hood/vk/system/core.php b/mirzaev/vk/system/core.php similarity index 58% rename from hood/vk/system/core.php rename to mirzaev/vk/system/core.php index 39cc2fc..c3c703f 100644 --- a/hood/vk/system/core.php +++ b/mirzaev/vk/system/core.php @@ -2,12 +2,13 @@ declare(strict_types=1); -namespace hood\vk; +namespace mirzaev\vk; + +use mirzaev\vk\robots\robot; +use mirzaev\vk\traits\singleton; +use mirzaev\vk\loggers\jasmo; use Exception; -use hood\vk\loggers\jasmo, - hood\vk\traits\singleton, - hood\vk\robots\robot; /** * Ядро @@ -34,18 +35,22 @@ use hood\vk\loggers\jasmo, * @method public function get($id = null) Чтение из реестра >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 * - * @package VK - * @author Арсен Мирзаев + * @package mirzaev\vk + * @author Arsen Mirzaev Tatyano-Muradovich */ final class core { use singleton; +<<<<<<< HEAD:hood/vk/system/core.php <<<<<<< HEAD /** * Счётчик роботов ======= /** +======= + /** +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/core.php * Счётчик роботов * * @var int @@ -106,20 +111,23 @@ final class core private string $path_temp; /** - * Журналист + * Запись в журнал * <<<<<<< HEAD * $file Файл для журналирования ======= * @param string $file Файл для журналирования * +<<<<<<< HEAD:hood/vk/system/core.php * @return self >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 * +======= +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/core.php * @todo Добавить установку иного журналиста по спецификации PSR-3 * @todo Более гибкое журналирование */ - public function log(string $file = null): self + public function journal(string $file = null): self { // Инициализация журналиста (требует переработки) jasmo::init()::post($file)::postErrorHandler()::postShutdownHandler(); @@ -139,20 +147,34 @@ final class core * @param int $id * @param robot $robot * +<<<<<<< HEAD:hood/vk/system/core.php * @see hood\vk\traits\registry Модификация метода * * @return void >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 +======= + * @see mirzaev\vk\traits\registry Модификация метода +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/core.php */ - public function set(int $id, robot $robot): void + public function write(int $id, robot $robot): void { - // if (empty($this->registry[$id])) { - // // Если нет сессий, то инициализировать - // $this->registry[$id] = []; - // } + try { + // Инициализация уникального идентификатора сессии - // Создать новую сессию и обновить счётчик роботов - $this->registry[$id][++$this->robots] = $robot; + $session = count($this->read($id)); + } catch (Exception $e) { + if ($e->getCode() === 404) { + // Робота или сессии не существует + + $session = 0; + } + } finally { + // Записать новую сессию + $this->registry[$id][$session] = $robot; + + // Прединкрементация счётчика роботов + ++$this->robots; + } } /** @@ -169,21 +191,42 @@ final class core * @param int|null $id Идентификатор * @param int|null $session Сессия * - * @see hood\vk\traits\registry Модификация метода + * @see mirzaev\vk\traits\registry Модификация метода * +<<<<<<< HEAD:hood/vk/system/core.php * @return mixed >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 +======= + * @return mixed Весь реестр, робота или сессию робота +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/core.php */ - public function get(int|null $id = null, int|null $session = null): mixed + public function read(int|null $id = null, int|null $session = null): mixed { - if (isset($id) && array_key_exists($id, $this->registry)) { - // Робот передан и найден - if (isset($session) && array_key_exists($session, $this->registry[$id])) { - // Сессия робота передана и найдена - return $this->registry[$id][$session]; + if (isset($id)) { + // Робот передан + + if (array_key_exists($id, $this->registry)) { + // Робот найден + + if (isset($session)) { + // Сессия робота передана + + if (array_key_exists($session, $this->registry[$id])) { + // Сессия робота найдена + + return $this->registry[$id][$session]; + } + + throw new Exception("Сессия $session робота с идентификатором $id не найдена", 404); + } + + return $this->registry[$id]; + } else { + + throw new Exception("Робот с идентификатором $id не найден", 404); } - return $this->registry[$id]; } + return $this->registry; } @@ -199,46 +242,54 @@ final class core * @param int|null $id Идентификатор * @param int|null $session Сессия * +<<<<<<< HEAD:hood/vk/system/core.php * @see hood\vk\traits\registry Модификация метода * * @return void >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 +======= + * @see mirzaev\vk\traits\registry Модификация метода +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/core.php */ public function delete(int|null $id = null, int|null $session = null): void { if (isset($id)) { // Робот передан - if (!array_key_exists($id, $this->registry)) { - throw new Exception('Робот не найден'); - } + if (array_key_exists($id, $this->registry)) { + // Робот найден - if (isset($session)) { - // Сессия передана + if (isset($session)) { + // Сессия передана - if (!array_key_exists($session, $this->registry[$id])) { - throw new Exception('Сессия не найдена'); + if (array_key_exists($session, $this->registry[$id])) { + // Сессия найдена + + // Постдекрементация счётчика роботов + --$this->robots; + + // Удаление сессии + unset($this->registry[$id][$session]); + + return; + } + + throw new Exception("Сессия $session робота с идентификатором $id не найдена", 404); } - // Счётчик роботов - --$this->robots; + // Вычитание из счётчика количества сессий робота + $this->robots = $this->robots - count($this->registry[$id]); - // Удаление сессии - unset($this->registry[$id][$session]); + // Удаление робота и всех его сессий + unset($this->registry[$id]); return; } - // Счётчик роботов - $this->robots = $this->robots - count($this->registry[$id]); - - // Удаление робота и всех его сессий - unset($this->registry[$id]); - - return; + throw new Exception("Робот с идентификатором $id не найден", 404); } - // Удаление всех роботов и их сессий + // Полная очистка $this->registry = []; } @@ -251,17 +302,20 @@ final class core ======= * @param mixed $name Название * @param mixed $value Значение +<<<<<<< HEAD:hood/vk/system/core.php * * @return void >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 +======= +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/core.php */ public function __set(mixed $name, mixed $value): void { match ($name) { - 'timezone' => !isset($this->timezone) ? $this->timezone = $value : throw new Exception('Запрещено переопределять часовой пояс'), - 'path_root' => !isset($this->path_root) ? $this->path_root = $value : throw new Exception('Запрещено переопределять корневой каталог'), - 'path_logs' => !isset($this->path_logs) ? $this->path_logs = $value : throw new Exception('Запрещено переопределять каталог журналов'), - 'path_temp' => !isset($this->path_temp) ? $this->path_temp = $value : throw new Exception('Запрещено переопределять каталог временных файлов') + 'timezone' => !isset($this->timezone) ? $this->timezone = $value : throw new Exception('Запрещено переопределять часовой пояс', 500), + 'path_root' => !isset($this->path_root) ? $this->path_root = $value : throw new Exception('Запрещено переопределять корневой каталог', 500), + 'path_logs' => !isset($this->path_logs) ? $this->path_logs = $value : throw new Exception('Запрещено переопределять каталог журналов', 500), + 'path_temp' => !isset($this->path_temp) ? $this->path_temp = $value : throw new Exception('Запрещено переопределять каталог временных файлов', 500) }; } @@ -275,18 +329,21 @@ final class core ======= * * @param mixed $name Название +<<<<<<< HEAD:hood/vk/system/core.php * * @return mixed >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 +======= +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/core.php */ public function __get(mixed $name): mixed { return match ($name) { 'robots' => $this->robots, - 'timezone' => !isset($this->timezone) ? $this->timezone = 'Europe/Moscow' : $this->timezone, - 'path_root' => !isset($this->path_root) ? $this->path_root = dirname(__DIR__) : $this->path_root, - 'path_logs' => !isset($this->path_logs) ? $this->path_logs = $this->path_root . '/logs' : $this->path_logs, - 'path_temp' => !isset($this->path_temp) ? $this->path_root . '/temp' : $this->path_temp, + 'timezone' => $this->timezone ?? $this->timezone = 'Europe/Moscow', + 'path_root' => $this->path_root ?? $this->path_root = dirname(__DIR__), + 'path_logs' => $this->path_logs ?? $this->path_logs = $this->__get('path_root') . '/logs', + 'path_temp' => $this->path_temp ?? $this->path_temp = $this->__get('path_root') . '/temp', default => null }; } @@ -303,17 +360,20 @@ final class core ======= * @param string $method Метод * @param array $params Параметры +<<<<<<< HEAD:hood/vk/system/core.php * * @return robot >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 +======= +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/core.php */ public function __call(string $method, array $params): robot { - if (class_exists($robot = '\\hood\\vk\\robots\\' . $method)) { + if (class_exists($robot = '\\mirzaev\\vk\\robots\\' . $method)) { // Если найден класс реализующий запрошенного робота return new $robot(...$params); } else { - throw new Exception('Не найден робот: ' . $method); + throw new Exception("Робот $method не найден", 404); } } } diff --git a/hood/vk/system/loggers/jasmo.php b/mirzaev/vk/system/loggers/jasmo.php similarity index 95% rename from hood/vk/system/loggers/jasmo.php rename to mirzaev/vk/system/loggers/jasmo.php index 6aebe22..960b948 100644 --- a/hood/vk/system/loggers/jasmo.php +++ b/mirzaev/vk/system/loggers/jasmo.php @@ -2,25 +2,25 @@ declare(strict_types=1); -namespace hood\vk\loggers; +namespace mirzaev\vk\loggers; use DateTime; use Monolog\logger; use Monolog\Handler\StreamHandler; use Jasny\ErrorHandler; -use hood\vk\core, - hood\vk\traits\singleton; +use mirzaev\vk\core, + mirzaev\vk\traits\singleton; /** * Журналист Jasmo - * - * Основан на "monolog/monolog" и "jasny/error-handler" + * + * Основан на "monolog/monolog" и "jasny/error-handler" * Jasmo = Jasny + Monolog - * + * * @see Monolog\logger * @see Jasny\ErrorHandler - * - * @package hood\vk\loggers + * + * @package mirzaev\vk\loggers * @author Arsen Mirzaev Tatyano-Muradovich */ final class jasmo extends logger @@ -37,7 +37,7 @@ final class jasmo extends logger // /** // * Экземпляр класса обработчика ошибок // * - // * @var ErrorHandler + // * @var ErrorHandler // */ // public ErrorHandler $handler; @@ -45,15 +45,15 @@ final class jasmo extends logger { $file = $file ?? date_format(new DateTime(core::init()->timezone), 'Y.m.d'); - /** + /** * Создание логгера по спецификации PSR-3 (Monolog) - * + * * @param string Название канала логирования */ self::$logger = new logger(__CLASS__); - /** - * Создание обработчиков (порядок обязателен) + /** + * Создание обработчиков (порядок обязателен) */ self::$logger->pushHandler(new StreamHandler(core::init()->path['logs'] . "/${file}-INFO.log", logger::INFO, false)); // Инфомация о процессе работы self::$logger->pushHandler(new StreamHandler(core::init()->path['logs'] . "/${file}-NOTICE.log", logger::NOTICE, false)); // Уведомления @@ -89,7 +89,7 @@ final class jasmo extends logger public static function postErrorHandler(): ?jasmo { - /** + /** * Подключение логгера в обработчик ошибок (Jasny) */ $handler = new ErrorHandler(self::$logger); diff --git a/hood/vk/system/loggers/logger.php b/mirzaev/vk/system/loggers/logger.php similarity index 88% rename from hood/vk/system/loggers/logger.php rename to mirzaev/vk/system/loggers/logger.php index 68b45d1..daef2c0 100644 --- a/hood/vk/system/loggers/logger.php +++ b/mirzaev/vk/system/loggers/logger.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace hood\vk\loggers; +namespace mirzaev\vk\loggers; /** * Абстрактный класс журналиста - * - * @package hood\vk\loggers + * + * @package mirzaev\vk\loggers * @author Arsen Mirzaev Tatyano-Muradovich */ abstract class logger @@ -22,4 +22,4 @@ abstract class logger abstract static public function post($file = null): ?logger; abstract static public function get(): ?logger; abstract static public function delete(): ?logger; -} \ No newline at end of file +} diff --git a/hood/vk/system/robots/group.php b/mirzaev/vk/system/robots/group.php similarity index 92% rename from hood/vk/system/robots/group.php rename to mirzaev/vk/system/robots/group.php index a39cfef..c09946c 100644 --- a/hood/vk/system/robots/group.php +++ b/mirzaev/vk/system/robots/group.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace hood\vk\robots; +namespace mirzaev\vk\robots; -use hood\vk\robots\robot, - hood\vk\api\longpoll; +use mirzaev\vk\robots\robot; +use mirzaev\vk\api\longpoll; -use Throwable, - Exception; +use Throwable; +use Exception; /** * Робот-группа @@ -29,7 +29,7 @@ use Throwable, * @method public function __get($name) Чтение свойства * @method public function __isset($name) Проверка на инициализированность свойства * - * @package hood\vk\robots + * @package mirzaev\vk\robots * @author Arsen Mirzaev Tatyano-Muradovich >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 */ @@ -56,7 +56,7 @@ final class group extends robot * @param string $name Название * @param mixed $value Значение * - * @see hood\vk\robots\robot Наследуемый метод + * @see mirzaev\vk\robots\robot Наследуемый метод * * @return void >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 @@ -85,7 +85,7 @@ final class group extends robot ======= * @param string $name Название * - * @see hood\vk\robots\robot Наследуемый метод + * @see mirzaev\vk\robots\robot Наследуемый метод * * @return mixed >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 diff --git a/hood/vk/system/robots/robot.php b/mirzaev/vk/system/robots/robot.php similarity index 77% rename from hood/vk/system/robots/robot.php rename to mirzaev/vk/system/robots/robot.php index 810a60c..9c9985b 100644 --- a/hood/vk/system/robots/robot.php +++ b/mirzaev/vk/system/robots/robot.php @@ -2,12 +2,13 @@ declare(strict_types=1); -namespace hood\vk\robots; +namespace mirzaev\vk\robots; use Exception; use GuzzleHttp\Client as browser; +<<<<<<< HEAD:hood/vk/system/robots/robot.php <<<<<<< HEAD use hood\vk\core, hood\vk\api\methods\method, @@ -45,8 +46,15 @@ use hood\vk\proxies\proxy; use hood\vk\captcha\captcha; use hood\vk\api\api; use hood\vk\api\methods\method; +======= +use mirzaev\vk\core; +use mirzaev\vk\proxies\proxy; +use mirzaev\vk\captcha\captcha; +use mirzaev\vk\api\settings as api; +use mirzaev\vk\api\methods\method; +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/robots/robot.php -use hood\accounts\vk as account; +use mirzaev\accounts\vk as account; /** @@ -63,7 +71,7 @@ use hood\accounts\vk as account; * * @var int $messages_mode Режим отправки сообщений * - * @method public function __construct(int $id = null, float $version = null) Конструктор + * @method public function __construct(int $id = null) Конструктор * @method public function key(string $key) Инициализация ключа * @method public function account(account $account) Инициализация аккаунта * @method public function __set($name, $value) Запись свойства @@ -74,7 +82,7 @@ use hood\accounts\vk as account; * @method public function __toString() Конвертация в строку >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 * - * @package hood\vk\robots + * @package mirzaev\vk\robots * @author Arsen Mirzaev Tatyano-Muradovich */ abstract class robot @@ -94,6 +102,7 @@ abstract class robot protected int $session; /** +<<<<<<< HEAD:hood/vk/system/robots/robot.php <<<<<<< HEAD * Ключ ======= @@ -111,6 +120,8 @@ abstract class robot /** * Аккаунт ======= +======= +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/robots/robot.php * @var string Аккаунт >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 */ @@ -154,6 +165,7 @@ abstract class robot /** * Конструктор * +<<<<<<< HEAD:hood/vk/system/robots/robot.php <<<<<<< HEAD * $id Идентификатор * $version Версия API @@ -162,21 +174,27 @@ abstract class robot { ======= * @param int $id Идентификатор +======= + * @param int|null $id Идентификатор + * @param string|null $key Ключ +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/robots/robot.php */ public function __construct( protected int|null $id = null, + protected string|null $key = null ) { >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 // Инициализация ядра $core = core::init(); // Идентификация робота - $this->id = empty($id) ? $core->robots + 1 : $id; + $this->id = $id ?? $core->robots + 1; // Регистрация робота в ядре - $core->set($this->id, $this); + $core->write($this->id, $this); // Идентификация сессии робота +<<<<<<< HEAD:hood/vk/system/robots/robot.php $this->session = count($core->get($this->id)); <<<<<<< HEAD @@ -186,6 +204,9 @@ abstract class robot } ======= >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 +======= + $this->session = count($core->read($this->id)); +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/robots/robot.php } /** @@ -201,11 +222,7 @@ abstract class robot */ public function key(string $key): self { - if (!isset($this->key)) { - $this->key = $key; - } else { - throw new Exception('Запрещено перезаписывать ключ'); - } + $this->__set('key', $key); return $this; } @@ -223,11 +240,7 @@ abstract class robot */ public function account(account $account): self { - if (!isset($this->account)) { - $this->account = $account; - } else { - throw new Exception('Запрещено перезаписывать аккаунт'); - } + $this->__set('account', $account); return $this; } @@ -245,7 +258,7 @@ abstract class robot */ public function proxy(proxy $proxy): self { - $this->proxy = $proxy; + $this->__set('proxy', $proxy); return $this; } @@ -263,7 +276,7 @@ abstract class robot */ public function captcha(captcha $captcha): self { - $this->captcha = $captcha; + $this->__set('captcha', $captcha); return $this; } @@ -284,6 +297,7 @@ abstract class robot public function __set(string $name, mixed $value): void { match ($name) { +<<<<<<< HEAD:hood/vk/system/robots/robot.php 'id' => !isset($this->id) ? $this->id = (int) $value : throw new Exception('Запрещено перезаписывать идентификатор'), 'session' => !isset($this->session) ? $this->session = (int) $value : throw new Exception('Запрещено перезаписывать сессию'), 'key' => !isset($this->key) ? $this->key = (string) $value : throw new Exception('Запрещено перезаписывать ключ'), @@ -302,6 +316,18 @@ abstract class robot ======= >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 default => throw new Exception('Свойство не найдено: ' . $name) +======= + 'id' => isset($this->id) ? throw new Exception('Запрещено перезаписывать идентификатор', 500) : $this->id = (int) $value, + 'session' => isset($this->session) ? throw new Exception('Запрещено перезаписывать сессию', 500) : $this->session = (int) $value, + 'key' => isset($this->key) ? throw new Exception('Запрещено перезаписывать ключ', 500) : $this->key = (string) $value, + 'api' => isset($this->api) ? throw new Exception('Запрещено перезаписывать API', 500) : $this->api = $value, + 'account' => isset($this->account) ? throw new Exception('Запрещено перезаписывать аккаунт', 500) : $this->account = $value, + 'browser' => isset($this->browser) ? throw new Exception('Запрещено перезаписывать браузер', 500) : $this->browser = $value, + 'proxy' => $this->proxy = $value, + 'captcha' => $this->captcha = $value, + 'messages_new' => $this->messages_new = (int) $value, + default => throw new Exception("Свойство $name не найдено", 404) +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/robots/robot.php }; } @@ -329,12 +355,16 @@ abstract class robot public function __get(string $name): mixed { return match ($name) { - 'id' => $this->id ?? throw new Exception('Идентификатор не инициализирован'), - 'session' => $this->session ?? throw new Exception('Сессия не инициализирована'), - 'key' => $this->key ?? throw new Exception('Ключ не инициализирован'), + 'id' => $this->id ?? throw new Exception('Идентификатор не инициализирован', 500), + 'session' => $this->session ?? throw new Exception('Сессия не инициализирована', 500), + 'key' => $this->key ?? throw new Exception('Ключ не инициализирован', 500), 'api' => $this->api ?? $this->api = new api($this), +<<<<<<< HEAD:hood/vk/system/robots/robot.php 'account' => $this->account ?? throw new Exception('Аккаунт не инициализирован'), >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 +======= + 'account' => $this->account ?? throw new Exception('Аккаунт не инициализирован', 500), +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/robots/robot.php 'browser' => $this->browser ?? $this->browser = new browser([ 'base_uri' => 'https://api.vk.com/method/', 'cookies' => true @@ -342,11 +372,15 @@ abstract class robot 'proxy' => $this->proxy, 'captcha' => $this->captcha, 'messages_new' => $this->messages_new, +<<<<<<< HEAD:hood/vk/system/robots/robot.php <<<<<<< HEAD // Если свойство не найдено: ======= >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 default => throw new Exception('Свойство не найдено: ' . $name) +======= + default => throw new Exception("Свойство $name не найдено", 404) +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/robots/robot.php }; } @@ -381,7 +415,7 @@ abstract class robot 'proxy' => isset($this->proxy), 'captcha' => isset($this->captcha), 'messages_new' => isset($this->messages_new), - default => throw new Exception('Свойство не найдено: ' . $name) + default => throw new Exception("Свойство $name не найдено", 404) }; } @@ -403,12 +437,12 @@ abstract class robot */ public function __call(string $method, array $params): method { - if (class_exists($class = '\\hood\\vk\\api\\methods\\' . $method . 's')) { + if (class_exists($class = '\\mirzaev\\vk\\api\\methods\\' . $method . 's')) { // Если найден класс реализующий запрошенный метод return new $class($this, ...$params); } - throw new Exception('Метод не найден: ' . $method); + throw new Exception("Метод $method не найден", 404); } /** @@ -429,11 +463,11 @@ abstract class robot */ public static function __callStatic(string $method, array $params): method { - if (class_exists($class = '\\hood\\vk\\api\\methods\\' . $method . 's')) { + if (class_exists($class = '\\mirzaev\\vk\\api\\methods\\' . $method . 's')) { return $class(self, ...$params); } - throw new Exception('Метод не найден: ' . $method); + throw new Exception("Метод $method не найден", 404); } /** diff --git a/hood/vk/system/robots/user.php b/mirzaev/vk/system/robots/user.php similarity index 79% rename from hood/vk/system/robots/user.php rename to mirzaev/vk/system/robots/user.php index 8bf401c..7bb878d 100644 --- a/hood/vk/system/robots/user.php +++ b/mirzaev/vk/system/robots/user.php @@ -2,16 +2,16 @@ declare(strict_types=1); -namespace hood\vk\robots; +namespace mirzaev\vk\robots; -use hood\vk\robots\robot; +use mirzaev\vk\robots\robot; -use hood\accounts\vk as account; +use mirzaev\accounts\vk as account; /** * Робот-пользователь * - * @package hood\vk\robots + * @package mirzaev\vk\robots * @author Arsen Mirzaev Tatyano-Muradovich */ final class user extends robot diff --git a/hood/vk/system/traits/registry.php b/mirzaev/vk/system/traits/registry.php similarity index 97% rename from hood/vk/system/traits/registry.php rename to mirzaev/vk/system/traits/registry.php index b50adbd..fe6b2e3 100644 --- a/hood/vk/system/traits/registry.php +++ b/mirzaev/vk/system/traits/registry.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace hood\vk\traits; +namespace mirzaev\vk\traits; /** * Паттерн registry diff --git a/hood/vk/system/traits/singleton.php b/mirzaev/vk/system/traits/singleton.php similarity index 87% rename from hood/vk/system/traits/singleton.php rename to mirzaev/vk/system/traits/singleton.php index 7bdc3da..d5b234d 100644 --- a/hood/vk/system/traits/singleton.php +++ b/mirzaev/vk/system/traits/singleton.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace hood\vk\traits; +namespace mirzaev\vk\traits; use Exception; @@ -27,9 +27,13 @@ trait singleton /** * Инициализация +<<<<<<< HEAD:hood/vk/system/traits/singleton.php <<<<<<< HEAD ======= * +======= + * +>>>>>>> 579e64b087c763b465464b5ee0d14b16a98d17b2:mirzaev/vk/system/traits/singleton.php * @return self >>>>>>> a45b5c327511a74d1fae5ab0e3a1dcc68e7dc3b4 */ diff --git a/hood/vk/temp/191417381_0.longpoll b/mirzaev/vk/temp/191417381_0.longpoll similarity index 100% rename from hood/vk/temp/191417381_0.longpoll rename to mirzaev/vk/temp/191417381_0.longpoll diff --git a/mirzaev/vk/temp/191417381_1.longpoll b/mirzaev/vk/temp/191417381_1.longpoll new file mode 100644 index 0000000..c750cc8 --- /dev/null +++ b/mirzaev/vk/temp/191417381_1.longpoll @@ -0,0 +1 @@ +9104 \ No newline at end of file diff --git a/hood/vk/tests/.gitignore b/mirzaev/vk/tests/.gitignore similarity index 100% rename from hood/vk/tests/.gitignore rename to mirzaev/vk/tests/.gitignore diff --git a/mirzaev/vk/tests/accounts/.gitignore b/mirzaev/vk/tests/accounts/.gitignore new file mode 100644 index 0000000..f4c3747 --- /dev/null +++ b/mirzaev/vk/tests/accounts/.gitignore @@ -0,0 +1,2 @@ +/* +!.gitignore \ No newline at end of file diff --git a/mirzaev/vk/tests/api/apiTest.php b/mirzaev/vk/tests/api/apiTest.php new file mode 100644 index 0000000..14189dd --- /dev/null +++ b/mirzaev/vk/tests/api/apiTest.php @@ -0,0 +1,273 @@ +ssl = self::$ssl ?? true; + + if (empty(self::$key)) { + // Если не указан ключ + + // Проверка входных данных + if (empty(self::$login)) { + self::markTestSkipped('Не инициализирован входной аккаунта'); + } else if (empty(self::$password)) { + self::markTestSkipped('Не инициализирован пароль аккаунта'); + } + + // Деаутентификация (на всякий случай) + self::$account->deauth(); + + // Аутентификация и генерация ключа + self::$key = self::$account->auth(self::$login, self::$password)->key(self::$project_id); + } + + $this->assertNotNull(self::$key, 'Ошибка при инициализации ключа аккаунта'); + } + + /** + * @testdox Деинициализация аккаунта + * @afterClass + */ + public static function testAccountDeinit(): void + { + // Инициализация аккаунта + self::$account = new account(self::$id ?? rand(0, 10), self::$path_accounts); + + // Деаутентификация + self::$account->deauth(); + } + + /** + * @testdox Инициализация робота-группы + * @before + */ + public function testRobotGroupInit(): void + { + // Инициализация ядра + self::$core = core::init(); + + // Сохранение количества роботов + $count = self::$core->robots; + + // Инициализация робота + self::$robot = self::$core->group(self::$group_id ?? rand(0, 10)); + + // Проверка + $this->assertSame(self::$core->robots, $count + 1, 'Ошибка при инициализации робота-группы'); + } + + /** + * @testdox Деинициализация робота-группы + * @after + */ + public function testRobotGroupDeinit(): void + { + // Очистка реестра + self::$core->delete(); + + // Проверка выброса исключения (НЕ РАБОТАЕТ, ВЕРОЯТНО БАГ) + // $this->expectExceptionMessage('Робот с идентификатором ' . self::$robot->id . ' не найден'); + // $this->expectExceptionCode(404); + + try { + // Чтение + self::$core->read(self::$robot->id); + } catch (RealException $e) { + // Проверка + $this->assertSame('Робот с идентификатором ' . self::$robot->id . ' не найден', $e->getMessage(), 'Не удалось удалить робота'); + } + } + + /** + * @testdox Инициализация + */ + public function testInit(): void + { + // Инициализация + $settings = self::$robot->key(self::$group_key)->api->init(self::$version); + + // Проверка + $this->assertNotNull($settings['access_token']); + $this->assertNotNull($settings['v']); + $this->assertSame($settings['v'], self::$version); + + // Проверка + $this->expectExceptionMessage('Повторная инициализация запрещена'); + + // Инициализация (повторная) + $settings = self::$robot->api->init(self::$version); + } + + /** + * @testdox Реинициализация + */ + public function testReinit(): void + { + // Реинициализация + self::$robot->key(self::$group_key)->api->reinit(); + } + + /** + * @testdox Запись и чтение параметра + */ + public function testWriteAndReadParameter(): void + { + // Запись + self::$robot->key(self::$group_key)->api['key'] = 'value'; + + // Проверка + $this->assertSame('value', self::$robot->api['key'], 'Не удалось записать или прочитать параметр'); + } + + /** + * @testdox Чтение неинициализированного параметра + */ + public function testReadUndefinedParameter(): void + { + // Проверка выброса исключения + $this->expectExceptionMessage('Ключ key не найден'); + + // Чтение + self::$robot->key(self::$group_key)->api['key']; + } + + /** + * @testdox Выбор получателя по идентификатору + */ + public function testChooseDestinationById(): void + { + // Выбор получателя + self::$robot->key(self::$group_key)->api->destination(self::$target_id); + + // Проверка + $this->assertSame(self::$target_id, self::$robot->api['peer_id'], 'Не удалось выбрать получателя по идентификатору'); + } + + /** + * @testdox Выбор получателей по идентификаторам + */ + public function testChooseDestinationsByIds(): void + { + // Выбор получателей + self::$robot->key(self::$group_key)->api->destination([self::$target_id, self::$target_id]); + + // Проверка + $this->assertSame([self::$target_id, self::$target_id], self::$robot->api['user_ids'], 'Не удалось выбрать получателей по идентификаторам'); + } + + /** + * @testdox Выбор получателя по домену + */ + public function testChooseDestinationByDomain(): void + { + // Выбор получателя + self::$robot->key(self::$group_key)->api->destination(self::$target_domain); + + // Проверка + $this->assertSame(self::$target_domain, self::$robot->api['domain'], 'Не удалось выбрать получателя по домену'); + } + + /** + * @testdox Запись, чтение и удаление вложений + */ + public function testWriteAndReadAttachments(): void + { + // Инициализация + self::$robot->key(self::$group_key); + + // Запись + self::$robot->api['attachments'] = 'photo0000_0000'; + self::$robot->api['attachments'] = 'video0000_0000'; + self::$robot->api['attachments'] = 'audio0000_0000'; + + // Проверка + $this->assertSame(['photo0000_0000', 'video0000_0000', 'audio0000_0000'], self::$robot->api['attachments'], 'Не удалось записать или прочитать вложения'); + + // Удаление одного вложения + unset(self::$robot->api['attachments'][0]); + + // Реинициализация смещений (для точной проверки) + self::$robot->api['attachments'] = array_values(self::$robot->api['attachments']); + + // Проверка + $this->assertSame(['video0000_0000', 'audio0000_0000'], self::$robot->api['attachments'], 'Не удалось удалить или прочитать вложения'); + + // Удаление всех вложений + unset(self::$robot->api['attachments']); + + // Проверка + $this->assertNull(self::$robot->api['attachments'], 'Не удалось удалить вложения'); + } + + /** + * @testdox Запись вложений с превышением ограничения + */ + public function testWriteWithOverflowAttachments() + { + // Проверка выброса исключения + $this->expectExceptionMessage('Превышено ограничение на 10 вложений'); + + // Инициализация + self::$robot->key(self::$group_key); + + // Запись (11 вложений) + self::$robot->api['attachments'] = 'photo0000_0000'; + self::$robot->api['attachments'] = 'video0000_0000'; + self::$robot->api['attachments'] = 'audio0000_0000'; + self::$robot->api['attachments'] = 'photo0000_0000'; + self::$robot->api['attachments'] = 'video0000_0000'; + self::$robot->api['attachments'] = 'audio0000_0000'; + self::$robot->api['attachments'] = 'photo0000_0000'; + self::$robot->api['attachments'] = 'video0000_0000'; + self::$robot->api['attachments'] = 'audio0000_0000'; + self::$robot->api['attachments'] = 'photo0000_0000'; + self::$robot->api['attachments'] = 'video0000_0000'; + } +} diff --git a/mirzaev/vk/tests/api/methods/messagesTest.php b/mirzaev/vk/tests/api/methods/messagesTest.php new file mode 100644 index 0000000..19980c8 --- /dev/null +++ b/mirzaev/vk/tests/api/methods/messagesTest.php @@ -0,0 +1,333 @@ +ssl = self::$ssl ?? true; + + if (empty(self::$key)) { + // Если не указан ключ + + // Проверка входных данных + if (empty(self::$login)) { + self::markTestSkipped('Не инициализирован входной аккаунта'); + } else if (empty(self::$password)) { + self::markTestSkipped('Не инициализирован пароль аккаунта'); + } + + // Деаутентификация (на всякий случай) + self::$account->deauth(); + + // Аутентификация и генерация ключа + self::$key = self::$account->auth(self::$login, self::$password)->key(self::$project_id); + } + + $this->assertNotNull(self::$key, 'Ошибка при инициализации ключа аккаунта'); + } + + /** + * @testdox Деинициализация аккаунта + * @afterClass + */ + public static function testAccountDeinit(): void + { + // Инициализация аккаунта + self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, self::$path_accounts); + + // Деаутентификация + self::$account->deauth(); + } + + /** + * @testdox Инициализация робота + * @before + */ + public function testRobotGroupInit(): void + { + // Инициализация ядра + self::$core = core::init(); + + // Сохранение количества роботов + $count = self::$core->robots; + + // Инициализация робота + self::$robot = self::$core->group(empty(self::$group_id) ? rand(0, 10) : self::$group_id); + + // Проверка + $this->assertSame(self::$core->robots, $count + 1, 'Ошибка при инициализации робота'); + } + + /** + * @testdox Деинициализация робота + * @after + */ + public function testRobotGroupDeinit(): void + { + // Очистка реестра + self::$core->delete(); + + // Проверка + $this->assertEmpty(self::$core->read(self::$robot->id), 'Ошибка при деинициализации робота'); + } + + /** + * @testdox Чтение текста + */ + public function testReadText(): void + { + // Проверка выброса исключения + $this->expectExceptionMessage('Текст не инициализирован'); + + // Чтение текста + self::$robot->message()->text; + } + + /** + * @testdox Запись текста + */ + public function testWriteText(): void + { + // Запись текста + $message = self::$robot->message()->text('text'); + + // Проверка + $this->assertNotNull($message->text); + } + + /** + * @testdox Запись текста (повторная) + */ + public function testWriteTextWhenHeIsAlreadyWrited(): void + { + // Запись текста + $message = self::$robot->message()->text('hello'); + + // Повторная запись текста + $message->text(' world'); + + // Проверка + $this->assertSame('hello world', $message->text, ); + } + + /** + * @testdox Отправка текста + */ + public function testSendText(): void + { + // Отправка сообщения + $response = self::$robot->key(self::$group_key)->message('Тестовое сообщение')->send(self::$target_id); + + // Проверка + $this->assertIsInt($response, 'Сообщение не отправленно'); + } + + /** + * @testdox Получение информации о сообщении + */ + public function testGetById(): void + { + // Отправка сообщения + $id = self::$robot->key(self::$group_key)->message('Теста метода getByID')->send(self::$target_id); + + // Получение информации + $response = self::$robot->message()->getById($id); + + // Проверка + $this->assertIsArray($response->items, 'Информация не получена'); + } + + + /** + * @testdox Чтение Вложений + */ + public function testReadAttachments(): void + { + // Проверка выброса исключеия + $this->expectExceptionMessage('Вложения не инициализированны'); + + // Проверка + self::$robot->message()->data; + } + + /** + * @testdox Запись вложений (методом) + */ + public function testWriteAttachments(): void + { + // Запись вложений + $message = self::$robot->message()->attachments('Вложение'); + + // Проверка + $this->assertSame(['Вложение'], $message->data); + } + + /** + * @testdox Запись фото + */ + public function testWriteImage(): void + { + // Запись фото + $message = self::$robot->key(self::$group_key)->message()->image(self::$path_photo); + + // Проверка + $this->assertNotEmpty($message->data); + } + + + /** + * @testdox Отправка фото + */ + public function testSendPhoto(): void + { + // Запись фото + $message = self::$robot->key(self::$group_key)->message('Тест отправки фото')->image(self::$path_photo); + + // Отправка сообщения + $id = $message->send(self::$target_id); + + // Получене информации для проверки + $message = $message->getById($id); + + // Проверка + $this->assertNotEmpty($message->items[0]->attachments, 'Фото не отправлено'); + } + + /** + * @testdox Чтение пересылаемых сообщений + */ + public function testReadForward(): void + { + // Проверка выброса исключеия + $this->expectExceptionMessage('Пересылаемые сообщения не инициализированны'); + + // Проверка + self::$robot->message()->forwardMessages; + } + + /** + * @testdox Запись пересылаемых сообщений + */ + public function testWriteForward(): void + { + // Запись пересылаемых сообщений + $message = self::$robot->message()->forward(123456); + + // Проверка + $this->assertNotEmpty($message->forwardMessages); + + } + + /** + * @testdox Пересылка сообщений + */ + public function testSendForward(): void + { + // Отправка пересылаемого сообщения + $id = self::$robot->key(self::$group_key)->message('Это сообщение будет переслано')->send(self::$target_id); + + // Запись пересылаемых сообщений + $message = self::$robot->message('Тест пересылки сообщений')->forward($id); + + // Отпрравка пересылки сообщения + $id = $message->send(self::$target_id); + + // Получене информации для проверки + $message = self::$robot->message()->getById($id); + + // Проверка + $this->assertNotEmpty($message->items[0]->fwd_messages, 'Сообщение не пересланно'); + + } + + /** + * @testdox Чтение ответного сообщения + */ + public function testReadReply(): void + { + // Проверка выброса исключеия + $this->expectExceptionMessage('Ответное сообщение не инициализированно'); + + // Проверка + self::$robot->message()->ReplyMessage; + } + + /** + * @testdox Запись ответного сообщения + */ + public function testWriteReply(): void + { + // Запись ответного сообщения + $message = self::$robot->message()->Reply(123456); + + // Проверка + $this->assertNotNull($message->ReplyMessage); + + } + + /** + * @testdox Ответ на сообщение + */ + public function testSendReply(): void + { + // Отправка ответного сообщения + $id = self::$robot->key(self::$group_key)->message('Будет ответ на это сообщение')->send(self::$target_id); + + // Запись ответного сообщения + $message = self::$robot->message('Тест ответа на сообщение')->reply($id); + + // Отправка ответа на сообщение + $id = $message->send(self::$target_id); + + // Получене информации для проверки + $message = self::$robot->message()->getById($id); + + // Проверка + $this->assertNotEmpty($message->items[0]->reply_message, 'Сообщение не пересланно'); + + } +} diff --git a/hood/vk/tests/api/methods/photosTest.php b/mirzaev/vk/tests/api/methods/photosTest.php similarity index 65% rename from hood/vk/tests/api/methods/photosTest.php rename to mirzaev/vk/tests/api/methods/photosTest.php index c7647d2..bd7a0a0 100644 --- a/hood/vk/tests/api/methods/photosTest.php +++ b/mirzaev/vk/tests/api/methods/photosTest.php @@ -4,11 +4,11 @@ declare(strict_types=1); use PHPUnit\Framework\TestCase; -use hood\vk\core; -use hood\vk\robots\robot; -use hood\vk\tests\settings; +use mirzaev\vk\core; +use mirzaev\vk\robots\robot; +use mirzaev\vk\tests\settings; -use hood\accounts\vk as account; +use mirzaev\accounts\vk as account; /** * @testdox Фото @@ -40,11 +40,11 @@ final class photosTest extends TestCase { // Проверка входных данных if (empty(self::$project_id)) { - self::$markTestSkipped('Не найден идентификатор проекта'); + self::markTestSkipped('Не инициализирован идентификатор проекта'); } // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../../accounts'); + self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, self::$path_accounts); // Запись режима SSL-протокола self::$account->ssl = self::$ssl ?? true; @@ -54,9 +54,9 @@ final class photosTest extends TestCase // Проверка входных данных if (empty(self::$login)) { - self::$markTestSkipped('Не найден входной аккаунта'); + self::markTestSkipped('Не инициализирован входной аккаунта'); } else if (empty(self::$password)) { - self::$markTestSkipped('Не найден пароль аккаунта'); + self::markTestSkipped('Не инициализирован пароль аккаунта'); } // Деаутентификация (на всякий случай) @@ -76,7 +76,7 @@ final class photosTest extends TestCase public static function testAccountDeinit(): void { // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../../accounts'); + self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, self::$path_accounts); // Деаутентификация self::$account->deauth(); @@ -115,14 +115,39 @@ final class photosTest extends TestCase } /** - * @testdox Загрузка фото и получение его id + * @testdox Получение адреса сервера сообщений + */ + public function testGetMessageServer(): void + { + // Получение адреса сервера + $response = self::$robot->key(self::$group_key)->photo()->getMessageServer(); + + // Проверка + $this->assertIsString($response->upload_url, 'Адрес сервера не получен'); + + } + + /** + * @testdox Загрузка фото + */ + public function testUpload(): void + { + // Получение адреса сервера + $url = self::$robot->key(self::$group_key)->photo()->getMessageServer()->upload_url; + + // Загрузка фото + $response = self::$robot->photo()->upload(fopen(self::$path_photo, 'r'), $url); + + // Проверка + $this->assertIsString($response->hash, 'Фото не загружено'); + } + + /** + * @testdox Получение id фото для сообщения */ public function testGetPhoto(): void { - // Ожидаемое исключение (это временно) - $this->expectExceptionMessage('Фото не загружено'); - // Проверка - self::$robot->key(self::$group_key)->photo()->getPhoto('img'); + self::$robot->key(self::$group_key)->photo()->getPhoto(self::$path_photo); } } diff --git a/hood/vk/tests/robots/groupTest.php b/mirzaev/vk/tests/robots/groupTest.php similarity index 93% rename from hood/vk/tests/robots/groupTest.php rename to mirzaev/vk/tests/robots/groupTest.php index 02c5fd8..48922e9 100644 --- a/hood/vk/tests/robots/groupTest.php +++ b/mirzaev/vk/tests/robots/groupTest.php @@ -4,11 +4,11 @@ declare(strict_types=1); use PHPUnit\Framework\TestCase; -use hood\vk\core, - hood\vk\robots\robot, - hood\vk\tests\settings; +use mirzaev\vk\core; +use mirzaev\vk\robots\robot; +use mirzaev\vk\tests\settings; -use hood\accounts\vk as account; +use mirzaev\accounts\vk as account; /** * @testdox Робот-группа @@ -56,11 +56,11 @@ final class groupTest extends TestCase { // Проверка входных данных if (empty(self::$project_id)) { - self::$markTestSkipped('Не найден идентификатор проекта'); + self::markTestSkipped('Не инициализирован идентификатор проекта'); } // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../accounts'); + self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, self::$path_accounts); // Запись режима SSL-протокола self::$account->ssl = self::$ssl ?? true; @@ -70,9 +70,9 @@ final class groupTest extends TestCase // Проверка входных данных if (empty(self::$login)) { - self::$markTestSkipped('Не найден входной аккаунта'); + self::markTestSkipped('Не инициализирован входной аккаунта'); } else if (empty(self::$password)) { - self::$markTestSkipped('Не найден пароль аккаунта'); + self::markTestSkipped('Не инициализирован пароль аккаунта'); } // Деаутентификация (на всякий случай) @@ -104,7 +104,7 @@ final class groupTest extends TestCase public static function testAccountDeinit(): void { // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../accounts'); + self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, self::$path_accounts); // Деаутентификация self::$account->deauth(); @@ -165,7 +165,7 @@ final class groupTest extends TestCase { // Проверки $this->assertNotNull(self::$robot->id, 'Не удалось прочитать идентификатор'); - $this->assertNotEmpty(self::$core->get(self::$robot->id), 'Робот не найден'); + $this->assertNotEmpty(self::$core->get(self::$robot->id), 'Робот не инициализирован'); } /** @@ -187,7 +187,7 @@ final class groupTest extends TestCase { // Проверки $this->assertNotNull(self::$robot->session, 'Не удалось прочитать сессию'); - $this->assertNotEmpty(self::$core->get(self::$robot->id, self::$robot->session), 'Сессия не найдена'); + $this->assertNotEmpty(self::$core->get(self::$robot->id, self::$robot->session), 'Сессия не инициализирована'); } /** diff --git a/hood/vk/tests/robots/userTest.php b/mirzaev/vk/tests/robots/userTest.php similarity index 93% rename from hood/vk/tests/robots/userTest.php rename to mirzaev/vk/tests/robots/userTest.php index 55b3426..8f14126 100644 --- a/hood/vk/tests/robots/userTest.php +++ b/mirzaev/vk/tests/robots/userTest.php @@ -4,11 +4,11 @@ declare(strict_types=1); use PHPUnit\Framework\TestCase; -use hood\vk\core, - hood\vk\robots\robot, - hood\vk\tests\settings; +use mirzaev\vk\core; +use mirzaev\vk\robots\robot; +use mirzaev\vk\tests\settings; -use hood\accounts\vk as account; +use mirzaev\accounts\vk as account; /** * @testdox Робот-пользователь @@ -56,11 +56,11 @@ final class userTest extends TestCase { // Проверка входных данных if (empty(self::$project_id)) { - self::$markTestSkipped('Не найден идентификатор проекта'); + self::markTestSkipped('Не инициализирован идентификатор проекта'); } // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../accounts'); + self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, self::$path_accounts); // Запись режима SSL-протокола self::$account->ssl = self::$ssl ?? true; @@ -70,9 +70,9 @@ final class userTest extends TestCase // Проверка входных данных if (empty(self::$login)) { - self::$markTestSkipped('Не найден входной аккаунта'); + self::markTestSkipped('Не инициализирован входной аккаунта'); } else if (empty(self::$password)) { - self::$markTestSkipped('Не найден пароль аккаунта'); + self::markTestSkipped('Не инициализирован пароль аккаунта'); } // Деаутентификация (на всякий случай) @@ -104,7 +104,7 @@ final class userTest extends TestCase public static function testAccountDeinit(): void { // Инициализация аккаунта - self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../accounts'); + self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, self::$path_accounts); // Деаутентификация self::$account->deauth(); @@ -165,7 +165,7 @@ final class userTest extends TestCase { // Проверки $this->assertNotNull(self::$robot->id, 'Не удалось прочитать идентификатор'); - $this->assertNotEmpty(self::$core->get(self::$robot->id), 'Робот не найден'); + $this->assertNotEmpty(self::$core->get(self::$robot->id), 'Робот не инициализирован'); } /** @@ -187,7 +187,7 @@ final class userTest extends TestCase { // Проверки $this->assertNotNull(self::$robot->session, 'Не удалось прочитать сессию'); - $this->assertNotEmpty(self::$core->get(self::$robot->id, self::$robot->session), 'Сессия не найдена'); + $this->assertNotEmpty(self::$core->get(self::$robot->id, self::$robot->session), 'Сессия не инициализирована'); } /** diff --git a/mirzaev/vk/tests/settings.php.example b/mirzaev/vk/tests/settings.php.example new file mode 100644 index 0000000..c117989 --- /dev/null +++ b/mirzaev/vk/tests/settings.php.example @@ -0,0 +1,90 @@ +group(12312)->key(1); +$robot = $core->group(12312)->key(1); +$robot = $core->group()->key(1); +$robot = $core->group()->key(1); + +$settings = new settings($robot); + +$settings['data']['test']['a'] = 2; +$settings['data'] = 2; + +var_export($core->read());