mirror of
https://github.com/evgen-app/chess_rpg_backend.git
synced 2024-11-22 09:37:05 +03:00
added connection to room algorithm, minor changes for player model
This commit is contained in:
parent
7a14089d10
commit
e1c8b2fb74
|
@ -12,16 +12,16 @@ DEBUG = True
|
||||||
ALLOWED_HOSTS = []
|
ALLOWED_HOSTS = []
|
||||||
|
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
|
"django.contrib.sessions",
|
||||||
"django.contrib.auth",
|
"django.contrib.auth",
|
||||||
"django.contrib.contenttypes",
|
"django.contrib.contenttypes",
|
||||||
"django.contrib.messages",
|
"django.contrib.messages",
|
||||||
"django.contrib.staticfiles",
|
|
||||||
# Packages
|
# Packages
|
||||||
"rest_framework",
|
"rest_framework",
|
||||||
"channels",
|
"channels",
|
||||||
# Apps
|
# Apps
|
||||||
"game",
|
"game",
|
||||||
"room"
|
"room",
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
@ -45,6 +45,7 @@ CHANNEL_LAYERS = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WSGI_APPLICATION = "chess_backend.wsgi.application"
|
WSGI_APPLICATION = "chess_backend.wsgi.application"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
import string
|
import string
|
||||||
import secrets
|
import secrets
|
||||||
|
|
||||||
|
from random import randint
|
||||||
|
|
||||||
|
|
||||||
def generate_charset(length: int):
|
def generate_charset(length: int):
|
||||||
return "".join(
|
return "".join(
|
||||||
secrets.choice(string.digits + string.ascii_letters) for _ in range(length)
|
secrets.choice(string.digits + string.ascii_letters) for _ in range(length)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def gen_ton():
|
||||||
|
return "".join([str(randint(0, 9)) for _ in range(48)])
|
||||||
|
|
6
game/admin.py
Normal file
6
game/admin.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
from game.models import HeroImageSet
|
||||||
|
|
||||||
|
admin.site.register(HeroImageSet)
|
|
@ -80,8 +80,8 @@ class PlayerCreateView(GenericAPIView, CreateModelMixin):
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
instance = self.perform_create(serializer)
|
instance = self.perform_create(serializer)
|
||||||
|
|
||||||
access_jwt = sign_jwt({"id": instance.id, "type": "access"}, t_life=3600)
|
access_jwt = instance.get_access_token()
|
||||||
refresh_jwt = sign_jwt({"jit": instance.get_auth_session(), "type": "refresh"})
|
refresh_jwt = instance.get_refresh_token()
|
||||||
return Response(
|
return Response(
|
||||||
{
|
{
|
||||||
"access_token": access_jwt,
|
"access_token": access_jwt,
|
||||||
|
|
|
@ -12,6 +12,7 @@ from django.db import models
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from common.generators import generate_charset
|
from common.generators import generate_charset
|
||||||
|
from game.services.jwt import sign_jwt
|
||||||
|
|
||||||
HER0_TYPES = [
|
HER0_TYPES = [
|
||||||
("WIZARD", "wizard"),
|
("WIZARD", "wizard"),
|
||||||
|
@ -66,6 +67,12 @@ class Player(models.Model):
|
||||||
def get_auth_session(self):
|
def get_auth_session(self):
|
||||||
return PlayerAuthSession.objects.get(player=self).jit
|
return PlayerAuthSession.objects.get(player=self).jit
|
||||||
|
|
||||||
|
def get_refresh_token(self):
|
||||||
|
return sign_jwt({"jit": self.get_auth_session(), "type": "refresh"})
|
||||||
|
|
||||||
|
def get_access_token(self):
|
||||||
|
return sign_jwt({"id": self.id, "type": "access"}, t_life=3600)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,11 @@ from channels.generic.websocket import AsyncWebsocketConsumer
|
||||||
from channels.layers import get_channel_layer
|
from channels.layers import get_channel_layer
|
||||||
|
|
||||||
from game.models import Deck
|
from game.models import Deck
|
||||||
from room.models import PlayerInQueue
|
from room.models import PlayerInQueue, Room, PlayerInRoom
|
||||||
from room.services.room_create import create_room
|
from room.services.room_create import create_room
|
||||||
|
|
||||||
|
channel_layer = get_channel_layer()
|
||||||
|
|
||||||
|
|
||||||
class QueueConsumer(AsyncWebsocketConsumer):
|
class QueueConsumer(AsyncWebsocketConsumer):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
@ -91,7 +93,6 @@ class QueueConsumer(AsyncWebsocketConsumer):
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# add to group and send message that opponent found to players
|
# add to group and send message that opponent found to players
|
||||||
channel_layer = get_channel_layer()
|
|
||||||
room = await create_room(
|
room = await create_room(
|
||||||
deck_id_1=self.scope["deck"],
|
deck_id_1=self.scope["deck"],
|
||||||
player_id_1=self.scope["player"],
|
player_id_1=self.scope["player"],
|
||||||
|
@ -201,13 +202,39 @@ class RoomConsumer(AsyncWebsocketConsumer):
|
||||||
self.room_name = None
|
self.room_name = None
|
||||||
|
|
||||||
async def connect(self):
|
async def connect(self):
|
||||||
self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
|
await self.accept()
|
||||||
self.room_group_name = f"room_{self.room_name}"
|
|
||||||
|
if not await self.connect_to_room():
|
||||||
|
await self.close()
|
||||||
|
|
||||||
# Join room group
|
# Join room group
|
||||||
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
|
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
|
||||||
|
|
||||||
await self.accept()
|
@sync_to_async
|
||||||
|
def connect_to_room(self):
|
||||||
|
slug = self.scope["url_route"]["kwargs"]["room_name"]
|
||||||
|
|
||||||
|
self.room_name = slug
|
||||||
|
self.room_group_name = f"room_{slug}"
|
||||||
|
room = Room.objects.filter(slug=slug)
|
||||||
|
|
||||||
|
if not room:
|
||||||
|
return False
|
||||||
|
|
||||||
|
self.scope["room"] = room
|
||||||
|
|
||||||
|
# check if player can be in a room
|
||||||
|
if self.scope["player"] not in [x.id for x in room.first().players.all()]:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# add player info to scope
|
||||||
|
player = PlayerInRoom.objects.get(player_id=self.scope["player"])
|
||||||
|
|
||||||
|
self.scope["first"] = player.first
|
||||||
|
self.scope["score"] = player.score
|
||||||
|
self.scope["deck"] = player.deck.id
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
async def disconnect(self, close_code):
|
async def disconnect(self, close_code):
|
||||||
# Leave room group
|
# Leave room group
|
||||||
|
@ -221,6 +248,12 @@ class RoomConsumer(AsyncWebsocketConsumer):
|
||||||
{"type": "chat_message", "message": text_data},
|
{"type": "chat_message", "message": text_data},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# info type message handler
|
||||||
|
async def info(self, event):
|
||||||
|
message = event["message"]
|
||||||
|
|
||||||
|
await self.send(text_data=json.dumps({"type": "INFO", "message": message}))
|
||||||
|
|
||||||
# Receive message from room group
|
# Receive message from room group
|
||||||
async def chat_message(self, event):
|
async def chat_message(self, event):
|
||||||
message = event["message"]
|
message = event["message"]
|
||||||
|
|
|
@ -4,5 +4,5 @@ from . import consumers
|
||||||
|
|
||||||
websocket_urlpatterns = [
|
websocket_urlpatterns = [
|
||||||
path("room/", consumers.QueueConsumer.as_asgi()),
|
path("room/", consumers.QueueConsumer.as_asgi()),
|
||||||
path("room/<str:room_name>/", consumers.RoomConsumer.as_asgi()),
|
path("room/<str:room_name>", consumers.RoomConsumer.as_asgi()),
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user