Browse Source

attach timestamp to the message key is chat feature requires fixed timing

main
ghost 12 months ago
parent
commit
948d5bbaaa
  1. 89
      src/Controller/RoomController.php
  2. 8
      templates/default/room/index.html.twig

89
src/Controller/RoomController.php

@ -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,18 +379,43 @@ class RoomController extends AbstractController
); );
} }
private function _identicon(string $key) private function _post(array $data): ?object
{
if (false === preg_match('/^([\d]+)@(.*)$/', $data['key'], $matches))
{ {
if ($key === 'anonymous') return null;
}
if (empty($matches[1]))
{
return null;
}
if (empty($matches[2]))
{ {
return false; return null;
}
return (object)
[
'id' => $data['txid'],
'time' => $matches[1],
'user' => $matches[2],
'icon' => $this->_identicon($matches[2]),
'message' => $data['value']
];
} }
else private function _identicon(mixed $value): ?string
{ {
if ($value === 'anonymous')
{
return null;
}
$identicon = new \Jdenticon\Identicon(); $identicon = new \Jdenticon\Identicon();
$identicon->setValue($key); $identicon->setValue($value);
$identicon->setSize(12); $identicon->setSize(12);
@ -415,4 +429,3 @@ class RoomController extends AbstractController
return $identicon->getImageDataUri('webp'); return $identicon->getImageDataUri('webp');
} }
} }
}

8
templates/default/room/index.html.twig

@ -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 %}
&bull; &bull;
<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>
&bull; &bull;
<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…
Cancel
Save