feat: dev-web - servlet part

This commit is contained in:
kmitresse
2024-03-26 13:57:16 +01:00
parent 5095e558d6
commit d983f8ce97
22 changed files with 326 additions and 165 deletions
@@ -1,6 +1,6 @@
package uppa.project; package uppa.project;
public class Global { public final class Global {
public static final String PERSISTENCE_UNIT_NAME = "prod"; public static final String PERSISTENCE_UNIT_NAME = "prod";
public static final String PERSISTENCE_UNIT_NAME_TEST = "test"; public static final String PERSISTENCE_UNIT_NAME_TEST = "test";
@@ -1,5 +1,6 @@
package uppa.project; package uppa.project;
import java.util.Calendar;
import uppa.project.dao.DAO; import uppa.project.dao.DAO;
import uppa.project.dao.DAOException; import uppa.project.dao.DAOException;
import uppa.project.dao.jpa.Game_JPA_DAO_Factory; import uppa.project.dao.jpa.Game_JPA_DAO_Factory;
@@ -7,7 +8,7 @@ import uppa.project.pojo.User;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) throws DAOException {
try { try {
Game_JPA_DAO_Factory jpaDaoFactory = new Game_JPA_DAO_Factory(); Game_JPA_DAO_Factory jpaDaoFactory = new Game_JPA_DAO_Factory();
DAO<User> daoJpaUser = jpaDaoFactory.getDAOUser(); DAO<User> daoJpaUser = jpaDaoFactory.getDAOUser();
@@ -21,17 +22,17 @@ public class Main {
} }
System.out.println(); System.out.println();
// // Ajout d'User : // Ajout d'User :
// Calendar cal1 = Calendar.getInstance(); Calendar cal1 = Calendar.getInstance();
// cal1.set(1996, Calendar.FEBRUARY, 20); cal1.set(1996, Calendar.FEBRUARY, 20);
// User user1 = new User("Kevin", "Mitresse", cal1.getTime(), User.Gender.MALE); User user1 = new User("Kevin","kmitresse@gmail.com", "Mitresse", cal1.getTime(), User.Gender.MALE);
//
// Calendar cal2 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance();
// cal2.set(2002, Calendar.JUNE, 28); cal2.set(2002, Calendar.JUNE, 28);
// User user2 = new User("Lucàs", "Vabre", cal2.getTime(), User.Gender.MALE); User user2 = new User("Lucàs", "lucas@gmail.com" ,"Vabre", cal2.getTime(), User.Gender.MALE);
//
// daoJpaUser.create(user1); daoJpaUser.create(user1);
// daoJpaUser.create(user2); daoJpaUser.create(user2);
// System.out.println("test récupération user"); // System.out.println("test récupération user");
// User[] users2 = daoJpaUser.findByField("username", "Kevin"); // User[] users2 = daoJpaUser.findByField("username", "Kevin");
@@ -8,9 +8,6 @@ package uppa.project.pojo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/** /**
* Représentation d'un paquet de cartes * Représentation d'un paquet de cartes
@@ -24,7 +21,7 @@ public class Deck {
* Ensemble de cartes du paquet * Ensemble de cartes du paquet
* @see Card * @see Card
*/ */
private Set<Card> cards; private ArrayList<Card> cards;
/** /**
* Constructeur par défaut * Constructeur par défaut
@@ -38,9 +35,13 @@ public class Deck {
cards = initializeDeck(nbColors, nbValues); cards = initializeDeck(nbColors, nbValues);
} }
public Set<Card> getCards() { /**
* @return l'ensemble de cartes du paquet
*/
public ArrayList<Card> getCards() {
return cards; return cards;
} }
/** /**
* Créé un paquet de cartes mélangé avec un nombre de couleurs et de valeurs donné * Créé un paquet de cartes mélangé avec un nombre de couleurs et de valeurs donné
* *
@@ -48,9 +49,10 @@ public class Deck {
* @param nbValues nombre de valeurs (doit être compris entre 1 et le nombre de valeurs de {@link Card.Value}) * @param nbValues nombre de valeurs (doit être compris entre 1 et le nombre de valeurs de {@link Card.Value})
* @return un ensemble de cartes mélangées * @return un ensemble de cartes mélangées
*/ */
private static Set<Card> initializeDeck(int nbColors, int nbValues) { private static ArrayList<Card> initializeDeck(int nbColors, int nbValues) {
Set<Card> cards = createSetOfCard(nbColors, nbValues); ArrayList<Card> cards = createSetOfCard(nbColors, nbValues);
return shuffleSetOfCard(cards); shuffleSetOfCard(cards);
return cards;
} }
/** /**
@@ -63,8 +65,8 @@ public class Deck {
* @throws IllegalArgumentException si le nombre de couleurs ou de valeurs est incorrect * @throws IllegalArgumentException si le nombre de couleurs ou de valeurs est incorrect
* @return un ensemble de cartes * @return un ensemble de cartes
*/ */
private static Set<Card> createSetOfCard(int nbColors, int nbValues) throws IllegalArgumentException { private static ArrayList<Card> createSetOfCard(int nbColors, int nbValues) throws IllegalArgumentException {
Set<Card> cards = new HashSet<>(); ArrayList<Card> cards = new ArrayList<>(nbColors*nbValues);
if (nbColors < 1 || nbColors > Card.Color.values().length) { if (nbColors < 1 || nbColors > Card.Color.values().length) {
throw new IllegalArgumentException("Le nombre de couleurs doit être compris entre 1 et " + Card.Color.values().length); throw new IllegalArgumentException("Le nombre de couleurs doit être compris entre 1 et " + Card.Color.values().length);
@@ -87,10 +89,8 @@ public class Deck {
* @param cards ensemble de cartes à mélanger * @param cards ensemble de cartes à mélanger
* @return un ensemble de cartes mélangées * @return un ensemble de cartes mélangées
*/ */
private static HashSet<Card> shuffleSetOfCard(Set<Card> cards) { private static void shuffleSetOfCard(ArrayList<Card> cards) {
List<Card> cardList = new ArrayList<>(cards); Collections.shuffle(cards);
Collections.shuffle(cardList);
return new HashSet<>(cardList);
} }
} }
@@ -22,9 +22,9 @@ import jakarta.persistence.TemporalType;
import jakarta.persistence.Transient; import jakarta.persistence.Transient;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
/** /**
* Représentation d'une partie de jeu * Représentation d'une partie de jeu
@@ -60,7 +60,7 @@ public class Game implements Serializable {
private int nbValuesPerColor; private int nbValuesPerColor;
@OneToMany(mappedBy = "game", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OneToMany(mappedBy = "game", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Player> players; private ArrayList<Player> players;
@Transient @Transient
private Deck deck; private Deck deck;
@@ -98,7 +98,7 @@ public class Game implements Serializable {
* @param nbValuesPerColor le nombre de valeurs par couleur * @param nbValuesPerColor le nombre de valeurs par couleur
* @param players les joueurs de la partie * @param players les joueurs de la partie
*/ */
public Game(BigDecimal id, Date createdAt, Difficulty difficulty, int nbRounds, int nbColors, int nbValuesPerColor, Set<Player> players) { public Game(BigDecimal id, Date createdAt, Difficulty difficulty, int nbRounds, int nbColors, int nbValuesPerColor, ArrayList<Player> players) {
this.id = id; this.id = id;
this.createdAt = createdAt; this.createdAt = createdAt;
this.difficulty = difficulty; this.difficulty = difficulty;
@@ -187,7 +187,7 @@ public class Game implements Serializable {
/** /**
* @return les joueurs de la partie * @return les joueurs de la partie
*/ */
public Set<Player> getPlayers() { public ArrayList<Player> getPlayers() {
return players; return players;
} }
@@ -196,7 +196,7 @@ public class Game implements Serializable {
* *
* @param players les nouveaux joueurs * @param players les nouveaux joueurs
*/ */
public void setPlayers(Set<Player> players) { public void setPlayers(ArrayList<Player> players) {
this.players = players; this.players = players;
} }
@@ -216,7 +216,7 @@ public class Game implements Serializable {
this.players.add(player); this.players.add(player);
} }
public Set<Card> getDeck() { public ArrayList<Card> getDeck() {
return deck.getCards(); return deck.getCards();
} }
@@ -17,8 +17,8 @@ import jakarta.persistence.Table;
import jakarta.persistence.Transient; import jakarta.persistence.Transient;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
/** /**
* Représentation d'un joueur * Représentation d'un joueur
@@ -259,7 +259,7 @@ public class Player implements Serializable {
return (double) rapidClickCount * 100 / clickCount; return (double) rapidClickCount * 100 / clickCount;
} }
public Set<Card> getDeck() { public ArrayList<Card> getDeck() {
return deck.getCards(); return deck.getCards();
} }
@Override @Override
@@ -23,9 +23,9 @@ import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
/** /**
* Représentation d'un utilisateur * Représentation d'un utilisateur
@@ -60,10 +60,10 @@ public class User implements Serializable {
private Gender gender; private Gender gender;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Player> playedGame; private ArrayList<Player> playedGames;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<RecoveryPasswordToken> recoveryPasswordTokens; private ArrayList<RecoveryPasswordToken> recoveryPasswordTokens;
/** /**
* Constructeur par défaut * Constructeur par défaut
@@ -98,13 +98,14 @@ public class User implements Serializable {
* @param birth la date de naissance * @param birth la date de naissance
* @param gender le genre * @param gender le genre
*/ */
public User(BigDecimal id, String username, String email, String password, Date birth, Gender gender) { public User(BigDecimal id, String username, String email, String password, Date birth, Gender gender, ArrayList<Player> playedGames) {
this.id = id; this.id = id;
this.username = username; this.username = username;
this.email = email; this.email = email;
this.password = password; this.password = password;
this.birth = birth; this.birth = birth;
this.gender = gender; this.gender = gender;
this.playedGames = playedGames;
} }
/** /**
@@ -245,13 +246,22 @@ public class User implements Serializable {
return hashedPassword != null && hashedPassword.equals(this.password); return hashedPassword != null && hashedPassword.equals(this.password);
} }
/**
* Récupère la liste des parties jouées par l'utilisateur
*
* @return la liste des parties jouées
*/
public ArrayList<Player> getPlayedGames() {
return playedGames;
}
/** /**
* Récupère le nombre de parties jouées * Récupère le nombre de parties jouées
* *
* @return le nombre de parties jouées * @return le nombre de parties jouées
*/ */
public int getNbPlayedGame() { public int getNbPlayedGame() {
return playedGame.size(); return playedGames.size();
} }
/** /**
@@ -261,7 +271,7 @@ public class User implements Serializable {
*/ */
public int getNbWin(){ public int getNbWin(){
int nbWin = 0; int nbWin = 0;
for (Player p : playedGame) { for (Player p : playedGames) {
if (p.isWinner()) nbWin++; if (p.isWinner()) nbWin++;
} }
return nbWin; return nbWin;
@@ -283,7 +293,7 @@ public class User implements Serializable {
*/ */
public int getNbClicks(){ public int getNbClicks(){
int nbClicks = 0; int nbClicks = 0;
for (Player p : playedGame) { for (Player p : playedGames) {
nbClicks += p.getClickCount(); nbClicks += p.getClickCount();
} }
return nbClicks; return nbClicks;
@@ -296,7 +306,7 @@ public class User implements Serializable {
*/ */
public int getNbRightClicks(){ public int getNbRightClicks(){
int nbRightClicks = 0; int nbRightClicks = 0;
for (Player p : playedGame) { for (Player p : playedGames) {
nbRightClicks += p.getRightClickCount(); nbRightClicks += p.getRightClickCount();
} }
return nbRightClicks; return nbRightClicks;
@@ -318,7 +328,7 @@ public class User implements Serializable {
*/ */
public int getNbRapidClicks(){ public int getNbRapidClicks(){
int nbRapidClicks = 0; int nbRapidClicks = 0;
for (Player p : playedGame) { for (Player p : playedGames) {
nbRapidClicks += p.getRapidClickCount(); nbRapidClicks += p.getRapidClickCount();
} }
return nbRapidClicks; return nbRapidClicks;
@@ -19,7 +19,7 @@ import uppa.project.Global;
* @see jakarta.persistence.EntityManager * @see jakarta.persistence.EntityManager
*/ */
public final class EntityManagerProvider { public final class EntityManagerProvider {
private static final String PERSISTENCE_UNIT_NAME = Global.PERSISTENCE_UNIT_NAME; private static String PERSISTENCE_UNIT_NAME = Global.PERSISTENCE_UNIT_NAME;
private static EntityManager instance; private static EntityManager instance;
private static EntityManagerFactory factory; private static EntityManagerFactory factory;
@@ -35,6 +35,9 @@ public final class EntityManagerProvider {
return instance; return instance;
} }
public static void setPersitenceUnitName(String name) {
PERSISTENCE_UNIT_NAME = name;
}
public static void close() { public static void close() {
if (instance.isOpen()) instance.close(); if (instance.isOpen()) instance.close();
if (factory.isOpen()) factory.close(); if (factory.isOpen()) factory.close();
@@ -12,6 +12,11 @@ import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import uppa.project.pojo.Game;
import uppa.project.pojo.Player;
import uppa.project.pojo.User;
@WebServlet(name = "mainMenuServlet", value = "/main-menu") @WebServlet(name = "mainMenuServlet", value = "/main-menu")
public class MainMenuServlet extends HttpServlet { public class MainMenuServlet extends HttpServlet {
@@ -20,15 +25,39 @@ public class MainMenuServlet extends HttpServlet {
} }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
User user = (User) request.getSession().getAttribute("user");
if (request.getSession().getAttribute("user") == null) { if (user == null) {
request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response); response.sendRedirect(request.getContextPath() + "/login");
return; return;
} }
manageNewGame(request, response, user);
manageStatistiques(request, response, user);
response.sendRedirect(request.getContextPath() + "/main-menu"); response.sendRedirect(request.getContextPath() + "/main-menu");
} }
public void destroy() { public void destroy() {
} }
private void manageMainMenu(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
}
private void manageNewGame(HttpServletRequest request, HttpServletResponse response, User sessionUser) throws IOException, ServletException {
List<User> connectedUsers = new ArrayList<User>();
/*TODO: récuperer la liste des joueurs connectés
penser à retirer l'utilisateur principal de la liste*/
connectedUsers.remove(sessionUser);
request.setAttribute("connectedUsers", connectedUsers);
request.getRequestDispatcher("/WEB-INF/views/new-game.jsp").forward(request, response);
}
private void manageStatistiques(HttpServletRequest request, HttpServletResponse response, User sessionUser) throws IOException, ServletException {
List<Game> games = new ArrayList<Game>();
for(Player player : sessionUser.getPlayedGames()) {
Game game = player.getGame();
game.sortPlayersByScore();
games.add(game);
}
request.setAttribute("games", games);
}
} }
@@ -26,16 +26,6 @@ public class NewGameServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
if (request.getSession().getAttribute("user") == null) {
response.sendRedirect(request.getContextPath() + "/login");
return;
}
User[] users = new User[0];
/*TODO: récuperer la liste des joueurs connectés
penser à retirer l'utilisateur principal de la liste*/
request.setAttribute("connectedUsers", users);
request.getRequestDispatcher("/WEB-INF/views/new-game.jsp").forward(request, response);
} }
public void destroy() { public void destroy() {
@@ -0,0 +1,51 @@
<%@ page import="uppa.project.pojo.User" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: kmitr
Date: 19/03/2024
Time: 15:47
To change this template use File | Settings | File Templates.
--%>
<div id="newGameModal" class="modal">
<div class="modal-content">
<span class="close">&times;</span>
<h1> New Game</h1>
<div id="settings">
<form>
<label for="nbRounds">Nombre de tours</label>
<input type="number" id="nbRounds" name="nbRounds" min="1" max="50" value="10">
<label for="timer">Timer</label>
<input type="number" id="timer" name="timer" min="1" max="10" value="5">
<label for="nbColors">Nb couleurs</label>
<input type="range" id="nbColors" name="nbColors" min="1" max="4" value="4">
<label for="nbValues">Nb valeurs par coleurs</label>
<input type="range" id="nbValues" name="nbValues" min="5" max="13" value="13">
</form>
</div>
<div id="players-selection">
<table>
<tr>
<th>Nom d'utilisateur</th>
<th>Nombre de partie jouées</th>
<th>% Parties Gagnées</th>
<th>% Clicks corrects</th>
<th>% Clicks rapides</th>
<th>Invite</th>
</tr>
<% List<User> connectedUsers = (List<User>) request.getAttribute("connectedUsers"); %>
<% for (User user : connectedUsers) { %>
<tr>
<td><%= user.getUsername() %></td>
<td><%= user.getNbPlayedGame() %></td>
<td><%= user.getWinRate() %></td>
<td><%= user.getRightClickPercentRate()%></td>
<td><%= user.getRapidClickPercentRate()%></td>
<td><input type="checkbox" id="<%= user.getUsername()%>-invite" name="<%= user.getUsername()%>-invite"/></td>
</tr>
<% } %>
</table>
<button id="startGame">Commencer la partie</button>
</div>
</div>
</div>
```
@@ -0,0 +1,95 @@
<%@ page import="uppa.project.pojo.User" %>
<%@ page import="uppa.project.pojo.Game" %>
<%@ page import="java.util.Set" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="uppa.project.pojo.Player" %><%--
Created by IntelliJ IDEA.
User: kmitr
Date: 26/03/2024
Time: 11:05
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
//modale statistque
<% User user = (User) request.getAttribute("user"); %>
<% ArrayList<Game> games = (ArrayList<Game>) request.getAttribute("games"); %>
<div id="statisticsModal" class="modal">
<div class="modal-content">
<span class="close">&times;</span>
<h1> New Game</h1>
<div id="selfSettings">
<h2>Statistiques globales</h2>
<table>
<tr>
<th>Nombre de parties jouées:</th>
<td><%= user.getNbPlayedGame() %></td>
</tr>
<tr>
<th>Nombre de parties gagnées:</th>
<td><%= user.getNbWin() %>, <%= user.getWinRate()%></td>
</tr>
<tr>
<th>Nombre de clicks total:</th>
<td><%= user.getNbClicks() %></td>
</tr>
<tr>
<th>Nombre de clicks corrects:</th>
<td><%= user.getNbRightClicks() %>, <%= user.getRightClickPercentRate()%></td>
</tr>
<tr>
<th>Nombre de clicks rapides:</th>
<td><%= user.getNbRapidClicks() %>, <%= user.getRapidClickPercentRate()%></td>
</tr>
</table>
</div>
<div id="game-selection">
//listes de game dont chacune est un onglet déroulante des joueurs
<h2>Statistiques par jeu</h2>
<table>
<tr>
<th>Date de la partie</th>
<th>Nombre de joueurs</th>
<th>Nombre de manches</th>
<th>Nombre de couleurs</th>
<th>Nombre de valeurs par couleur</th>
<th>Vainqueur</th>
</tr>
<%
for (Game game : games) {
%>
<tr>
<td><%= game.getCreatedAt() %></td>
<td><%= game.getNbPlayers() %></td>
<td><%= game.getNbRounds() %></td>
<td><%= game.getNbColors() %></td>
<td><%= game.getNbValuesPerColor() %></td>
<td><%= game.getPlayers().get(0).getUser().getUsername() %></td>
</tr>
<tr class="dropdown" aria-disabled="false">
<table>
<tr>
<th>Username</th>
<th>Score</th>
<th>Nombre de click</th>
<th>Nombre de click corrects</th>
<th>Nombre de click rapides</th>
</tr>
<%
for (Player player : game.getPlayers()) {
%>
<tr>
<td><%= player.getUser().getUsername() %></td>
<td><%= player.getScore() %></td>
<td><%= player.getClickCount() %></td>
<td><%= player.getRightClickCount() %>, <%= player.getRatioRightClick() %></td>
<td><%= player.getRapidClickCount() %>, <%= player.getRatioRapidClick() %></td>
<%
}
%>
</table>
</tr>
</table>
</div>
</div>
</div>
@@ -1,14 +1,13 @@
window.onload = function (){ const ERROR_MESSAGE = {
"expired-token": "Lien expiré, veuillez recommencer la procédure de récupération de mot de passe.",
"invalid-token": "Lien invalide, veuillez recommencer la procédure de récupération de mot de passe.",
};
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
let error = null; const error = urlParams.get('error');
if (urlParams.has('error')) {
error = urlParams.get('error'); if (error) {
} const errorMessage = ERROR_MESSAGE[error];
console.log(error); console.error(errorMessage);
if (error != null && error === "expired-token") { window.alert(errorMessage);
window.alert("Lien expiré, veuillez recommencer la procédure de récupération de mot de passe.");
}
if (error != null && error === "invalid-token") {
window.alert("Lien invalide, veuillez recommencer la procédure de récupération de mot de passe.");
}
} }
@@ -24,7 +24,7 @@ loginForm.addEventListener("submit", (event) => {
; ;
}); });
window.onload = function (){
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
if (urlParams.has('success')) { if (urlParams.has('success')) {
if (urlParams.get('success') === "account-created") { if (urlParams.get('success') === "account-created") {
@@ -34,4 +34,3 @@ window.onload = function (){
window.alert("Mot de passe réinitialisé avec succès."); window.alert("Mot de passe réinitialisé avec succès.");
} }
} }
}
@@ -1,15 +1,19 @@
// Mise à jour du nombre de rounds max en fonction du nombre de couleurs et de valeurs sélécetionnés const nbColorsElement = document.getElementById("nbColors");
document.getElementById("nbColors").addEventListener("change", function () { const nbValuesElement = document.getElementById("nbValues");
let nbColors = document.getElementById("nbColors").value; const nbRoundsElement = document.getElementById("nbRounds")
let nbValues = document.getElementById("nbValues").value;
let nbRounds = document.getElementById("nbRounds"); /**
nbRounds.max = nbColors * nbValues; * Mise à jour du nombre de rounds max en fonction du nombre de couleurs et de valeurs séléctionnés
nbRounds.value = nbRounds.value > nbRounds.max ? nbRounds.max : nbRounds.value; */
}); function updateOnChange() {
document.getElementById("nbValues").addEventListener("change", function () { nbRoundsElement.max = nbColorsElement.value * nbValuesElement.value;
let nbColors = document.getElementById("nbColors").value;
let nbValues = document.getElementById("nbValues").value; nbRoundsElement.value =
let nbRounds = document.getElementById("nbRounds"); (nbRoundsElement.value > nbRoundsElement.max)
nbRounds.max = nbColors * nbValues; ? nbRoundsElement.max
nbRounds.value = nbRounds.value > nbRounds.max ? nbRounds.max : nbRounds.value; : nbRoundsElement.value
}); ;
}
nbColorsElement.addEventListener("change", updateOnChange);
nbValuesElement.addEventListener("change", updateOnChange);
@@ -0,0 +1,30 @@
const registerForm = document.getElementById("register-form");
const confirmPassword = document.getElementById("confirmPassword");
registerForm.addEventListener("submit", function (event) {
event.preventDefault();
const formData = new FormData(registerForm);
const data = {};
formData.forEach((value, key) => data[key] = value);
const action = loginForm.getAttribute("action")
const method = loginForm.getAttribute("method")
fetch("/reset-password", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
}).then(response => {
if (response.ok) {
window.location.href = "/login";
} else {
response.json().then(data => {
alert(data.message);
});
}
}).catch(error => console.error("Error:", error));
});
@@ -1,15 +1,16 @@
const ResetPasswordForm = document.getElementById("resetPasswordForm"); const resetPasswordForm = document.getElementById("resetPasswordForm");
const confirmPassword = document.getElementById("confirmPassword");
ResetPasswordForm.addEventListener("submit", function (event) { resetPasswordForm.addEventListener("submit", function (event) {
event.preventDefault(); event.preventDefault();
const formData = new FormData(ResetPasswordForm); const formData = new FormData(resetPasswordForm);
const data = {}; const data = {};
formData.forEach((value, key) => data[key] = value); formData.forEach((value, key) => data[key] = value);
const action = loginForm.getAttribute("action") const action = loginForm.getAttribute("action")
const method = loginForm.getAttribute("method") const method = loginForm.getAttribute("method")
fetch("/reset-password", { fetch("/reset-password", {
method: "POST", method: "POST",
headers: { headers: {
@@ -28,5 +29,3 @@ ResetPasswordForm.addEventListener("submit", function (event) {
console.error("Error:", error); console.error("Error:", error);
}); });
}); });
@@ -26,5 +26,5 @@
<%}%> <%}%>
</main> </main>
</body> </body>
<script defer type="text/javascript"><%@include file="../static/js/forgotten-password.js"%></script> <script defer type="module"><%@include file="../static/js/forgotten-password.js"%></script>
</html> </html>
@@ -4,6 +4,7 @@
<head> <head>
<title> Cards Rush - Connexion</title> <title> Cards Rush - Connexion</title>
<style><%@include file="../static/css/login.css" %></style> <style><%@include file="../static/css/login.css" %></style>
<meta charset="utf-8">
</head> </head>
<body> <body>
@@ -35,7 +36,7 @@
</section> </section>
</main> </main>
<script defer type="text/javascript"><%@include file="../static/js/login.js" %></script> <script defer type="module"><%@include file="../static/js/login.js" %></script>
</body> </body>
</html> </html>
@@ -4,6 +4,7 @@
<html> <html>
<head> <head>
<title>Cards Rush</title> <title>Cards Rush</title>
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" type="text/css">
</head> </head>
<body> <body>
<main> <main>
@@ -11,8 +12,10 @@
<section id="main"> <section id="main">
<h1 id="Title">Titre du jeu</h1> <h1 id="Title">Titre du jeu</h1>
<div class="main-button"> <div class="main-button">
<input type="button" value="New game" > //create a modal button for new game:
<input type="button" value="Hard mode" > <button data-toggle="modal" data-target="#newGameModal" >New Game</button>
<%@include file="../components/new-game.jsp"%>
</div>;
<input type="button" value="Statistics" > <input type="button" value="Statistics" >
</div> </div>
</section> </section>
@@ -1,57 +0,0 @@
<%@ page import="uppa.project.pojo.User" %><%--
Created by IntelliJ IDEA.
User: kmitr
Date: 19/03/2024
Time: 15:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>New game</title>
</head>
<body>
<main>
<section id="newGame">
<h1> New Game</h1>
<div id="settings">
<form>
<label for="nbRounds">Nombre de tours</label>
<input type="number" id="nbRounds" name="nbRounds" min="1" max="50" value="10">
<label for="timer">Timer</label>
<input type="number" id="timer" name="timer" min="1" max="10" value="5">
<label for="nbColors">Nb coleurs</label>
<input type="range" id="nbColors" name="nbColors" min="1" max="4" value="4">
<label for="nbValues">Nb valeurs par coleurs</label>
<input type="range" id="nbValues" name="nbValues" min="5" max="13" value="13">
</form>
</div>
<div id="players-selection">
<table>
<tr>
<th>Nom d'utilisateur</th>
<th>Nombre de partie jouées</th>
<th>% Parties Gagnées</th>
<th>% Clicks corrects</th>
<th>% Clicks rapides</th>
<th>Invite</th>
</tr>
<% User[] connectedUsers = (User[]) request.getAttribute("connectedUsers"); %>
<% for (User user : connectedUsers) { %>
<tr>
<td><%= user.getUsername() %></td>
<td><%= user.getNbPlayedGame() %></td>
<td><%= user.getWinRate() %></td>
<td><%= user.getRightClickPercentRate()%></td>
<td><%= user.getRapidClickPercentRate()%></td>
<td><input type="checkbox" id="<%= user.getUsername()%>-invite" name="<%= user.getUsername()%>-invite"/></td>
</tr>
<% } %>
</table>
<button id="startGame">Commencer la partie</button>
</div>
</section>
</main>
</body>
<script defer type="text/javascript"> <%@include file="../static/js/new-game.js"%></script>
</html>
@@ -51,4 +51,5 @@
</main> </main>
</body> </body>
<script defer type="module"><%@include file="../static/js/register.js"%></script>
</html> </html>
@@ -19,8 +19,11 @@ class DeckTest {
@Test @Test
void throw_error_on_creation_of_invalid_deck() { void throw_error_on_creation_of_invalid_deck() {
// Nombre de couleurs invalides
assertThrows(IllegalArgumentException.class, () -> new Deck(0, 13)); assertThrows(IllegalArgumentException.class, () -> new Deck(0, 13));
assertThrows(IllegalArgumentException.class, () -> new Deck(5, 13)); assertThrows(IllegalArgumentException.class, () -> new Deck(5, 13));
// Nombre de valeurs invalides
assertThrows(IllegalArgumentException.class, () -> new Deck(1, 0)); assertThrows(IllegalArgumentException.class, () -> new Deck(1, 0));
assertThrows(IllegalArgumentException.class, () -> new Deck(1, 15)); assertThrows(IllegalArgumentException.class, () -> new Deck(1, 15));
} }