import 'dart:developer'; import 'package:flutter/foundation.dart'; import 'package:mchess/chess_bloc/chess_bloc.dart'; import 'package:mchess/chess_bloc/chess_events.dart'; import 'package:mchess/chess_bloc/chess_position.dart'; import 'package:mchess/utils/chess_utils.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; class ServerConnection { late WebSocketChannel channel; late bool wasConnected = false; late int counter = 0; Stream broadcast = const Stream.empty(); static final ServerConnection _instance = ServerConnection._internal(); ServerConnection._internal() { log("ServerConnection._internal constructor is called"); } factory ServerConnection() { return _instance; } factory ServerConnection.getInstance() { return ServerConnection(); } void send(String message) { channel.sink.add(message); counter++; } void connect(String playerID) { if (wasConnected) channel.sink.close(); if (kDebugMode) { channel = WebSocketChannel.connect(Uri.parse('ws://localhost:8080/api/ws')); } else { channel = WebSocketChannel.connect(Uri.parse('wss://chess.sw-gross.de:8080')); } send(playerID); log(channel.closeCode.toString()); wasConnected = true; broadcast = channel.stream.asBroadcastStream(); broadcast.listen((data) { log("Data received:"); log(data); var receivedString = data.toString(); var splitString = receivedString.split(' '); if (splitString[0] == "cl") { ChessColor onBottom = splitString[1] == "white" ? ChessColor.white : ChessColor.black; ChessBloc.getInstance().add(ColorDetermined(myColor: onBottom)); return; } if (splitString[0] == "bd") { if (splitString[1] == "init") ChessBloc.getInstance().add(InitBoard()); } if (splitString[0] == ('mv')) { var startSquare = ChessCoordinate.fromString(splitString[1]); var endSquare = ChessCoordinate.fromString(splitString[2]); if (ChessMove(from: startSquare, to: endSquare) == ChessPosition.getInstance().lastMove) { //This is our own move that got resent by the server. Do not process. } else { log('lastMove: from: ${ChessPosition.getInstance().lastMove.from} to: ${ChessPosition.getInstance().lastMove.to}'); log('constructed move: from: $startSquare to: $endSquare)}'); log('Move received : ${startSquare.toAlphabetical()}:${endSquare.toAlphabetical()}'); ChessBloc.getInstance().add(OpponentPieceMoved( startSquare: startSquare, endSquare: endSquare)); } } }); } }