Various changes.
This commit is contained in:
parent
605743c0d2
commit
6e5d84364d
41
lib/api/websocket_message.dart
Normal file
41
lib/api/websocket_message.dart
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
@ -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');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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(
|
||||||
|
@ -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'),
|
||||||
),
|
),
|
||||||
|
),
|
||||||