mirror of
https://github.com/kevachat/webapp.git
synced 2025-01-14 16:57:56 +00:00
attach timestamp to the message key is chat feature requires fixed timing
This commit is contained in:
parent
9cd4bb631d
commit
948d5bbaaa
@ -97,23 +97,18 @@ class RoomController extends AbstractController
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get more info
|
// Require valid kevachat meta
|
||||||
if ($transaction = $client->getRawTransaction($pending['txid']))
|
if ($data = $this->_post($pending))
|
||||||
{
|
{
|
||||||
$feed[] =
|
$feed[] =
|
||||||
[
|
[
|
||||||
'pending' => true,
|
'id' => $data->id,
|
||||||
'key' => $pending['key'],
|
'user' => $data->user,
|
||||||
'value' => $pending['value'],
|
'icon' => $data->icon,
|
||||||
'txid' => $pending['txid'],
|
'message' => $data->message,
|
||||||
'transaction' =>
|
'timestamp' => $data->time,
|
||||||
[
|
'time' => date('c', $data->time),
|
||||||
'time' => date('c', $transaction['time']),
|
'pending' => true
|
||||||
'timestamp' => $transaction['time'],
|
|
||||||
'confirmations' => $transaction['confirmations'],
|
|
||||||
],
|
|
||||||
'icon' => $this->_identicon($pending['key']),
|
|
||||||
'sort' => 0//$transaction['time'] // sort order field
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,25 +122,18 @@ class RoomController extends AbstractController
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get more info
|
// Require valid kevachat meta
|
||||||
if ($transaction = $client->getRawTransaction($post['txid']))
|
if ($data = $this->_post($post))
|
||||||
{
|
{
|
||||||
$feed[] =
|
$feed[] =
|
||||||
[
|
[
|
||||||
'pending' => false,
|
'id' => $data->id,
|
||||||
'key' => $post['key'],
|
'user' => $data->user,
|
||||||
'value' => $post['value'],
|
'icon' => $data->icon,
|
||||||
'height' => $post['height'],
|
'message' => $data->message,
|
||||||
# 'vout' => $post['vout'],
|
'timestamp' => $data->time,
|
||||||
'txid' => $post['txid'],
|
'time' => date('c', $data->time),
|
||||||
'transaction' =>
|
'pending' => false
|
||||||
[
|
|
||||||
'time' => date('c', $transaction['time']),
|
|
||||||
'timestamp' => $transaction['time'],
|
|
||||||
'confirmations' => $transaction['confirmations'],
|
|
||||||
],
|
|
||||||
'icon' => $this->_identicon($post['key']),
|
|
||||||
'sort' => $transaction['time'] // sort order field
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -154,7 +142,7 @@ class RoomController extends AbstractController
|
|||||||
array_multisort(
|
array_multisort(
|
||||||
array_column(
|
array_column(
|
||||||
$feed,
|
$feed,
|
||||||
'sort'
|
'time'
|
||||||
),
|
),
|
||||||
SORT_DESC,
|
SORT_DESC,
|
||||||
$feed
|
$feed
|
||||||
@ -354,7 +342,8 @@ class RoomController extends AbstractController
|
|||||||
$client->kevaPut(
|
$client->kevaPut(
|
||||||
$request->get('namespace'),
|
$request->get('namespace'),
|
||||||
sprintf(
|
sprintf(
|
||||||
'@%s',
|
'%s@%s',
|
||||||
|
time(), // @TODO save timestamp as part of key to keep timing actual for the chat feature
|
||||||
$request->get('user') === 'ip' ? $request->getClientIp() : 'anonymous'
|
$request->get('user') === 'ip' ? $request->getClientIp() : 'anonymous'
|
||||||
),
|
),
|
||||||
$request->get('message')
|
$request->get('message')
|
||||||
@ -390,29 +379,53 @@ class RoomController extends AbstractController
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function _identicon(string $key)
|
private function _post(array $data): ?object
|
||||||
{
|
{
|
||||||
if ($key === 'anonymous')
|
if (false === preg_match('/^([\d]+)@(.*)$/', $data['key'], $matches))
|
||||||
{
|
{
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
if (empty($matches[1]))
|
||||||
{
|
{
|
||||||
$identicon = new \Jdenticon\Identicon();
|
return null;
|
||||||
|
|
||||||
$identicon->setValue($key);
|
|
||||||
|
|
||||||
$identicon->setSize(12);
|
|
||||||
|
|
||||||
$identicon->setStyle(
|
|
||||||
[
|
|
||||||
'backgroundColor' => 'rgba(255, 255, 255, 0)',
|
|
||||||
'padding' => 0
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
return $identicon->getImageDataUri('webp');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (empty($matches[2]))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (object)
|
||||||
|
[
|
||||||
|
'id' => $data['txid'],
|
||||||
|
'time' => $matches[1],
|
||||||
|
'user' => $matches[2],
|
||||||
|
'icon' => $this->_identicon($matches[2]),
|
||||||
|
'message' => $data['value']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _identicon(mixed $value): ?string
|
||||||
|
{
|
||||||
|
if ($value === 'anonymous')
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$identicon = new \Jdenticon\Identicon();
|
||||||
|
|
||||||
|
$identicon->setValue($value);
|
||||||
|
|
||||||
|
$identicon->setSize(12);
|
||||||
|
|
||||||
|
$identicon->setStyle(
|
||||||
|
[
|
||||||
|
'backgroundColor' => 'rgba(255, 255, 255, 0)',
|
||||||
|
'padding' => 0
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
return $identicon->getImageDataUri('webp');
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -15,7 +15,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
{% for post in feed %}
|
{% for post in feed %}
|
||||||
<li>
|
<li>
|
||||||
<a name="{{ post.txid }}"></a>
|
<a name="{{ post.id }}"></a>
|
||||||
{% if post.icon %}
|
{% if post.icon %}
|
||||||
<img src="{{ post.icon }}" alt="icon" />
|
<img src="{{ post.icon }}" alt="icon" />
|
||||||
{% else %}
|
{% else %}
|
||||||
@ -24,9 +24,9 @@
|
|||||||
</strong>
|
</strong>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
•
|
•
|
||||||
<a href="{{ path('room_namespace', { namespace : request.get('namespace') }) }}#{{ post.txid }}" title="{{ 'time:' | trans }} {{ post.transaction.time }} / {{ 'confirmations:' | trans }} {{ post.transaction.confirmations }}">{{ post.transaction.timestamp | format_ago }}</a>
|
<a href="{{ path('room_namespace', { namespace : request.get('namespace') }) }}#{{ post.id }}" title="{{ post.time }}">{{ post.timestamp | format_ago }}</a>
|
||||||
•
|
•
|
||||||
<a href="{{ path('room_namespace', { namespace : request.get('namespace'), txid : post.txid }) }}#{{ post.txid }}">{{ 'reply' | trans }}</a>
|
<a href="{{ path('room_namespace', { namespace : request.get('namespace'), id : post.id }) }}#{{ post.id }}">{{ 'reply' | trans }}</a>
|
||||||
{% if post.pending %}
|
{% if post.pending %}
|
||||||
<span title="{{ 'pending in DHT' | trans }}">
|
<span title="{{ 'pending in DHT' | trans }}">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 16 16">
|
||||||
@ -35,7 +35,7 @@
|
|||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<p>
|
<p>
|
||||||
{{ post.value }}
|
{{ post.message }}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
Loading…
Reference in New Issue
Block a user