battleship-back/battleship/views.py
Administrator cb7a4a379e migrate
2022-08-26 15:52:42 +03:00

146 lines
4.2 KiB
Python

import json
from django.http import JsonResponse
# Create your views here.
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt
from battleship.models import Game, Player, generate_token
from battleship.utils import check_field
@csrf_exempt
def new_game(request):
if request.method == 'OPTIONS':
return JsonResponse({})
game = Game.objects.create()
player1 = Player.objects.create(
game=game,
number=0,
attended=True
)
player2 = Player.objects.create(
game=game,
number=1,
)
return JsonResponse({
'game_id': game.id,
'player_token': player2.token,
'my_token': player1.token
})
@csrf_exempt
def attend_game(request):
if request.method == 'OPTIONS':
return JsonResponse({})
data = json.loads(request.body.decode('utf-8'))
game_id = data['game_id']
attend_token = data['attend_token']
player = Player.objects.get(game_id=game_id, token=attend_token)
if player.token is not None:
return JsonResponse({}, status=403)
player.attended = True
player.save()
return JsonResponse({
'token': player.token
})
@csrf_exempt
def place_ships(request):
if request.method == 'OPTIONS':
return JsonResponse({})
data = json.loads(request.body.decode('utf-8'))
game_id = data['game_id']
token = data['token']
player = Player.objects.get(game_id=game_id, token=token)
if player.field != ' ' * 100:
return JsonResponse({}, status=403)
player.field = data['field']
if check_field(player.field):
player.save()
return JsonResponse({})
else:
return JsonResponse({}, status=403)
@csrf_exempt
def check_opponent(request):
if request.method == 'OPTIONS':
return JsonResponse({})
data = json.loads(request.body.decode('utf-8'))
game_id = data['game_id']
token = data['token']
player = Player.objects.get(game_id=game_id, token=token)
player2 = Player.objects.filter(game_id=game_id, number=(1 - player.number)).first()
value = {"attend": player2.attended, "ready": 'o' in player2.field}
print(value)
return JsonResponse(value)
@csrf_exempt
def shoot(request):
if request.method == 'OPTIONS':
return JsonResponse({})
data = json.loads(request.body.decode('utf-8'))
game_id = data['game_id']
token = data['token']
player = Player.objects.get(game_id=game_id, token=token)
if player.game.turn != player.number:
return JsonResponse({}, status=403)
player2 = Player.objects.get(game_id=game_id, number=(1 - player.number))
h = data['h']
v = data['v']
pos = h * 10 + v
if player2.field[pos] == 'x' or player2.field[pos] == '.':
return JsonResponse({}, status=403)
if player2.field[pos] == 'o':
new_symb = 'x'
else:
new_symb = '.'
player.game.turn = (1 - player.game.turn)
player.game.last_move_ts = timezone.now()
player.game.save()
if pos == 0:
player2.field = new_symb + player2.field[1:]
elif pos == 99:
player2.field[:99] + new_symb
else:
player2.field = player2.field[:pos] + new_symb + player2.field[pos + 1:]
player2.save()
game_finish = 'o' not in player2.field
if game_finish:
player.game.winner = player.number
player.game.save()
return JsonResponse({
'shot': new_symb == 'x',
'game_finish': game_finish
})
@csrf_exempt
def check_status(request):
if request.method == 'OPTIONS':
return JsonResponse({})
data = json.loads(request.body.decode('utf-8'))
game_id = data['game_id']
token = data['token']
player = Player.objects.get(game_id=game_id, token=token)
player2 = Player.objects.get(game_id=game_id, number=1 - player.number)
return JsonResponse({
'my_turn': player.game.turn == player.number,
'game_finished': 'o' not in player.field or 'o' not in player2.field
})
@csrf_exempt
def check_field_correct(request):
if request.method == 'OPTIONS':
return JsonResponse({})
data = json.loads(request.body.decode('utf-8'))
correct = check_field(data['field'])
return JsonResponse({
'correct': correct
})