From ec56e1302dfa160e4b2b646e10297249250f2af2 Mon Sep 17 00:00:00 2001 From: Nathan Ogunleye <9629534+nathanogunleye@users.noreply.github.com> Date: Sun, 19 May 2024 01:02:01 +0100 Subject: [PATCH] Add separate Firebase model --- lib/model/firebase/player.dart | 22 ++++++++ lib/model/firebase/room.dart | 27 ++++++++++ lib/model/internal/room.dart | 2 + lib/service/messaging_service.dart | 81 +++++++++++++++++------------- 4 files changed, 98 insertions(+), 34 deletions(-) create mode 100644 lib/model/firebase/player.dart create mode 100644 lib/model/firebase/room.dart diff --git a/lib/model/firebase/player.dart b/lib/model/firebase/player.dart new file mode 100644 index 0000000..2670384 --- /dev/null +++ b/lib/model/firebase/player.dart @@ -0,0 +1,22 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'player.g.dart'; + +@JsonSerializable(explicitToJson: true) +class Player { + /// Name of player + String name; + + /// Flag for if this is the current user's turn + bool isPlaying; + + Player({ + required this.name, + required this.isPlaying, + }); + + factory Player.fromJson(Map json) => + _$PlayerFromJson(json); + + Map toJson() => _$PlayerToJson(this); +} diff --git a/lib/model/firebase/room.dart b/lib/model/firebase/room.dart new file mode 100644 index 0000000..cf50270 --- /dev/null +++ b/lib/model/firebase/room.dart @@ -0,0 +1,27 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:karma_palace/model/firebase/player.dart'; + +part 'room.g.dart'; + +@JsonSerializable(explicitToJson: true) +class Room { + /// Room ID. This is the same ID used for the deck API + String id; + + /// List of players in the room + List players; + + /// Player in play + String currentPlayer; + + Room({ + required this.id, + required this.players, + required this.currentPlayer, + }); + + factory Room.fromJson(Map json) => + _$RoomFromJson(json); + + Map toJson() => _$RoomToJson(this); +} diff --git a/lib/model/internal/room.dart b/lib/model/internal/room.dart index aabce06..66a8e03 100644 --- a/lib/model/internal/room.dart +++ b/lib/model/internal/room.dart @@ -2,12 +2,14 @@ import 'package:karma_palace/model/internal/card.dart'; import 'package:karma_palace/model/internal/player.dart'; class Room { + String id; List players; List deck; List playingPile; List discardPile; Room({ + required this.id, required this.players, required this.deck, required this.playingPile, diff --git a/lib/service/messaging_service.dart b/lib/service/messaging_service.dart index a794411..25f3cb8 100644 --- a/lib/service/messaging_service.dart +++ b/lib/service/messaging_service.dart @@ -1,37 +1,50 @@ -// import 'package:firebase_database/firebase_database.dart'; -// import 'package:karma_palace/model/internal/player.dart'; -// import 'package:karma_palace/model/internal/room.dart'; +import 'package:firebase_database/firebase_database.dart'; + +import '../model/firebase/player.dart' as firebase_player; +import '../model/firebase/room.dart'; +import '../model/internal/player.dart'; class MessagingService { - // static final MessagingService _messagingService = - // MessagingService._internal(); - // - // factory MessagingService() { - // return _messagingService; - // } - // - // MessagingService._internal(); - // - // void saveNewRoom(String roomId, Player player) async { - // Room room = Room(players: [ - // player, - // ]); - // - // FirebaseDatabase database = FirebaseDatabase.instance; - // DatabaseReference ref = database.ref('room/$roomId'); - // await ref.set(room.toJson()); - // } - // - // Future joinExistingRoom(String roomId, Player player) async { - // FirebaseDatabase database = FirebaseDatabase.instance; - // DatabaseReference roomRef = database.ref('room/$roomId'); - // DatabaseEvent event = await roomRef.once(); - // if (event.snapshot.exists) { - // DatabaseReference roomPlayerRef = roomRef.child('players'); - // DatabaseReference newPlayerRef = roomPlayerRef.push(); - // newPlayerRef.set(player.toJson()); - // } - // - // throw 'Room does not exist!'; - // } + static final MessagingService _messagingService = + MessagingService._internal(); + + factory MessagingService() { + return _messagingService; + } + + MessagingService._internal(); + + void createRoom(String id, Player player) async { + Room room = Room( + id: id, + players: [ + firebase_player.Player( + name: player.name, + isPlaying: true, + ), + ], + currentPlayer: player.name, + ); + + FirebaseDatabase database = FirebaseDatabase.instance; + DatabaseReference ref = database.ref('room/${room.id}'); + await ref.set(room.toJson()); + } + + Future joinRoom(String id, Player player) async { + FirebaseDatabase database = FirebaseDatabase.instance; + DatabaseReference roomRef = database.ref('room/$id'); + + DatabaseEvent event = await roomRef.once(); + if (event.snapshot.exists) { + DatabaseReference roomPlayerRef = roomRef.child('players'); + DatabaseReference newPlayerRef = roomPlayerRef.push(); + newPlayerRef.set(firebase_player.Player( + name: player.name, + isPlaying: false, + ).toJson()); + } + + throw 'Room does not exist!'; + } }