Файловый менеджер - Редактировать - /home/gqdcvggs/go.imators.com/video.tar
Назад
inter/api/status.php 0000664 00000000000 15114742451 0010466 0 ustar 00 inter/composer.json 0000664 00000000135 15114742451 0010414 0 ustar 00 { "require": { "cboden/ratchet": "^0.4.4", "react/http": "^1.11" } } inter/server.php 0000664 00000002041 15114742451 0007707 0 ustar 00 <?php require_once 'db.php'; $logFile = __DIR__ . '/imators-billboard.log'; function writeLog($message) { global $logFile; $timestamp = date('Y-m-d H:i:s'); file_put_contents($logFile, "[$timestamp] $message" . PHP_EOL, FILE_APPEND); } writeLog('Démarrage du serveur de gestion des panneaux Imators'); while (true) { try { $now = new DateTime(); $offline = $now->sub(new DateInterval('PT1H'))->format('Y-m-d H:i:s'); $stmt = $pdo->prepare("SELECT * FROM `imators-systems-billboard` WHERE last_seen < ?"); $stmt->execute([$offline]); $offlineBillboards = $stmt->fetchAll(); foreach ($offlineBillboards as $billboard) { writeLog("Panneau {$billboard['serial']} détecté hors ligne (dernière connexion: {$billboard['last_seen']})"); } writeLog("Vérification terminée - " . count($offlineBillboards) . " panneaux hors ligne"); } catch (Exception $e) { writeLog("ERREUR: " . $e->getMessage()); } sleep(300); } inter/db.php 0000664 00000001606 15114742451 0006774 0 ustar 00 <?php $host = 'localhost:3306'; $dbname = 'gqdcvggs_managements'; $username = 'gqdcvggs'; $password = 'imaors_management.346980*#@-onlyforcpanel;forchange'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ]); $pdo->exec("CREATE TABLE IF NOT EXISTS `imators-systems-billboard` ( id INT AUTO_INCREMENT PRIMARY KEY, serial VARCHAR(50) NOT NULL UNIQUE, config TEXT NOT NULL, status ENUM('active', 'stopped') NOT NULL DEFAULT 'active', stop_message TEXT NULL, last_seen DATETIME NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"); } catch (PDOException $e) { die("Erreur de connexion à la base de données: " . $e->getMessage()); } inter/check_status.php 0000664 00000001633 15114742451 0011067 0 ustar 00 <?php require_once 'db.php'; header('Content-Type: application/json'); $serial = filter_input(INPUT_GET, 'serial', FILTER_SANITIZE_STRING); if (empty($serial)) { echo json_encode(['error' => 'Numéro de série manquant']); exit; } try { $stmt = $pdo->prepare("SELECT status, stop_message FROM `imators-systems-billboard` WHERE serial = ?"); $stmt->execute([$serial]); $billboard = $stmt->fetch(); if ($billboard) { $stmt = $pdo->prepare("UPDATE `imators-systems-billboard` SET last_seen = NOW() WHERE serial = ?"); $stmt->execute([$serial]); echo json_encode([ 'status' => $billboard['status'], 'stop_message' => $billboard['stop_message'] ?? '' ]); } else { echo json_encode(['error' => 'Panneau non trouvé']); } } catch (PDOException $e) { echo json_encode(['error' => 'Erreur de base de données']); } inter/ecosystem.config.js 0000664 00000001026 15114742451 0011507 0 ustar 00 module.exports = { apps : [ { name: 'imators-ws-server', script: 'ws-server.php', interpreter: 'php', watch: false, instances: 1, autorestart: true, max_memory_restart: '200M', log_date_format: 'YYYY-MM-DD HH:mm:ss' }, { name: 'imators-billboard-monitor', script: 'server.php', interpreter: 'php', watch: false, instances: 1, autorestart: true, max_memory_restart: '100M', log_date_format: 'YYYY-MM-DD HH:mm:ss' } ] }; inter/error_log 0000644 00000021614 15114742451 0007612 0 ustar 00 [15-Mar-2025 16:07:00 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/index.php on line 29 [15-Mar-2025 16:07:18 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 15 [15-Mar-2025 16:07:31 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:08:01 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:08:10 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 15 [15-Mar-2025 16:08:31 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:09:01 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:09:04 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 32 [15-Mar-2025 16:09:04 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 33 [15-Mar-2025 16:10:50 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 42 [15-Mar-2025 16:11:19 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 32 [15-Mar-2025 16:11:19 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 33 [15-Mar-2025 16:12:27 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 42 [15-Mar-2025 16:13:00 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:13:30 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:14:00 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:14:30 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:15:00 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:15:30 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:16:00 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:16:30 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:17:00 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:17:30 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:18:01 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:18:31 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:19:46 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/check_status.php on line 6 [15-Mar-2025 16:20:00 UTC] PHP Warning: Undefined array key "admin_username" in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 201 [15-Mar-2025 16:20:00 UTC] PHP Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 201 [15-Mar-2025 16:20:19 UTC] PHP Warning: Undefined array key "admin_username" in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 201 [15-Mar-2025 16:20:19 UTC] PHP Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 201 [15-Mar-2025 16:31:10 UTC] PHP Warning: Undefined array key "admin_username" in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 218 [15-Mar-2025 16:31:10 UTC] PHP Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 218 [15-Mar-2025 16:31:14 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 16 [15-Mar-2025 16:32:21 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 16 [15-Mar-2025 16:32:26 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 16 [15-Mar-2025 16:32:40 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 16 [15-Mar-2025 16:33:39 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 16 [15-Mar-2025 16:33:51 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 16 [15-Mar-2025 16:54:22 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/index.php on line 29 [15-Mar-2025 16:55:55 UTC] PHP Warning: file_get_contents(https://imators.systems/video/inter/broadcast.php?serial=6778-997&status=stopped&message=This+billboard+has+been+stopped+by+the+administrator.): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 51 [15-Mar-2025 16:56:08 UTC] PHP Warning: file_get_contents(https://imators.systems/video/inter/broadcast.php?serial=6778-997&status=active): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 63 [15-Mar-2025 16:57:11 UTC] PHP Warning: file_get_contents(https://imators.systems/video/inter/broadcast.php?serial=6778-997&status=stopped&message=Une+image+non+intentionnelle+a+%C3%A9t%C3%A9+affich%C3%A9.+Nous+avons+donc+stopper+le+processus.+Une+%C3%A9quipe+d%E2%80%99urgence+arrive+): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 51 [16-Mar-2025 12:55:05 UTC] PHP Warning: Uninitialized string offset 0 in /home/gqdcvggs/imators.systems/video/inter/vendor/ratchet/rfc6455/src/Handshake/RequestVerifier.php on line 56 [16-Mar-2025 13:27:07 UTC] PHP Warning: Uninitialized string offset 0 in /home/gqdcvggs/imators.systems/video/inter/vendor/ratchet/rfc6455/src/Handshake/RequestVerifier.php on line 56 [16-Mar-2025 14:40:33 UTC] PHP Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /home/gqdcvggs/imators.systems/video/inter/index.php on line 29 [16-Mar-2025 14:43:40 UTC] PHP Warning: file_get_contents(https://imators.systems/video/inter/broadcast.php?serial=566789-9987&status=stopped&message=This+billboard+has+been+stopped+by+the+administrator.): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 51 [16-Mar-2025 14:43:51 UTC] PHP Warning: file_get_contents(https://imators.systems/video/inter/broadcast.php?serial=566789-9987&status=active): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/gqdcvggs/imators.systems/video/inter/admin.php on line 63 [18-Mar-2025 21:28:25 UTC] PHP Warning: Uninitialized string offset 0 in /home/gqdcvggs/imators.systems/video/inter/vendor/ratchet/rfc6455/src/Handshake/RequestVerifier.php on line 56 [18-Mar-2025 22:07:46 UTC] PHP Warning: Uninitialized string offset 0 in /home/gqdcvggs/imators.systems/video/inter/vendor/ratchet/rfc6455/src/Handshake/RequestVerifier.php on line 56 [19-Mar-2025 01:00:40 UTC] PHP Warning: Uninitialized string offset 0 in /home/gqdcvggs/imators.systems/video/inter/vendor/ratchet/rfc6455/src/Handshake/RequestVerifier.php on line 56 inter/brodcast.php 0000664 00000002115 15114742451 0010204 0 ustar 00 <?php require_once 'db.php'; header('Content-Type: application/json'); $serial = $_GET['serial'] ?? ''; $status = $_GET['status'] ?? ''; $message = $_GET['message'] ?? null; if (empty($serial) || empty($status)) { echo json_encode(['error' => 'Missing parameters']); exit; } if ($status !== 'active' && $status !== 'stopped') { echo json_encode(['error' => 'Invalid status']); exit; } try { if ($status === 'stopped' && $message !== null) { $stmt = $pdo->prepare("UPDATE `imators-systems-billboard` SET status = 'stopped', stop_message = ? WHERE serial = ?"); $stmt->execute([$message, $serial]); } else if ($status === 'active') { $stmt = $pdo->prepare("UPDATE `imators-systems-billboard` SET status = 'active', stop_message = NULL WHERE serial = ?"); $stmt->execute([$serial]); } echo json_encode([ 'success' => true, 'status' => $status, 'serial' => $serial, 'message' => $message ]); } catch (PDOException $e) { echo json_encode(['error' => 'Database error: ' . $e->getMessage()]); } inter/composer.lock 0000664 00000144344 15114742451 0010406 0 ustar 00 { "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "dbb0bc16ee997e9b7199c73ca813fa7f", "packages": [ { "name": "cboden/ratchet", "version": "v0.4.4", "source": { "type": "git", "url": "https://github.com/ratchetphp/Ratchet.git", "reference": "5012dc954541b40c5599d286fd40653f5716a38f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/ratchetphp/Ratchet/zipball/5012dc954541b40c5599d286fd40653f5716a38f", "reference": "5012dc954541b40c5599d286fd40653f5716a38f", "shasum": "" }, "require": { "guzzlehttp/psr7": "^1.7|^2.0", "php": ">=5.4.2", "ratchet/rfc6455": "^0.3.1", "react/event-loop": ">=0.4", "react/socket": "^1.0 || ^0.8 || ^0.7 || ^0.6 || ^0.5", "symfony/http-foundation": "^2.6|^3.0|^4.0|^5.0|^6.0", "symfony/routing": "^2.6|^3.0|^4.0|^5.0|^6.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" ], "support": { "chat": "https://gitter.im/reactphp/reactphp", "issues": "https://github.com/ratchetphp/Ratchet/issues", "source": "https://github.com/ratchetphp/Ratchet/tree/v0.4.4" }, "time": "2021-12-14T00:20:41+00:00" }, { "name": "evenement/evenement", "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/igorw/evenement.git", "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", "shasum": "" }, "require": { "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^9 || ^6" }, "type": "library", "autoload": { "psr-4": { "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" ], "support": { "issues": "https://github.com/igorw/evenement/issues", "source": "https://github.com/igorw/evenement/tree/v3.0.2" }, "time": "2023-08-08T05:53:35+00:00" }, { "name": "fig/http-message-util", "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/php-fig/http-message-util.git", "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "suggest": { "psr/http-message": "The package containing the PSR-7 interfaces" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { "Fig\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", "keywords": [ "http", "http-message", "psr", "psr-7", "request", "response" ], "support": { "issues": "https://github.com/php-fig/http-message-util/issues", "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" }, "time": "2020-11-24T22:02:12+00:00" }, { "name": "guzzlehttp/psr7", "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "George Mponos", "email": "gmponos@gmail.com", "homepage": "https://github.com/gmponos" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://github.com/sagikazarmark" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ "http", "message", "psr-7", "request", "response", "stream", "uri", "url" ], "support": { "issues": "https://github.com/guzzle/psr7/issues", "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { "url": "https://github.com/GrahamCampbell", "type": "github" }, { "url": "https://github.com/Nyholm", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", "type": "tidelift" } ], "time": "2024-07-18T11:15:46+00:00" }, { "name": "psr/http-factory", "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { "php": ">=7.1", "psr/http-message": "^1.0 || ^2.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": "https://www.php-fig.org/" } ], "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", "message", "psr", "psr-17", "psr-7", "request", "response" ], "support": { "source": "https://github.com/php-fig/http-factory" }, "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", "version": "1.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.1.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" ], "support": { "source": "https://github.com/php-fig/http-message/tree/1.1" }, "time": "2023-04-04T09:50:52+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.", "support": { "issues": "https://github.com/ralouphie/getallheaders/issues", "source": "https://github.com/ralouphie/getallheaders/tree/develop" }, "time": "2019-03-08T08:55:37+00:00" }, { "name": "ratchet/rfc6455", "version": "v0.3.1", "source": { "type": "git", "url": "https://github.com/ratchetphp/RFC6455.git", "reference": "7c964514e93456a52a99a20fcfa0de242a43ccdb" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/ratchetphp/RFC6455/zipball/7c964514e93456a52a99a20fcfa0de242a43ccdb", "reference": "7c964514e93456a52a99a20fcfa0de242a43ccdb", "shasum": "" }, "require": { "guzzlehttp/psr7": "^2 || ^1.7", "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" ], "support": { "chat": "https://gitter.im/reactphp/reactphp", "issues": "https://github.com/ratchetphp/RFC6455/issues", "source": "https://github.com/ratchetphp/RFC6455/tree/v0.3.1" }, "time": "2021-12-09T23:20:49+00:00" }, { "name": "react/cache", "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/reactphp/cache.git", "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", "shasum": "" }, "require": { "php": ">=5.3.0", "react/promise": "^3.0 || ^2.0 || ^1.1" }, "require-dev": { "phpunit/phpunit": "^9.5 || ^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" ], "support": { "issues": "https://github.com/reactphp/cache/issues", "source": "https://github.com/reactphp/cache/tree/v1.2.0" }, "funding": [ { "url": "https://opencollective.com/reactphp", "type": "open_collective" } ], "time": "2022-11-30T15:59:55+00:00" }, { "name": "react/dns", "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/reactphp/dns.git", "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", "shasum": "" }, "require": { "php": ">=5.3.0", "react/cache": "^1.0 || ^0.6 || ^0.5", "react/event-loop": "^1.2", "react/promise": "^3.2 || ^2.7 || ^1.2.1" }, "require-dev": { "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", "react/async": "^4.3 || ^3 || ^2", "react/promise-timer": "^1.11" }, "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" ], "support": { "issues": "https://github.com/reactphp/dns/issues", "source": "https://github.com/reactphp/dns/tree/v1.13.0" }, "funding": [ { "url": "https://opencollective.com/reactphp", "type": "open_collective" } ], "time": "2024-06-13T14:18:03+00:00" }, { "name": "react/event-loop", "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", "shasum": "" }, "require": { "php": ">=5.3.0" }, "require-dev": { "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "suggest": { "ext-pcntl": "For signal handling support when using the StreamSelectLoop" }, "type": "library", "autoload": { "psr-4": { "React\\EventLoop\\": "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": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", "keywords": [ "asynchronous", "event-loop" ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" }, "funding": [ { "url": "https://opencollective.com/reactphp", "type": "open_collective" } ], "time": "2023-11-13T13:48:05+00:00" }, { "name": "react/http", "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/reactphp/http.git", "reference": "8db02de41dcca82037367f67a2d4be365b1c4db9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/reactphp/http/zipball/8db02de41dcca82037367f67a2d4be365b1c4db9", "reference": "8db02de41dcca82037367f67a2d4be365b1c4db9", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "fig/http-message-util": "^1.1", "php": ">=5.3.0", "psr/http-message": "^1.0", "react/event-loop": "^1.2", "react/promise": "^3.2 || ^2.3 || ^1.2.1", "react/socket": "^1.16", "react/stream": "^1.4" }, "require-dev": { "clue/http-proxy-react": "^1.8", "clue/reactphp-ssh-proxy": "^1.4", "clue/socks-react": "^1.4", "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", "react/async": "^4.2 || ^3 || ^2", "react/promise-stream": "^1.4", "react/promise-timer": "^1.11" }, "type": "library", "autoload": { "psr-4": { "React\\Http\\": "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": "Event-driven, streaming HTTP client and server implementation for ReactPHP", "keywords": [ "async", "client", "event-driven", "http", "http client", "http server", "https", "psr-7", "reactphp", "server", "streaming" ], "support": { "issues": "https://github.com/reactphp/http/issues", "source": "https://github.com/reactphp/http/tree/v1.11.0" }, "funding": [ { "url": "https://opencollective.com/reactphp", "type": "open_collective" } ], "time": "2024-11-20T15:24:08+00:00" }, { "name": "react/promise", "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", "reference": "8a164643313c71354582dc850b42b33fa12a4b63" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", "reference": "8a164643313c71354582dc850b42b33fa12a4b63", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { "phpstan/phpstan": "1.10.39 || 1.4.10", "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", "autoload": { "files": [ "src/functions_include.php" ], "psr-4": { "React\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jan Sorgalla", "email": "jsorgalla@gmail.com", "homepage": "https://sorgalla.com/" }, { "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": "Chris Boden", "email": "cboden@gmail.com", "homepage": "https://cboden.dev/" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", "keywords": [ "promise", "promises" ], "support": { "issues": "https://github.com/reactphp/promise/issues", "source": "https://github.com/reactphp/promise/tree/v3.2.0" }, "funding": [ { "url": "https://opencollective.com/reactphp", "type": "open_collective" } ], "time": "2024-05-24T10:39:05+00:00" }, { "name": "react/socket", "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", "react/dns": "^1.13", "react/event-loop": "^1.2", "react/promise": "^3.2 || ^2.6 || ^1.2.1", "react/stream": "^1.4" }, "require-dev": { "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", "react/async": "^4.3 || ^3.3 || ^2", "react/promise-stream": "^1.4", "react/promise-timer": "^1.11" }, "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" ], "support": { "issues": "https://github.com/reactphp/socket/issues", "source": "https://github.com/reactphp/socket/tree/v1.16.0" }, "funding": [ { "url": "https://opencollective.com/reactphp", "type": "open_collective" } ], "time": "2024-07-26T10:38:09+00:00" }, { "name": "react/stream", "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/reactphp/stream.git", "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.8", "react/event-loop": "^1.2" }, "require-dev": { "clue/stream-filter": "~1.2", "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { "psr-4": { "React\\Stream\\": "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": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", "keywords": [ "event-driven", "io", "non-blocking", "pipe", "reactphp", "readable", "stream", "writable" ], "support": { "issues": "https://github.com/reactphp/stream/issues", "source": "https://github.com/reactphp/stream/tree/v1.4.0" }, "funding": [ { "url": "https://opencollective.com/reactphp", "type": "open_collective" } ], "time": "2024-06-11T12:45:25+00:00" }, { "name": "symfony/deprecation-contracts", "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { "php": ">=8.1" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/contracts", "name": "symfony/contracts" }, "branch-alias": { "dev-main": "3.5-dev" } }, "autoload": { "files": [ "function.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/http-foundation", "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0492d6217e5ab48f51fca76f64cf8e78919d0db", "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, "conflict": { "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", "symfony/mime": "^5.4|^6.0|^7.0", "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/http-foundation/tree/v6.4.18" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2025-01-09T15:48:56+00:00" }, { "name": "symfony/polyfill-mbstring", "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { "php": ">=7.2" }, "provide": { "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", "mbstring", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { "php": ">=7.2" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" }, "classmap": [ "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/routing", "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/routing/zipball/e9bfc94953019089acdfb9be51c1b9142c4afa68", "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.12", "symfony/config": "<6.2", "symfony/dependency-injection": "<5.4", "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", "symfony/config": "^6.2|^7.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Routing\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ "router", "routing", "uri", "url" ], "support": { "source": "https://github.com/symfony/routing/tree/v6.4.18" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2025-01-09T08:51:02+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": [], "platform-dev": [], "plugin-api-version": "2.6.0" } inter/ws-server.php 0000664 00000014401 15114742451 0010341 0 ustar 00 <?php require_once 'db.php'; require 'vendor/autoload.php'; use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; use React\EventLoop\Factory; use React\Socket\SocketServer; use React\Http\HttpServer as ReactHttpServer; use React\Http\Message\Response; use Psr\Http\Message\ServerRequestInterface; class BillboardSocket implements \Ratchet\MessageComponentInterface { protected $clients; protected $billboards; protected $pdo; public function __construct() { $this->clients = new \SplObjectStorage; $this->billboards = []; global $pdo; $this->pdo = $pdo; } public function onOpen(\Ratchet\ConnectionInterface $conn) { $this->clients->attach($conn); echo "New connection! ({$conn->resourceId})\n"; } public function onMessage(\Ratchet\ConnectionInterface $from, $msg) { $data = json_decode($msg, true); if (isset($data['type'])) { switch ($data['type']) { case 'register': if (isset($data['serial'])) { $this->billboards[$from->resourceId] = $data['serial']; echo "Billboard registered: {$data['serial']} ({$from->resourceId})\n"; $stmt = $this->pdo->prepare("UPDATE `imators-systems-billboard` SET last_seen = NOW() WHERE serial = ?"); $stmt->execute([$data['serial']]); $stmt = $this->pdo->prepare("SELECT status, stop_message FROM `imators-systems-billboard` WHERE serial = ?"); $stmt->execute([$data['serial']]); $billboard = $stmt->fetch(); if ($billboard && $billboard['status'] === 'stopped') { $from->send(json_encode([ 'type' => 'status_update', 'serial' => $data['serial'], 'status' => 'stopped', 'message' => $billboard['stop_message'] ])); } } break; case 'heartbeat': if (isset($data['serial'])) { $stmt = $this->pdo->prepare("UPDATE `imators-systems-billboard` SET last_seen = NOW() WHERE serial = ?"); $stmt->execute([$data['serial']]); } break; case 'admin_command': if (isset($data['serial']) && isset($data['action'])) { if ($data['action'] === 'stop' && isset($data['message'])) { $stmt = $this->pdo->prepare("UPDATE `imators-systems-billboard` SET status = 'stopped', stop_message = ? WHERE serial = ?"); $stmt->execute([$data['message'], $data['serial']]); $this->broadcastStatus($data['serial'], 'stopped', $data['message']); } else if ($data['action'] === 'restart') { $stmt = $this->pdo->prepare("UPDATE `imators-systems-billboard` SET status = 'active', stop_message = NULL WHERE serial = ?"); $stmt->execute([$data['serial']]); $this->broadcastStatus($data['serial'], 'active'); } } break; } } } public function onClose(\Ratchet\ConnectionInterface $conn) { $this->clients->detach($conn); if (isset($this->billboards[$conn->resourceId])) { echo "Billboard disconnected: {$this->billboards[$conn->resourceId]} ({$conn->resourceId})\n"; unset($this->billboards[$conn->resourceId]); } } public function onError(\Ratchet\ConnectionInterface $conn, \Exception $e) { echo "Error: {$e->getMessage()}\n"; $conn->close(); } public function broadcastStatus($serial, $status, $message = null) { foreach ($this->clients as $client) { $clientSerial = $this->billboards[$client->resourceId] ?? null; if ($clientSerial === $serial) { $client->send(json_encode([ 'type' => 'status_update', 'serial' => $serial, 'status' => $status, 'message' => $message ])); echo "Status broadcast to $serial: $status\n"; } } } } if (php_sapi_name() === 'cli') { $loop = Factory::create(); $socket = new BillboardSocket(); $server = IoServer::factory( new HttpServer( new WsServer($socket) ), 8080 ); $http = new ReactHttpServer( $loop, function (ServerRequestInterface $request) use ($socket) { $path = $request->getUri()->getPath(); if ($path === '/broadcast.php') { $query = $request->getQueryParams(); if (isset($query['serial']) && isset($query['status'])) { $socket->broadcastStatus( $query['serial'], $query['status'], $query['message'] ?? null ); return new Response( 200, ['Content-Type' => 'application/json'], json_encode(['status' => 'success']) ); } } return new Response( 404, ['Content-Type' => 'text/plain'], 'Not found' ); } ); $httpSocket = new SocketServer('0.0.0.0:8081', [], $loop); $http->listen($httpSocket); echo "WebSocket server running on port 8080\n"; echo "HTTP broadcast endpoint running on port 8081\n"; $server->run(); } else { header('Content-Type: application/json'); echo json_encode(['error' => 'This script should be run from command line']); } inter/index.php 0000644 00000051442 15114742451 0007517 0 ustar 00 <?php session_start(); require_once 'db.php'; $config = [ 'location' => [ 'latitude' => 51.5074, 'longitude' => -0.1278 ], 'screensaver' => [ 'enabled' => true, 'start' => '19:30', 'end' => '06:00', 'qrCode' => 'https://imators.com/about/screen-saver' ], 'weather' => [ 'enabled' => false ], 'serial' => '', 'status' => 'active' ]; $showSetup = false; $stopMessage = ''; if (isset($_POST['saveConfig'])) { $latitude = filter_input(INPUT_POST, 'latitude', FILTER_VALIDATE_FLOAT); $longitude = filter_input(INPUT_POST, 'longitude', FILTER_VALIDATE_FLOAT); $serialNumber = filter_input(INPUT_POST, 'serial', FILTER_SANITIZE_STRING); $stmt = $pdo->prepare("SELECT * FROM `imators-systems-billboard` WHERE serial = ?"); $stmt->execute([$serialNumber]); $existing = $stmt->fetch(); if ($existing) { $_SESSION['config'] = json_decode($existing['config'], true); $_SESSION['serial'] = $serialNumber; $_SESSION['status'] = $existing['status']; $_SESSION['stop_message'] = $existing['stop_message']; } else { $config['location']['latitude'] = $latitude; $config['location']['longitude'] = $longitude; $config['serial'] = $serialNumber; $stmt = $pdo->prepare("INSERT INTO `imators-systems-billboard` (serial, config, status, last_seen) VALUES (?, ?, 'active', NOW())"); $stmt->execute([$serialNumber, json_encode($config)]); $_SESSION['config'] = $config; $_SESSION['serial'] = $serialNumber; $_SESSION['status'] = 'active'; $_SESSION['stop_message'] = null; } header('Location: index.php'); exit; } if (!isset($_SESSION['config']) || !isset($_SESSION['serial'])) { $showSetup = true; } else { $config = $_SESSION['config']; $serialNumber = $_SESSION['serial']; $stmt = $pdo->prepare("UPDATE `imators-systems-billboard` SET last_seen = NOW() WHERE serial = ?"); $stmt->execute([$serialNumber]); $stmt = $pdo->prepare("SELECT status, stop_message FROM `imators-systems-billboard` WHERE serial = ?"); $stmt->execute([$serialNumber]); $billboard = $stmt->fetch(); if ($billboard) { if ($billboard['status'] === 'stopped') { $stopMessage = $billboard['stop_message'] ?? 'This billboard has been stopped by the administrator.'; $_SESSION['status'] = 'stopped'; $_SESSION['stop_message'] = $stopMessage; } else { $_SESSION['status'] = 'active'; $_SESSION['stop_message'] = null; } } } $videos = [ [ 'src' => 'https://cdn.imators.com/imators_systems_ads2.mp4', 'link' => 'https://academ.my', 'showElements' => true, 'showQR' => true, 'showHour' => ['show' => true, 'color' => 'white'], 'showDate' => ['show' => true, 'color' => 'white'], 'showWeather' => true, 'timeSlot' => ['start' => '00:00', 'end' => '00:00'], 'loop' => true ], [ 'src' => 'https://cdn.imators.com/imators_systems_ads1.mp4', 'link' => 'https://imators.com/about/daywithimators', 'showElements' => true, 'showQR' => true, 'showHour' => ['show' => true, 'color' => 'black'], 'showDate' => ['show' => true, 'color' => 'black'], 'showWeather' => false, 'timeSlot' => ['start' => '00:00', 'end' => '00:00'], 'loop' => true ], [ 'src' => 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/TearsOfSteel.mp4', 'link' => 'https://example.com/link3', 'showElements' => true, 'showQR' => true, 'showHour' => ['show' => true, 'color' => 'white'], 'showDate' => ['show' => true, 'color' => 'white'], 'showWeather' => true, 'timeSlot' => ['start' => '00:00', 'end' => '00:00'], 'loop' => true ], [ 'src' => 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4', 'link' => 'https://example.com/link4', 'showElements' => true, 'showQR' => false, 'showHour' => ['show' => true, 'color' => 'white'], 'showDate' => ['show' => true, 'color' => 'white'], 'showWeather' => false, 'timeSlot' => ['start' => '00:00', 'end' => '00:00'], 'loop' => true ] ]; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Imators Systems</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script> <script src="https://cdn.tailwindcss.com"></script> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet" /> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" /> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script> <style type="text/css"> body { font-family: 'Inter', sans-serif; } .hidden { display: none !important; } </style> </head> <body class="bg-black text-white h-screen overflow-hidden"> <?php if ($showSetup): ?> <div class="bg-gray-900 min-h-screen flex flex-col items-center justify-center p-6"> <div class="bg-gray-800 p-8 rounded-xl shadow-xl max-w-md w-full"> <img src="https://cdn.imators.com/logo.png" alt="Imators Logo" class="w-24 h-24 mx-auto mb-6"> <h1 class="text-2xl font-bold text-center mb-6">Billboard Configuration</h1> <form method="POST" action="" class="space-y-6"> <div class="space-y-2"> <label class="block text-sm font-medium">Location</label> <div id="map" class="h-64 rounded-lg mb-2"></div> <div class="grid grid-cols-2 gap-4"> <div> <label class="block text-xs mb-1">Latitude</label> <input type="text" name="latitude" id="latitude" value="<?php echo $config['location']['latitude']; ?>" class="w-full bg-gray-700 border border-gray-600 rounded-lg px-3 py-2 text-white"> </div> <div> <label class="block text-xs mb-1">Longitude</label> <input type="text" name="longitude" id="longitude" value="<?php echo $config['location']['longitude']; ?>" class="w-full bg-gray-700 border border-gray-600 rounded-lg px-3 py-2 text-white"> </div> </div> </div> <div class="space-y-2"> <label for="serial" class="block text-sm font-medium">Billboard Serial Number</label> <input type="text" name="serial" id="serial" required class="w-full bg-gray-700 border border-gray-600 rounded-lg px-3 py-2 text-white"> </div> <button type="submit" name="saveConfig" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-lg transition duration-150"> Confirm and Start </button> </form> </div> </div> <script> const latInput = document.getElementById('latitude'); const lngInput = document.getElementById('longitude'); const map = L.map('map').setView([<?php echo $config['location']['latitude']; ?>, <?php echo $config['location']['longitude']; ?>], 13); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>' }).addTo(map); let marker = L.marker([<?php echo $config['location']['latitude']; ?>, <?php echo $config['location']['longitude']; ?>], { draggable: true }).addTo(map); marker.on('dragend', function(e) { const position = marker.getLatLng(); latInput.value = position.lat.toFixed(6); lngInput.value = position.lng.toFixed(6); }); map.on('click', function(e) { marker.setLatLng(e.latlng); latInput.value = e.latlng.lat.toFixed(6); lngInput.value = e.latlng.lng.toFixed(6); }); </script> <?php else: ?> <?php if ($_SESSION['status'] === 'stopped'): ?> <div class="fixed inset-0 z-50 flex items-center justify-center bg-red-600"> <div class="text-center p-8"> <h1 class="text-4xl font-bold mb-4">STOPPED</h1> <p class="text-2xl"><?php echo htmlspecialchars($_SESSION['stop_message']); ?></p> </div> </div> <?php else: ?> <div class="absolute inset-0 w-full h-full" id="video-container"> <video autoplay="" class="object-cover w-full h-full" id="background-video" muted=""></video> </div> <div class="hidden absolute inset-0 w-full h-full bg-black" id="screensaver"> <div class="absolute top-4 left-4" id="datetime-screensaver"> <div class="text-4xl font-light" id="time-screensaver"></div> <div class="text-lg font-light mt-1 opacity-80" id="date-screensaver"></div> <div class="text-lg font-light mt-2" id="weather-screensaver"></div> </div> <div class="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-center"> <div class="flex items-center gap-8"> <img alt="Logo" class="w-48 h-48" src="https://cdn.imators.com/logo.png" /> <div class="text-left"> <h1 class="text-4xl mb-2">Good Night everyone!</h1> <p class="text-xl text-gray-300">We wish you a pleasant evening and see you tomorrow!</p> </div> </div> </div> <div class="absolute bottom-6 right-6 bg-white p-2 rounded-md shadow-lg"> <div id="qrcode-screensaver"></div> </div> </div> <div class="absolute bottom-6 right-6 bg-white p-2 rounded-md shadow-lg" id="qr-container"> <div id="qrcode"></div> </div> <div class="absolute top-4 left-4 text-white" id="datetime-container"> <div class="text-4xl font-light" id="time"></div> <div class="text-lg font-light mt-1 opacity-80" id="date"></div> <div class="text-lg font-light mt-2" id="weather"></div> </div> <script> const CONFIG = <?php echo json_encode($config); ?>; const SERIAL = "<?php echo $serialNumber; ?>"; const videos = <?php echo json_encode($videos); ?>; let currentVideoIndex = 0; let wsConnection = null; const timeElementScreensaver = document.getElementById('time-screensaver'); const dateElementScreensaver = document.getElementById('date-screensaver'); const weatherElementScreensaver = document.getElementById('weather-screensaver'); const qrcodeScreensaver = document.getElementById('qrcode-screensaver'); const video = document.getElementById('background-video'); const qrcode = document.getElementById('qrcode'); const qrContainer = document.getElementById('qr-container'); const datetimeContainer = document.getElementById('datetime-container'); const timeElement = document.getElementById('time'); const dateElement = document.getElementById('date'); const screensaver = document.getElementById('screensaver'); const weather = document.getElementById('weather'); function getWeatherDescription(code) { const weatherCodes = { 0: 'Clear sky', 1: 'Mainly clear', 2: 'Partly cloudy', 3: 'Overcast', 45: 'Fog', 48: 'Depositing rime fog', 51: 'Light drizzle', 53: 'Moderate drizzle', 55: 'Dense drizzle', 61: 'Slight rain', 63: 'Moderate rain', 65: 'Heavy rain', 71: 'Slight snow fall', 73: 'Moderate snow fall', 75: 'Heavy snow fall', 77: 'Snow grains', 80: 'Slight rain showers', 81: 'Moderate rain showers', 82: 'Violent rain showers', 95: 'Thunderstorm', 96: 'Thunderstorm with slight hail', 99: 'Thunderstorm with heavy hail' }; return weatherCodes[code] || 'Unknown'; } async function updateWeather() { if (!CONFIG.weather.enabled) { weather.textContent = ''; weatherElementScreensaver.textContent = ''; weather.classList.add('hidden'); return; } try { const response = await fetch( `https://api.open-meteo.com/v1/forecast?latitude=${CONFIG.location.latitude}&longitude=${CONFIG.location.longitude}¤t=temperature_2m,weather_code&timezone=auto` ); const data = await response.json(); const temp = Math.round(data.current.temperature_2m); const weatherCode = data.current.weather_code; const description = getWeatherDescription(weatherCode); weather.textContent = `${temp}°C - ${description}`; weatherElementScreensaver.textContent = `${temp}°C - ${description}`; } catch (error) { console.error('Weather error:', error); weather.textContent = ''; weatherElementScreensaver.textContent = ''; weather.classList.add('hidden'); } } function isScreensaverTime() { if (!CONFIG.screensaver.enabled) return false; const now = new Date(); const currentTime = now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0'); if (CONFIG.screensaver.start <= CONFIG.screensaver.end) { return currentTime >= CONFIG.screensaver.start && currentTime < CONFIG.screensaver.end; } else { return currentTime >= CONFIG.screensaver.start || currentTime < CONFIG.screensaver.end; } } function isInTimeSlot(video) { if (video.timeSlot.start === '00:00' && video.timeSlot.end === '00:00') { return true; } const now = new Date(); const currentTime = now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0'); const start = video.timeSlot.start; const end = video.timeSlot.end; if (start <= end) { return currentTime >= start && currentTime < end; } else { return currentTime >= start || currentTime < end; } } function getNextValidVideoIndex() { let checkedVideos = 0; let nextIndex = currentVideoIndex; while (checkedVideos < videos.length) { nextIndex = (nextIndex + 1) % videos.length; const video = videos[nextIndex]; if (video.loop && isInTimeSlot(video)) { return nextIndex; } checkedVideos++; } return -1; } function playVideo() { if (CONFIG.screensaver.enabled && isScreensaverTime()) { video.src = ''; screensaver.classList.remove('hidden'); qrContainer.classList.add('hidden'); qrcodeScreensaver.innerHTML = ''; new QRCode(qrcodeScreensaver, { text: CONFIG.screensaver.qrCode, width: 128, height: 128, colorDark: "#000000", colorLight: "#ffffff" }); return; } screensaver.classList.add('hidden'); const currentVideo = videos[currentVideoIndex]; if (!currentVideo.loop || !isInTimeSlot(currentVideo)) { const nextValidIndex = getNextValidVideoIndex(); if (nextValidIndex === -1) { video.src = ''; qrContainer.classList.add('hidden'); datetimeContainer.classList.add('hidden'); return; } currentVideoIndex = nextValidIndex; } const videoToPlay = videos[currentVideoIndex]; video.src = videoToPlay.src; video.play(); if (videoToPlay.showElements) { datetimeContainer.classList.remove('hidden'); if (videoToPlay.showQR) { qrContainer.classList.remove('hidden'); qrcode.innerHTML = ''; new QRCode(qrcode, { text: videoToPlay.link, width: 128, height: 128, colorDark: "#000000", colorLight: "#ffffff" }); } else { qrContainer.classList.add('hidden'); } timeElement.classList.toggle('hidden', !videoToPlay.showHour.show); timeElement.style.color = videoToPlay.showHour.color; dateElement.classList.toggle('hidden', !videoToPlay.showDate.show); dateElement.style.color = videoToPlay.showDate.color; if (CONFIG.weather.enabled && videoToPlay.showWeather) { weather.classList.remove('hidden'); } else { weather.classList.add('hidden'); } } else { qrContainer.classList.add('hidden'); datetimeContainer.classList.add('hidden'); } } video.addEventListener('ended', () => { const nextValidIndex = getNextValidVideoIndex(); if (nextValidIndex !== -1) { currentVideoIndex = nextValidIndex; playVideo(); } }); function updateDateTime() { const now = new Date(); const timeString = now.toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' }); const dateString = now.toLocaleDateString('en-GB', { weekday: 'long', day: 'numeric', month: 'long' }); const formattedDate = dateString.charAt(0).toUpperCase() + dateString.slice(1); timeElement.textContent = timeString; dateElement.textContent = formattedDate; timeElementScreensaver.textContent = timeString; dateElementScreensaver.textContent = formattedDate; if (!isInTimeSlot(videos[currentVideoIndex]) || isScreensaverTime()) { playVideo(); } } function connectWebSocket() { if (wsConnection && (wsConnection.readyState === WebSocket.CONNECTING || wsConnection.readyState === WebSocket.OPEN)) { return; } const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const wsUrl = `${protocol}//${window.location.host}/ws-server.php`; wsConnection = new WebSocket(wsUrl); wsConnection.onopen = function() { console.log('WebSocket connected'); wsConnection.send(JSON.stringify({ type: 'register', serial: SERIAL })); }; wsConnection.onmessage = function(event) { const data = JSON.parse(event.data); if (data.type === 'status_update') { if (data.status === 'stopped' && data.serial === SERIAL) { window.location.reload(); } } }; wsConnection.onclose = function() { console.log('WebSocket connection closed'); setTimeout(connectWebSocket, 5000); }; wsConnection.onerror = function(error) { console.error('WebSocket error:', error); wsConnection.close(); }; } function updateStatus() { fetch('api/status.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ serial: SERIAL, action: 'check' }) }) .then(response => response.json()) .then(data => { if (data.status === 'stopped' && data.reloadNeeded) { window.location.reload(); } }) .catch(error => console.error('Status check error:', error)); } setInterval(updateStatus, 10000); setInterval(updateWeather, 15 * 60 * 1000); updateWeather(); setInterval(updateDateTime, 1000); updateDateTime(); playVideo(); // Try to use WebSocket if supported if ('WebSocket' in window) { connectWebSocket(); } </script> <?php endif; ?> <?php endif; ?> </body> </html>