mirror of
https://github.com/kevachat/webapp.git
synced 2025-01-22 12:34:25 +00:00
add room name twig filter, make optimizations
This commit is contained in:
parent
f8c5dc5fad
commit
5af56addfb
1
.env
1
.env
@ -26,6 +26,7 @@ APP_NAME=KevaChat
|
||||
# Connect memcached
|
||||
APP_MEMCACHED_HOST=127.0.0.1
|
||||
APP_MEMCACHED_PORT=11211
|
||||
APP_MEMCACHED_TIMEOUT=3600
|
||||
|
||||
# Connect kevacoin
|
||||
|
||||
|
@ -8,6 +8,7 @@ parameters:
|
||||
app.name: '%env(APP_NAME)%'
|
||||
app.memcached.host: '%env(APP_MEMCACHED_HOST)%'
|
||||
app.memcached.port: '%env(APP_MEMCACHED_PORT)%'
|
||||
app.memcached.timeout: '%env(APP_MEMCACHED_TIMEOUT)%'
|
||||
app.kevacoin.protocol: '%env(APP_KEVACOIN_PROTOCOL)%'
|
||||
app.kevacoin.host: '%env(APP_KEVACOIN_HOST)%'
|
||||
app.kevacoin.port: '%env(APP_KEVACOIN_PORT)%'
|
||||
|
@ -56,33 +56,10 @@ class ModuleController extends AbstractController
|
||||
$this->getParameter('app.kevacoin.password')
|
||||
);
|
||||
|
||||
$list = [];
|
||||
|
||||
// Get configured rooms list
|
||||
foreach ((array) explode('|', $this->getParameter('app.kevacoin.room.namespaces')) as $namespace)
|
||||
{
|
||||
$list[$namespace] = [
|
||||
'name' => $namespace,
|
||||
'namespace' => $namespace,
|
||||
'active' => $namespace === $request->get('namespace')
|
||||
];
|
||||
}
|
||||
|
||||
// Find related room names
|
||||
foreach ((array) $client->kevaListNamespaces() as $value)
|
||||
{
|
||||
if (isset($list[$value['namespaceId']]))
|
||||
{
|
||||
$list[$value['namespaceId']]['name'] = $value['displayName'];
|
||||
}
|
||||
}
|
||||
|
||||
return $this->render(
|
||||
'default/module/room.html.twig',
|
||||
[
|
||||
'list' => array_values(
|
||||
$list
|
||||
),
|
||||
'list' => (array) explode('|', $this->getParameter('app.kevacoin.room.namespaces')),
|
||||
'form' =>
|
||||
[
|
||||
'namespace' =>
|
||||
|
@ -61,20 +61,6 @@ class RoomController extends AbstractController
|
||||
$this->getParameter('app.kevacoin.password')
|
||||
);
|
||||
|
||||
// Set title
|
||||
$name = $request->get('namespace');
|
||||
|
||||
foreach ((array) $client->kevaListNamespaces() as $namespace)
|
||||
{
|
||||
// Get current room namespace (could be third-party)
|
||||
if ($namespace['namespaceId'] == $request->get('namespace'))
|
||||
{
|
||||
$name = $namespace['displayName'];
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Check for external rooms reading allowed in config
|
||||
if (
|
||||
!in_array(
|
||||
@ -178,7 +164,6 @@ class RoomController extends AbstractController
|
||||
return $this->render(
|
||||
'default/room/index.rss.twig',
|
||||
[
|
||||
'name' => $name,
|
||||
'feed' => $feed,
|
||||
'request' => $request
|
||||
],
|
||||
@ -190,7 +175,6 @@ class RoomController extends AbstractController
|
||||
return $this->render(
|
||||
'default/room/index.html.twig',
|
||||
[
|
||||
'name' => $name,
|
||||
'feed' => $feed,
|
||||
'request' => $request
|
||||
]
|
||||
@ -221,15 +205,13 @@ class RoomController extends AbstractController
|
||||
$this->getParameter('app.memcached.port')
|
||||
);
|
||||
|
||||
$memory = [
|
||||
'app.add.post.remote.ip.delay' => md5(
|
||||
sprintf(
|
||||
'kevachat.app.add.post.remote.ip.delay:%s.%s',
|
||||
$this->getParameter('app.name'),
|
||||
$request->getClientIp(),
|
||||
),
|
||||
$memory = md5(
|
||||
sprintf(
|
||||
'%s.RoomController::post:add.post.remote.ip.delay:%s',
|
||||
__DIR__,
|
||||
$request->getClientIp(),
|
||||
),
|
||||
];
|
||||
);
|
||||
|
||||
// Connect kevacoin
|
||||
$client = new \Kevachat\Kevacoin\Client(
|
||||
@ -322,7 +304,7 @@ class RoomController extends AbstractController
|
||||
}
|
||||
|
||||
/// Validate remote IP limits
|
||||
if ($delay = (int) $memcached->get($memory['app.add.post.remote.ip.delay']))
|
||||
if ($delay = (int) $memcached->get($memory))
|
||||
{
|
||||
// Error
|
||||
return $this->redirectToRoute(
|
||||
@ -369,9 +351,9 @@ class RoomController extends AbstractController
|
||||
{
|
||||
// Register event time
|
||||
$memcached->set(
|
||||
$memory['app.add.post.remote.ip.delay'],
|
||||
$memory,
|
||||
time(),
|
||||
(int) $this->getParameter('app.add.post.remote.ip.delay')
|
||||
(int) $this->getParameter('app.add.post.remote.ip.delay') // auto remove on cache expire
|
||||
);
|
||||
|
||||
// Redirect back to room
|
||||
|
@ -37,6 +37,13 @@ class AppExtension extends AbstractExtension
|
||||
$this,
|
||||
'urlToMarkdown'
|
||||
]
|
||||
),
|
||||
new TwigFilter(
|
||||
'keva_namespace_value',
|
||||
[
|
||||
$this,
|
||||
'kevaNamespaceValue'
|
||||
]
|
||||
)
|
||||
];
|
||||
}
|
||||
@ -129,4 +136,69 @@ class AppExtension extends AbstractExtension
|
||||
|
||||
return $texts[(($number % 100) > 4 && ($number % 100) < 20) ? 2 : $cases[min($number % 10, 5)]];
|
||||
}
|
||||
|
||||
// @TODO
|
||||
// this is fix of keva magic with Kevachat\Kevacoin\Client::kevaListNamespaces results (on pending transactions exist in the namespaces)
|
||||
// let's extract it from latest_KEVA_NS_ value and temporarily store results in memory cache
|
||||
public function kevaNamespaceValue(
|
||||
string $namespace
|
||||
): string
|
||||
{
|
||||
// Connect kevacoin
|
||||
$client = new \Kevachat\Kevacoin\Client(
|
||||
$this->container->getParameter('app.kevacoin.protocol'),
|
||||
$this->container->getParameter('app.kevacoin.host'),
|
||||
$this->container->getParameter('app.kevacoin.port'),
|
||||
$this->container->getParameter('app.kevacoin.username'),
|
||||
$this->container->getParameter('app.kevacoin.password')
|
||||
);
|
||||
|
||||
// Connect memcached
|
||||
$memcached = new \Memcached();
|
||||
$memcached->addServer(
|
||||
$this->container->getParameter('app.memcached.host'),
|
||||
$this->container->getParameter('app.memcached.port')
|
||||
);
|
||||
|
||||
// Generate unique cache key
|
||||
$key = md5(
|
||||
sprintf(
|
||||
'%s.AppExtension::kevaNamespaceValue:%s',
|
||||
__DIR__,
|
||||
$namespace
|
||||
)
|
||||
);
|
||||
|
||||
// Return cached value if exists
|
||||
if ($value = $memcached->get($key))
|
||||
{
|
||||
return $value;
|
||||
}
|
||||
|
||||
// Find related room names
|
||||
$_keva_ns = [];
|
||||
foreach ((array) $client->kevaFilter($namespace) as $data)
|
||||
{
|
||||
if ($data['key'] == '_KEVA_NS_')
|
||||
{
|
||||
$_keva_ns[$data['height']] = $data['value'];
|
||||
}
|
||||
}
|
||||
|
||||
// Get last by it block height
|
||||
if (!empty($_keva_ns))
|
||||
{
|
||||
$value = reset(
|
||||
$_keva_ns
|
||||
);
|
||||
|
||||
if ($memcached->set($key, $value, $this->container->getParameter('app.memcached.timeout')))
|
||||
{
|
||||
return (string) $value;
|
||||
}
|
||||
}
|
||||
|
||||
// Return original hash
|
||||
return $namespace;
|
||||
}
|
||||
}
|
@ -2,17 +2,17 @@
|
||||
<input type="text" name="namespace" value="{{ form.namespace.value }}" placeholder="{{ 'join room by kevacoin namespace...' | trans }}" />
|
||||
</form>
|
||||
{% if list %}
|
||||
{% for i, room in list %}
|
||||
{% for i, namespace in list %}
|
||||
{% if i %}•{% endif %}
|
||||
<h2>
|
||||
{% if room.active %}
|
||||
{{ room.name }}
|
||||
{% if namespace == form.namespace.value %}
|
||||
{{ namespace | keva_namespace_value }}
|
||||
{% else %}
|
||||
<a href="{{ path('room_namespace', { namespace : room.namespace }) }}">{{ room.name }}</a>
|
||||
<a href="{{ path('room_namespace', { namespace : namespace }) }}">{{ namespace | keva_namespace_value }}</a>
|
||||
{% endif %}
|
||||
</h2>
|
||||
<sup>
|
||||
<a href="{{ path('room_namespace', { namespace : room.namespace, feed : 'rss' }) }}" title="{{ 'RSS' | trans }}" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 16 16">
|
||||
<a href="{{ path('room_namespace', { namespace : namespace, feed : 'rss' }) }}" title="{{ 'RSS' | trans }}" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 16 16">
|
||||
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm1.5 2.5c5.523 0 10 4.477 10 10a1 1 0 1 1-2 0 8 8 0 0 0-8-8 1 1 0 0 1 0-2m0 4a6 6 0 0 1 6 6 1 1 0 1 1-2 0 4 4 0 0 0-4-4 1 1 0 0 1 0-2m.5 7a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3"/>
|
||||
</svg></a>
|
||||
</sup>
|
||||
|
@ -1,5 +1,5 @@
|
||||
{% extends 'default/layout.html.twig' %}
|
||||
{% block head_title_content %}{{ name }} - {{ 'KevaChat' | trans }}{% endblock %}
|
||||
{% block head_title_content %}{{ request.get('namespace') | keva_namespace_value }} - {{ 'KevaChat' | trans }}{% endblock %}
|
||||
{% block main_content %}
|
||||
{{
|
||||
render(
|
||||
@ -28,7 +28,7 @@
|
||||
•
|
||||
<a href="{{ path('room_namespace', { namespace : request.get('namespace'), txid : post.id }) }}#{{ post.id }}">{{ 'reply' | trans }}</a>
|
||||
{% if post.pending %}
|
||||
<span title="{{ 'pending for new block...' | trans }}">
|
||||
<span title="{{ 'pending in pool' | trans }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 16 16">
|
||||
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8 3.5a.5.5 0 0 0-1 0V9a.5.5 0 0 0 .252.434l3.5 2a.5.5 0 0 0 .496-.868L8 8.71z"/>
|
||||
</svg>
|
||||
|
Loading…
x
Reference in New Issue
Block a user