added room create for match

This commit is contained in:
Alexander Karpov 2022-06-24 01:04:35 +03:00
parent e188de29a0
commit 7a14089d10
4 changed files with 82 additions and 5 deletions

View File

@ -1,11 +1,12 @@
import json
from asgiref.sync import sync_to_async, async_to_sync
from asgiref.sync import sync_to_async
from channels.generic.websocket import AsyncWebsocketConsumer
from channels.layers import get_channel_layer
from game.models import Deck
from room.models import PlayerInQueue
from room.services.room_create import create_room
class QueueConsumer(AsyncWebsocketConsumer):
@ -91,12 +92,21 @@ class QueueConsumer(AsyncWebsocketConsumer):
else:
# add to group and send message that opponent found to players
channel_layer = get_channel_layer()
room = await create_room(
deck_id_1=self.scope["deck"],
player_id_1=self.scope["player"],
player_score_1=self.scope["score"],
deck_id_2=opponent[2],
player_id_2=opponent[3],
player_score_2=opponent[1],
)
await channel_layer.send(
opponent[0],
{
"type": "info",
"message": f"user found, with score {self.scope['score']}",
"room": room,
},
)
@ -105,6 +115,7 @@ class QueueConsumer(AsyncWebsocketConsumer):
{
"type": "INFO",
"message": f"user found, with score {opponent[1]}",
"room": room,
}
)
)
@ -132,7 +143,7 @@ class QueueConsumer(AsyncWebsocketConsumer):
for el in PlayerInQueue.objects.all():
if el.player_id != self.scope["player"]:
if s_min <= el.score <= s_max:
return el.channel_name, el.score
return el.channel_name, el.score, el.deck.id, el.player.id
return False
@sync_to_async
@ -156,16 +167,22 @@ class QueueConsumer(AsyncWebsocketConsumer):
except PlayerInQueue.DoesNotExist:
queue = PlayerInQueue.objects.create(
player_id=self.scope["player"],
deck=deck,
score=deck.score(),
channel_name=self.channel_name,
)
self.scope["queue"] = queue.id
self.scope["deck"] = deck.id
self.scope["score"] = queue.score
async def info(self, event):
message = event["message"]
await self.send(text_data=json.dumps({"type": "INFO", "message": message}))
msg = {"type": "INFO", "message": message}
if "room" in event:
msg["room"] = event["room"]
await self.send(text_data=json.dumps(msg))
async def check_origin(self):
if not self.scope["player"]:

View File

@ -1,14 +1,35 @@
from django.db import models
# Create your models here.
from game.models import Player
from game.models import Player, Deck
class PlayerInQueue(models.Model):
# TODO use redis for storing
player = models.OneToOneField(Player, unique=True, on_delete=models.CASCADE)
score = models.IntegerField()
channel_name = models.CharField(max_length=50, blank=False)
deck = models.ForeignKey(Deck, on_delete=models.CASCADE)
score = models.IntegerField()
def __str__(self):
return f"{self.player.name} in que with score {self.score}"
class Room(models.Model):
slug = models.SlugField(max_length=16, unique=True)
created = models.DateTimeField(auto_now_add=True)
ended = models.BooleanField(default=False)
def __str__(self):
return f"room with slug {self.slug}"
class PlayerInRoom(models.Model):
player = models.OneToOneField(Player, unique=True, on_delete=models.CASCADE)
room = models.ForeignKey(Room, on_delete=models.CASCADE, related_name="players")
first = models.BooleanField()
score = models.IntegerField(blank=False)
deck = models.ForeignKey(Deck, on_delete=models.CASCADE, related_name="decks")
def __str__(self):
return f"{self.player.name} in room {self.room.slug}"

View File

View File

@ -0,0 +1,39 @@
from asgiref.sync import sync_to_async
from random import randint
from common.generators import generate_charset
from game.models import Player
from room.models import Room, PlayerInRoom
@sync_to_async
def create_room(
deck_id_1: int,
player_id_1: int,
player_score_1: int,
deck_id_2: int,
player_id_2: int,
player_score_2: int,
) -> str:
room = Room.objects.create(slug=generate_charset(16))
player_1 = Player.objects.get(id=player_id_1)
player_2 = Player.objects.get(id=player_id_2)
first_player = randint(1, 2)
PlayerInRoom.objects.create(
player=player_1,
room=room,
score=player_score_1,
deck_id=deck_id_1,
first=first_player == 1,
)
PlayerInRoom.objects.create(
player=player_2,
room=room,
score=player_score_2,
deck_id=deck_id_2,
first=first_player == 2,
)
return room.slug