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, token=generate_token() ) 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}) print(player2.field) value = {"attend": True, "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 })