Browse Source

remove meta key/values markup (by new protocol)

main
ghost 7 months ago
parent
commit
a7e03d8018
  1. 10
      .env
  2. 1
      composer.json
  3. 24
      src/Controller/ModuleController.php
  4. 170
      src/Controller/RoomController.php
  5. 2
      src/Controller/UserController.php
  6. 13
      templates/default/room/index.html.twig

10
.env

@ -19,7 +19,7 @@ APP_ENV=dev
APP_SECRET=EDIT_ME APP_SECRET=EDIT_ME
###< symfony/framework-bundle ### ###< symfony/framework-bundle ###
APP_VERSION=1.10.0 APP_VERSION=1.11.0
APP_NAME=KevaChat APP_NAME=KevaChat
@ -104,11 +104,13 @@ APP_ADD_POST_REMOTE_IP_DELAY=60
# Skip access limits for banned IPs separated by | # Skip access limits for banned IPs separated by |
APP_ADD_POST_REMOTE_IP_DENIED= APP_ADD_POST_REMOTE_IP_DENIED=
# Post ID rules (for kevacoin key) do not change to keep external KevaChat nodes compatibility # Post ID rules (for kevacoin key)
APP_ADD_POST_KEY_REGEX=/^([\d]+)@([A-z0-9\.\:\[\]]+)$/ # do not change to keep external KevaChat nodes compatibility
APP_ADD_POST_KEY_REGEX=/^[A-z0-9-]{1,520}$/
# Post content rules (for kevacoin value, max length is 3072) # Post content rules (for kevacoin value, max length is 3072)
APP_ADD_POST_VALUE_REGEX=/.*/ui # do not change to keep external KevaChat nodes compatibility
APP_ADD_POST_VALUE_REGEX=/.{1,3072}/ui
# Post cost (set 0 for free publications) # Post cost (set 0 for free publications)
APP_ADD_POST_COST_KVA=1 APP_ADD_POST_COST_KVA=1

1
composer.json

@ -13,7 +13,6 @@
"doctrine/doctrine-bundle": "^2.11", "doctrine/doctrine-bundle": "^2.11",
"doctrine/doctrine-migrations-bundle": "^3.3", "doctrine/doctrine-migrations-bundle": "^3.3",
"doctrine/orm": "^3.0", "doctrine/orm": "^3.0",
"jdenticon/jdenticon": "^1.0",
"kevachat/kevacoin": "dev-main", "kevachat/kevacoin": "dev-main",
"league/commonmark": "^2.4", "league/commonmark": "^2.4",
"symfony/console": "7.0.*", "symfony/console": "7.0.*",

24
src/Controller/ModuleController.php

@ -159,29 +159,9 @@ class ModuleController extends AbstractController
} }
// Format quoted message // Format quoted message
if (preg_match('/^[A-z0-9]{64}$/', $request->get('txid'))) if (preg_match('/^[A-f0-9]{64}$/', $request->get('txid')))
{ {
$message = str_replace( $message = $request->get('txid') . PHP_EOL . $request->get('message');
[
sprintf(
'@%s',
$request->get('txid')
)
],
false,
$request->get('message')
);
$message = trim(
$message
);
$message = sprintf(
'@%s%s%s',
$request->get('txid'),
PHP_EOL,
$request->get('message')
);
} }
else else

170
src/Controller/RoomController.php

