Skip to content
Snippets Groups Projects

Draft: Resolve "Create game model"

7 files
+ 213
63
Compare changes
  • Side-by-side
  • Inline

Files

@@ -20,23 +20,23 @@ import com.wordbattle.game.network.FirebaseInterface;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
public class AndroidInterfaceClass implements FirebaseInterface {
FirebaseDatabase database;
DatabaseReference myRef;
String lobbyID;
public AndroidInterfaceClass() {
database = FirebaseDatabase.getInstance("https://wordbattle-96156-default-rtdb.europe-west1.firebasedatabase.app");
myRef = database.getReference("message");
myRef.setValue("Something");
database = FirebaseDatabase.getInstance("https://wordbattle-96156-default-rtdb.europe-west1.firebasedatabase.app");
myRef = database.getReference("message");
myRef.setValue("Something");
}
@Override
public void SomeFunction() {
System.out.println("Something works");
@@ -44,14 +44,27 @@ public class AndroidInterfaceClass implements FirebaseInterface {
@Override
public void createNewLobby(String hostNickname, String pin) {
LobbyModel lobby = new LobbyModel(hostNickname, pin);
DatabaseReference lobbyRef = database.getReference("lobbies").child(pin);
lobbyRef.setValue(lobby)
Map<String, Object> lobbyData = new HashMap<>();
lobbyData.put("gameStarted", false);
lobbyData.put("hostNickname", hostNickname);
lobbyData.put("pin", pin);
// Create a map to store players' scores and finished status
Map<String, Object> players = new HashMap<>();
// Add the host player
players.put(hostNickname, new HashMap<String, Object>() {{
put("score", 0);
put("finished", false);
}});
// Add the players to the lobby data
lobbyData.put("players", players);
lobbyRef.setValue(lobbyData)
.addOnSuccessListener(aVoid -> {
// This will be called if the lobby is successfully created in the database.
// Here you could navigate to the lobby screen, update the UI, etc.
System.out.println("Lobby created successfully.");
System.out.println(lobby.isGameStarted());
})
.addOnFailureListener(e -> {
// This will be called if there is an error creating the lobby.
@@ -59,8 +72,9 @@ public class AndroidInterfaceClass implements FirebaseInterface {
System.err.println("Error creating lobby: " + e.getMessage());
});
}
@Override
public void joinLobby(String pin, String playerNickname, Runnable onSuccess, Runnable onFail) {
public void joinLobby(String pin, String playerNickname, Runnable onSuccess, Runnable onFail) {
// Reference to the specific lobby by its pin
DatabaseReference lobbyRef = database.getReference("lobbies").child(pin);
@@ -68,32 +82,50 @@ public class AndroidInterfaceClass implements FirebaseInterface {
lobbyRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
LobbyModel lobby = dataSnapshot.getValue(LobbyModel.class);
if (lobby != null) {
// Add the player's nickname to the lobby
lobby.addPlayerNickname(playerNickname);
// Save the updated lobby back to the database
lobbyRef.setValue(lobby).addOnSuccessListener(aVoid -> {
// Successfully joined the lobby
System.out.println(playerNickname + " joined the damn lobby with PIN: " + pin);
onSuccess.run();
}).addOnFailureListener(e -> {
// Handle failure to join the lobby
System.err.println("Failed to join lobby: " + e.getMessage());
});
Map<String, Object> lobbyData = (Map<String, Object>) dataSnapshot.getValue();
if (lobbyData != null) {
// Get the players map from the lobby data
Map<String, Object> players = (Map<String, Object>) lobbyData.get("players");
if (players != null) {
// Add the new player to the players map
players.put(playerNickname, new HashMap<String, Object>() {{
put("score", 0);
put("finished", false);
}});
// Update the players map in the lobby data
lobbyData.put("players", players);
// Save the updated lobby back to the database
lobbyRef.setValue(lobbyData).addOnSuccessListener(aVoid -> {
// Successfully joined the lobby
System.out.println(playerNickname + " joined the lobby with PIN: " + pin);
onSuccess.run();
}).addOnFailureListener(e -> {
// Handle failure to join the lobby
System.err.println("Failed to join lobby: " + e.getMessage());
});
} else {
// Players map is null, something went wrong
System.err.println("Error: Players map is null in lobby " + pin);
onFail.run();
}
} else {
// Lobby data is null, lobby does not exist
System.err.println("Error: Lobby with PIN " + pin + " does not exist.");
onFail.run();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Handle error on getting lobby data
System.err.println("Database error: " + databaseError.getMessage());
// Handle cancellation
System.err.println("Error joining lobby: " + databaseError.getMessage());
onFail.run();
}
});
}
};
public void createNewCategory(Category category) {
DatabaseReference categoryRef = database.getReference("categories").child(category.getName());
@@ -166,8 +198,6 @@ public class AndroidInterfaceClass implements FirebaseInterface {
}
@Override
public void fetchScores(String lobbyPin, ScoreFetchCallback callback) {
DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("lobbies").child(lobbyPin).child("scores");
@@ -198,7 +228,8 @@ public class AndroidInterfaceClass implements FirebaseInterface {
public void onDataChange(DataSnapshot dataSnapshot) {
LobbyModel lobby = dataSnapshot.getValue(LobbyModel.class);
if (lobby != null) {
callback.onPlayerListUpdated(lobby.getPlayerNicknames());
List<String> playerNicknames = lobby.getPlayerNicknames();
callback.onPlayerListUpdated(playerNicknames);
}
}
@@ -209,6 +240,8 @@ public class AndroidInterfaceClass implements FirebaseInterface {
});
}
public void startGame(String pin) {
DatabaseReference lobbyRef = database.getReference("lobbies").child(pin);
lobbyRef.child("gameStarted").setValue(true)
@@ -270,6 +303,46 @@ public class AndroidInterfaceClass implements FirebaseInterface {
});
}
@Override
public boolean checkIfAllPlayersAreFinished(String pin) {
DatabaseReference lobbyRef = database.getReference("lobbies").child(pin);
AtomicBoolean allPlayersFinished = new AtomicBoolean(true); // Assume all players are finished initially
lobbyRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Map<String, Object> lobbyData = (Map<String, Object>) dataSnapshot.getValue();
if (lobbyData != null) {
Map<String, Object> players = (Map<String, Object>) lobbyData.get("players");
if (players != null) {
// Iterate through each player
for (Map.Entry<String, Object> entry : players.entrySet()) {
Map<String, Object> playerData = (Map<String, Object>) entry.getValue();
boolean finished = false;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
finished = (boolean) playerData.getOrDefault("finished", false);
}
if (!finished) {
// If any player is not finished, set the flag to false and break the loop
allPlayersFinished.set(false);
break;
}
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Handle cancellation
System.err.println("Error checking if all players are finished: " + databaseError.getMessage());
}
});
return allPlayersFinished.get();
}
private long generateSeedFromPin(String pin) {
return Long.parseLong(pin);
Loading