mirror of
https://github.com/RoboSats/robosats.git
synced 2024-12-14 11:26:24 +00:00
Add Redis. Basic websocket chat working.
This commit is contained in:
parent
f4b14baf69
commit
8104656ce6
@ -4,6 +4,8 @@ LND_CERT_BASE64=''
|
|||||||
LND_MACAROON_BASE64=''
|
LND_MACAROON_BASE64=''
|
||||||
LND_GRPC_HOST='127.0.0.1:10009'
|
LND_GRPC_HOST='127.0.0.1:10009'
|
||||||
|
|
||||||
|
REDIS_URL=''
|
||||||
|
|
||||||
# Market price public API
|
# Market price public API
|
||||||
MARKET_PRICE_API = 'https://blockchain.info/ticker'
|
MARKET_PRICE_API = 'https://blockchain.info/ticker'
|
||||||
|
|
||||||
|
50
chat/consumers.py
Normal file
50
chat/consumers.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
from channels.generic.websocket import AsyncWebsocketConsumer
|
||||||
|
import json
|
||||||
|
|
||||||
|
class ChatRoomConsumer(AsyncWebsocketConsumer):
|
||||||
|
|
||||||
|
async def connect(self):
|
||||||
|
self.order_id = self.scope['url_route']['kwargs']['order_id']
|
||||||
|
self.room_group_name = f'chat_order_{self.order_id}'
|
||||||
|
|
||||||
|
|
||||||
|
await self.channel_layer.group_add(
|
||||||
|
self.room_group_name,
|
||||||
|
self.channel_name
|
||||||
|
)
|
||||||
|
|
||||||
|
await self.accept()
|
||||||
|
|
||||||
|
async def disconnect(self, close_code):
|
||||||
|
await self.channel_layer.group_discard(
|
||||||
|
self.room_group_name,
|
||||||
|
self.channel_name
|
||||||
|
)
|
||||||
|
|
||||||
|
async def receive(self, text_data):
|
||||||
|
text_data_json = json.loads(text_data)
|
||||||
|
message = text_data_json['message']
|
||||||
|
username = text_data_json['username']
|
||||||
|
|
||||||
|
await self.channel_layer.group_send(
|
||||||
|
self.room_group_name,
|
||||||
|
{
|
||||||
|
'type': 'chatroom_message',
|
||||||
|
'message': message,
|
||||||
|
'username': username,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
async def chatroom_message(self, event):
|
||||||
|
message = event['message']
|
||||||
|
username = event['username']
|
||||||
|
try:
|
||||||
|
message = int(message)*42
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
await self.send(text_data=json.dumps({
|
||||||
|
'message': message,
|
||||||
|
'username': username,
|
||||||
|
}))
|
||||||
|
|
||||||
|
pass
|
6
chat/routing.py
Normal file
6
chat/routing.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from django.urls import re_path
|
||||||
|
from . import consumers
|
||||||
|
|
||||||
|
websocket_urlpatterns = [
|
||||||
|
re_path(r'ws/chat/(?P<order_id>\w+)/$', consumers.ChatRoomConsumer.as_asgi()),
|
||||||
|
]
|
82
chat/templates/chatroom.html
Normal file
82
chat/templates/chatroom.html
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<!-- Required meta tags -->
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
|
||||||
|
<!-- Bootstrap CSS -->
|
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
|
||||||
|
integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
|
||||||
|
|
||||||
|
<title>Hello, world!</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row d-flex justify-content-center">
|
||||||
|
<div class="col-6">
|
||||||
|
<form>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="exampleFormControlTextarea1" class="h4 pt-5">Chatroom</label>
|
||||||
|
<textarea class="form-control" id="chat-text" rows="10"></textarea><br>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control" id="input" type="text"></br>
|
||||||
|
</div>
|
||||||
|
<input class="btn btn-secondary btn-lg btn-block" id="submit" type="button" value="Send">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ request.user.username|json_script:"user_username" }}
|
||||||
|
{{ order_id|json_script:"order-id" }}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const user_username = JSON.parse(document.getElementById('user_username').textContent);
|
||||||
|
document.querySelector('#submit').onclick = function (e) {
|
||||||
|
const messageInputDom = document.querySelector('#input');
|
||||||
|
const message = messageInputDom.value;
|
||||||
|
chatSocket.send(JSON.stringify({
|
||||||
|
'message': message,
|
||||||
|
'username': user_username,
|
||||||
|
}));
|
||||||
|
messageInputDom.value = '';
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const orderId = JSON.parse(document.getElementById('order-id').textContent);
|
||||||
|
|
||||||
|
const chatSocket = new WebSocket(
|
||||||
|
'ws://' +
|
||||||
|
window.location.host +
|
||||||
|
'/ws/chat/' +
|
||||||
|
orderId +
|
||||||
|
'/'
|
||||||
|
);
|
||||||
|
|
||||||
|
chatSocket.onmessage = function (e) {
|
||||||
|
const data = JSON.parse(e.data);
|
||||||
|
console.log(data)
|
||||||
|
document.querySelector('#chat-text').value += (data.username + ': ' + data.message + '\n')
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Optional JavaScript -->
|
||||||
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||||
|
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
|
||||||
|
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"
|
||||||
|
integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous">
|
||||||
|
</script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"
|
||||||
|
integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous">
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
@ -4,5 +4,5 @@ from . import views
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.index, name='index'),
|
path('', views.index, name='index'),
|
||||||
path('<str:order_id>/', views.room, name='room'),
|
path('<str:order_id>/', views.room, name='order_chat'),
|
||||||
]
|
]
|
@ -1,3 +1,10 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
|
||||||
# Create your views here.
|
|
||||||
|
def index(request):
|
||||||
|
return render(request, 'index.html', {})
|
||||||
|
|
||||||
|
def room(request, order_id):
|
||||||
|
return render(request, 'chatroom.html', {
|
||||||
|
'order_id': order_id
|
||||||
|
})
|
13
robosats/routing.py
Normal file
13
robosats/routing.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from channels.auth import AuthMiddlewareStack
|
||||||
|
from channels.routing import ProtocolTypeRouter, URLRouter
|
||||||
|
import chat.routing
|
||||||
|
|
||||||
|
|
||||||
|
application = ProtocolTypeRouter({
|
||||||
|
'websocket': AuthMiddlewareStack(
|
||||||
|
URLRouter(
|
||||||
|
chat.routing.websocket_urlpatterns,
|
||||||
|
# TODO add api.routing.websocket_urlpatterns when Order page works with websocket
|
||||||
|
)
|
||||||
|
),
|
||||||
|
})
|
@ -122,6 +122,26 @@ USE_TZ = True
|
|||||||
# https://docs.djangoproject.com/en/4.0/howto/static-files/
|
# https://docs.djangoproject.com/en/4.0/howto/static-files/
|
||||||
|
|
||||||
STATIC_URL = 'static/'
|
STATIC_URL = 'static/'
|
||||||
|
ASGI_APPLICATION = "robosats.routing.application"
|
||||||
|
|
||||||
|
CHANNEL_LAYERS = {
|
||||||
|
'default': {
|
||||||
|
'BACKEND': 'channels_redis.core.RedisChannelLayer',
|
||||||
|
'CONFIG': {
|
||||||
|
"hosts": [config('REDIS_URL')],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
CACHES = {
|
||||||
|
"default": {
|
||||||
|
"BACKEND": "django_redis.cache.RedisCache",
|
||||||
|
"LOCATION": config('REDIS_URL'),
|
||||||
|
"OPTIONS": {
|
||||||
|
"CLIENT_CLASS": "django_redis.client.DefaultClient"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Default primary key field type
|
# Default primary key field type
|
||||||
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
|
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
|
||||||
|
14
setup.md
14
setup.md
@ -33,8 +33,18 @@ source /usr/local/bin/virtualenvwrapper.sh
|
|||||||
## Install Django admin relational links
|
## Install Django admin relational links
|
||||||
`pip install django-admin-relation-links`
|
`pip install django-admin-relation-links`
|
||||||
|
|
||||||
## Install Django channels for websockets
|
## Install dependencies for websockets
|
||||||
`pip install channels`
|
Install Redis
|
||||||
|
`apt-get install redis-server`
|
||||||
|
Test redis-server
|
||||||
|
`redis-cli ping`
|
||||||
|
|
||||||
|
Install python dependencies
|
||||||
|
```
|
||||||
|
pip install channels
|
||||||
|
pip install django-redis
|
||||||
|
pip install channels-redis
|
||||||
|
```
|
||||||
|
|
||||||
*Django 4.0 at the time of writting*
|
*Django 4.0 at the time of writting*
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user