diff --git a/dicos/90_nineschool.xml b/dicos/90_nineschool.xml
index 16ebd21..9b060b8 100644
--- a/dicos/90_nineschool.xml
+++ b/dicos/90_nineschool.xml
@@ -16,7 +16,7 @@
-
+
diff --git a/src/nineschool-1.0/composer.json b/src/nineschool-1.0/composer.json
index fa58e06..194c2ea 100644
--- a/src/nineschool-1.0/composer.json
+++ b/src/nineschool-1.0/composer.json
@@ -5,6 +5,7 @@
"php": "^7.1.3",
"ext-ctype": "*",
"ext-iconv": "*",
+ "cboden/ratchet": "^0.4.3",
"doctrine/annotations": "^1.8",
"friendsofsymfony/ckeditor-bundle": "^2.2",
"friendsofsymfony/rest-bundle": "^3.0",
@@ -14,6 +15,7 @@
"nategood/httpful": "^0.3.2",
"nelmio/api-doc-bundle": "^3.6",
"oneup/uploader-bundle": "^3.0",
+ "ramsey/uuid": "^4.1",
"sensio/framework-extra-bundle": "^5.1",
"symfony/apache-pack": "^1.0",
"symfony/asset": "5.1.*",
diff --git a/src/nineschool-1.0/composer.lock b/src/nineschool-1.0/composer.lock
index b05ff51..3a143b2 100644
--- a/src/nineschool-1.0/composer.lock
+++ b/src/nineschool-1.0/composer.lock
@@ -4,8 +4,111 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "content-hash": "dcf29a3826720301ab52c6fe3543f7bd",
+ "content-hash": "6e17c24e8ecdd92e1fa9b4738c5c94f3",
"packages": [
+ {
+ "name": "brick/math",
+ "version": "0.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/brick/math.git",
+ "reference": "283a40c901101e66de7061bd359252c013dcc43c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/brick/math/zipball/283a40c901101e66de7061bd359252c013dcc43c",
+ "reference": "283a40c901101e66de7061bd359252c013dcc43c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.1|^8.0"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.2",
+ "phpunit/phpunit": "^7.5.15|^8.5",
+ "vimeo/psalm": "^3.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Brick\\Math\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Arbitrary-precision arithmetic library",
+ "keywords": [
+ "Arbitrary-precision",
+ "BigInteger",
+ "BigRational",
+ "arithmetic",
+ "bigdecimal",
+ "bignum",
+ "brick",
+ "math"
+ ],
+ "time": "2020-08-18T23:57:15+00:00"
+ },
+ {
+ "name": "cboden/ratchet",
+ "version": "v0.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ratchetphp/Ratchet.git",
+ "reference": "466a0ecc83209c75b76645eb823401b5c52e5f21"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ratchetphp/Ratchet/zipball/466a0ecc83209c75b76645eb823401b5c52e5f21",
+ "reference": "466a0ecc83209c75b76645eb823401b5c52e5f21",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/psr7": "^1.0",
+ "php": ">=5.4.2",
+ "ratchet/rfc6455": "^0.3",
+ "react/socket": "^1.0 || ^0.8 || ^0.7 || ^0.6 || ^0.5",
+ "symfony/http-foundation": "^2.6|^3.0|^4.0|^5.0",
+ "symfony/routing": "^2.6|^3.0|^4.0|^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Ratchet\\": "src/Ratchet"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Matt Bonneau",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP WebSocket library",
+ "homepage": "http://socketo.me",
+ "keywords": [
+ "Ratchet",
+ "WebSockets",
+ "server",
+ "sockets",
+ "websocket"
+ ],
+ "time": "2020-07-07T15:50:14+00:00"
+ },
{
"name": "doctrine/annotations",
"version": "1.10.3",
@@ -1165,6 +1268,7 @@
"reflection",
"static"
],
+ "abandoned": "roave/better-reflection",
"time": "2020-03-27T11:06:43+00:00"
},
{
@@ -1278,6 +1382,49 @@
],
"time": "2020-06-16T20:11:17+00:00"
},
+ {
+ "name": "evenement/evenement",
+ "version": "v3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/igorw/evenement.git",
+ "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
+ "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Evenement": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ }
+ ],
+ "description": "Événement is a very simple event dispatching library for PHP",
+ "keywords": [
+ "event-dispatcher",
+ "event-emitter"
+ ],
+ "time": "2017-07-23T21:35:13+00:00"
+ },
{
"name": "exsyst/swagger",
"version": "v0.4.1",
@@ -1496,6 +1643,77 @@
],
"time": "2020-06-29T11:19:01+00:00"
},
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3",
+ "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0",
+ "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "ext-zlib": "*",
+ "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "time": "2020-09-30T07:37:11+00:00"
+ },
{
"name": "jasig/phpcas",
"version": "1.3.8",
@@ -2495,6 +2713,56 @@
],
"time": "2019-01-08T18:20:26+00:00"
},
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2016-08-06T14:39:51+00:00"
+ },
{
"name": "psr/link",
"version": "1.0.0",
@@ -2591,6 +2859,627 @@
],
"time": "2020-03-23T09:12:05+00:00"
},
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "ramsey/collection",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/collection.git",
+ "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/24d93aefb2cd786b7edd9f45b554aea20b28b9b1",
+ "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "ergebnis/composer-normalize": "^2.6",
+ "fzaninotto/faker": "^1.5",
+ "hamcrest/hamcrest-php": "^2",
+ "jangregor/phpstan-prophecy": "^0.6",
+ "mockery/mockery": "^1.3",
+ "phpstan/extension-installer": "^1",
+ "phpstan/phpstan": "^0.12.32",
+ "phpstan/phpstan-mockery": "^0.12.5",
+ "phpstan/phpstan-phpunit": "^0.12.11",
+ "phpunit/phpunit": "^8.5",
+ "psy/psysh": "^0.10.4",
+ "slevomat/coding-standard": "^6.3",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^3.12.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Collection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "description": "A PHP 7.2+ library for representing and manipulating collections.",
+ "keywords": [
+ "array",
+ "collection",
+ "hash",
+ "map",
+ "queue",
+ "set"
+ ],
+ "time": "2020-09-10T20:58:17+00:00"
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "4.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "cd4032040a750077205918c86049aa0f43d22947"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947",
+ "reference": "cd4032040a750077205918c86049aa0f43d22947",
+ "shasum": ""
+ },
+ "require": {
+ "brick/math": "^0.8 || ^0.9",
+ "ext-json": "*",
+ "php": "^7.2 || ^8",
+ "ramsey/collection": "^1.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "codeception/aspect-mock": "^3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0",
+ "doctrine/annotations": "^1.8",
+ "goaop/framework": "^2",
+ "mockery/mockery": "^1.3",
+ "moontoast/math": "^1.1",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock-mockery": "^1.3",
+ "php-mock/php-mock-phpunit": "^2.5",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpbench/phpbench": "^0.17.1",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-mockery": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^8.5",
+ "psy/psysh": "^0.10.0",
+ "slevomat/coding-standard": "^6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "3.9.4"
+ },
+ "suggest": {
+ "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+ "ext-ctype": "Enables faster processing of character classification using ctype functions.",
+ "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+ "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+ "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+ "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+ "homepage": "https://github.com/ramsey/uuid",
+ "keywords": [
+ "guid",
+ "identifier",
+ "uuid"
+ ],
+ "time": "2020-08-18T17:17:46+00:00"
+ },
+ {
+ "name": "ratchet/rfc6455",
+ "version": "v0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ratchetphp/RFC6455.git",
+ "reference": "c8651c7938651c2d55f5d8c2422ac5e57a183341"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ratchetphp/RFC6455/zipball/c8651c7938651c2d55f5d8c2422ac5e57a183341",
+ "reference": "c8651c7938651c2d55f5d8c2422ac5e57a183341",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/psr7": "^1.0",
+ "php": ">=5.4.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "5.7.*",
+ "react/socket": "^1.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Ratchet\\RFC6455\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Matt Bonneau",
+ "role": "Developer"
+ }
+ ],
+ "description": "RFC6455 WebSocket protocol handler",
+ "homepage": "http://socketo.me",
+ "keywords": [
+ "WebSockets",
+ "rfc6455",
+ "websocket"
+ ],
+ "time": "2020-05-15T18:31:24+00:00"
+ },
+ {
+ "name": "react/cache",
+ "version": "v1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/cache.git",
+ "reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/cache/zipball/44a568925556b0bd8cacc7b49fb0f1cf0d706a0c",
+ "reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "react/promise": "^3.0 || ^2.0 || ^1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Async, Promise-based cache interface for ReactPHP",
+ "keywords": [
+ "cache",
+ "caching",
+ "promise",
+ "reactphp"
+ ],
+ "time": "2020-09-18T12:12:35+00:00"
+ },
+ {
+ "name": "react/dns",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/dns.git",
+ "reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/dns/zipball/665260757171e2ab17485b44e7ffffa7acb6ca1f",
+ "reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "react/cache": "^1.0 || ^0.6 || ^0.5",
+ "react/event-loop": "^1.0 || ^0.5",
+ "react/promise": "^3.0 || ^2.7 || ^1.2.1",
+ "react/promise-timer": "^1.2"
+ },
+ "require-dev": {
+ "clue/block-react": "^1.2",
+ "phpunit/phpunit": "^9.3 || ^4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Dns\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Async DNS resolver for ReactPHP",
+ "keywords": [
+ "async",
+ "dns",
+ "dns-resolver",
+ "reactphp"
+ ],
+ "time": "2020-09-18T12:12:55+00:00"
+ },
+ {
+ "name": "react/event-loop",
+ "version": "v1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/event-loop.git",
+ "reference": "6d24de090cd59cfc830263cfba965be77b563c13"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6d24de090cd59cfc830263cfba965be77b563c13",
+ "reference": "6d24de090cd59cfc830263cfba965be77b563c13",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
+ },
+ "suggest": {
+ "ext-event": "~1.0 for ExtEventLoop",
+ "ext-pcntl": "For signal handling support when using the StreamSelectLoop",
+ "ext-uv": "* for ExtUvLoop"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\EventLoop\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
+ "keywords": [
+ "asynchronous",
+ "event-loop"
+ ],
+ "time": "2020-01-01T18:39:52+00:00"
+ },
+ {
+ "name": "react/promise",
+ "version": "v2.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/promise.git",
+ "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4",
+ "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com"
+ }
+ ],
+ "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+ "keywords": [
+ "promise",
+ "promises"
+ ],
+ "time": "2020-05-12T15:16:56+00:00"
+ },
+ {
+ "name": "react/promise-timer",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/promise-timer.git",
+ "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/daee9baf6ef30c43ea4c86399f828bb5f558f6e6",
+ "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3",
+ "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
+ "react/promise": "^3.0 || ^2.7.0 || ^1.2.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0 || ^5.7 || ^4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Promise\\Timer\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@lueck.tv"
+ }
+ ],
+ "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.",
+ "homepage": "https://github.com/reactphp/promise-timer",
+ "keywords": [
+ "async",
+ "event-loop",
+ "promise",
+ "reactphp",
+ "timeout",
+ "timer"
+ ],
+ "time": "2020-07-10T12:18:06+00:00"
+ },
+ {
+ "name": "react/socket",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/socket.git",
+ "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/socket/zipball/e2b96b23a13ca9b41ab343268dbce3f8ef4d524a",
+ "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.0",
+ "react/dns": "^1.1",
+ "react/event-loop": "^1.0 || ^0.5",
+ "react/promise": "^2.6.0 || ^1.2.1",
+ "react/promise-timer": "^1.4.0",
+ "react/stream": "^1.1"
+ },
+ "require-dev": {
+ "clue/block-react": "^1.2",
+ "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35",
+ "react/promise-stream": "^1.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Socket\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
+ "keywords": [
+ "Connection",
+ "Socket",
+ "async",
+ "reactphp",
+ "stream"
+ ],
+ "time": "2020-08-28T12:49:05+00:00"
+ },
+ {
+ "name": "react/stream",
+ "version": "v1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/stream.git",
+ "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/stream/zipball/7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
+ "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.8",
+ "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5"
+ },
+ "require-dev": {
+ "clue/stream-filter": "~1.2",
+ "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Stream\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
+ "keywords": [
+ "event-driven",
+ "io",
+ "non-blocking",
+ "pipe",
+ "reactphp",
+ "readable",
+ "stream",
+ "writable"
+ ],
+ "time": "2020-05-04T10:17:57+00:00"
+ },
{
"name": "sensio/framework-extra-bundle",
"version": "v5.5.6",
diff --git a/src/nineschool-1.0/config/packages/twig.yaml b/src/nineschool-1.0/config/packages/twig.yaml
index 615e006..acd6bfe 100644
--- a/src/nineschool-1.0/config/packages/twig.yaml
+++ b/src/nineschool-1.0/config/packages/twig.yaml
@@ -12,6 +12,8 @@ twig:
appName: '%appName%'
appCron: '%appCron%'
appMasteridentity: '%appMasteridentity%'
+ wssuse: '%wssuse%'
+ wssurl: '%wssurl%'
sondeUse: '%sondeUse%'
sondeUrl: '%sondeUrl%'
diff --git a/src/nineschool-1.0/config/routes.yaml b/src/nineschool-1.0/config/routes.yaml
index 47cb55c..44553f1 100644
--- a/src/nineschool-1.0/config/routes.yaml
+++ b/src/nineschool-1.0/config/routes.yaml
@@ -62,6 +62,11 @@ app_theme_select:
path: /admin/theme/select/{name}
defaults: { _controller: App\Controller\ThemeController:select, name: "" }
+#== Wss ==================================================================================================================
+app_wss_sample:
+ path: /user/wss/sampble
+ defaults: { _controller: App\Controller\WebsocketController:sample }
+
#== Sonde ================================================================================================================
app_sonde:
path: /sonde
diff --git a/src/nineschool-1.0/config/services.yaml b/src/nineschool-1.0/config/services.yaml
index 7380014..46e54d8 100644
--- a/src/nineschool-1.0/config/services.yaml
+++ b/src/nineschool-1.0/config/services.yaml
@@ -46,6 +46,10 @@ parameters:
casEmail: '%env(resolve:CAS_EMAIL)%'
casLastname: '%env(resolve:CAS_LASTNAME)%'
casFirstname: '%env(resolve:CAS_FIRSTNAME)%'
+
+ wssuse: '%env(resolve:WSS_USE)%'
+ wssport: '%env(resolve:WSS_PORT)%'
+ wssurl: 'wss://%env(resolve:APP_WEBURL)%/wss%env(resolve:APP_ALIAS)%'
proxyUse: '%env(resolve:PROXY_USE)%'
proxyHost: '%env(resolve:PROXY_HOST)%'
diff --git a/src/nineschool-1.0/public/styles/css/style.css b/src/nineschool-1.0/public/styles/css/style.css
index 18967a9..254166b 100644
--- a/src/nineschool-1.0/public/styles/css/style.css
+++ b/src/nineschool-1.0/public/styles/css/style.css
@@ -12,6 +12,11 @@ h1{
}
+.page-maxed {
+ max-width:1200px;
+ margin:auto !important;
+}
+
/* Sidebar Styles */
.contentsidebar {
margin-left:250px;
diff --git a/src/nineschool-1.0/scripts/.env.model b/src/nineschool-1.0/scripts/.env.model
index 027a592..6c22fe8 100644
--- a/src/nineschool-1.0/scripts/.env.model
+++ b/src/nineschool-1.0/scripts/.env.model
@@ -52,6 +52,11 @@ CAS_LASTNAME=lastname
CAS_FIRSTNAME=firstname
+# WEBSOCKET
+WSS_USE=0
+WSS_PORT=5586
+
+
# Proxy
PROXY_USE=0
PROXY_HOST=
diff --git a/src/nineschool-1.0/scripts/reconfigure.sh b/src/nineschool-1.0/scripts/reconfigure.sh
index 4442548..0c0f4a0 100755
--- a/src/nineschool-1.0/scripts/reconfigure.sh
+++ b/src/nineschool-1.0/scripts/reconfigure.sh
@@ -6,12 +6,15 @@ cd ${DIR}
cd ..
DIR=$(pwd)
+# Mise en place du fichier d'environnement model
+yes 2>/dev/null | cp $DIR/scripts/.env.model $DIR/.env
+
# Import des env
. $DIR/.env
. $DIR/.env.local
# Déclaration d'un proxy
-if [[ "$PROXY_USE"=="1" ]]
+if [[ "$PROXY_USE" == "1" ]]
then
export HTTP_PROXY="$PROXY_HOST:$PROXY_PORT"
export HTTPS_PROXY="$PROXY_HOST:$PROXY_PORT"
@@ -23,9 +26,6 @@ then
find $DIR/var/log -mindepth 1 -mtime +7 -delete
fi
-# Mise en place du fichier d'environnement model
-yes 2>/dev/null | cp $DIR/scripts/.env.model $DIR/.env
-
# Installation des dépendances composer
echo COMPOSER = Install
composer install --quiet
@@ -34,6 +34,12 @@ php bin/console app:AppInit --env=prod
php bin/console app:CronInit --env=prod
php bin/console app:Script --env=prod
+# Websocket
+if [[ "$WSS_USE" == "1" ]]
+then
+ $DIR/scripts/websocket.sh restart
+fi
+
# Permissions
echo PERMISSIONS
./scripts/perm.sh www-data
diff --git a/src/nineschool-1.0/scripts/websocket.sh b/src/nineschool-1.0/scripts/websocket.sh
new file mode 100755
index 0000000..2bdd9e6
--- /dev/null
+++ b/src/nineschool-1.0/scripts/websocket.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+# Se positionner sur la racine du projet
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+cd ${DIR}
+cd ..
+DIR=$(pwd)
+
+# Import des env
+. $DIR/.env
+. $DIR/.env.local
+
+# Déclaration d'un proxy
+if [[ "$WSS_USE" == "1" ]]
+then
+ # Server Websocket
+ if [[ "$1" != "restartifdown" ]]; then
+ echo WEBSOCKET = STOP
+ pid="$(pgrep -a -f app:Websocket| grep $APP_ALIAS)"
+ if [ -n "${pid}" ]; then
+ IFS=' ' read -r -a array <<< "$pid"
+ kill -9 ${array[0]};
+ fi
+ fi
+
+ # Port LISTEN ?
+ pid="$(pgrep -a -f app:Websocket| grep $APP_ALIAS)"
+ restart="yes"
+ if [ "$1" == "restartifdown" ] && [ -n "${pid}" ] ; then
+ restart="no"
+ fi
+
+ if [ "$restart" == "yes" ] && [ "$1" != "stop" ] ; then
+ echo WEBSOCKET = START
+ bin/console app:Websocket --name $APP_ALIAS & disown
+ fi
+fi
\ No newline at end of file
diff --git a/src/nineschool-1.0/src/Command/AppInitCommand.php b/src/nineschool-1.0/src/Command/AppInitCommand.php
index 95aa68b..f35d9bc 100644
--- a/src/nineschool-1.0/src/Command/AppInitCommand.php
+++ b/src/nineschool-1.0/src/Command/AppInitCommand.php
@@ -9,6 +9,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Console\Input\ArrayInput;
+use Ramsey\Uuid\Uuid;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Id\AssignedGenerator;
@@ -354,6 +355,8 @@ class AppInitCommand extends Command
if(!$entity) {
$this->writelnred('Création du compte admin par défaut avec password admin - Veuillez modifier votre password admin après connexion');
$entity = new User;
+ $key = Uuid::uuid4();
+
$entity->setId(0);
$entity->setUsername("admin");
$entity->setPassword("admin");
@@ -362,6 +365,7 @@ class AppInitCommand extends Command
$entity->setEmail($this->appmailnoreply);
$entity->setRoles(["ROLE_ADMIN"]);
$entity->setAvatar("admin.jpg");
+ $entity->setApiKey($key);
$this->em->persist($entity);
}
diff --git a/src/nineschool-1.0/src/Command/ScriptCommand.php b/src/nineschool-1.0/src/Command/ScriptCommand.php
index 43227f0..974272d 100644
--- a/src/nineschool-1.0/src/Command/ScriptCommand.php
+++ b/src/nineschool-1.0/src/Command/ScriptCommand.php
@@ -3,15 +3,11 @@
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem;
-use Symfony\Component\Console\Input\ArrayInput;
-
-use Doctrine\ORM\Mapping\ClassMetadata;
-use Doctrine\ORM\Id\AssignedGenerator;
+use Ramsey\Uuid\Uuid;
use App\Entity\Script;
@@ -49,7 +45,7 @@ class ScriptCommand extends Command
$output->writeln('APP = Scripts');
- //$this->callscript("test");
+ $this->callscript("addapikey");
$output->writeln('');
@@ -61,7 +57,7 @@ class ScriptCommand extends Command
private function callscript($name) {
$script=$this->em->getRepository("App:Script")->findOneBy(["name"=>$name]);
if(!$script) {
- $this->writelnred("== SCRIPT = ".$name);
+ //$this->writelnred("== SCRIPT = ".$name);
$this->$name();
$script=new Script();
@@ -72,8 +68,14 @@ class ScriptCommand extends Command
}
}
- private function test() {
- $this->writeln("TEST");
+ private function addapikey() {
+ $users=$this->em->getRepository("App:User")->findBy(["apikey"=>null]);
+ foreach($users as $user) {
+ $key = Uuid::uuid4();
+ $user->setApikey($key);
+ $this->em->persist($user);
+ $this->em->flush();
+ }
}
diff --git a/src/nineschool-1.0/src/Command/SynchroUsersCommand.php b/src/nineschool-1.0/src/Command/SynchroUsersCommand.php
index 81854bb..43e2980 100644
--- a/src/nineschool-1.0/src/Command/SynchroUsersCommand.php
+++ b/src/nineschool-1.0/src/Command/SynchroUsersCommand.php
@@ -10,6 +10,7 @@ use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Ramsey\Uuid\Uuid;
use App\Entity\Group as Group;
use App\Entity\User as User;
@@ -525,9 +526,11 @@ class SynchroUsersCommand extends Command
if(!$simulate) {
if(!$user) {
$user = new User();
+ $key = Uuid::uuid4();
$user->setUsername($apiuser->username);
$user->setPassword("NOPASSWORD");
+ $user->setApiKey($key);
}
$user->setLastname($apiuser->lastname);
diff --git a/src/nineschool-1.0/src/Command/WebsocketServerCommand.php b/src/nineschool-1.0/src/Command/WebsocketServerCommand.php
new file mode 100644
index 0000000..b0a6d0c
--- /dev/null
+++ b/src/nineschool-1.0/src/Command/WebsocketServerCommand.php
@@ -0,0 +1,53 @@
+container = $container;
+ $this->em = $em;
+ }
+
+ protected function configure()
+ {
+ $this
+ ->setName('app:Websocket')
+ ->setDescription('Lauch Websocket server')
+ ->setHelp('Lauch Websocket server')
+ ->addOption('name',null,InputOption::VALUE_REQUIRED,'Websocket server name',null)
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $port = $this->container->getParameter('wssport');
+
+ $output->writeln("Starting server on port " . $port);
+ $server = IoServer::factory(
+ new HttpServer(
+ new WsServer(
+ new MessageHandler($this->container,$this->em)
+ )
+ ),
+ $port
+ );
+ $server->run();
+ return 0;
+ }
+}
\ No newline at end of file
diff --git a/src/nineschool-1.0/src/Controller/SecurityController.php b/src/nineschool-1.0/src/Controller/SecurityController.php
index 3380b05..d420d60 100755
--- a/src/nineschool-1.0/src/Controller/SecurityController.php
+++ b/src/nineschool-1.0/src/Controller/SecurityController.php
@@ -12,6 +12,7 @@ use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Ramsey\Uuid\Uuid;
class SecurityController extends AbstractController
{
@@ -37,9 +38,6 @@ class SecurityController extends AbstractController
}
public function loginMYSQL(Request $request, AuthenticationUtils $authenticationUtils) {
- // activer les activités par défaut
- $this->get('session')->set('activeactivity',true);
-
return $this->render('Home/login.html.twig', array(
'last_username' => $authenticationUtils->getLastUsername(),
'error' => $authenticationUtils->getLastAuthenticationError(),
@@ -87,11 +85,13 @@ class SecurityController extends AbstractController
if (!$exists) {
$user = new User();
+ $key = Uuid::uuid4();
$user->setUsername($username);
$user->setLastname($lastname);
$user->setFirstname($firstname);
$user->setEmail($email);
+ $user->setApiKey($key);
$user->setPassword("CASPWD-".$username);
$user->setSalt("CASPWD-".$username);
@@ -120,8 +120,6 @@ class SecurityController extends AbstractController
$this->updateLDAP($user);
}
- // activer les activités par défaut
- $this->get('session')->set('activeactivity',true);
// Autoconnexion
// Récupérer le token de l'utilisateur
diff --git a/src/nineschool-1.0/src/Controller/UserController.php b/src/nineschool-1.0/src/Controller/UserController.php
index b93c83d..434a28d 100755
--- a/src/nineschool-1.0/src/Controller/UserController.php
+++ b/src/nineschool-1.0/src/Controller/UserController.php
@@ -5,7 +5,7 @@ namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\Form\FormError;
+use Ramsey\Uuid\Uuid;
use App\Entity\User as Entity;
use App\Form\UserType as Form;
@@ -37,7 +37,9 @@ class UserController extends AbstractController
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
$data = new Entity();
+ $key = Uuid::uuid4();
$data->setAvatar("noavatar.png");
+ $data->setApiKey($key);
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"submit","appAuth"=>$this->getParameter("appAuth"),"appMasteridentity"=>$this->getParameter("appMasteridentity")));
diff --git a/src/nineschool-1.0/src/Controller/WebsocketController.php b/src/nineschool-1.0/src/Controller/WebsocketController.php
new file mode 100644
index 0000000..a53dac2
--- /dev/null
+++ b/src/nineschool-1.0/src/Controller/WebsocketController.php
@@ -0,0 +1,13 @@
+render('Websocket/sample.html.twig');
+ }
+}
diff --git a/src/nineschool-1.0/src/Form/UserType.php b/src/nineschool-1.0/src/Form/UserType.php
index 8c04c02..3d2f346 100644
--- a/src/nineschool-1.0/src/Form/UserType.php
+++ b/src/nineschool-1.0/src/Form/UserType.php
@@ -103,7 +103,8 @@ class UserType extends AbstractType
$builder->add('apikey',
TextType::class, [
"label" =>"Clé Accès",
- "required" => false
+ "required" => true,
+ "disabled" => true,
]
);
diff --git a/src/nineschool-1.0/src/Websocket/MessageHandler.php b/src/nineschool-1.0/src/Websocket/MessageHandler.php
new file mode 100644
index 0000000..1da1aa9
--- /dev/null
+++ b/src/nineschool-1.0/src/Websocket/MessageHandler.php
@@ -0,0 +1,114 @@
+container = $container;
+ $this->em = $em;
+
+ $this->clients = new SplObjectStorage;
+ $this->subscriptions = [];
+ $this->users = [];
+ $this->keys = [];
+ }
+
+ public function onOpen(ConnectionInterface $conn)
+ {
+ $this->clients->attach($conn);
+ $this->users[$conn->resourceId] = $conn;
+ }
+
+ public function onClose(ConnectionInterface $conn)
+ {
+ $data= new \stdClass;
+ $data->command = "adead";
+ $this->sendMessage($conn,$data,false);
+
+ $this->clients->detach($conn);
+ unset($this->users[$conn->resourceId]);
+ unset($this->keys[$conn->resourceId]);
+ unset($this->subscriptions[$conn->resourceId]);
+ }
+
+ public function onError(ConnectionInterface $conn, Exception $e)
+ {
+ $conn->close();
+ }
+
+ public function onMessage(ConnectionInterface $conn, $msg)
+ {
+ $data = json_decode($msg);
+
+ switch ($data->command) {
+ case "subscribe":
+ $this->subscriptions[$conn->resourceId] = $data->channel;
+ $this->keys[$conn->resourceId] = $data->key;
+ break;
+
+ case "meto":
+ if (isset($this->subscriptions[$conn->resourceId])) {
+ $this->sendMessage($conn,$data,false);
+ }
+ break;
+
+ case "alive":
+ default:
+ if (isset($this->subscriptions[$conn->resourceId])) {
+ $this->sendMessage($conn,$data);
+ }
+ break;
+ }
+ }
+
+ private function sendMessage(ConnectionInterface $conn, $data, $tome=true) {
+ $target = $this->subscriptions[$conn->resourceId];
+ foreach ($this->subscriptions as $id=>$channel) {
+ if ($channel == $target) {
+ if($tome||(!$tome&&$id!=$conn->resourceId)) {
+ // From
+ $key= $this->keys[$conn->resourceId];
+ $from=$this->em->getRepository("App:User")->findOneBy(["apikey"=>$key]);
+
+ // To
+ $key= $this->keys[$id];
+ $to=$this->em->getRepository("App:User")->findOneBy(["apikey"=>$key]);
+
+ // Send
+ if($from && $to) {
+ $data->from= new \stdClass;
+ $data->from->id = $from->getId();
+ $data->from->username = $from->getUsername();
+ $data->from->displayname = $from->getDisplayname();
+ $data->from->avatar = $this->getAvatar($from->getAvatar());
+
+ $data->log="== GET MSG from ".$data->from->username." to ".$to->getUsername()." = ".$data->command;
+ $this->users[$id]->send(json_encode($data));
+ }
+ }
+ }
+ }
+ }
+
+ private function getAvatar($avatar) {
+ if(stripos($avatar,"http")===0)
+ return $avatar;
+ else
+ return "/".$this->container->getParameter("appAlias")."/uploads/avatar/".$avatar;
+ }
+}
\ No newline at end of file
diff --git a/src/nineschool-1.0/symfony.lock b/src/nineschool-1.0/symfony.lock
index fdac724..79de052 100644
--- a/src/nineschool-1.0/symfony.lock
+++ b/src/nineschool-1.0/symfony.lock
@@ -1,4 +1,10 @@
{
+ "brick/math": {
+ "version": "0.9.1"
+ },
+ "cboden/ratchet": {
+ "version": "v0.4.3"
+ },
"doctrine/annotations": {
"version": "1.0",
"recipe": {
@@ -81,6 +87,9 @@
"egulias/email-validator": {
"version": "2.1.17"
},
+ "evenement/evenement": {
+ "version": "v3.0.1"
+ },
"exsyst/swagger": {
"version": "v0.4.1"
},
@@ -108,6 +117,9 @@
"config/packages/fos_rest.yaml"
]
},
+ "guzzlehttp/psr7": {
+ "version": "1.7.0"
+ },
"jasig/phpcas": {
"version": "1.3.8"
},
@@ -194,12 +206,48 @@
"psr/event-dispatcher": {
"version": "1.0.0"
},
+ "psr/http-message": {
+ "version": "1.0.1"
+ },
"psr/link": {
"version": "1.0.0"
},
"psr/log": {
"version": "1.1.2"
},
+ "ralouphie/getallheaders": {
+ "version": "3.0.3"
+ },
+ "ramsey/collection": {
+ "version": "1.1.1"
+ },
+ "ramsey/uuid": {
+ "version": "4.1.1"
+ },
+ "ratchet/rfc6455": {
+ "version": "v0.3"
+ },
+ "react/cache": {
+ "version": "v1.1.0"
+ },
+ "react/dns": {
+ "version": "v1.4.0"
+ },
+ "react/event-loop": {
+ "version": "v1.1.1"
+ },
+ "react/promise": {
+ "version": "v2.8.0"
+ },
+ "react/promise-timer": {
+ "version": "v1.6.0"
+ },
+ "react/socket": {
+ "version": "v1.6.0"
+ },
+ "react/stream": {
+ "version": "v1.1.1"
+ },
"sensio/framework-extra-bundle": {
"version": "5.2",
"recipe": {
diff --git a/src/nineschool-1.0/templates/Home/home.html.twig b/src/nineschool-1.0/templates/Home/home.html.twig
index 2ea26b9..5356889 100644
--- a/src/nineschool-1.0/templates/Home/home.html.twig
+++ b/src/nineschool-1.0/templates/Home/home.html.twig
@@ -1,6 +1,9 @@
{% extends "base.html.twig" %}
{% block body %}
+{% if wssuse and app.user %}
+{{ render(path("app_wss_sample")) }}
+{% endif %}
{% endblock %}
diff --git a/src/nineschool-1.0/templates/Include/javascript.js.twig b/src/nineschool-1.0/templates/Include/javascript.js.twig
index 84e6fc2..9ea016e 100644
--- a/src/nineschool-1.0/templates/Include/javascript.js.twig
+++ b/src/nineschool-1.0/templates/Include/javascript.js.twig
@@ -1,4 +1,12 @@
$(document).ready(function() {
+
+ $(".pick-a-color").spectrum(
+ {
+ type: "text",
+ showAlpha: false
+ }
+ );
+
var doit = true;
$("a[data-method]").on('click',function(){
@@ -20,4 +28,24 @@ function ModalLoad(idmodal,title,path) {
$("#"+idmodal+" .modal-header h4").text(title);
$("#"+idmodal+" iframe").attr("src",path);
$("#"+idmodal).modal("show");
-}
\ No newline at end of file
+}
+
+{% if wssuse %}
+ function subscribe(channeltype,channelkey,userkey) {
+ console.log("== SUBSCRIBE "+channeltype+"-"+channelkey+" with userkey "+userkey);
+ conn.send(JSON.stringify({
+ command: "subscribe",
+ log: "",
+ channel: channeltype+"-"+channelkey,
+ channeltype: channeltype,
+ channelkey: channelkey,
+ userkey: userkey
+ }));
+ }
+
+ function sendMessage(msg) {
+ json=JSON.stringify(msg);
+ console.log("== SEND MSG = "+json);
+ conn.send(json);
+ }
+{% endif %}
diff --git a/src/nineschool-1.0/templates/Websocket/sample.html.twig b/src/nineschool-1.0/templates/Websocket/sample.html.twig
new file mode 100644
index 0000000..a74146d
--- /dev/null
+++ b/src/nineschool-1.0/templates/Websocket/sample.html.twig
@@ -0,0 +1,61 @@
+
+
+{% if wssuse %}
+
+{% endif %}
\ No newline at end of file
diff --git a/src/nineschool-1.0/templates/base.html.twig b/src/nineschool-1.0/templates/base.html.twig
index ff1c8eb..8dadd76 100644
--- a/src/nineschool-1.0/templates/base.html.twig
+++ b/src/nineschool-1.0/templates/base.html.twig
@@ -34,6 +34,15 @@
{% endblock %}
+ {{ encore_entry_script_tags('app') }}
+ {% block encorescripttags %}
+
+ {% endblock %}
+
+
+
{% set class="" %}
{% if usemonocolor is defined and usemonocolor %}
@@ -93,7 +102,7 @@
{% endif %}
-
+
{% set contentsidebar="" %}
{% if usesidebar is defined and usesidebar %}
{% set contentsidebar="contentsidebar" %}
@@ -111,19 +120,20 @@
-
+
+
- {{ encore_entry_script_tags('app') }}
-
- {% block encorescripttags %}
-
- {% endblock %}
{% block localexternalscript %}
{% endblock %}
-
-