add room list cache to prevent available kevaListNamespaces results on pending transactions

This commit is contained in:
ghost 2023-12-09 23:08:58 +02:00
parent ee81ffec09
commit d984f01d5d
2 changed files with 71 additions and 37 deletions

2
.env
View File

@ -19,7 +19,7 @@ APP_ENV=dev
APP_SECRET=EDIT_ME APP_SECRET=EDIT_ME
###< symfony/framework-bundle ### ###< symfony/framework-bundle ###
APP_VERSION=1.4.0 APP_VERSION=1.4.1
APP_NAME=KevaChat APP_NAME=KevaChat

View File

@ -52,54 +52,78 @@ class RoomController extends AbstractController
$this->getParameter('app.kevacoin.password') $this->getParameter('app.kevacoin.password')
); );
// Connect memcached
$memcached = new \Memcached();
$memcached->addServer(
$this->getParameter('app.memcached.host'),
$this->getParameter('app.memcached.port')
);
$memory = md5(
sprintf(
'%s.RoomController::list:rooms',
__DIR__
),
);
// Get room list // Get room list
$list = []; $list = [];
foreach ((array) $client->kevaListNamespaces() as $value) if (!$list = $memcached->get($memory))
{ {
// Calculate room totals foreach ((array) $client->kevaListNamespaces() as $value)
$total = 0;
foreach ((array) $client->kevaFilter($value['namespaceId']) as $post)
{ {
// Skip values with meta keys // Calculate room totals
if (false !== stripos($post['key'], '_KEVA_')) $total = 0;
foreach ((array) $client->kevaFilter($value['namespaceId']) as $post)
{ {
continue; // Skip values with meta keys
if (false !== stripos($post['key'], '_KEVA_'))
{
continue;
}
// Require valid kevachat meta
if ($this->_post($post))
{
$total++;
}
} }
// Require valid kevachat meta // Add to room list
if ($this->_post($post)) $list[] =
{ [
$total++; 'namespace' => $value['namespaceId'],
} 'name' => $value['displayName'],
'total' => $total,
'pinned' => in_array(
$value['namespaceId'],
(array) explode(
'|',
$this->getParameter('app.kevacoin.room.namespaces.pinned')
)
)
];
} }
// Add to room list // Sort by name
$list[] = array_multisort(
[ array_column(
'namespace' => $value['namespaceId'], $list,
'name' => $value['displayName'], 'total'
'total' => $total, ),
'pinned' => in_array( SORT_DESC,
$value['namespaceId'], $list
(array) explode( );
'|',
$this->getParameter('app.kevacoin.room.namespaces.pinned')
)
)
];
}
// Sort by name // Cache rooms to memcached as kevaListNamespaces hides rooms with pending posts
array_multisort( $memcached->set(
array_column( $memory,
$list, $list,
'total' (int) $this->getParameter('app.memcached.timeout')
), );
SORT_DESC, }
$list
);
// RSS // RSS
if ('rss' === $request->get('feed')) if ('rss' === $request->get('feed'))
@ -703,6 +727,16 @@ class RoomController extends AbstractController
(int) $this->getParameter('app.add.room.remote.ip.delay') // auto remove on cache expire (int) $this->getParameter('app.add.room.remote.ip.delay') // auto remove on cache expire
); );
// Reset rooms list cache
$memcached->delete(
md5(
sprintf(
'%s.RoomController::list:rooms',
__DIR__
),
)
);
// Redirect to new room // Redirect to new room
return $this->redirectToRoute( return $this->redirectToRoute(
'room_namespace', 'room_namespace',