From 5ffd0a3bc20ce28df370d4e4ab9812fbe7e74562 Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 9 Dec 2023 19:31:54 +0200 Subject: [PATCH] implement rooms list --- .env | 7 +- README.md | 4 +- config/services.yaml | 3 +- public/css/default.css | 2 +- src/Controller/ModuleController.php | 11 +- src/Controller/RoomController.php | 126 +++++++++++++++--- .../{room.html.twig => rooms.html.twig} | 15 +++ templates/default/room/index.html.twig | 2 +- templates/default/room/list.html.twig | 46 +++++++ templates/default/room/list.rss.twig | 16 +++ 10 files changed, 196 insertions(+), 36 deletions(-) rename templates/default/module/{room.html.twig => rooms.html.twig} (61%) create mode 100644 templates/default/room/list.html.twig create mode 100644 templates/default/room/list.rss.twig diff --git a/.env b/.env index 0857729..93b084e 100644 --- a/.env +++ b/.env @@ -50,17 +50,14 @@ APP_KEVACOIN_EXPLORER_URL=https://keva.one/explorer/address/ APP_KEVACOIN_BOOST_ADDRESS=EDIT_ME # Allowed room namespaces, separated with | (must be owned to accept posts) -APP_KEVACOIN_ROOM_NAMESPACES=EDIT_ME +APP_KEVACOIN_ROOM_NAMESPACES_PINNED=EDIT_ME # Allowed room namespaces for read only (e.g. project news) separated with | -APP_KEVACOIN_ROOM_NAMESPACES_READONLY=EDIT_ME +APP_KEVACOIN_ROOM_NAMESPACES_READONLY= # Redirect from index page to default room APP_KEVACOIN_ROOM_NAMESPACE_DEFAULT=EDIT_ME -# Allow users to read external node rooms -APP_KEVACOIN_ROOM_NAMESPACES_EXTERNAL= - # Online session expiration timeout APP_SESSION_ONLINE_TIMEOUT=900 diff --git a/README.md b/README.md index ba77c88..7a1b983 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,8 @@ Application package contain settings preset, just few steps required to launch: * Copy `rpcuser` to `env`.`APP_KEVACOIN_USERNAME` and `rpcpassword` to `env`.`APP_KEVACOIN_PASSWORD` * Generate new address using CLI `kevacoin-cli getnewaddress` and copy to `env`.`APP_KEVACOIN_BOOST_ADDRESS` * Send few coins to this address and wait for new block to continue -* Create namespace for the chat room with `kevacoin-cli keva_namespace "sandbox"` and add it hash to `env`.`APP_KEVACOIN_ROOM_NAMESPACES` -* Also Provide at least one namespace for default chat room to `env`.`APP_KEVACOIN_ROOM_NAMESPACE_DEFAULT` (for homepage redirects) +* Create at least one room namespace with Web UI or CLI `kevacoin-cli keva_namespace "sandbox"` +* Provide at least one namespace for default chat room to `env`.`APP_KEVACOIN_ROOM_NAMESPACE_DEFAULT` (for homepage redirects) ## Contribution diff --git a/config/services.yaml b/config/services.yaml index 6b3cd97..fb38fa0 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -15,9 +15,8 @@ parameters: app.kevacoin.port: '%env(APP_KEVACOIN_PORT)%' app.kevacoin.username: '%env(APP_KEVACOIN_USERNAME)%' app.kevacoin.password: '%env(APP_KEVACOIN_PASSWORD)%' - app.kevacoin.room.namespaces: '%env(APP_KEVACOIN_ROOM_NAMESPACES)%' + app.kevacoin.room.namespaces.pinned: '%env(APP_KEVACOIN_ROOM_NAMESPACES_PINNED)%' app.kevacoin.room.namespaces.readonly: '%env(APP_KEVACOIN_ROOM_NAMESPACES_READONLY)%' - app.kevacoin.room.namespaces.external: '%env(APP_KEVACOIN_ROOM_NAMESPACES_EXTERNAL)%' app.kevacoin.room.namespace.default: '%env(APP_KEVACOIN_ROOM_NAMESPACE_DEFAULT)%' app.kevacoin.boost.address: '%env(APP_KEVACOIN_BOOST_ADDRESS)%' app.kevacoin.explorer.url: '%env(APP_KEVACOIN_EXPLORER_URL)%' diff --git a/public/css/default.css b/public/css/default.css index e26d107..fd6b11a 100644 --- a/public/css/default.css +++ b/public/css/default.css @@ -127,7 +127,7 @@ main ul li span > svg float: right; } -main > sup > a > svg +main a > svg { fill: var(--color-warning); } diff --git a/src/Controller/ModuleController.php b/src/Controller/ModuleController.php index 7bc5840..8dd9a30 100644 --- a/src/Controller/ModuleController.php +++ b/src/Controller/ModuleController.php @@ -95,7 +95,7 @@ class ModuleController extends AbstractController ); } - public function room( + public function rooms( Request $request ): Response { @@ -108,9 +108,9 @@ class ModuleController extends AbstractController ); return $this->render( - 'default/module/room.html.twig', + 'default/module/rooms.html.twig', [ - 'list' => (array) explode('|', $this->getParameter('app.kevacoin.room.namespaces')), + 'list' => (array) explode('|', $this->getParameter('app.kevacoin.room.namespaces.pinned')), 'form' => [ 'namespace' => @@ -168,11 +168,6 @@ class ModuleController extends AbstractController 'enabled' => ( - in_array( - $request->get('namespace'), - explode('|', $this->getParameter('app.kevacoin.room.namespaces')) - ) - && !in_array( $request->get('namespace'), explode('|', $this->getParameter('app.kevacoin.room.namespaces.readonly')) diff --git a/src/Controller/RoomController.php b/src/Controller/RoomController.php index d10d93d..6d63631 100644 --- a/src/Controller/RoomController.php +++ b/src/Controller/RoomController.php @@ -31,6 +31,106 @@ class RoomController extends AbstractController ); } + #[Route( + '/room/list', + name: 'room_list', + methods: + [ + 'GET' + ] + )] + public function list( + ?Request $request + ): Response + { + // Connect kevacoin + $client = new \Kevachat\Kevacoin\Client( + $this->getParameter('app.kevacoin.protocol'), + $this->getParameter('app.kevacoin.host'), + $this->getParameter('app.kevacoin.port'), + $this->getParameter('app.kevacoin.username'), + $this->getParameter('app.kevacoin.password') + ); + + // Get room list + $list = []; + + foreach ((array) $client->kevaListNamespaces() as $value) + { + // Calculate room totals + $total = 0; + + foreach ((array) $client->kevaFilter($value['namespaceId']) as $post) + { + // Skip values with meta keys + if (false !== stripos($post['key'], '_KEVA_')) + { + continue; + } + + // Require valid kevachat meta + if ($this->_post($post)) + { + $total++; + } + } + + // Add to room list + $list[] = + [ + 'namespace' => $value['namespaceId'], + 'name' => $value['displayName'], + 'total' => $total, + 'pinned' => in_array( + $value['namespaceId'], + (array) explode( + '|', + $this->getParameter('app.kevacoin.room.namespaces.pinned') + ) + ) + ]; + } + + // Sort by name + array_multisort( + array_column( + $list, + 'name' + ), + SORT_ASC, + $list + ); + + // RSS + if ('rss' === $request->get('feed')) + { + $response = new Response(); + + $response->headers->set( + 'Content-Type', + 'text/xml' + ); + + return $this->render( + 'default/room/list.rss.twig', + [ + 'list' => $list, + 'request' => $request + ], + $response + ); + } + + // HTML + return $this->render( + 'default/room/list.html.twig', + [ + 'list' => $list, + 'request' => $request + ] + ); + } + #[Route( '/room/{namespace}/{txid}', name: 'room_namespace', @@ -61,21 +161,6 @@ class RoomController extends AbstractController $this->getParameter('app.kevacoin.password') ); - // Check for external rooms reading allowed in config - if ( - !in_array( - $request->get('namespace'), - (array) explode('|', $this->getParameter('app.kevacoin.room.namespaces')) - ) - && - $this->getParameter('app.kevacoin.room.namespaces.external') - ) { - // @TODO process to error page instead of redirect to default room - return $this->redirectToRoute( - 'room_index' - ); - } - // Get room feed $feed = []; @@ -263,14 +348,21 @@ class RoomController extends AbstractController ); // Check namespace defined in config - if (!in_array($request->get('namespace'), (array) explode('|', $this->getParameter('app.kevacoin.room.namespaces')))) + $rooms = []; + + foreach ((array) $client->kevaListNamespaces() as $value) + { + $rooms[] = $value['namespaceId']; + } + + if (!in_array($request->get('namespace'), $rooms)) { return $this->redirectToRoute( 'room_namespace', [ 'namespace' => $request->get('namespace'), 'message' => $request->get('message'), - 'error' => $translator->trans('Namespace not listed in settings!') + 'error' => $translator->trans('Namespace not not found on this node!') ] ); } diff --git a/templates/default/module/room.html.twig b/templates/default/module/rooms.html.twig similarity index 61% rename from templates/default/module/room.html.twig rename to templates/default/module/rooms.html.twig index dc89245..943ec2b 100644 --- a/templates/default/module/room.html.twig +++ b/templates/default/module/rooms.html.twig @@ -17,4 +17,19 @@ {% endfor %} +{% endif %} +{% if list %} + • +

