Skip to content

Commit c3a6406

Browse files
author
drus
committed
initial commit
0 parents  commit c3a6406

File tree

20 files changed

+490
-0
lines changed

20 files changed

+490
-0
lines changed

.gitignore

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# Byte-compiled / optimized / DLL files
2+
__pycache__/
3+
*.py[cod]
4+
*$py.class
5+
6+
# C extensions
7+
*.so
8+
9+
# Distribution / packaging
10+
.Python
11+
build/
12+
develop-eggs/
13+
dist/
14+
downloads/
15+
eggs/
16+
.eggs/
17+
lib/
18+
lib64/
19+
parts/
20+
sdist/
21+
var/
22+
wheels/
23+
*.egg-info/
24+
.installed.cfg
25+
*.egg
26+
27+
# PyInstaller
28+
# Usually these files are written by a python script from a template
29+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
30+
*.manifest
31+
*.spec
32+
33+
# Installer logs
34+
pip-log.txt
35+
pip-delete-this-directory.txt
36+
37+
# Unit test / coverage reports
38+
htmlcov/
39+
.tox/
40+
.coverage
41+
.coverage.*
42+
.cache
43+
nosetests.xml
44+
coverage.xml
45+
*.cover
46+
.hypothesis/
47+
.pytest_cache/
48+
49+
# Translations
50+
*.mo
51+
*.pot
52+
53+
# Django stuff:
54+
*.log
55+
local_settings.py
56+
db.sqlite3
57+
58+
# Flask stuff:
59+
instance/
60+
.webassets-cache
61+
62+
# Scrapy stuff:
63+
.scrapy
64+
65+
# Sphinx documentation
66+
docs/_build/
67+
68+
# PyBuilder
69+
target/
70+
71+
# Jupyter Notebook
72+
.ipynb_checkpoints
73+
74+
# celery beat schedule file
75+
celerybeat-schedule
76+
77+
# SageMath parsed files
78+
*.sage.py
79+
80+
# Environments
81+
.venv
82+
env/
83+
venv/
84+
ENV/
85+
env.bak/
86+
venv.bak/
87+
88+
# Spyder project settings
89+
.spyderproject
90+
.spyproject
91+
92+
# Rope project settings
93+
.ropeproject
94+
95+
# mkdocs documentation
96+
/site
97+
98+
# mypy
99+
.mypy_cache/
100+
101+
# vscode
102+
.vscode/*
103+
104+
# Pipenv
105+
Pipfile*
106+
107+
# Static files
108+
109+
static/

src/chat/__init__.py

Whitespace-only changes.

src/chat/admin.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.contrib import admin
2+
3+
# Register your models here.

src/chat/apps.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.apps import AppConfig
2+
3+
4+
class ChatConfig(AppConfig):
5+
name = 'chat'

src/chat/consumers.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from channels.generic.websocket import AsyncJsonWebsocketConsumer
2+
import json
3+
4+
class ChatConsumer(AsyncJsonWebsocketConsumer):
5+
async def connect(self):
6+
self.room_name = self.scope['url_route']['kwargs']['room_name']
7+
self.room_group_name = 'chat_%s' % self.room_name
8+
9+
# Join room group
10+
await self.channel_layer.group_add(
11+
self.room_group_name,
12+
self.channel_name
13+
)
14+
15+
await self.accept()
16+
17+
async def disconnect(self, close_code):
18+
# Leave room group
19+
await self.channel_layer.group_discard(
20+
self.room_group_name,
21+
self.channel_name
22+
)
23+
24+
# Receive message from WebSocket
25+
async def receive(self, text_data):
26+
text_data_json = json.loads(text_data)
27+
message = text_data_json['message']
28+
29+
# Send message to room group
30+
await self.channel_layer.group_send(
31+
self.room_group_name,
32+
{
33+
'type': 'chat_message',
34+
'message': message
35+
}
36+
)
37+
38+
# Receive message from room group
39+
async def chat_message(self, event):
40+
message = event['message']
41+
42+
# Send message to WebSocket
43+
await self.send(text_data=json.dumps({
44+
'message': message
45+
}))

src/chat/migrations/__init__.py

Whitespace-only changes.

src/chat/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.db import models
2+
3+
# Create your models here.

src/chat/routing.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from django.conf.urls import url
2+
3+
from . import consumers
4+
5+
websocket_urlpatterns = [
6+
url(r'^ws/chat/(?P<room_name>[^/]+)/$', consumers.ChatConsumer),
7+
]

src/chat/templates/chat/index.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<!-- chat/templates/chat/index.html -->
2+
<!DOCTYPE html>
3+
<html>
4+
<head>
5+
<meta charset="utf-8"/>
6+
<title>Chat Rooms</title>
7+
</head>
8+
<body>
9+
What chat room would you like to enter?<br/>
10+
<input id="room-name-input" type="text" size="100"/><br/>
11+
<input id="room-name-submit" type="button" value="Enter"/>
12+
13+
<script>
14+
document.querySelector('#room-name-input').focus();
15+
document.querySelector('#room-name-input').onkeyup = function(e) {
16+
if (e.keyCode === 13) { // enter, return
17+
document.querySelector('#room-name-submit').click();
18+
}
19+
};
20+
21+
document.querySelector('#room-name-submit').onclick = function(e) {
22+
var roomName = document.querySelector('#room-name-input').value;
23+
window.location.pathname = '/chat/' + roomName + '/';
24+
};
25+
</script>
26+
</body>
27+
</html>

src/chat/templates/chat/room.html

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
3+
<!-- chat/templates/chat/room.html -->
4+
<!DOCTYPE html>
5+
<html>
6+
<head>
7+
<meta charset="utf-8"/>
8+
<title>Chat Room</title>
9+
</head>
10+
<body>
11+
<textarea id="chat-log" cols="100" rows="20"></textarea><br/>
12+
<input id="chat-message-input" type="text" size="100"/><br/>
13+
<input id="chat-message-submit" type="button" value="Send"/>
14+
</body>
15+
<script>
16+
var roomName = {{ room_name_json }};
17+
18+
var chatSocket = new WebSocket(
19+
'ws://' + window.location.host +
20+
'/ws/chat/' + roomName + '/');
21+
22+
chatSocket.onmessage = function(e) {
23+
var data = JSON.parse(e.data);
24+
var message = data['message'];
25+
document.querySelector('#chat-log').value += (message + '\n');
26+
};
27+
28+
chatSocket.onclose = function(e) {
29+
console.error('Chat socket closed unexpectedly');
30+
};
31+
32+
document.querySelector('#chat-message-input').focus();
33+
document.querySelector('#chat-message-input').onkeyup = function(e) {
34+
if (e.keyCode === 13) { // enter, return
35+
document.querySelector('#chat-message-submit').click();
36+
}
37+
};
38+
39+
document.querySelector('#chat-message-submit').onclick = function(e) {
40+
var messageInputDom = document.querySelector('#chat-message-input');
41+
var message = messageInputDom.value;
42+
chatSocket.send(JSON.stringify({
43+
'message': message
44+
}));
45+
46+
messageInputDom.value = '';
47+
};
48+
</script>
49+
</html>

0 commit comments

Comments
 (0)