Various changes.

This commit is contained in:
Marco 2023-06-08 17:10:48 +02:00
parent 605743c0d2
commit 6e5d84364d
9 changed files with 237 additions and 81 deletions

View File

@ -0,0 +1,41 @@
import 'package:mchess/api/move.dart';
enum MessageType {
moveMessage,
colorDetermined;
String toJson() => name;
static MessageType fromJson(String json) => values.byName(json);
}
enum ApiColor {
black,
white;
String toJson() => name;
static ApiColor fromJson(String json) => values.byName(json);
}
class ApiWebsocketMessage {
final MessageType type;
final ApiMove? move;
final ApiColor? color;
ApiWebsocketMessage(
{required this.type, required this.move, required this.color});
factory ApiWebsocketMessage.fromJson(Map<String, dynamic> json) {
final type = MessageType.fromJson(json['messageType']);
ApiWebsocketMessage ret;
switch (type) {
case MessageType.colorDetermined:
ret = ApiWebsocketMessage(
type: type, move: null, color: ApiColor.fromJson(json['color']));
break;
case MessageType.moveMessage:
ret = ApiWebsocketMessage(
type: type, move: ApiMove.fromJson(json['move']), color: null);
}
return ret;
}
}

View File

@ -51,8 +51,6 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
? ChessColor.black ? ChessColor.black
: ChessColor.white; : ChessColor.white;
log('emitting new state with position $newPosition');
emit( emit(
ChessBoardState( ChessBoardState(
state.bottomColor, state.bottomColor,
@ -60,6 +58,7 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
newPosition, newPosition,
), ),
); );
log('emitting new state with position $newPosition');
} }
void ownMoveHandler(OwnPieceMoved event, Emitter<ChessBoardState> emit) { void ownMoveHandler(OwnPieceMoved event, Emitter<ChessBoardState> emit) {
@ -72,6 +71,21 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
var move = ApiMove(startSquare: start, endSquare: end); var move = ApiMove(startSquare: start, endSquare: end);
ServerConnection.getInstance().send(jsonEncode(move)); ServerConnection.getInstance().send(jsonEncode(move));
turnColor = state.newTurnColor == ChessColor.white
? ChessColor.black
: ChessColor.white;
var newPosition = ChessPosition.getInstance().currentPosition;
emit(
ChessBoardState(
state.bottomColor,
turnColor,
newPosition,
),
);
log('emitting new state with position $newPosition');
} }
} }

View File

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:mchess/api/move.dart'; import 'package:mchess/api/websocket_message.dart';
import 'package:mchess/chess_bloc/chess_bloc.dart'; import 'package:mchess/chess_bloc/chess_bloc.dart';
import 'package:mchess/chess_bloc/chess_events.dart'; import 'package:mchess/chess_bloc/chess_events.dart';
import 'package:mchess/chess_bloc/chess_position.dart'; import 'package:mchess/chess_bloc/chess_position.dart';
@ -41,8 +41,8 @@ class ServerConnection {
channel = channel =
WebSocketChannel.connect(Uri.parse('ws://localhost:8080/api/ws')); WebSocketChannel.connect(Uri.parse('ws://localhost:8080/api/ws'));
} else { } else {
channel = channel = WebSocketChannel.connect(
WebSocketChannel.connect(Uri.parse('wss://chess.sw-gross.de:8080')); Uri.parse('wss://chess.sw-gross.de:9999/api/ws'));
} }
send(jsonEncode(WebsocketMessageIdentifyPlayer( send(jsonEncode(WebsocketMessageIdentifyPlayer(
playerID: (playerID), lobbyID: (lobbyID)))); playerID: (playerID), lobbyID: (lobbyID))));
@ -59,12 +59,21 @@ class ServerConnection {
void handleIncomingData(dynamic data) { void handleIncomingData(dynamic data) {
log("Data received:"); log("Data received:");
log(data); log(data);
var apiMove = ApiMove.fromJson(jsonDecode(data)); var apiMessage = ApiWebsocketMessage.fromJson(jsonDecode(data));
//Todo: Implement status messages switch (apiMessage.type) {
// e.g. to tell the client that both players connected, who is playing which color and so on case MessageType.colorDetermined:
ChessBloc.getInstance().add(ColorDetermined(
myColor: ChessColor.fromApiColor(apiMessage.color!)));
break;
var move = ChessMove.fromApiMove(apiMove); case MessageType.moveMessage:
handleIncomingMoveMessage(apiMessage);
}
}
void handleIncomingMoveMessage(ApiWebsocketMessage apiMessage) {
var move = ChessMove.fromApiMove(apiMessage.move!);
if (move == ChessPosition.getInstance().lastMove) { if (move == ChessPosition.getInstance().lastMove) {
//This is our own move that got resent by the server. Do not process. //This is our own move that got resent by the server. Do not process.
} else { } else {

View File

@ -35,7 +35,7 @@ class _ChessGameState extends State<ChessGame> {
body: Center( body: Center(
child: FittedBox( child: FittedBox(
fit: BoxFit.contain, fit: BoxFit.contain,
child: Row( child: Column(
children: [ children: [
if (kDebugMode) if (kDebugMode)
StreamBuilder( StreamBuilder(

View File

@ -7,12 +7,14 @@ class LobbySelector extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
body: TextButton( body: Center(
child: TextButton(
onPressed: () { onPressed: () {
context.goNamed('prepareChessGame'); context.goNamed('prepareChessGame');
}, },
child: const Text('Random lobby'), child: const Text('Random lobby'),
), ),
),