+ {% if form.namespace.value %} + {{ 'all' | trans }} + {% else %} + {{ 'all' | trans }} + {% endif %} +

+ + + + + {% endif %} \ No newline at end of file diff --git a/templates/default/room/index.html.twig b/templates/default/room/index.html.twig index 5b1c3a4..3530507 100644 --- a/templates/default/room/index.html.twig +++ b/templates/default/room/index.html.twig @@ -50,7 +50,7 @@ {{ render( controller( - 'App\\Controller\\ModuleController::room', + 'App\\Controller\\ModuleController::rooms', { request: request } diff --git a/templates/default/room/list.html.twig b/templates/default/room/list.html.twig new file mode 100644 index 0000000..2b46d20 --- /dev/null +++ b/templates/default/room/list.html.twig @@ -0,0 +1,46 @@ +{% extends 'default/layout.html.twig' %} +{% block head_title_content %}{{ 'Rooms' | trans }} - {{ 'KevaChat' | trans }}{% endblock %} +{% block main_content %} + {{ + render( + controller( + 'App\\Controller\\ModuleController::rooms', + { + request: request + } + ) + ) + }} + {% if list | length %} + + {% else %} + + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/default/room/list.rss.twig b/templates/default/room/list.rss.twig new file mode 100644 index 0000000..2940aa4 --- /dev/null +++ b/templates/default/room/list.rss.twig @@ -0,0 +1,16 @@ + + + + + {{ 'Rooms' | trans }} - {{ 'KevaChat' | trans }} + {{ url('room_list') }} + {% for room in list %} + + {{ room.namespace | keva_namespace_value }} + {{ url('room_namespace', { namespace : room.namespace }) }} + {{ url('room_namespace', { namespace : room.namespace }) }} + {{ 'join' | trans }} {{ room.namespace | keva_namespace_value }} {{ 'room' | trans }}! + + {% endfor %} + + \ No newline at end of file