@ -15,6 +15,8 @@ use App\Entity\Pool;
class RoomController extends AbstractController class RoomController extends AbstractController
{ {
private const PARENT_REGEX = '/^[>@]?([A-f0-9]{64})\s/i';
#[Route( #[Route(
'/', '/',
name: 'room_index', name: 'room_index',
@ -203,56 +205,6 @@ class RoomController extends AbstractController
// Get room feed // Get room feed
$feed = []; $feed = [];
// Get pending from payment pool
/*
foreach ($entity->getRepository(Pool::class)->findBy(
[
'namespace' => $request->get('namespace'),
'sent' => 0,
'expired' => 0
]
) as $pending)
{
// Require valid kevachat meta
if ($data = $this->_post(
[
'key' => $pending->getKey(),
'value' => $pending->getValue(),
'txid' => hash( // @TODO tmp solution as required for tree building
'sha256',
rand()
)
]
))
{
// Detect parent post
preg_match('/^@([A-z0-9]{64})\s/i', $data->message, $mention);
$feed[$data->id] =
[
'id' => $data->id,
'user' => $data->user,
'icon' => $data->icon,
'time' => $data->time,
'parent' => isset($mention[1]) ? $mention[1] : null,
'message' => trim(
preg_replace( // remove mention from folded message
'/^@([A-z0-9]{64})\s/i',
'',
$data->message
)
),
'pending' => true,
'pool' =>
[
'cost' => $pending->getCost(),
'address' => $pending->getAddress(),
'expires' => $pending->getTime() + $this->getParameter('app.pool.timeout')
]
];
}
}
*/
// Get pending paradise // Get pending paradise
foreach ((array) $client->kevaPending() as $pending) // @TODO relate to this room foreach ((array) $client->kevaPending() as $pending) // @TODO relate to this room
{ {
@ -275,21 +227,20 @@ class RoomController extends AbstractController
} }
// Require valid kevachat meta // Require valid kevachat meta
if ($data = $this->_post($pending)) if ($data = $this->_post($client, $pending))
{ {
// Detect parent post // Detect parent post
preg_match('/^@([A-z0-9]{64})\s/i', $data->message, $mention); preg_match(self::PARENT_REGEX, $data->message, $mention);
$feed[$data->id] = $feed[$data->id] =
[ [
'id' => $data->id, 'id' => $data->id,
'user' => $data->user, 'user' => $data->user,
'icon' => $data->icon,
'time' => $data->time, 'time' => $data->time,
'parent' => isset($mention[1]) ? $mention[1] : null, 'parent' => isset($mention[1]) ? $mention[1] : null,
'message' => trim( 'message' => trim(
preg_replace( // remove mention from folded message preg_replace( // remove mention from folded message
'/^@([A-z0-9]{64})\s/i', self::PARENT_REGEX,
'', '',
$data->message $data->message
) )
@ -309,21 +260,20 @@ class RoomController extends AbstractController
} }
// Require valid kevachat meta // Require valid kevachat meta
if ($data = $this->_post($post)) if ($data = $this->_post($client, $post))
{ {
// Detect parent post // Detect parent post
preg_match('/^@([A-z0-9]{64})\s/i', $data->message, $mention); preg_match(self::PARENT_REGEX, $data->message, $mention);
$feed[$data->id] = $feed[$data->id] =
[ [
'id' => $data->id, 'id' => $data->id,
'user' => $data->user, 'user' => $data->user,
'icon' => $data->icon,
'time' => $data->time, 'time' => $data->time,
'parent' => isset($mention[1]) ? $mention[1] : null, 'parent' => isset($mention[1]) ? $mention[1] : null,
'message' => trim( 'message' => trim(
preg_replace( // remove mention from folded message preg_replace( // remove mention from folded message
'/^@([A-z0-9]{64})\s/i', self::PARENT_REGEX,
'', '',
$data->message $data->message
) )
@ -664,11 +614,7 @@ class RoomController extends AbstractController
if ( if (
$client->kevaPut( $client->kevaPut(
$request->get('namespace'), $request->get('namespace'),
sprintf( $username,
'%s@%s',
time(), // @TODO save timestamp as part of key to keep timing actual for the chat feature
$username
),
$request->get('message') $request->get('message')
) )
) { ) {
@ -735,11 +681,7 @@ class RoomController extends AbstractController
); );
$pool->setKey( $pool->setKey(
sprintf( $username
'%s@%s',
$time,
$username
)
); );
$pool->setValue( $pool->setValue(
@ -789,11 +731,7 @@ class RoomController extends AbstractController
if ( if (
$client->kevaPut( $client->kevaPut(
$request->get('namespace'), $request->get('namespace'),
sprintf( $username,
'%s@%s',
time(), // @TODO save timestamp as part of key to keep timing actual for the chat feature
$username
),
$request->get('message') $request->get('message')
) )
) )
@ -1154,30 +1092,40 @@ class RoomController extends AbstractController
); );
} }
private function _post(array $data): ?object private function _post(
\Kevachat\Kevacoin\Client $client,
array $data
): ?object
{ {
// Validate key format allowed in settings // Validate required data
if (!preg_match((string) $this->getParameter('app.add.post.key.regex'), $data['key'], $matches)) if (empty($data['txid']))
{ {
return null; return null;
} }
// Timestamp required in key if (empty($data['key']))
if (empty($matches[1]))
{ {
return null; return null;
} }
// Username required in key if (empty($data['value']))
if (empty($matches[2]))
{ {
return null; return null;
} }
// Legacy usernames backport // Legacy key format support (protocol v1 contain timestamp in prefix)
if (!preg_match((string) $this->getParameter('app.add.user.name.regex'), $matches[2])) if (preg_match('/^([\d]+)@([A-z0-9\.\:\[\]]+)/', $data['key'], $matches))
{ {
$matches[2] = 'anon'; if (!empty($matches[2]))
{
$data['key'] = $matches[2];
}
}
// Validate key format allowed in settings
if (!preg_match((string) $this->getParameter('app.add.post.key.regex'), $data['key']))
{
return null;
} }
// Validate value format allowed in settings // Validate value format allowed in settings
@ -1186,37 +1134,25 @@ class RoomController extends AbstractController
return null; return null;
} }
return (object) // Get time from raw transaction
[ if (!$transaction = $client->getRawTransaction($data['txid']))
'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 === 'anon')
{ {
return null; return null;
} }
$identicon = new \Jdenticon\Identicon(); // Make sure time available
if (empty($transaction['time']))
$identicon->setValue($value); {
return null;
$identicon->setSize(12); }
$identicon->setStyle(
[
'backgroundColor' => 'rgba(255, 255, 255, 0)',
'padding' => 0
]
);
return $identicon->getImageDataUri('webp'); return (object)
[
'id' => $data['txid'],
'user' => $data['key'],
'message' => $data['value'],
'time' => $transaction['time']
];
} }
private function _tree( private function _tree(
@ -1251,17 +1187,11 @@ class RoomController extends AbstractController
return $tree; return $tree;
} }
private function _total(string $namespace): int private function _total(
\Kevachat\Kevacoin\Client $client,
string $namespace
): int
{ {
// 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')
);
$raw = []; $raw = [];
// Get pending // Get pending
@ -1288,7 +1218,7 @@ class RoomController extends AbstractController
foreach ($raw as $data) foreach ($raw as $data)
{ {
// Is valid post // Is valid post
if ($this->_post($data)) if ($this->_post($client, $data))
{ {
$total++; $total++;
} }

2
src/Controller/UserController.php

@ -119,7 +119,7 @@ class UserController extends AbstractController
$posts = 0; $posts = 0;
foreach ((array) $client->kevaFilter($value['namespaceId'], sprintf('^[\d]+@%s$', $user['key'])) as $post) foreach ((array) $client->kevaFilter($value['namespaceId'], sprintf('^([\d]+@%s|%s)$', $user['key'], $user['key'])) as $post)
{ {
$total++; $total++;
$posts++; $posts++;

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

@ -6,16 +6,9 @@
<li> <li>
<div> <div>
<a name="{{ post.id }}"></a> <a name="{{ post.id }}"></a>
{% if post.icon %} <strong>
{# <img src="{{ post.icon }}" alt="icon" /> #} {{ 'anon' | trans }}
<strong> </strong>
@{{ post.user }}
</strong>
{% else %}
<strong>
@{{ 'anon' | trans }}
</strong>
{% endif %}
&bull; &bull;
{% if post.pending %} {% if post.pending %}
{{ post.time | format_ago }} {{ post.time | format_ago }}

Loading…
Cancel
Save