146 lines
4.3 KiB
Python
146 lines
4.3 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,
|
|
token=generate_token()
|
|
)
|
|
player2 = Player.objects.create(
|
|
game=game,
|
|
number=1
|
|
)
|
|
return JsonResponse({
|
|
'game_id': game.id,
|
|
'player_token': player2.attend_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, attend_token=attend_token)
|
|
if player.token is not None:
|
|
return JsonResponse({}, status=403)
|
|
player.token = generate_token()
|
|
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()
|
|
if player2.token is None:
|
|
return JsonResponse({"attend": False, "ready": False})
|
|
return JsonResponse({"attend": True, "ready": player2.field != ' ' * 100})
|
|
|
|
|
|
@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
|
|
})
|