Merge branch 'master' into CI/CD
continuous-integration/drone/push Build is passing Details

CI/CD
Thomas Chazot 1 year ago
commit 9d082bb5d5

@ -1,5 +1,6 @@
#!/bin/sh #!/bin/sh
npm install --force
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

@ -69,6 +69,9 @@ class AuthController {
// Stocker l'utilisateur dans la session) // Stocker l'utilisateur dans la session)
req.session.user = user; req.session.user = user;
req.session.user.nbNodes = 25
req.session.user.nbIndices = 3
// Envoyer une réponse réussie // Envoyer une réponse réussie
console.log("[" + hour + ":" + minutes + "] " + user.pseudo + " have been connected."); console.log("[" + hour + ":" + minutes + "] " + user.pseudo + " have been connected.");
@ -84,6 +87,20 @@ class AuthController {
} }
} }
static async UpdateNbNodesIndices(req, res){
try{
if (req.session.user){
req.session.user.nbNodes = req.body.nbNodes;
req.session.user.nbIndices = req.body.nbIndices;
res.status(200).json({ message: 'Nombre de noeuds mis à jour.' });
}
}
catch(error){
console.error(error);
res.status(500).json({ error: 'Erreur lors de la mise à jour du nombre de noeuds.' });
}
}
static async logout(req, res) { static async logout(req, res) {
const pseudo = req.session.user.pseudo; const pseudo = req.session.user.pseudo;
const date = new Date(); const date = new Date();

@ -11,6 +11,7 @@ router.delete('/auth/logout', AuthController.logout)
router.delete('/auth/delAccount', AuthController.delAccount) router.delete('/auth/delAccount', AuthController.delAccount)
router.post('/auth/validatePassword', AuthController.validatePassword); router.post('/auth/validatePassword', AuthController.validatePassword);
router.put('/auth/updatePassword', AuthController.updatePassword); router.put('/auth/updatePassword', AuthController.updatePassword);
router.put('/session/updateNbNodes', AuthController.UpdateNbNodesIndices);
router.get('/auth/getAllUsers', AuthController.getUsers) router.get('/auth/getAllUsers', AuthController.getUsers)
router.get('/auth/games', AuthController.getGames) router.get('/auth/games', AuthController.getGames)
@ -25,6 +26,7 @@ router.post('/session/addHardEnigmaStats', SessionController.addHardEnigmaStats)
router.post('/session/addOnlineStats', SessionController.addOnlineStats); router.post('/session/addOnlineStats', SessionController.addOnlineStats);
router.put('/session/updatePseudo', SessionController.UpdatePseudo); router.put('/session/updatePseudo', SessionController.UpdatePseudo);
// Routes pour le daily scoreboard // Routes pour le daily scoreboard
router.get('/scoreboard/getDailyMastermind', ScoreboardController.getDailyMastermind); router.get('/scoreboard/getDailyMastermind', ScoreboardController.getDailyMastermind);
router.get('/scoreboard/getDailyEasyEnigma', ScoreboardController.getDailyEasyEnigma); router.get('/scoreboard/getDailyEasyEnigma', ScoreboardController.getDailyEasyEnigma);

@ -78,7 +78,6 @@ let cptHistory = 0
let lastNodes: NodePerson[] = [] let lastNodes: NodePerson[] = []
let cptEndgame = 0 let cptEndgame = 0
let endgame= false let endgame= false
let firstHistory = true
let cptSquare = 0 let cptSquare = 0
let cptOnAskedWrong = 0 let cptOnAskedWrong = 0
let cptPlayerLeft = 0 let cptPlayerLeft = 0
@ -89,6 +88,7 @@ let testTemps = 0
let testFirst = false let testFirst = false
let gameStartTmp = true let gameStartTmp = true
let index = 0 let index = 0
let firstHistory = true
const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, difficulty, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf, importToJSON, setImportToJSON, setPutCorrectBackground, setPutGreyBackground, setPutImposssibleGrey, putCorrectBackground, putGreyBackground, putImposssibleGrey, handleTurn, setChangeGraph, lang}) => { const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, difficulty, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf, importToJSON, setImportToJSON, setPutCorrectBackground, setPutGreyBackground, setPutImposssibleGrey, putCorrectBackground, putGreyBackground, putImposssibleGrey, handleTurn, setChangeGraph, lang}) => {
let cptTour: number = 1 let cptTour: number = 1
@ -112,6 +112,8 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
const [netEnigme, setNetEnigme] = useState<Map<number, Pair<Indice, boolean>[]> | null>(null) const [netEnigme, setNetEnigme] = useState<Map<number, Pair<Indice, boolean>[]> | null>(null)
const [downloaded, setDownloaded] = useState(false) const [downloaded, setDownloaded] = useState(false)
const [updateHistory, setUpdateHistory] = useState<() => void>(() => {})
useEffect(() => { useEffect(() => {
if (testFirst){ if (testFirst){
testTemps = 0 testTemps = 0
@ -192,7 +194,6 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
gameStartTmp=gameStart gameStartTmp=gameStart
if (gameStartTmp){ if (gameStartTmp){
setGameStartData(false) setGameStartData(false)
console.log(gameStart)
setLastIndex(turnPlayerIndex) setLastIndex(turnPlayerIndex)
setPlayerIndex(playerIndex) setPlayerIndex(playerIndex)
} }
@ -420,6 +421,7 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
} }
useEffect(() => { useEffect(() => {
if (importToJSON){ if (importToJSON){
setImportToJSON(false) setImportToJSON(false)
@ -436,11 +438,16 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
setIndicesData(choosenIndices) setIndicesData(choosenIndices)
const map = EnigmeDuJourCreator.createEnigme(networkPerson, choosenIndices, choosenPerson, Stub.GenerateIndice()) const map = EnigmeDuJourCreator.createEnigme(networkPerson, choosenIndices, choosenPerson, Stub.GenerateIndice())
setDailyEnigmeData(map) setDailyEnigmeData(map)
addToHistory("<----- [Tour " + 1 +"/"+networkPerson.getPersons().length + "] ----->"); if (solo && (difficulty === "intermediate" || !isDaily)){
addToHistory("<----- ["+ intl.formatMessage({ id: 'turn' }) +" " + 1 +"/"+networkPerson.getPersons().length + "] ----->");
}
else{
choosenIndices.forEach((indice, index) => {
addToHistory(intl.formatMessage({ id: 'indice' }) + positionToEmoji(index, true) + " : " + indice.ToString(lang))
})
}
changecptTour(1) changecptTour(1)
testTemps=0 testTemps=0
} }
useEffect(() => { useEffect(() => {
@ -497,12 +504,24 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
} }
}; };
const networkData = { nodes: nodes, edges: graph.edges }; const networkData = { nodes: nodes, edges: graph.edges };
const network = new Network(container, networkData, initialOptions); const network = new Network(container, networkData, initialOptions);
network.stabilize(); network.stabilize();
setNetwork(network) setNetwork(network)
setSeedData(network.getSeed()) setSeedData(network.getSeed())
if (solo){
if (solo && (difficulty === "intermediate" || !isDaily)){
addToHistory("<----- ["+ intl.formatMessage({ id: 'turn' }) +" " + 1 +"/"+networkData.nodes.length + "] ----->");
}
else{
indices.forEach((indice, index) => {
addToHistory(intl.formatMessage({ id: 'indice' }) + positionToEmoji(index, true) + " : " + indice.ToString(lang))
})
}
}
if (isDaily){ if (isDaily){
setNetworkEnigme(dailyEnigme) setNetworkEnigme(dailyEnigme)
setNetEnigme(dailyEnigme) setNetEnigme(dailyEnigme)
@ -521,15 +540,6 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
}) })
}); });
} }
else if (difficulty === "easy"){
if (firstHistory){
firstHistory=false
indices.forEach((indice, index) => {
addToHistory(intl.formatMessage({ id: 'indice' }) + positionToEmoji(index, true) + " : " + indice.ToString(lang))
})
}
}
} }
socket.on("give network", (playerId) => { socket.on("give network", (playerId) => {
@ -620,7 +630,6 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
setPlayerIndex(index) setPlayerIndex(index)
setLastIndex(index) setLastIndex(index)
if (actualPlayerIndex==index){ if (actualPlayerIndex==index){
handleTurnBarTextChange(intl.formatMessage({ id: 'game.yourTurn' }))
handleShowTurnBar(true) handleShowTurnBar(true)
} }
}) })
@ -901,6 +910,7 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
setLastIndex(-1) setLastIndex(-1)
setPlayerTouched(-1) setPlayerTouched(-1)
setWinnerData(winner) setWinnerData(winner)
firstHistory=true
first = true first = true
@ -909,7 +919,6 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
setAskedWrong(false) setAskedWrong(false)
askedWrongBot=false askedWrongBot=false
endgame = true endgame = true
firstHistory=true
cptBug=0 cptBug=0
try{ try{
if(isLoggedIn){ if(isLoggedIn){
@ -935,6 +944,7 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
} }
finally{ finally{
setElapsedTime(0) setElapsedTime(0)
putCorrectBackground()
socket.off("end game") socket.off("end game")
socket.off("asked all") socket.off("asked all")
socket.off("opacity activated") socket.off("opacity activated")
@ -951,24 +961,6 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
} }
}) })
personNetwork.getPersons().forEach(p => {
let a = 0
for (let i of indices){
let tester = IndiceTesterFactory.Create(i)
if (tester.Works(p)){
a++
}
}
if (a==indices.length){
//networkData.nodes.update({id: p.getId(), label: p.getName() + "\n🔵"})
//console.log(p)
}
});
// Gérer le changement entre la physique et le déplacement manuel // Gérer le changement entre la physique et le déplacement manuel
network.on("dragging", (params) => { network.on("dragging", (params) => {
if (params.nodes.length > 0) { if (params.nodes.length > 0) {
@ -1104,15 +1096,14 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
const personTest = personNetwork?.getPersons().find((p) => p.getId() == params.nodes[0]) //person sélectionnée const personTest = personNetwork?.getPersons().find((p) => p.getId() == params.nodes[0]) //person sélectionnée
const node = nodes.get().find((n: any) => params.nodes[0] == n.id) const node = nodes.get().find((n: any) => params.nodes[0] == n.id)
if(node == undefined)return; if(node == undefined)return;
if (personTest != undefined && !node.label.includes(positionToEmoji(index, true)) && !node.label.includes(positionToEmoji(index, false))){ //si la personne existe et que le noeud n'a pas déjà été cliqué if (node.label.includes(colorToEmoji(positionToColor(0), true)) || node.label.includes(colorToEmoji(positionToColor(0), false))) return
if (personTest != undefined){ //si la personne existe et que le noeud n'a pas déjà été cliqué
let index =0 let index =0
let works = true
const statsTime = elapsedTime;
for (const i of indices){ for (const i of indices){
const tester = IndiceTesterFactory.Create(i) const tester = IndiceTesterFactory.Create(i)
const test = tester.Works(personTest) const test = tester.Works(personTest)
//@ts-ignore //@ts-ignore
if (node!=undefined){ if (node!=undefined && !node.label.includes(positionToEmoji(index, true)) && !node.label.includes(positionToEmoji(index, false))){
const nodeNode = nodes.get().find((n: any) => params.nodes[0] == n.id) const nodeNode = nodes.get().find((n: any) => params.nodes[0] == n.id)
if(nodeNode == undefined)return; if(nodeNode == undefined)return;
networkData.nodes.update({id: params.nodes[0], label: nodeNode.label + positionToEmoji(index, test)}) networkData.nodes.update({id: params.nodes[0], label: nodeNode.label + positionToEmoji(index, test)})

@ -8,6 +8,7 @@ import Person from '../res/img/Person.png'
import BotImg from '../res/img/bot.png' import BotImg from '../res/img/bot.png'
import { socket } from '../SocketConfig'; import { socket } from '../SocketConfig';
import { FormattedMessage } from 'react-intl';
//@ts-ignore //@ts-ignore
@ -69,7 +70,7 @@ const PlayerList: React.FC<PlayerListProps> = ({ players, playerTouched, setPlay
textAlign: "center", textAlign: "center",
color: "white", color: "white",
padding: "10px"}} padding: "10px"}}
onClick={() => askEveryone()}>Ask everyone</button> onClick={() => askEveryone()}><FormattedMessage id='askeveryone'/></button>
): ):
( (
<button style={{ <button style={{
@ -80,7 +81,7 @@ const PlayerList: React.FC<PlayerListProps> = ({ players, playerTouched, setPlay
textAlign: "center", textAlign: "center",
color: "white", color: "white",
padding: "10px"}} padding: "10px"}}
onClick={() => askEveryone()}>Ask everyone</button> onClick={() => askEveryone()}><FormattedMessage id='askeveryone'/></button>
) )
} }
</div> </div>

@ -13,3 +13,16 @@
/* Personnalisez davantage selon vos préférences */ /* Personnalisez davantage selon vos préférences */
.carousselButton{
border:none;
background-color:darkgray;
color:white;
opacity: 60%;
width: 50px;
height: 70px;
font-size: 40px;
border-radius: 5px;
padding: 5px;
margin: 5px;
cursor: pointer;
}

@ -94,6 +94,19 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => {
const intl = useIntl(); const intl = useIntl();
//@ts-ignore
const CustomPrevButton = ({ previousSlide }) => (
<button className='carousselButton' onClick={previousSlide}>&lt;</button>
);
//@ts-ignore
const CustomNextButton = ({ nextSlide }) => (
<button className='carousselButton' onClick={nextSlide}>&gt;</button>
);
return ( return (
<Tabs <Tabs
activeKey={activeTab} activeKey={activeTab}
@ -108,7 +121,15 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => {
title={intl.formatMessage({ id: 'score.tab.stat' })} title={intl.formatMessage({ id: 'score.tab.stat' })}
disabled={!Player.pseudo.startsWith("Guest_") ? false : true}> disabled={!Player.pseudo.startsWith("Guest_") ? false : true}>
<Tab.Content className={`tabsStats ${activeTab !== 'perso' ? 'hidden' : ''}`}> <Tab.Content className={`tabsStats ${activeTab !== 'perso' ? 'hidden' : ''}`}>
<Carousel adaptiveHeight wrapAround slidesToShow={1} cellSpacing={10} key={carouselKey}> <Carousel
renderCenterLeftControls={({ previousSlide }) => <CustomPrevButton previousSlide={previousSlide} />}
renderCenterRightControls={({ nextSlide }) => <CustomNextButton nextSlide={nextSlide} />}
adaptiveHeight
wrapAround
slidesToShow={1}
cellSpacing={10}
key={carouselKey}
>
<div className="stats"> <div className="stats">
<h5><FormattedMessage id='info.mdj.mastermind'/></h5> <h5><FormattedMessage id='info.mdj.mastermind'/></h5>
<hr /> <hr />
@ -151,7 +172,7 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => {
</Carousel> </Carousel>
</Tab.Content> </Tab.Content>
</Tab> </Tab>
<Tab eventKey="daily" title="Daily"> <Tab eventKey="daily" title={intl.formatMessage({ id: 'score.tab.quoti' })}>
<Tab.Content className={`tabsStats ${activeTab !== 'daily' ? 'hidden' : ''}`}> <Tab.Content className={`tabsStats ${activeTab !== 'daily' ? 'hidden' : ''}`}>
<Carousel adaptiveHeight wrapAround slidesToShow={1} cellSpacing={10} key={carouselKey}> <Carousel adaptiveHeight wrapAround slidesToShow={1} cellSpacing={10} key={carouselKey}>
<div className="stats"> <div className="stats">
@ -257,7 +278,7 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => {
</Carousel> </Carousel>
</Tab.Content> </Tab.Content>
</Tab> </Tab>
<Tab eventKey="weekly" title="Weekly"> <Tab eventKey="weekly" title={intl.formatMessage({ id: 'score.tab.hebdo' })}>
<Tab.Content className={`tabsStats ${activeTab !== 'weekly' ? 'hidden' : ''}`}> <Tab.Content className={`tabsStats ${activeTab !== 'weekly' ? 'hidden' : ''}`}>
<Carousel adaptiveHeight wrapAround slidesToShow={1} cellSpacing={10} key={carouselKey}> <Carousel adaptiveHeight wrapAround slidesToShow={1} cellSpacing={10} key={carouselKey}>
<div className="stats"> <div className="stats">

@ -28,7 +28,7 @@ function ErrorPage({ code = "", msg = "Something is wrong"}) {
</div> </div>
<div className='centerDivH' style={{margin: "20px"}}> <div className='centerDivH' style={{margin: "20px"}}>
<Button href={`${basePath}/`} variant='danger'>Retour à l'accueil</Button> <Button href={`${basePath}/`} variant='danger'><FormattedMessage id='BackHome'/></Button>
</div> </div>
</div> </div>
); );

@ -1,124 +1,90 @@
/* Styles for the Winner and Indice section */
.head{ .head {
display: flex; display: flex;
justify-content: center; justify-content: center;
flex-direction: column;
align-items: center;
}
.leaderboard-header{
display: flex;
justify-content: center;
flex-direction: column;
align-items: center; align-items: center;
}
width: fit-content; .leaderboard-header {
border: 2px solid;
border-radius: 0px 0px 30px 30px; border-color: #0064E0;
border: solid;
border-width: 0 5px;
padding: 20px; padding: 20px;
} text-align: center;
border-radius: 0px 0px 10px 10px;
.bottomEnd{ }
display: flex;
justify-content: space-around;
}
.winner{
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
}
.playersContainer { /* Styles for the Winner's details */
.winner-details {
display: flex; display: flex;
flex-direction: column;
align-items: center; align-items: center;
/* padding-left: "5px"; */ justify-content: center;
}
width: 100px;
background-color: red; .winner-details img {
} width: 75px;
height: 75px;
.playerContainer{ border-radius: 50%;
/* display: flex; margin-right: 10px;
align-items: center; */ }
/* flex-direction: column; */
/* Styles for the Indice Display */
/* width: 300px; */ .indiceDisplay {
width: 30%; border: 2px solid whitesmoke;
margin-bottom: 20px; border-radius: 10px;
/* margin-bottom: 10px; */ margin: 5px; /* Réduire la marge */
padding: 8px; /* Réduire le rembourrage */
border: solid 1px whitesmoke; box-shadow: 3px 3px 3px rgb(246, 246, 246); /* Réduire l'ombre */
border-radius: 15px; }
background-color: white;
}
.losingPlayersContainer{ /* Styles for the Losing Players Container */
.losingPlayersContainer {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-evenly; justify-content: space-evenly;
margin: 5px;
}
margin: 10px 0; /* Styles for individual Player Containers */
.playerContainer {
max-width: 50%;
overflow-y: scroll;
max-height: 200px;
/* background-color: yellow; */
}
.indiceDisplay{
border: solid 2px whitesmoke;
border-radius: 10px;
margin: 0 15px 0 15px;
padding: 10px;
box-shadow: 5px 5px 5px rgb(246, 246, 246);
}
.SoloContainer{
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
margin-top: 30px;
border: solid 1px whitesmoke; margin-bottom: 30px;
border: 1px solid whitesmoke;
border-radius: 15px; border-radius: 15px;
background-color: white; background-color: white;
}
max-width: 50%; .soloContainer {
}
.indicesolo{
display: flex; display: flex;
flex-wrap: wrap; justify-content: center;
justify-content: space-evenly; align-items: center;
width: 100%; /* Ajoutez cette ligne pour occuper toute la largeur */
/* margin: 10px 0; */ }
/* max-height: 200px; */
}
.solostat{
display: flex;
justify-content: space-between;
width: 70%;
}
.solostat p { .solostat{
border: solid 1px whitesmoke; border: solid 1px whitesmoke;
border-radius: 15px; border-radius: 15px;
background-color: white; background-color: white;
padding: 10px; padding: 10px;
} margin: 5px;
width: fit-content; /* Ajoutez cette ligne pour ajuster la largeur au contenu */
}
.center {
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
}
#vis-graph { /* Styles for the Graph Container */
#vis-graph {
height: 500px; height: 500px;
margin: 50px; margin: 5px;
border: 2px solid #ccc; border: 2px solid #ccc;
overflow: hidden; overflow: hidden;
} }

@ -35,7 +35,7 @@ import Player from '../model/Player';
import { useGame } from '../Contexts/GameContext'; import { useGame } from '../Contexts/GameContext';
/* Boostrap */ /* Boostrap */
import { Button } from 'react-bootstrap'; import { Button, Col, Container, Row } from 'react-bootstrap';
import Bot from '../model/Bot'; import Bot from '../model/Bot';
import {basePath} from "../AdressSetup" import {basePath} from "../AdressSetup"
@ -147,77 +147,191 @@ function EndGame({lang}: {lang: string}) {
}, 2000); }, 2000);
}; };
return ( return (
<div> <div style={{overflow:"hidden"}}>
{playTurnSound && <audio src={WinSound} autoPlay />} {playTurnSound && <audio src={WinSound} autoPlay />}
{!IsSolo ? ( {!IsSolo ? (
<div> <Container>
<div className="head"> {/* Winner et son indice */}
<header className='leaderboard-header' style={{ borderColor: theme.colors.primary }}> <Row>
<h1>{winner?.pseudo} a gagné !</h1> <Col>
<h3>Le coupable était <u>{person?.getName()}</u></h3> <div className="losingPlayersContainer">
</header> {/* Indices pairs */}
</div> {players.map((player, index) => (
<div className='winner'> index % 2 == 0 && (
<img src={Person} width='250' height='250'/> <div className="playerContainer" key={index}>
<PersonStatus img={Person} state={Person} key={index} name={player.pseudo} playerTouched={1} setPlayerTouched={() => {}} index={index} playerIndex={-2} showCircle={false} askedWrong={false}/>
{!indicenull && (<h3 className='indiceDisplay'>{indices[players.findIndex((p) => p.id == winner?.id)].ToString(lang)}</h3>)} {!indicenull && (<h6 className='indiceDisplay'>{indices[players.findIndex((p) => p.id == player?.id)].ToString(lang)}</h6>)}
</div> </div>
<div className='bottomEnd'> )
{/* <div className='centerDivH' onClick={resetAll}> ))}
<BigButtonNav dest="/play" img={Leave}/> </div>
</div> */} </Col>
<div className="losingPlayersContainer">
{players.map((player, index) => ( <Col xs={6}>
player.id !== winner?.id && ( <Row>
<div className="playerContainer" key={index}> <div className="head">
<PersonStatus img={Person} state={Person} key={index} name={player.pseudo} playerTouched={1} setPlayerTouched={() => {}} index={index} playerIndex={-2} showCircle={false} askedWrong={false}/> <header className='leaderboard-header' style={{ borderColor: theme.colors.primary }}>
{!indicenull && (<h6 className='indiceDisplay'>{indices[players.findIndex((p) => p.id == player?.id)].ToString(lang)}</h6>)} <h4>{winner?.pseudo} a gagné !</h4>
</div> <h5>Le coupable était <u>{person?.getName()}</u></h5>
) </header>
))} </div>
</div> </Row>
</div> <Row>
</div> <div id="vis-graph"></div>
</Row>
<Row className="justify-content-md-center">
<Button href={`${basePath}/`} style={{
width:"50%",
margin:"10px"
}}>Retour à l'accueil</Button>
</Row>
</Col>
<Col>
<div className="losingPlayersContainer">
{players.map((player, index) => (
index % 2 == 1 && (
<div className="playerContainer" key={index}>
<PersonStatus img={Person} state={Person} key={index} name={player.pseudo} playerTouched={1} setPlayerTouched={() => {}} index={index} playerIndex={-2} showCircle={false} askedWrong={false}/>
{!indicenull && (<h6 className='indiceDisplay'>{indices[players.findIndex((p) => p.id == player?.id)].ToString(lang)}</h6>)}
</div>
)
))}
</div>
</Col>
</Row>
</Container>
): ( ): (
<div> <Container fluid>
<div className="head"> {/* Perd une énigme */}
<header className='leaderboard-header' style={{ borderColor: theme.colors.primary }}> {!winner && (
<h1>Vous avez gagné !</h1> <Row>
<h3>Le coupable était <u>{person?.getName()}</u></h3> <Col>
</header> <Row>
</div> <div className="head">
<div className='winner'> <header className='leaderboard-header' style={{ borderColor: theme.colors.primary }}>
<img src={Person} width='250' height='250'/> <h4>Vous avez perdu !</h4>
<h1>{winner?.pseudo}</h1> <h5>Le coupable était <u>{person?.getName()}</u></h5>
</div> </header>
</div>
<div className='bottomEnd'>
<div className="SoloContainer">
<div className='solostat'>
{!IsDaily && <p>Nombre de coups : {nbCoup}</p> }
<p>Temps : {temps}s</p>
</div>
<div className='indicesolo'>
{indices.map((indice, index) => (
// <div className="playerContainer" key={index}>
<div>
<h6 className='indiceDisplay'> <u>Indice {index+1}</u> : {indice.ToString(lang)}</h6>
</div>
//</div>
))
}
</div>
</div>
</div>
</div>
)}
<div id="vis-graph"/>
<div className='centerDivH' onClick={resetAll} style={{margin: "20px"}}> <Row>
<Button href={`${basePath}/`}>Retour à l'accueil</Button> {!IsDaily &&
</div> <Col className='center'>
<p className='solostat'>Nombre de coups : {nbCoup}</p>
</Col>
}
<Col className='center'>
<p className='solostat'>Temps : {temps}s</p>
</Col>
</Row>
</Row>
<Row>
<Col>
{indices.map((indice, index) => (
index % 2 == 0 && (
<div className='playerContainer'>
<h6 className='indiceDisplay'> <u>Indice {index+1}</u> : {indice.ToString("fr")}</h6>
</div>
)
))}
</Col>
<Col xs={6}>
<div id="vis-graph"></div>
</Col>
<Col>
<div className="losingPlayersContainer">
{indices.map((indice, index) => (
index % 2 == 1 && (
<div className='playerContainer'>
<h6 className='indiceDisplay'> <u>Indice {index+1}</u> : {indice.ToString("fr")}</h6>
</div>
)
))}
</div>
</Col>
</Row>
<Row className="justify-content-md-center">
<Button href={`${basePath}/`} style={{
width:"50%",
margin:"10px"
}}>Retour à l'accueil</Button>
</Row>
</Col>
</Row>
)}
{/* Gagne une énigme */}
{winner && (
<Row>
<Col>
<Row>
<div className="head">
<header className='leaderboard-header' style={{ borderColor: theme.colors.primary }}>
<h4>Vous avez gagné !</h4>
<h5>Le coupable était <u>{person?.getName()}</u></h5>
</header>
</div>
<Row>
{!IsDaily &&
<Col className='center'>
<p className='solostat'>Nombre de coups : {nbCoup}</p>
</Col>
}
<Col className='center'>
<p className='solostat'>Temps : {temps}s</p>
</Col>
</Row>
</Row>
<Row>
<Col>
{indices.map((indice, index) => (
index % 2 == 0 && (
<div className='playerContainer'>
<h6 className='indiceDisplay'> <u>Indice {index+1}</u> : {indice.ToString("fr")}</h6>
</div>
)
))}
</Col>
<Col xs={6}>
<div id="vis-graph"></div>
</Col>
<Col>
<div className="losingPlayersContainer">
{indices.map((indice, index) => (
index % 2 == 1 && (
<div className='playerContainer'>
<h6 className='indiceDisplay'> <u>Indice {index+1}</u> : {indice.ToString("fr")}</h6>
</div>
)
))}
</div>
</Col>
</Row>
<Row className='justify-content-center'>
<Button href={`${basePath}/`} style={{
width:"50%",
margin:"10px"
}}>Retour à l'accueil</Button>
</Row>
</Col>
</Row>
)}
</Container>
)}
</div> </div>
); );
} }

@ -3,7 +3,6 @@
justify-content: space-between; justify-content: space-between;
/* background-color: #D7D4C6; */ /* background-color: #D7D4C6; */
background-color: #fff; background-color: #fff;
min-height: 100vh;
font-size: calc(10px + 2vmin); font-size: calc(10px + 2vmin);
/* color: #2A4541; */ /* color: #2A4541; */
} }

@ -41,76 +41,90 @@ function Home() {
}, [isLoggedIn]); }, [isLoggedIn]);
return ( return (
<div className="home-container" style={{overflow:"hidden"}}>
<div className="left-section">
<div>
{/* <h2><FormattedMessage id="home.histoire.title"/></h2> */}
<h2>Introduction</h2>
<p style={{fontSize:"14px"}}>
{/* <FormattedMessage id="home.histoire" /> */}
Bienvenue dans notre jeu de déduction captivant, où l'intrigue et la malice se rejoignent dans une aventure palpitante !
Plongez-vous dans un monde de mystère et d'intrigue, où chaque interaction compte, et chaque indice vous rapproche de la vérité.
Imaginez un graphique complexe où chaque sommet représente une personne, chaque axe une relation, et chaque détail compte.
Vous êtes plongé dans un défi stimulant pour découvrir qui parmi ces individus est le mystérieux coupable.
Chaque joueur détient un indice crucial, et seul le partage stratégique de ces indices vous mènera à la résolution du mystère.
Explorez notre page de règles pour comprendre les subtilités du jeu, découvrez les indices qui peuvent vous guider, et élaborez des stratégies intelligentes pour identifier le coupable.
Manipuler vos amis, afin d'être le premier à découvrir qui est le meurtrier !
Êtes-vous prêt à relever le défi et à démasquer le coupable caché dans le graphe ? Que l'enquête commence !
</p>
</div>
<div className="home-container"> <hr/>
<div className="left-section"> <div>
<h2><FormattedMessage id="home.jeu.title"/></h2>
<p style={{fontSize:"14px"}}>
{/* <FormattedMessage id="home.jeu" /> */}
Dans l'univers captivant de notre jeu de déduction, la tromperie et la ruse sont les maîtres mots de la réussite. Explorez le mystère qui se dissimule derrière chaque interaction de notre graphique complexe, dévoilant les liens entre les individus.
</p>
<div> <p style={{fontSize:"14px"}}>
{/* <h2><FormattedMessage id="home.histoire.title"/></h2> */} {/* <FormattedMessage id="home.jeu" /> */}
<h2>Introduction</h2> Votre mission ultime ? Découvrir qui parmi les individus est le coupable, mais n'attendez pas une collaboration ouverte. Utilisez plutôt la manipulation subtile pour embrouiller les pistes, détourner l'attention de vos adversaires. Posez des questions stratégiques, répondez avec malice et plantez des indices trompeurs pour vous rapprocher du dénouement.
<p> </p>
{/* <FormattedMessage id="home.histoire" /> */}
Bienvenue dans notre jeu de déduction captivant, où l'intrigue et la malice se rejoignent dans une aventure palpitante ! Plongez-vous dans un monde de mystère et d'intrigue, où chaque interaction compte, et chaque indice vous rapproche de la vérité.Imaginez un graphique complexe où chaque sommet représente une personne, chaque axe une relation, et chaque détail compte. Vous êtes plongé dans un défi stimulant pour découvrir qui parmi ces individus est le mystérieux coupable. Chaque joueur détient un indice crucial, et seul le partage stratégique de ces indices vous mènera à la résolution du mystère. Explorez notre page de règles pour comprendre les subtilités du jeu, découvrez les indices qui peuvent vous guider, et élaborez des stratégies intelligentes pour identifier le coupable. Manipuler vos amis, afin d'être le premier à découvrir qui est le meurtrier ! Êtes-vous prêt à relever le défi et à démasquer le coupable caché dans le graphe ? Que l'enquête commence ! <p style={{fontSize:"14px"}}>
</p> {/* <FormattedMessage id="home.jeu" /> */}
Chaque occasion offre la possibilité de semer le doute parmi vos adversaires. Lorsqu'un joueur vous interroge, répondez en plaçant adroitement un jeton carré pour suggérer que "selon votre indice, cette personne ne peut être le coupable", ou un jeton rond pour indiquer qu'elle reste dans la liste des suspects. Soyez vigilant, chaque geste peut être interprété, et la vérité se dissimule souvent derrière une façade d'indices trompeurs.
</p>
<p style={{fontSize:"14px"}}>
{/* <FormattedMessage id="home.jeu" /> */}
Si un joueur place un jeton carré, le questionneur doit également jouer son jeu en plaçant un jeton carré de sa couleur sur un nœud du graphique. La contre-manipulation devient ainsi une arme redoutable pour détourner l'accusation et semer la confusion. Pour en savoir plus, plongez-vous dans les détails de ce passionnant récit sur une autre page.
</p>
<h5>Pour des informations plus détaillées, consulter les <Link to={`${basePath}/info`}>règles</Link>.</h5>
<hr/>
</div>
<div>
<h6>Jeu inspiré par le jeu de société "Cryptide"</h6>
</div>
</div> </div>
<div>
<h2><FormattedMessage id="home.jeu.title"/></h2>
<p>
{/* <FormattedMessage id="home.jeu" /> */}
Dans l'univers captivant de notre jeu de déduction, la tromperie et la ruse sont les maîtres mots de la réussite. Explorez le mystère qui se dissimule derrière chaque interaction de notre graphique complexe, dévoilant les liens entre les individus.
Votre mission ultime ? Découvrir qui parmi les individus est le coupable, mais n'attendez pas une collaboration ouverte. Utilisez plutôt la manipulation subtile pour embrouiller les pistes, détourner l'attention de vos adversaires. Posez des questions stratégiques, répondez avec malice et plantez des indices trompeurs pour vous rapprocher du dénouement. <div className="vertical-divider"></div>
Chaque occasion offre la possibilité de semer le doute parmi vos adversaires. Lorsqu'un joueur vous interroge, répondez en plaçant adroitement un jeton carré pour suggérer que "selon votre indice, cette personne ne peut être le coupable", ou un jeton rond pour indiquer qu'elle reste dans la liste des suspects. Soyez vigilant, chaque geste peut être interprété, et la vérité se dissimule souvent derrière une façade d'indices trompeurs. <div className="right-section">
{/* <h3><FormattedMessage id="game.time"/></h3>
<h3><FormattedMessage id="game.players"/></h3>
<h3><FormattedMessage id="game.age"/></h3> */}
<h3>
Temps : 20 minutes<br/>
Joueurs : 1 à 6<br/>
Âge : 8ans et +<br/>
</h3>
Si un joueur place un jeton carré, le questionneur doit également jouer son jeu en plaçant un jeton carré de sa couleur sur un nœud du graphique. La contre-manipulation devient ainsi une arme redoutable pour détourner l'accusation et semer la confusion. Pour en savoir plus, plongez-vous dans les détails de ce passionnant récit sur une autre page. <hr/>
</p>
<br/> <h3>
<p>Pour des informations plus détaillées, consulter les <Link to={`${basePath}/info`}>règles</Link>.</p> <u><FormattedMessage id="game.createdBy"/></u><br/>
Chazot Thomas<br/>
Ferreira Pierre<br/>
Marcel Baptiste<br/>
</h3>
{/* <h3> <u><FormattedMessage id="game.illustratedBy"/></u><br/> Kwanchai Moriya</h3> */}
{/* <button>Jouer au jeu</button> */}
<br/> <br/>
</div>
<div>
{/* <h2><FormattedMessage id="home.plus.title"/></h2>
<ul>
<li><FormattedMessage id="home.plus.1"/></li>
<li><FormattedMessage id="home.plus.2"/></li>
<li><FormattedMessage id="home.plus.3"/></li>
</ul> */}
<h2>Présentation Video :</h2>
(ici il y aura la vidéo)
</div>
</div>
<div className="vertical-divider"></div> <Link to={`${basePath}/`} className='button'
style={{
<div className="right-section"> backgroundColor: theme.colors.primary,
{/* <h3><FormattedMessage id="game.time"/></h3> borderColor: theme.colors.secondary
<h3><FormattedMessage id="game.players"/></h3> }}>
<h3><FormattedMessage id="game.age"/></h3> */} <FormattedMessage id="play"/>
<h3> </Link>
Temps : 20 minutes<br/> </div>
Joueurs : 1 à 6<br/>
Âge : 8ans et +<br/>
</h3>
<hr/>
<h3> <u><FormattedMessage id="game.createdBy"/></u><br/>
Chazot Thomas<br/>
Ferreira Pierre<br/>
Marcel Baptiste<br/>
</h3>
{/* <h3> <u><FormattedMessage id="game.illustratedBy"/></u><br/> Kwanchai Moriya</h3> */}
{/* <button>Jouer au jeu</button> */}
<br/>
<Link to={`${basePath}/`} className='button'
style={{
backgroundColor: theme.colors.primary,
borderColor: theme.colors.secondary
}}>
<FormattedMessage id="play"/>
</Link>
</div> </div>
</div>
); );
} }

@ -55,6 +55,7 @@ import {generateLatexCode, generateLatexCodeEnigme} from '../Script/LatexScript'
import Pair from '../model/Pair'; import Pair from '../model/Pair';
import Indice from '../model/Indices/Indice'; import Indice from '../model/Indices/Indice';
import {basePath} from "../AdressSetup" import {basePath} from "../AdressSetup"
import { useAuth } from '../Contexts/AuthContext';
let cptNavigation = 0 let cptNavigation = 0
@ -65,6 +66,7 @@ const InGame = ({locale, changeLocale}) => {
const theme = useTheme(); const theme = useTheme();
const navigate = useNavigate() const navigate = useNavigate()
const {user, manager} = useAuth()
const params = new URLSearchParams(window.location.search); const params = new URLSearchParams(window.location.search);
@ -104,6 +106,7 @@ const InGame = ({locale, changeLocale}) => {
const [askedWrong, setAskedWrong] = useState(false) const [askedWrong, setAskedWrong] = useState(false)
const [importToPdf, setImportToPdf] = useState(false) const [importToPdf, setImportToPdf] = useState(false)
const [importToJSON, setImportToJSON] = useState(false) const [importToJSON, setImportToJSON] = useState(false)
const [firstHistory, setFirstHistory] = useState(true)
const [putCorrectBackground, setPutCorrectBackground] = useState<() => void>(() => {}); const [putCorrectBackground, setPutCorrectBackground] = useState<() => void>(() => {});
const [putGreyBackgroud, setPutGreyBackground] = useState<() => void>(() => {}); const [putGreyBackgroud, setPutGreyBackground] = useState<() => void>(() => {});
@ -324,20 +327,76 @@ const InGame = ({locale, changeLocale}) => {
const [playTurnSound, setPlayTurnSound] = useState(false); const [playTurnSound, setPlayTurnSound] = useState(false);
const [soundPreference, setSoundPreference] = useState(true); // utilisateur const [soundPreference, setSoundPreference] = useState(true); // utilisateur
const [enteredNumber, setEnteredNumber] = useState(25); const [enteredNumber, setEnteredNumber] = useState(user?.nbNodes || 25);
const [enteredNumberIndices, setEnteredNumberIndices] = useState(3); const [enteredNumberIndices, setEnteredNumberIndices] = useState(user?.nbIndices || 3);
//@ts-ignore //@ts-ignore
const handleNumberChange = (event) => { const handleNumberChange = (event) => {
if (parseInt(event.target.value)){
setEnteredNumber(parseInt(event.target.value));
}
};
//@ts-ignore
const handleKeyDown = (event) => {
// Vérifier si la touche appuyée est "Entrée"
if (event.key === 'Enter' && user!==null && parseInt(event.target.value)) {
const newNumber = Math.max(20, Math.min(50, parseInt(event.target.value, 10))); const newNumber = Math.max(20, Math.min(50, parseInt(event.target.value, 10)));
user.nbNodes = newNumber;
setEnteredNumber(newNumber);
}
};
const handleBlur = () => {
if (user!==null){
const newNumber = Math.max(20, Math.min(50, enteredNumber));
user.nbNodes = newNumber;
setEnteredNumber(newNumber); setEnteredNumber(newNumber);
}
}; };
//@ts-ignore //@ts-ignore
const handleNumberIndicesChange = (event) => { const handleNumberIndicesChange = (event) => {
if (parseInt(event.target.value)){
setEnteredNumberIndices(parseInt(event.target.value));
}
};
useEffect(() => {
if (changeGraph){
if (enteredNumber>=20 && enteredNumber<=50 && enteredNumberIndices>=3 && enteredNumberIndices<=6){
console.log(enteredNumber)
console.log(enteredNumberIndices)
manager?.userService.changeNodesIndices(enteredNumber, enteredNumberIndices)
setHistory([]);
setFirstHistory(true)
changeGraph(enteredNumber, enteredNumberIndices)
}
}
else{
setEnteredNumber(user?.nbNodes || 25)
setEnteredNumberIndices(user?.nbIndices || 3)
}
}, [enteredNumber, enteredNumberIndices])
//@ts-ignore
const handleKeyDownIndice = (event) => {
// Vérifier si la touche appuyée est "Entrée"
if (event.key === 'Enter' && user!=null && parseInt(event.target.value)) {
const newNumber = Math.max(3, Math.min(6, parseInt(event.target.value, 10))); const newNumber = Math.max(3, Math.min(6, parseInt(event.target.value, 10)));
user.nbIndices = newNumber;
setEnteredNumberIndices(newNumber); setEnteredNumberIndices(newNumber);
}
};
const handleBlurIndice = () => {
if (user!==null){
const newNumber = Math.max(3, Math.min(6, enteredNumberIndices));
setEnteredNumberIndices(newNumber);
user.nbIndices = newNumber;
}
}; };
const handleSoundPreferenceChange = () => { const handleSoundPreferenceChange = () => {
@ -541,7 +600,7 @@ const InGame = ({locale, changeLocale}) => {
<Offcanvas show={showS} <Offcanvas show={showS}
onHide={handleCloseS} onHide={handleCloseS}
placement='top' placement='top'
style={{height: '60%', width: '30%', left: '70%' }}> style={{height: '80%', width: '30%', left: '70%' }}>
<Offcanvas.Header closeButton> <Offcanvas.Header closeButton>
<Offcanvas.Title><img src={Param} alt='param'/> <FormattedMessage id='param'/></Offcanvas.Title> <Offcanvas.Title><img src={Param} alt='param'/> <FormattedMessage id='param'/></Offcanvas.Title>
</Offcanvas.Header> </Offcanvas.Header>
@ -553,54 +612,47 @@ const InGame = ({locale, changeLocale}) => {
</label> </label>
{IsSolo && {IsSolo &&
<div className='nbNodeDiv'> <div className='nbNodeDiv' style={{ padding:'20px'}}>
<label htmlFor="numberInput"><FormattedMessage id='param.node'/> :</label> <label htmlFor="numberInput"><FormattedMessage id='param.node'/> :</label>
<div> <div>
<button className='valuebutton' onClick={() => { if (enteredNumber>20) setEnteredNumber(enteredNumber-1)}} <button className='valuebutton' onClick={() => { if (enteredNumber>20 && user !== null){ setEnteredNumber(enteredNumber-1); user.nbNodes = user.nbNodes-1; setHistory([]); }}}
style={{borderColor:theme.colors.secondary}}> - </button> style={{borderColor:theme.colors.secondary}}> - </button>
<input <input
// type="number" // type="number"
style={{textAlign:'center'}} style={{textAlign:'center', border: 'none', width: '100px'}}
id="numberInput" id="numberInput"
disabled
value={enteredNumber} value={enteredNumber}
onChange={handleNumberChange} onChange={handleNumberChange}
min={20} onKeyDown={handleKeyDown} // Ajout de l'événement onKeyDown
max={60}/> onBlur={handleBlur} // Ajout de l'événement onBlur
<button className='valuebutton' onClick={() => { if (enteredNumber<50) setEnteredNumber(enteredNumber+1)}} />
<button className='valuebutton' onClick={() => { if (enteredNumber<50 && user!==null){ setEnteredNumber(enteredNumber+1); user.nbNodes = user.nbNodes+1 ;setHistory([]); }}}
style={{borderColor:theme.colors.secondary}}> + </button> style={{borderColor:theme.colors.secondary}}> + </button>
</div> </div>
<button onClick={() => {setHistory([]); changeGraph(enteredNumber, enteredNumberIndices)}}
style={{
backgroundColor: theme.colors.tertiary,
borderColor: theme.colors.secondary,
}}><FormattedMessage id='param.valid'/></button>
</div>} </div>}
{IsSolo && {IsSolo &&
<div className='nbNodeDiv'> <div className='nbNodeDiv' style={{ padding:'20px'}}>
<label htmlFor="numberInput"><FormattedMessage id='param.clue'/> :</label> <label htmlFor="numberInput"><FormattedMessage id='param.clue'/> :</label>
<div> <div>
<button className='valuebutton' onClick={() => { if (enteredNumberIndices>3) setEnteredNumberIndices(enteredNumberIndices-1)}} <button className='valuebutton' onClick={() => { if (enteredNumberIndices>3 && user!==null){ setEnteredNumberIndices(enteredNumberIndices - 1); user.nbIndices = user.nbIndices-1; setHistory([]); }}}
style={{borderColor:theme.colors.secondary}}> - </button> style={{borderColor:theme.colors.secondary}}> - </button>
<input <input
// type="number" // type="number"
style={{textAlign:'center'}} style={{textAlign:'center', border: 'none', width: '100px'}}
id="numberInput" id="numberInput"
disabled
value={enteredNumberIndices} value={enteredNumberIndices}
onChange={handleNumberIndicesChange} onChange={handleNumberIndicesChange}
min={3} onKeyDown={handleKeyDownIndice} // Ajout de l'événement onKeyDown
max={6}/> onBlur={handleBlurIndice}/>
<button className='valuebutton' onClick={() => { if (enteredNumberIndices<6) setEnteredNumberIndices(enteredNumberIndices+1)}} <button className='valuebutton' onClick={() => { if (enteredNumberIndices<6 && user!==null){ setEnteredNumberIndices(enteredNumberIndices + 1); user.nbIndices = user.nbIndices+1; setHistory([]); }}}
style={{borderColor:theme.colors.secondary}}> + </button> style={{borderColor:theme.colors.secondary}}> + </button>
</div> </div>
<button onClick={() => {setHistory([]); changeGraph(enteredNumber, enteredNumberIndices)}}
style={{
backgroundColor: theme.colors.tertiary,
borderColor: theme.colors.secondary,
}}><FormattedMessage id='param.valid'/></button>
</div>} </div>}
<div className='centerDivH' style={{margin: "20px"}}>
<Button variant="outline-warning" onClick={() => {setHistory([]); changeGraph(enteredNumber, enteredNumberIndices)}}><FormattedMessage id='regenerate'/></Button>
</div>
<Button variant="outline-danger" href={`${basePath}/`}><FormattedMessage id='BackHome'/></Button>
</div> </div>
</Offcanvas.Body> </Offcanvas.Body>
</Offcanvas> </Offcanvas>

@ -42,7 +42,6 @@ function Lobbies() {
const [showAvailable, setShowAvailable] = useState(true); const [showAvailable, setShowAvailable] = useState(true);
//const [cptNavigation, setCptNavigation] = useState(0);
const handleShowAllClick = () => { const handleShowAllClick = () => {
setShowAvailable(false); setShowAvailable(false);
@ -58,7 +57,7 @@ function Lobbies() {
}; };
const handleSetCptNavigation = () => { const handleSetCptNavigation = () => {
//setCptNavigation((prevCpt) => prevCpt + 1); cptNavigation++
if (cptNavigation % 2 >= 0 && navigationType.toString() === "POP") { if (cptNavigation % 2 >= 0 && navigationType.toString() === "POP") {
socket.emit("player quit"); socket.emit("player quit");

@ -309,9 +309,9 @@ function Lobby() {
<h3><FormattedMessage id='lobby.bienvenue'/></h3> <h3><FormattedMessage id='lobby.bienvenue'/></h3>
<p><FormattedMessage id='lobby.wait'/></p> <p><FormattedMessage id='lobby.wait'/></p>
{/* Bouton pour copier le lien */} {/* Bouton pour copier le lien */}
<Button variant="primary" ref={target} onClick={copyGameLink}> {/* <Button variant="primary" ref={target} onClick={copyGameLink}>
<FormattedMessage id='lobby.invite'/> <FormattedMessage id='lobby.invite'/>
</Button> </Button> */}
<Overlay target={target.current} show={show} placement="top"> <Overlay target={target.current} show={show} placement="top">
{({ {({
placement: _placement, placement: _placement,

@ -96,7 +96,7 @@ function NewPlay() {
} }
function launchMastermind(){ function launchMastermind(){
const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(3, 30) const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(user?.nbIndices || 3, user?.nbNodes || 25)
setPersonData(choosenPerson) setPersonData(choosenPerson)
setPersonNetworkData(networkPerson) setPersonNetworkData(networkPerson)
setIndicesData(choosenIndices) setIndicesData(choosenIndices)
@ -159,7 +159,7 @@ function NewPlay() {
//* Mode facile //* Mode facile
//todo différencier les deux //todo différencier les deux
const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(3, 30) const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(user?.nbIndices || 3, user?.nbNodes || 25)
setPersonData(choosenPerson) setPersonData(choosenPerson)
setPersonNetworkData(networkPerson) setPersonNetworkData(networkPerson)
setIndicesData(choosenIndices) setIndicesData(choosenIndices)
@ -173,7 +173,7 @@ function NewPlay() {
//* Mode facile //* Mode facile
//todo différencier les deux //todo différencier les deux
const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(3, 30) const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(user?.nbIndices || 3, user?.nbNodes || 25)
setPersonData(choosenPerson) setPersonData(choosenPerson)
setPersonNetworkData(networkPerson) setPersonNetworkData(networkPerson)
setIndicesData(choosenIndices) setIndicesData(choosenIndices)
@ -193,7 +193,7 @@ function NewPlay() {
//* Mode difficile //* Mode difficile
//todo différencier les deux //todo différencier les deux
const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(3, 30) const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(user?.nbIndices || 3, user?.nbNodes || 25)
setPersonData(choosenPerson) setPersonData(choosenPerson)
setPersonNetworkData(networkPerson) setPersonNetworkData(networkPerson)
setIndicesData(choosenIndices) setIndicesData(choosenIndices)
@ -255,7 +255,7 @@ function NewPlay() {
</div> </div>
{/* Lobbies */} {/* Lobbies */}
<div style={{border:'solid 1px lightgray', borderRadius:'15px', marginTop:'20px'}}> <div style={{border:'solid 1px lightgray', borderRadius:'15px', marginTop:'20px', minHeight:'400px'}}>
<Lobbies/> <Lobbies/>
</div> </div>
</div> </div>

@ -28,7 +28,7 @@
"indice":"Hint", "indice":"Hint",
"param":"Settings", "param":"Settings",
"sfx":"Activate SFX", "sfx":"Activate sounds",
"aide":"Help", "aide":"Help",
"majUn":"A", "majUn":"A",
@ -101,6 +101,10 @@
"compris": "Understood!", "compris": "Understood!",
"close": "Close", "close": "Close",
"regenerate":"Regenarte graph",
"BackHome" : "Back to home",
"askeveryone" : "Ask everyone",
"color.green":"Green", "color.green":"Green",
"color.blue":"Blue", "color.blue":"Blue",
"color.red":"Red", "color.red":"Red",
@ -136,6 +140,8 @@
"score.titre.online": "Online", "score.titre.online": "Online",
"score.tab.stat" : "Your Stats", "score.tab.stat" : "Your Stats",
"score.tab.quoti" : "Daily",
"score.tab.hebdo" : "Weekly",
"lobby.players" : "Players", "lobby.players" : "Players",
"lobby.bienvenue": "Welcome to your lobby!", "lobby.bienvenue": "Welcome to your lobby!",

@ -28,7 +28,7 @@
"indice":"Indice", "indice":"Indice",
"param":"Paramètres", "param":"Paramètres",
"sfx":"Activer les SFX", "sfx":"Activer les sons",
"aide":"Aide", "aide":"Aide",
"majUn":"Un", "majUn":"Un",
@ -98,13 +98,17 @@
"compris":"Compris !", "compris":"Compris !",
"close" : "Fermer", "close" : "Fermer",
"askeveryone" : "Demandez à tous",
"regenerate":"Regénérer le graph",
"BackHome" : "Retour à l'accueil",
"color.green":"Vert", "color.green":"Vert",
"color.blue":"Bleu", "color.blue":"Bleu",
"color.red":"Rouge", "color.red":"Rouge",
"color.yellow":"Jaune", "color.yellow":"Jaune",
"play.jouerseul": "Jouer seul", "play.jouerseul": "Mastermind",
"play.enigme": "Résoudre une énigme", "play.enigme": "Résoudre une énigme",
"play.enigme.easy": "Facile", "play.enigme.easy": "Facile",
"play.enigme.medium": "Intermédiaire", "play.enigme.medium": "Intermédiaire",
@ -134,6 +138,8 @@
"score.titre.online" : "En ligne", "score.titre.online" : "En ligne",
"score.tab.stat" : "Vos Stats", "score.tab.stat" : "Vos Stats",
"score.tab.quoti" : "Quotidien",
"score.tab.hebdo" : "Hebdomadaire",
"lobby.players" : "Joueurs", "lobby.players" : "Joueurs",
"lobby.bienvenue" : "Bienvenue dans votre lobby !", "lobby.bienvenue" : "Bienvenue dans votre lobby !",
@ -345,7 +351,7 @@
"tuto.txt.14.6.5":" pour deviner, bonne chance !", "tuto.txt.14.6.5":" pour deviner, bonne chance !",
"history.mis":" à mis un ", "history.mis":" a mis un ",
"à":"à", "à":"à",
"history.cantPose":" ne peut plus poser de carré", "history.cantPose":" ne peut plus poser de carré",
"history.NotCoupable":" n'est pas le coupable !" "history.NotCoupable":" n'est pas le coupable !"

@ -41,6 +41,8 @@ class DbUserService implements IUserService{
nbWins: sessionData.user.onlineStats.nbWins, nbWins: sessionData.user.onlineStats.nbWins,
ratio: sessionData.user.onlineStats.ratio, ratio: sessionData.user.onlineStats.ratio,
}); });
currentUser.nbNodes = sessionData.user.nbNodes || 25
currentUser.nbIndices = sessionData.user.nbIndices || 3
return [currentUser, true]; return [currentUser, true];
} }
@ -76,6 +78,9 @@ class DbUserService implements IUserService{
ratio: 0, ratio: 0,
}); });
guestUser.nbNodes = 25
guestUser.nbIndices = 3
return [guestUser, false]; return [guestUser, false];
} }
} catch (error) { } catch (error) {
@ -148,6 +153,19 @@ class DbUserService implements IUserService{
console.error(error); console.error(error);
} }
} }
async changeNodesIndices(nbNodes: number, nbIndices: number): Promise<void> {
try {
const result = await SessionService.changeNodesIndices(nbNodes, nbIndices);
if (result) {
console.log("Nodes updated");
} else {
console.log("Nodes not updated");
}
} catch (error) {
console.error(error);
}
}
} }
export default DbUserService export default DbUserService

@ -2,6 +2,7 @@ import User from "../User";
interface IUserService{ interface IUserService{
fetchUserInformation(): Promise<[User | null, boolean]> fetchUserInformation(): Promise<[User | null, boolean]>
changeNodesIndices(nbNodes: number, nbIndices: number): Promise<void>
addMastermindStats(pseudo: string, score: number, time: number): Promise<void> addMastermindStats(pseudo: string, score: number, time: number): Promise<void>
addEasyEnigmaStats(pseudo: string, win: number, time: number): Promise<void> addEasyEnigmaStats(pseudo: string, win: number, time: number): Promise<void>
addMediumEnigmaStats(pseudo: string, score: number, time: number): Promise<void> addMediumEnigmaStats(pseudo: string, score: number, time: number): Promise<void>

@ -7,6 +7,8 @@ class User extends Player{
public mediumEnigmaStats: any public mediumEnigmaStats: any
public hardEnigmaStats: any public hardEnigmaStats: any
public onlineStats: any public onlineStats: any
public nbNodes: number = 25
public nbIndices: number = 3
constructor(id: string, pseudo: string, profilePicture: string, soloStats: any, easyEnigmaStats: any, mediumEnigmaStats: any, hardEnigmaStats: any, onlineStats: any){ constructor(id: string, pseudo: string, profilePicture: string, soloStats: any, easyEnigmaStats: any, mediumEnigmaStats: any, hardEnigmaStats: any, onlineStats: any){
super(id, pseudo, profilePicture || defaultImg) super(id, pseudo, profilePicture || defaultImg)

@ -24,6 +24,34 @@ class SessionService {
} }
} }
static async changeNodesIndices(nbNodes: number, nbIndices: number) {
try {
const response = await fetch(ADRESSE_DBSERVER + '/session/updateNbNodes', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
nbNodes,
nbIndices
}),
credentials: 'include',
});
if (response.ok) {
const result = await response.json();
return result;
} else {
const errorResponse = await response.json();
throw new Error(errorResponse.error);
}
} catch (error) {
console.error(error);
throw error;
}
}
static async addMastermindStats(pseudo: string, score: number, time: number){ static async addMastermindStats(pseudo: string, score: number, time: number){
try { try {
const response = await fetch(ADRESSE_DBSERVER + '/session/addMastermindStats', { const response = await fetch(ADRESSE_DBSERVER + '/session/addMastermindStats', {

Loading…
Cancel
Save