mirror of https://github.com/kevachat/webapp.git
ghost
1 year ago
13 changed files with 468 additions and 0 deletions
@ -0,0 +1,10 @@ |
|||||||
|
twig: |
||||||
|
default_path: '%kernel.project_dir%/templates' |
||||||
|
globals: |
||||||
|
app: |
||||||
|
version: '%app.version%' |
||||||
|
name: '%app.name%' |
||||||
|
|
||||||
|
when@test: |
||||||
|
twig: |
||||||
|
strict_variables: true |
@ -0,0 +1,105 @@ |
|||||||
|
* |
||||||
|
{ |
||||||
|
/* apply defaults */ |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
|
||||||
|
/* allow draw */ |
||||||
|
font-family: monospace; |
||||||
|
|
||||||
|
/* adaptive */ |
||||||
|
color-scheme: light dark; |
||||||
|
|
||||||
|
/* vars */ |
||||||
|
--container-max-width: 740px; |
||||||
|
} |
||||||
|
|
||||||
|
*::placeholder |
||||||
|
{ |
||||||
|
font-size: 12px; |
||||||
|
} |
||||||
|
|
||||||
|
a, a:active, a:visited |
||||||
|
{ |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
a:hover |
||||||
|
{ |
||||||
|
text-decoration: underline; |
||||||
|
} |
||||||
|
|
||||||
|
body |
||||||
|
{ |
||||||
|
font-size: 12px; |
||||||
|
padding: 0 16px; |
||||||
|
} |
||||||
|
|
||||||
|
header |
||||||
|
{ |
||||||
|
max-width: var(--container-max-width); |
||||||
|
margin: 16px auto; |
||||||
|
display: block; |
||||||
|
} |
||||||
|
|
||||||
|
header > strong |
||||||
|
{ |
||||||
|
font-size: 14px; |
||||||
|
} |
||||||
|
|
||||||
|
header > div |
||||||
|
{ |
||||||
|
margin: 8px 0; |
||||||
|
} |
||||||
|
|
||||||
|
header > div > pre |
||||||
|
{ |
||||||
|
display: inline-block; |
||||||
|
} |
||||||
|
|
||||||
|
main |
||||||
|
{ |
||||||
|
max-width: var(--container-max-width); |
||||||
|
margin: 16px auto; |
||||||
|
display: block; |
||||||
|
} |
||||||
|
|
||||||
|
main > form > input[type="text"] |
||||||
|
{ |
||||||
|
box-sizing: border-box; |
||||||
|
padding: 4px; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
footer |
||||||
|
{ |
||||||
|
display: block; |
||||||
|
margin: 16px auto; |
||||||
|
max-width: var(--container-max-width); |
||||||
|
} |
||||||
|
|
||||||
|
footer > form |
||||||
|
{ |
||||||
|
bottom: 16px; |
||||||
|
display: block; |
||||||
|
max-width: var(--container-max-width); |
||||||
|
position: fixed; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
footer > form > textarea |
||||||
|
{ |
||||||
|
box-sizing: border-box; |
||||||
|
display: block; |
||||||
|
margin: 8px 0; |
||||||
|
max-width: var(--container-max-width); |
||||||
|
padding: 4px; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
footer > form > button |
||||||
|
{ |
||||||
|
cursor: pointer; |
||||||
|
float: right; |
||||||
|
padding: 2px 8px; |
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Controller; |
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; |
||||||
|
|
||||||
|
use Symfony\Component\Routing\Annotation\Route; |
||||||
|
use Symfony\Component\HttpFoundation\Response; |
||||||
|
use Symfony\Component\HttpFoundation\Request; |
||||||
|
|
||||||
|
class ModuleController extends AbstractController |
||||||
|
{ |
||||||
|
public function info(): Response |
||||||
|
{ |
||||||
|
$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') |
||||||
|
); |
||||||
|
|
||||||
|
return $this->render( |
||||||
|
'default/module/info.html.twig', |
||||||
|
[ |
||||||
|
'wallet' => |
||||||
|
[ |
||||||
|
'balance' => (float) $client->getBalance(), |
||||||
|
'block' => (int) $client->getBlockCount(), |
||||||
|
'address' => $this->getParameter('app.kevacoin.address') |
||||||
|
], |
||||||
|
'pool' => [ |
||||||
|
'url' => $this->getParameter('app.kevacoin.pool.url') |
||||||
|
] |
||||||
|
] |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
public function room( |
||||||
|
Request $request |
||||||
|
): Response |
||||||
|
{ |
||||||
|
$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') |
||||||
|
); |
||||||
|
|
||||||
|
return $this->render( |
||||||
|
'default/module/room.html.twig', |
||||||
|
[ |
||||||
|
'room' => $request->get('room'), |
||||||
|
'list' => (array) $client->kevaListNamespaces() |
||||||
|
] |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
public function post( |
||||||
|
Request $request |
||||||
|
): Response |
||||||
|
{ |
||||||
|
$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') |
||||||
|
); |
||||||
|
|
||||||
|
// Get wallet namespaces (to enable post module there) |
||||||
|
$namespaces = []; |
||||||
|
|
||||||
|
foreach ((array) $client->kevaListNamespaces() as $key => $value) |
||||||
|
{ |
||||||
|
$namespaces[] = $key; |
||||||
|
} |
||||||
|
|
||||||
|
return $this->render( |
||||||
|
'default/module/post.html.twig', |
||||||
|
[ |
||||||
|
'enabled' => in_array($request->get('namespace'), $namespaces), |
||||||
|
'namespace' => $request->get('namespace'), |
||||||
|
'message' => $request->get('message'), |
||||||
|
'user' => $request->get('user'), |
||||||
|
'ip' => $request->getClientIp() |
||||||
|
] |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,122 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Controller; |
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; |
||||||
|
|
||||||
|
use Symfony\Component\Routing\Annotation\Route; |
||||||
|
use Symfony\Component\HttpFoundation\Response; |
||||||
|
use Symfony\Component\HttpFoundation\Request; |
||||||
|
|
||||||
|
class RoomController extends AbstractController |
||||||
|
{ |
||||||
|
#[Route( |
||||||
|
'/', |
||||||
|
name: 'room_index', |
||||||
|
methods: |
||||||
|
[ |
||||||
|
'GET' |
||||||
|
] |
||||||
|
)] |
||||||
|
public function index(): Response |
||||||
|
{ |
||||||
|
return $this->redirectToRoute( |
||||||
|
'room_namespace', |
||||||
|
[ |
||||||
|
'namespace' => $this->getParameter('app.kevacoin.namespace') |
||||||
|
] |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
#[Route( |
||||||
|
'/room/{namespace}', |
||||||
|
name: 'room_namespace', |
||||||
|
requirements: |
||||||
|
[ |
||||||
|
'namespace' => '^[A-z0-9]{34}$', |
||||||
|
], |
||||||
|
methods: |
||||||
|
[ |
||||||
|
'GET' |
||||||
|
] |
||||||
|
)] |
||||||
|
public function room( |
||||||
|
Request $request |
||||||
|
): Response |
||||||
|
{ |
||||||
|
// 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') |
||||||
|
); |
||||||
|
|
||||||
|
// Get room messages |
||||||
|
$messages = []; |
||||||
|
|
||||||
|
foreach ((array) $client->kevaFilter($request->get('namespace')) as $message) |
||||||
|
{ |
||||||
|
$messages[] = $message; |
||||||
|
} |
||||||
|
|
||||||
|
// Return result |
||||||
|
return $this->render( |
||||||
|
'default/room/index.html.twig', |
||||||
|
[ |
||||||
|
'messages' => $messages, |
||||||
|
'request' => $request |
||||||
|
] |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
#[Route( |
||||||
|
'/room/{namespace}/post', |
||||||
|
name: 'room_post', |
||||||
|
requirements: |
||||||
|
[ |
||||||
|
'namespace' => '^[A-z0-9]{34}$', |
||||||
|
], |
||||||
|
methods: |
||||||
|
[ |
||||||
|
'POST' |
||||||
|
] |
||||||
|
)] |
||||||
|
public function post( |
||||||
|
Request $request |
||||||
|
): Response |
||||||
|
{ |
||||||
|
// 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') |
||||||
|
); |
||||||
|
|
||||||
|
// Check namespace exist for this wallet |
||||||
|
$namespaces = []; |
||||||
|
|
||||||
|
foreach ((array) $client->kevaListNamespaces() as $key => $value) |
||||||
|
{ |
||||||
|
$namespaces[] = $key; |
||||||
|
} |
||||||
|
|
||||||
|
if (!in_array($request->get('namespace'), $namespaces)) |
||||||
|
{ |
||||||
|
exit('Namespace not related with this node!'); |
||||||
|
} |
||||||
|
|
||||||
|
// @TODO |
||||||
|
|
||||||
|
// Redirect back to the room |
||||||
|
return $this->redirectToRoute( |
||||||
|
'room_namespace', |
||||||
|
[ |
||||||
|
'namespace' => $this->getParameter('app.kevacoin.namespace') |
||||||
|
] |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html> |
||||||
|
<head> |
||||||
|
<meta charset="UTF-8"> |
||||||
|
<title>{% block head_title %}{{ 'KevaChat' | trans }}{% endblock %}</title> |
||||||
|
<link rel="stylesheet" type="text/css" href="/css/default.css?{{ app.version }}"/> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<header> |
||||||
|
<strong> |
||||||
|
{{ app.name }} |
||||||
|
</strong> |
||||||
|
<sup> |
||||||
|
<a href="https://github.com/kevachat/webapp" target="_blank" title="Source">{{ app.version }}</a> |
||||||
|
</sup> |
||||||
|
{% block header_module_info %} |
||||||
|
{{ |
||||||
|
render( |
||||||
|
controller( |
||||||
|
'App\\Controller\\ModuleController::info' |
||||||
|
) |
||||||
|
) |
||||||
|
}} |
||||||
|
{% endblock %} |
||||||
|
</header> |
||||||
|
<main> |
||||||
|
{% block main_content %}{% endblock %} |
||||||
|
</main> |
||||||
|
<footer> |
||||||
|
{% block footer_content %}{% endblock %} |
||||||
|
</footer> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,14 @@ |
|||||||
|
<div> |
||||||
|
{{ 'Block:' | trans }} {{ wallet.block }} |
||||||
|
/ |
||||||
|
{{ 'Balance:' | trans }} {{ wallet.balance }} |
||||||
|
{% if wallet.address %} |
||||||
|
/ |
||||||
|
{% if pool.url %} |
||||||
|
<a href="{{ pool.url }}" target="_blank">{{ 'Charge' | trans }}</a>: |
||||||
|
{% else %} |
||||||
|
{{ 'Charge:' | trans }} |
||||||
|
{% endif %} |
||||||
|
<pre>{{ wallet.address }}</pre> |
||||||
|
{% endif %} |
||||||
|
</div> |
@ -0,0 +1,22 @@ |
|||||||
|
{% if enabled %} |
||||||
|
<form name="post" action="{{ path('room_post', { namespace : namespace }) }}" method="post"> |
||||||
|
<textarea name="message" placeholder="{{ 'enter your message...' | trans }}">{{ message }}</textarea> |
||||||
|
{% if user == 'anonymous' or user != 'ip' %} |
||||||
|
<input type="radio" name="user" value="anonymous" id="form-post-user-anonymous" checked="checked" /> |
||||||
|
{% else %} |
||||||
|
<input type="radio" name="user" value="anonymous" id="form-post-user-anonymous" /> |
||||||
|
{% endif %} |
||||||
|
<label for="form-post-user-anonymous"> |
||||||
|
{{ 'anonymous' | trans }} |
||||||
|
</label> |
||||||
|
{% if user == 'ip' %} |
||||||
|
<input type="radio" name="user" value="ip" id="form-post-user-ip" checked="checked" /> |
||||||
|
{% else %} |
||||||
|
<input type="radio" name="user" value="ip" id="form-post-user-ip" /> |
||||||
|
{% endif %} |
||||||
|
<label for="form-post-user-ip"> |
||||||
|
@{{ ip }} |
||||||
|
</label> |
||||||
|
<button type="submit">{{ 'send' | trans }}</button> |
||||||
|
</form> |
||||||
|
{% endif %} |
@ -0,0 +1,3 @@ |
|||||||
|
<form name="room" action="{{ path('room_index') }}" method="get"> |
||||||
|
<input type="text" name="room" value="{{ room }}" placeholder="{{ 'join room by kevacoin namespace...' | trans }}" /> |
||||||
|
</form> |
@ -0,0 +1,25 @@ |
|||||||
|
{% extends 'default/layout.html.twig' %} |
||||||
|
{% block main_content %} |
||||||
|
{{ |
||||||
|
render( |
||||||
|
controller( |
||||||
|
'App\\Controller\\ModuleController::room', |
||||||
|
{ |
||||||
|
request: request |
||||||
|
} |
||||||
|
) |
||||||
|
) |
||||||
|
}} |
||||||
|
{% endblock %} |
||||||
|
{% block footer_content %} |
||||||
|
{{ |
||||||
|
render( |
||||||
|
controller( |
||||||
|
'App\\Controller\\ModuleController::post', |
||||||
|
{ |
||||||
|
request: request |
||||||
|
} |
||||||
|
) |
||||||
|
) |
||||||
|
}} |
||||||
|
{% endblock %} |
Loading…
Reference in new issue