Dans mon jeu d'échecs par e-mail il existe un bouton de rappel qui est utilisé pour rappeler à l'adversaire de jouer.
Cependant celui ci pour une raison qui m'est inconnu ne fonctionne plus.
Voici en image où il se trouve:
Le message apparaissant lorsque l'on clique dessus:
Le fichier commands.js en ligne 174
// these functions interact with the server
function disableButtons( )
{
if ( ! watchgame)
{
getObject("btnUndo").disabled = true;
getObject("btnDraw").disabled = true;
getObject("btnResign").disabled = true;
//document.querySelector('btnUndo').disabled = true;
//document.querySelector('btnDraw').disabled = true;
//document.querySelector('btnResign').disabled = true;
}
}
function undo( )
{
disableButtons( );
document.gamedata.requestUndo.value = "yes";
my_alert("gamedata.requestUndo = " + document.gamedata.requestUndo.value);
document.gamedata.submit( );
}
function draw( )
{
disableButtons( );
document.gamedata.requestDraw.value = "yes";
my_alert("gamedata.requestDraw = " + document.gamedata.requestDraw.value);
document.gamedata.submit( );
}
function resigngame( )
{
disableButtons( );
document.gamedata.resign.value = "yes";
my_alert("gamedata.resign = " + document.gamedata.resign.value);
document.gamedata.submit( );
}
function displayMainmenu( )
{
this.disabled = true;
disableButtons( );
window.open('index.php', '_self');
}
function reloadPage(btnReload)
{
btnReload.disabled = true;
disableButtons( );
window.open('chess.php', '_self');
}
function downloadPGN( )
{
window.open('./includes/openpgn.inc.php', '_self')
}
function replay( )
{
if (document.gamemenu.btnReplay.value == "Revoir partie")
{
document.gamemenu.btnReplay.value = "Continue";
// pause the refresh timer
clearTimeout(intervalId);
// disable the board
isBoardDisabled = true;
// run the replay scripts
var replayBoard = htmlBoard( );
getObject('chessboard').innerHTML = replayBoard;
// reset the moves with movable ones
displayMoves(true);
// get the FEN array
currMoveIdx = FEN.length - 1;
// display the captured pieces
FENToCapt(numMoves);
displayCaptPieces( );
// make the replay buttons and hide game buttons
getObject('gamebuttons').style.display = 'none';
var navButtons = '<form id="navigation" action="">';
navButtons += '<span id="navbuttons">';
navButtons += '<input id="start" title="Début" type="button" value="Début" />';
navButtons += '<input id="jmpback" title="5 demi-coups avant" type="button" value=" << " />';
navButtons += '<input id="prev" title="1 demi-coup avant" type="button" value=" < " />';
navButtons += '<input id="next" title="1 demi-coup après" type="button" value=" > " />';
navButtons += '<input id="jmpfwd" title="5 demi-coups après" type="button" value=" >> " />';
navButtons += '<input id="end" title="Fin" type="button" value="Fin" /><br>';
navButtons += '<input style="width:100px" id="invert" title="Inverser" type="button" value="< Tourner" />';
navButtons += '<input style="width:100px" id="invert2" title="Inverser" type="button" value="Tourner >" disabled />';
navButtons += '</span>';
navButtons += '</form>';
getObject('gamenav').innerHTML = navButtons;
function invert1(){ /*toggleInvert( )*/
document.getElementById("invert").disabled = true;
document.getElementById("invert2").disabled = false;
document.getElementById("theBoard").style.transform = "rotate(180deg)";
document.getElementById("theBoard").style.transition = ".3s";
for (var i=0; i < 64; i++) {
var element = document.getElementById("sq"+i);
if (typeof(element) != 'undefined' && element != null)
{
document.getElementById("sq"+i).style.transform = "rotate(180deg)";
}
}
};
function invert2(){ /*toggleInvert( )*/
document.getElementById("invert2").disabled = true;
document.getElementById("invert").disabled = false;
document.getElementById("theBoard").style.transform = "rotate(0deg)";
document.getElementById("theBoard").style.transition = ".3s";
for (var i=0; i < 64; i++) {
var element = document.getElementById("sq"+i);
if (typeof(element) != 'undefined' && element != null)
{
document.getElementById("sq"+i).style.transform = "rotate(0deg)";
//document.getElementById("theBoard").style.transition = ".3s";
}
}
//document.getElementById("invert").style.display = "block";
//document.getElementById("invert2").style.display = "none";
};
// set the replay button actions - définir les actions du bouton de relecture
getObject("start").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(-10000);invert1();}else{moveJmp(-10000)} ;};
getObject("jmpback").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(-5);invert1();}else{moveJmp(-5)};};
getObject("prev").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(-1);invert1();}else{moveJmp(-1)};};
getObject("next").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(1);invert1();}else{moveJmp(1)};};
getObject("jmpfwd").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(5);invert1();}else{moveJmp(5)};};
getObject("end").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(10000);invert1();}else{moveJmp(10000)};};
getObject("invert").onclick = function( ){invert1()};
getObject("invert2").onclick = function( ){invert2()};
//document.querySelector('start').onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(-10000);invert1();}else{moveJmp(-10000)} ;};
//document.querySelector('jmpback').onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(-5);invert1();}else{moveJmp(-5)};};
//document.querySelector('prev').onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(-1);invert1();}else{moveJmp(-1)};};
//document.querySelector('next').onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(1);invert1();}else{moveJmp(1)};};
//document.querySelector('jmpfwd').onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(5);invert1();}else{moveJmp(5)};};
//document.querySelector('end').onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(10000);invert1();}else{moveJmp(10000)};};
//document.querySelector('invert').onclick = function( ){invert1()};
//document.querySelector('invert2').onclick = function( ){invert2()};
}
else if (document.gamemenu.btnReplay.value == "Continue")
{
// just refresh the page, everything resets itself
window.location.replace('chess.php');
}
}
function wakeUp( )
{
if (confirm('Confirmez le mail de rappel.'))
{
document.wakeup.submit( );
}
}
function promotepawn( )
{
var blackPawnFound = false;
var whitePawnFound = false;
var i = -1;
// search for the promoting pawn
while ( ! blackPawnFound && ! whitePawnFound && i < 8)
{
i++;
/* check for black pawn being promoted */
if (board[0][i] == (BLACK | PAWN))
blackPawnFound = true;
/* check for white pawn being promoted */
if (board[7][i] == (WHITE | PAWN))
whitePawnFound = true;
}
/* to which piece is the pawn being promoted to? */
var promotedTo = 0;
for (var j = 0; j <= 3; j++)
{
if (document.gamedata.promotion[j].checked)
promotedTo = parseInt(document.gamedata.promotion[j].value);
}
/* change pawn to promoted piece */
var enemyColor = "black";
if (blackPawnFound)
{
enemyColor = "white";
board[0][i] = (BLACK | promotedTo);
my_alert("Promotion pour: (noirs) " + board[0][i]);
}
else if (whitePawnFound)
{
board[7][i] = (WHITE | promotedTo);
my_alert("Promotion pour: (blancs) " + board[7][i]);
}
else
{
alert("ATTENTION ! : Le site ne trouve pas le pion à promouvoir");
}
/* update board and database */
document.gamedata.submit( );
}
Le message d'alerte indiquant que le rappel à échoué:
Le fichier chess.php se rapportant à ce message de rappel échoué en ligne 327:
<?php
// set the session cookie parameters so the cookie is only valid for this game
$parts = pathinfo($_SERVER['REQUEST_URI']);
$path = $parts['dirname'];
if (empty($parts['extension'])) {
$path .= '/'.$parts['jeuxechecs_fr'];
}
$path = str_replace('\\', '/', $path).'/';
session_set_cookie_params(time()+365*24*3600, $path);
session_start( );
//print_r($_COOKIE);
// load 'always needed' settings
require_once './includes/config.inc.php';
require_once './includes/html.inc.php';
// include outside functions
require_once './includes/chessconstants.inc.php';
require_once './includes/chessutils.inc.php';
require_once './includes/gui.inc.php';
require_once './includes/chessdb.inc.php';
//******************************************************************************
// load basic information
//******************************************************************************
// check if loading game
if (isset($_POST['game_id']))
{
$_SESSION['game_id'] = (int) $_POST['game_id'];
}
// make sure we have game id data
if (empty($_SESSION['game_id'])) {
header('Location: index.php');
exit;
}
if (isset($_SESSION['game_id']) || ! isset($_SESSION['white']))
{
// get White's data
$query = "
SELECT p_id
, p_username
, p_email
FROM ".T_PLAYER."
, ".T_GAME."
WHERE ".T_PLAYER.".p_id = ".T_GAME.".g_white_player_id
AND ".T_GAME.".g_id = '{$_SESSION['game_id']}'
";
$_SESSION['white'] = $mysql->fetch_assoc($query, __LINE__, __FILE__);
// get Black's data
$query = "
SELECT p_id
, p_username
, p_email
FROM ".T_PLAYER."
, ".T_GAME."
WHERE ".T_PLAYER.".p_id = ".T_GAME.".g_black_player_id
AND ".T_GAME.".g_id = '{$_SESSION['game_id']}'
";
$_SESSION['black'] = $mysql->fetch_assoc($query, __LINE__, __FILE__);
// get players' color
if ($_SESSION['white']['p_username'] == $_SESSION['username'])
{
$_SESSION['player'] = &$_SESSION['white'];
$_SESSION['player']['p_color'] = 'white';
$_SESSION['opponent'] = &$_SESSION['black'];
$_SESSION['opponent']['p_color'] = 'black';
}
else
{
$_SESSION['player'] = &$_SESSION['black'];
$_SESSION['player']['p_color'] = 'black';
$_SESSION['opponent'] = &$_SESSION['white'];
$_SESSION['opponent']['p_color'] = 'white';
}
// get id960 and position
$query = "
SELECT g_id960
FROM ".T_GAME."
WHERE g_id = '{$_SESSION['game_id']}'
";
$_SESSION['id960'] = $mysql->fetch_value($query, __LINE__, __FILE__);
}
$initpos = id960_to_pos($_SESSION['id960']);
$promoting = false; // init the promotion flag
$undoing = false; // init the undo flag
// get FEN array (this should probably be in an include somewhere)
$i = 0;
$query = "
SELECT h_fen
FROM ".T_HISTORY."
WHERE h_game_id = '{$_SESSION['game_id']}'
ORDER BY h_time
";
$FENarray = $mysql->fetch_value_array($query, __LINE__, __FILE__);
$num_moves = count($FENarray) - 1; // remove one for initpos
loadGame( ); // sets up board using last entry in ".T_HISTORY." table (chessdb.inc.php)
FENtomoves( ); // creates movesArray from FENarray (chessutils.inc.php)
// find out if it's the current player's turn
$FENitems = explode(' ',$FENarray[$num_moves]);
$curTurn = $colorArray[$FENitems[1]]; // convert w -> white, b -> black
$isPlayersTurn = ($curTurn == $_SESSION['player']['p_color']) ? true : false;
//*/
//******************************************************************************
// save incoming information
//******************************************************************************
checkDatabase( ); // check the database data against the current FEN to make sure the game is ended properly (chessdb.inc.php)
processMessages( ); // processes the messages (undo, resign, etc) (chessdb.inc.php)
// are we undoing ?
if ($undoing && 0 < $num_moves)
{
call("UNDO REQUEST");
// just remove the last FEN entered into the history table
$query = "
SELECT MAX(h_time)
FROM ".T_HISTORY."
WHERE h_game_id = '{$_SESSION['game_id']}'
";
$max_time = $mysql->fetch_value($query, __LINE__, __FILE__);
$query = "
DELETE FROM ".T_HISTORY."
WHERE h_game_id = '{$_SESSION['game_id']}'
AND h_time = '{$max_time}'
LIMIT 1
";
$mysql->query($query, __LINE__, __FILE__);
if (!DEBUG) header("Location: ./chess.php");
}
// or saving the promotion
elseif ( isset($_POST['promotion']) && '' != $_POST['promotion'] && false != $_POST['promoting'] )
{
call("SAVING PROMOTION");
savePromotion( ); // inserts promoted piece and saves to database (chessdb.inc.php)
if (!DEBUG) header("Location: ./chess.php");
}
// or making a move
elseif ( ( isset($_POST['fromRow']) && '' != $_POST['fromRow'] && '' != $_POST['fromCol'] && '' != $_POST['toRow'] && '' != $_POST['toCol'] ) || ( isset($_POST['castleMove']) && 'false' != $_POST['castleMove'] ) )
{
call("MAKING A MOVE");
call($_POST);
call($_POST['fromRow']);
/* ensure it's the current player moving */
/* NOTE: if not, this will currently ignore the command... */
/* perhaps the status should be instead? */
/* (Could be confusing to player if they double-click or something */
$is_valid = true;
if ('white' == $curTurn) // white's move
{
call("WHITE");
call($board[$_POST['fromRow']][$_POST['fromCol']]);
// ensure that piece being moved isn't black (and is a piece)
if (('black' == $pieceColor[$board[$_POST['fromRow']][$_POST['fromCol']]]) || ('0' == $board[$_POST['fromRow']][$_POST['fromCol']]))
$is_valid = false; // if test passes, piece was black
}
else // black' move
{
call("BLACK");
call($pieceColor[$board[$_POST['fromRow']][$_POST['fromCol']]]);
// ensure that piece being moved isn't white (and is a piece)
if (("white" == $pieceColor[$board[$_POST['fromRow']][$_POST['fromCol']]]) || ('0' == $board[$_POST['fromRow']][$_POST['fromCol']]))
$is_valid = false; // if test passes, piece was white
}
if ($is_valid)
{
call("IS VALID");
saveGame( ); // (chessdb.inc.php)
// reload a fresh page to avoid errors
// and to display the new database data
if (!DEBUG) header("Location: ./chess.php");
}
}
// or we need to select the promoting piece
elseif ('P' == strtoupper($movesArray[$num_moves]['piece']) && ( ! isset($movesArray[$num_moves]['promo']) || null == $movesArray[$num_moves]['promo']))
{
if($movesArray[$num_moves]['toRow'] == 7 || $movesArray[$num_moves]['toRow'] == 0)
{
$promoting = true;
}
}
//*/
//******************************************************************************
// submit chat message
//******************************************************************************
if (isset($_POST['txtChatbox']) && ('' != $_POST['txtChatbox']))
{
$_POST = sani($_POST);
$private = (isset($_POST['private']) && 'on' == $_POST['private']) ? 'Yes' : 'No';
// select the last post entered and make sure it is not a IE error duplicate message
// (same message within 1 second)
$query = "
SELECT COUNT(*)
FROM ".T_CHAT."
WHERE c_message = '{$_POST['txtChatbox']}'
AND c_time BETWEEN
DATE_SUB(NOW( ), INTERVAL 1 SECOND)
AND DATE_ADD(NOW( ), INTERVAL 1 SECOND)
";
$count = $mysql->fetch_value($query, __LINE__, __FILE__);
date_default_timezone_set('Europe/Paris');
$test = new DateTime();
$d= date_format($test, 'Y-m-d H:i:s');
if (0 == $count)
{
//$dat= date('d-m-Y-G-i',strtotime("+1 hours"));
$query = "
INSERT INTO ".T_CHAT."
(c_game_id, c_player_id, c_time, c_message, c_private)
VALUES
('{$_SESSION['game_id']}', '{$_SESSION['player_id']}', '{$d}', '{$_POST['txtChatbox']}', '{$private}')
";
$mysql->query($query, __LINE__, __FILE__);
}
// refresh the page to avoid double posts
if (!DEBUG) header('Location: chess.php');
}
//*/
//******************************************************************************
// send wake up email
//******************************************************************************
$wake_up_sent = false;
/*echo $_POST['wakeID'];
echo "<br/>";
echo $_SESSION['game_id'];
echo "<br/>";
echo $_POST['wakeID'];
echo "<br/>";
exit();*/
if ( isset($_POST['wakeID']) && $_SESSION['game_id'] == $_POST['wakeID'] )
{
call("webchessMail('wakeup',{$_SESSION['opponent']['p_email']},'',{$_SESSION['username']},{$_SESSION['game_id']})");
$wake_up_sent = webchessMail('wakeup',$_SESSION['opponent']['p_email'],'',$_SESSION['username'],$_SESSION['game_id']);
}
//*/
//******************************************************************************
// load game from database for display
//******************************************************************************
// get FEN array
$query = "
SELECT h_fen
FROM ".T_HISTORY."
WHERE h_game_id = '{$_SESSION['game_id']}'
ORDER BY h_time
";
$FENarray = $mysql->fetch_value_array($query, __LINE__, __FILE__);
$num_moves = count($FENarray) - 1; // remove one for initpos
loadGame( ); // sets up board using last entry in ".T_HISTORY." table (chessdb.inc.php)
// convert the current FEN array to an array of standard moves
FENtomoves( ); // (chessutils.inc.php)
// find out if it's the current player's turn
$FENitems = explode(' ',$FENarray[$num_moves]);
$curTurn = $colorArray[$FENitems[1]];
$isPlayersTurn = ($curTurn == $_SESSION['player']['p_color']) ? true : false;
//*/
// set the display to show whos turn, or shared
if ($_SESSION['shared'])
{
$turn = "Partagé";
}
elseif ($isPlayersTurn)
{
$turn = "Votre coup";
}
else
{
$turn = "Coup adverse";
}
$head_extra = '
<script type="text/javascript">//<![CDATA[
var watchgame = false;
function redo( )
{
window.location.replace(\'chess.php\');
}
';
// ouput confirmation for wake up email
if ($wake_up_sent)
{
$head_extra .= "alert('Envoi Wake Up par e-mail effectué.');\n ";
}
elseif (isset($_POST['wakeID']) && ! $wake_up_sent)
{
$head_extra .= "alert('Envoi Wake Up par e-mail échoué !!');\n ";
}
// transfer game data to javacript vars
$head_extra .= getJSFEN( ); // writes 'FEN' array, and 'result' (gui.inc.php)
$head_extra .= getTurn( ); // writes 'isBoardDisabled', 'isPlayersTurn', and 'perspective' (gui.inc.php)
$head_extra .= getMoves( ); // writes the 'moves' array (gui.inc.php)
$head_extra .= getStatus( ); // writes 'whosMove', 'gameState', and 'statusMsg' (gui.inc.php)
$head_extra .= "var DEBUG = ".JS_DEBUG.";\n ";
$head_extra .= "var numMoves = FEN.length - 1;\n ";
// if it's not the player's turn, enable auto-refresh
$autoRefresh = ( ! $isPlayersTurn && ! isBoardDisabled( ) && ! $_SESSION['shared'] );
$head_extra .= "var autoreload = ";
if ( ! $autoRefresh || (0 == $CFG_MINAUTORELOAD) )
{
$head_extra .= "0";
}
elseif ( $_SESSION['pref_auto_reload'] >= $CFG_MINAUTORELOAD )
{
$head_extra .= $_SESSION['pref_auto_reload'];
}
else
{
$head_extra .= $CFG_MINAUTORELOAD;
}
$vs = get_medal($_SESSION['white']['p_username']).$_SESSION['white']['p_username']." - ".get_medal($_SESSION['black']['p_username']).$_SESSION['black']['p_username'];
$head_extra .= ";
var gameId = '{$_SESSION['game_id']}';
var players = '{$vs}';
var promoting = '{$promoting}';
var isGameOver = '{$isGameOver}';
var lastMoveIndicator = '{$_SESSION['pref_show_last_move']}';
var id960 = '{$_SESSION['id960']}';
var initpos = '{$initpos}';
var parties_gagnees = '{$_SESSION['wins']}';
";
$head_extra .= "var currentTheme = '";
$head_extra .= (isset($_SESSION['pref_theme']) ? $_SESSION['pref_theme'] : "Style A") . '\';
//]]>
</script>
<!-- the \'variables\' javascript must come first !! -->
<script type="text/javascript" src="javascript/variables.js"></script>
<script type="text/javascript" src="javascript/chessutils.js"></script>
<script type="text/javascript" src="javascript/commands.js"></script>
<script type="text/javascript" src="javascript/validation.js"></script>
';
if ($isPlayersTurn || $_SESSION['shared'] || $promoting)
{
$head_extra .= "\n <script type=\"text/javascript\" src=\"javascript/isCheckMate.js\"></script>";
}
if ( ! isBoardDisabled( ) || $_SESSION['shared'])
{
$head_extra .= "\n <script type=\"text/javascript\" src=\"javascript/squareclicked.js\"></script>";
}
$head_extra .= '<script type="text/javascript" src="javascript/board.js"></script>
<script type="text/javascript" src="javascript/highlight.js"></script>
';
echo get_header(null, $turn, $head_extra)
?>
<div id='centrer_jeu'>
<div id="centrer_menu_partie">
<a href="index.php"><input type="button" class="button" value="<= Accueil =>"/></a>
<input type="button" id="btnUndo" class="button" value="Demander à rejouer" />
<input type="button" id="btnDraw" class="button" value="Demander la nulle" disabled="disabled" />
<input type="button" id="btnResign" class="button" value="Abandonner" />
<br/><br/>
</div>
<div id="history">
<?php // case avec dernier coup : ?>
<span style='display:none;' id="curmove"> </span>
<h2 id="players"></h2>
<h2 id="gameid"></h2>
<div id="gamebody"></div>
</div>
<div id="board">
<div id="checkmsg"></div>
<div id="statusmsg"></div>
<br>
<div id="gamebuttons">
<span id="castle">Pour roquer : cliquez sur le roi, et ensuite sur la tour du côté du roque.
<a href="#" class="help" onclick="window.open('./help/c960castling.html','help','resizable,scrollbars,width=550,height=500,top=50,left=50','_blank');return false;">?</a></span>
</div>
<h3>Pièces capturées:</h3>
<div id="captheading"></div>
<div id="captures"></div>
<br>
<div id="date">
<?php
/*timezone();
setlocale(LC_TIME,'fr_FR');
echo 'Nous sommes '.strftime("%A %d %B %Y").'. ';
echo ' Il est: '.strftime("%Hh %M").'<br/>';*/
?>
</div>
<form name="gamedata" method="post" action="chess.php">
<div id="chessboard"></div>
<?php
if ($promoting && ( ! $isPlayersTurn || $_SESSION['shared'])) // Write promotion dialog only to the correct player
{
echo getPromotion( );
}
if ($isUndoRequested)
{
echo getUndoRequest( );
}
if ($isDrawRequested)
{
echo getDrawRequest( );
}
?>
<input type="hidden" name="requestUndo" value="no" />
<input type="hidden" name="requestDraw" value="no" />
<input type="hidden" name="resign" value="no" />
<input type="hidden" name="fromRow" value="" />
<input type="hidden" name="fromCol" value="" />
<input type="hidden" name="toRow" value="" />
<input type="hidden" name="toCol" value="<?php if ($promoting) echo $movesArray[$num_moves]['toCol']; ?>" />
<input type="hidden" name="castleMove" value="false" />
<input type="hidden" name="promoting" value="<?php echo ($promoting ? 'true' : 'false'); ?>" />
</form>
<div id="gamenav"></div>
<form name="gamemenu" id="gamemenu" method="post" action="chess.php" style="display:inline;">
<input type="button" id="btnReload" value="Recharger" disabled="disabled" />
<input type="button" id="btnReplay" value="Revoir partie" disabled="disabled" />
<input type="button" id="btnPGN" value="PGN" disabled="disabled" />
</form>
<form name="wakeup" id="wakeup" method="post" action="chess.php" style="display:inline;">
<?php
// test for opponents email, and if none, disable the wake up button
$temp = ('' == $_SESSION['opponent']['p_email']) ? ' disabled="disabled"' : ''; // check the var and disable if no email is found
?>
<input type="button" id="btnWakeUp" value="Rappel" onclick="wakeUp( );"<?php echo $temp; ?> />
<input type="hidden" name="wakeID" value="<?php echo $_SESSION['game_id']; ?>" /><a href="#" class="help" onclick="window.open('./help/wakeup.html','help','resizable,scrollbars,width=550,height=500,top=50,left=50','_blank');return false;">?</a>
</form>
</div>
<?php
// collect the public chat messages
$query = "
SELECT distinct c_message
, c_private
, p_username
,DAY(c_time) AS jour, MONTH(c_time) AS mois, Year(c_time) AS annee, HOUR(c_time) AS heure, MINUTE(c_time) AS minute
FROM ".T_CHAT."
LEFT JOIN ".T_PLAYER."
ON ".T_CHAT.".c_player_id = ".T_PLAYER.".p_id
WHERE c_game_id = '{$_SESSION['game_id']}'
AND (
(c_private = 'No')
";
// include private message data if game is not shared
if ('1' != $_SESSION['shared'])
{
$query .= "
OR (c_private='Yes'
AND ".T_CHAT.".c_player_id = '{$_SESSION['player_id']}')
";
}
$query .= "
)
ORDER BY c_time DESC
";
$result = $mysql->fetch_array($query, __LINE__, __FILE__);
$i = 0;
// on n'affiche pas le tableau si on a pas de résultats ..
$nb_res = count($result);
if($nb_res > 0){
?>
<div id="chat">
<h2><center>Chat<center></h2>
<div id="date">
<?php
setlocale(LC_TIME,'fr_FR');
//$a=strftime("%A %d %B %Y");
//echo htmlentities($a);
//$y='Nous sommes le '.strftime("%A %d %B %Y").'. ';
echo 'Nous sommes le '.strftime("%A %d %B %Y").'. ';
//echo $y;
echo ' Il est: '.strftime("%Hh %M").'<br/>';
?></div>
<div class="info"></div>
<div id="chatholder">
<table class="chat" style='table-layout: fixed;'>
<col />
<col class="message" />
<tr>
<th style='width:90px' >Joueurs</th>
<th >Messages</th>
</tr>
<?php }else{ ?>
<div id="chat">
<h2>chat</h2>
<div class="info"></div>
<div id="chatholder">
<table class="chat">
<col />
<col class="message" />
<tr>
<th>Aucun message</th>
</tr>
<?php }
foreach ($result as $chat)
{
$alt = ' class="';
$alt .= (0 == $i % 2) ? ' alt' : '';
$alt .= ('Yes' == $chat['c_private']) ? ' mine' : '';
$alt .= ( $_SESSION['username'] != $chat['p_username'] ) ? ' opp' : '';
$alt .= '"';
$mois=array("","/ 01 /","/ 02 /","/ 03 /","/ 04 /","/ 05 /","/ 06 /","/ 07 /","/ 08 /","/ 09 /","/ 10 /","/ 11 /","/ 12 /");
//$mois=array("","janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre");
$chat['c_message']=nl2br($chat['c_message']);
if($chat['minute'] < 10 ){$chat['minute'] = "0".$chat['minute'];}
echo "
<tr{$alt}>
<td class=\"player\">{$chat['p_username']}:<br/>
{$chat['jour']} {$mois[$chat['mois']]} {$chat['annee']}<br/>
{$chat['heure']}:{$chat['minute']}</td>
<td style = 'hyphens: auto;word-wrap: break-word;'> {$chat['c_message']}</td>
</tr>";
$i++;
}
?>
</table>
</div>
<br>
<br>
<form action="chess.php" method="post" name="chatdata" style="display:inline;">
<textarea style="width:339px;max-width:373px;max-height:90px;" name="txtChatbox" tabindex="2" cols="39" rows="4" onfocus="clearTimeout(intervalId);" onblur="if(''==this.value){intervalId = setTimeout('redo( )', autoreload * 1000);}"
tabindex="2" placeholder="Ecrivez vos commentaires ici..."></textarea>
<br>
<!--<label for="private"><input type="checkbox" id="private" name="private" tabindex="1" />Privé</label> -->
<input type="submit" id="btnSubmit" name="chat" tabindex="3" value="Envoi" />
</form>
</div>
</div>
</div>
<div id="footerspacer"> </div>
<?php // NE PAS ENLEVER FENBLOCK : sinon on ne peu plus revoir les coups précédents ?>
<div id="FENblock"></div>
<?php call($GLOBALS);?>
</body>
</html>
<!--
</table>
</div>
<br>
<br>
<form action="chess.php" method="post" name="chatdata" style="display:inline;">
<textarea style="width:339px;max-width:373px;max-height:60px;" name="txtChatbox" tabindex="2" cols="39" rows="4" onfocus="clearTimeout(intervalId);" onblur="if(''==this.value){intervalId = setTimeout('redo( )', autoreload * 1000);}"></textarea>
<br>
<label for="private"><input type="checkbox" id="private" name="private" tabindex="1" />Privé</label>
<input type="submit" id="btnSubmit" name="chat" tabindex="3" value="Envoi" />
</form>
</div>
</div>
</div>
<div id="footerspacer_jeu"> </div>
<?php call($GLOBALS);?>
</body>
</html> -->
<?php
Le fichier board.js où se trouve le bouton en ligne 662
function getObject(obj) {
if (document.getElementById) { // Mozilla, FireFox, Explorer 5+, Opera 5+, Konqueror, Safari, iCab, Ice, OmniWeb 4.5
if (typeof obj == "string") {
if (document.getElementById(obj)) {
return document.getElementById(obj);
} else {
return document.getElementsByName(obj)[0];
}
} else {
return obj.style;
}
}
if (document.all) { // Explorer 4+, Opera 6+, iCab, Ice, Omniweb 4.2-
if (typeof obj == "string") {
return document.all(obj);
} else {
return obj.style;
}
}
if (document.layers) { // Netscape 4, Ice, Escape, Omniweb 4.2-
if (typeof obj == "string") {
return document.layers(obj);
} else {
return obj.style;
}
}
alert('Objet non trouvé : ' + obj);
return false;
}
function isGameDrawn( )
{
var i,j;
// Stalemate? // is all this needed, it is generated in php, so...
if (gameState == 'stalemate')
{
var myColor = WHITE;
if (0 <= numMoves && 'b' == FEN[FEN.length - 1].split(' ')[1])
{
myColor = BLACK;
}
if (0 == countMoves(myColor))
{
alert('Nulle (pat)\nVous devriez offrir la nulle à votre adversaire.');
}
return "stalemate";
}
// Is the game drawn due to insufficient material to checkmate?
var count = 0;
var canCheckmate = false;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
if (board[i][j] != 0 && (board[i][j] & COLOR_MASK) != KING)
{
if ((board[i][j] & COLOR_MASK) != KNIGHT && (board[i][j] & COLOR_MASK) != BISHOP)
canCheckmate = true;
else
count++;
}
}
}
if (count < 2 && ! canCheckmate)
{
alert('Nulle (materiel insuffisant pour mater)\nVous devriez offrir la nulle à votre adversaire.');
return "material";
}
// Is the game drawn because this is the third time that the exact same position arises?
if (numMoves >= 0 && isThirdTimePosDraw(FEN))
{
alert('Nulle (cette position a été rencontrée trois fois)\nVous devriez offrir la nulle à votre adversaire.');
return "3";
}
// Draw because of no capture or pawn move for the last 50 moves?
if (numMoves >= 0 && isFiftyMoveDraw(FEN[FEN.length-1]))
{
alert('Nulle (règle des 50 coups)\nVous devriez offrir la nulle à votre adversaire.');
return "50";
}
return false;
}
function displayCaptPieces( )
{
var i,j;
var color = 'white';
var html = '<div>';
var piece = '';
var item;
for(i = 0; i < captPieces.length; i++)
{
for(j = 0; j < captPieces[i].length; j++)
{
piece = color + '_' + captPieces[i][j];
html += '<img src="images/' + currentTheme + '/' + piece + '.' + ((-1 !== currentTheme.indexOf('gnuchess')) ? 'png' : 'gif') + '" width="';
html += parseInt(50 * 3 / 5) + '" height="' + parseInt(50 * 3 / 5) + '" alt="' + piece + '" />';
}
html += "</div>\n<div>";
color = 'black';
}
html += '</div>';
getObject('captures').innerHTML = html;
}
if (0 < numMoves) { // if we have not made a move yet, don't get the previous move
var prevMove = new previousMove( ); // the previous move info as object
}
var takenPiece = 0; // the captured piece img in the captures section
var captEnPass = 0; // the square the en passant captured pawn was on
function unhighlightCurMove( )
{
unhighlight(getObject('tsq' + prevMove.fromSq));
unhighlight(getObject('tsq' + prevMove.toSq));
if (takenPiece) // if we have a captured piece highlighted
{
unhighlight(takenPiece); // unhighlight it
takenPiece = 0; // and erase the var so we don't keep highlighting it
}
if (captEnPass) // if we have an en passant capture
{
unhighlight(captEnPass); // unhighlight it
captEnPass = 0; // and erase the var so we don't keep highlighting it
}
}
function highlightCurMove( )
{
var item;
// check for en passant move
if (undefined != prevMove.captSq && prevMove.captSq != prevMove.toSq)
{
captEnPass = getObject('tsq' + prevMove.captSq);
}
if (prevMove.captPiece)
{
if ('w' == pieceColor[prevMove.captPiece])
{
item = 'white_' + pieceLtrToName[prevMove.captPiece.toLowerCase( )];
}
else
{
item = 'black_' + pieceLtrToName[prevMove.captPiece.toLowerCase( )];
}
var capt = getObject('captures').getElementsByTagName('img');
var i;
for (i = 0; i < capt.length; i++)
{
if (capt[i].alt == item)
{
takenPiece = capt[i];
break;
}
}
}
highlight(getObject('tsq' + prevMove.fromSq), 'highlighted');
setTimeout('highlightCurMoveTo( )', 300);
setTimeout('unhighlightCurMove( )', 900);
}
function highlightCurMoveTo( )
{
if (takenPiece)
{
highlight(takenPiece, 'taken_highlighted');
if (captEnPass)
{
highlight(captEnPass, 'taken_highlighted');
highlight(getObject('tsq' + prevMove.toSq), 'highlighted');
}
else
{
highlight(getObject('tsq' + prevMove.toSq), 'taken_highlighted');
}
}
else
{
highlight(getObject('tsq' + prevMove.toSq), 'highlighted');
}
}
function displayCurFEN(moveIdx)
{
if (undefined != moveIdx)
{
getObject('FENblock').innerHTML = FEN[moveIdx];
}
else
{
getObject('FENblock').innerHTML = FEN[FEN.length - 1];
}
}
// these will throw errors, but initializing them as 'undefined' is the
// only way to ensure all-around compatibility no matter what the original colors are.
function moveTo(objMoveId)
{
var theBoard;
if (0 < currMoveIdx) // don't try to reset the empty span, it throws errors
{
unhighlight(getObject('m' + currMoveIdx)); // reset the previous move box background color
}
currMoveIdx = parseInt(objMoveId.id.slice(1)); // get the move number
FENToBoard(FEN[currMoveIdx]); // convert that FEN to the board var
displayCurFEN(currMoveIdx); // display that FEN
FENToCapt(currMoveIdx); // get the captures up to that point
displayCaptPieces( ); // display those captures
theBoard = htmlBoard( ); // convert the board var to html code
getObject('chessboard').innerHTML = theBoard; // display that board
highlight(getObject('m' + currMoveIdx), 'curmove_highlighted'); // change the move box background color
}
function moveJmp(moveDelta)
{
var moveIdx = currMoveIdx;
if (moveIdx + moveDelta > FEN.length - 1)
{
moveIdx = FEN.length - 1;
}
else if (moveIdx + moveDelta < 0)
{
moveIdx = 0;
}
else
{
moveIdx += moveDelta;
}
moveTo(getObject('m' + moveIdx + ''));
}
function displayMoves(replay)
{
var i;
var alt = '';
var objGamebody = getObject('gamebody');
var theMoves = '\n<span id="m0"></span>';
var moveId = 1;
theMoves += '\n<table class="moveList">\n';
for (i = 0; i < moves.length; i++)
{
if ( (i + 1) % 2 == 0)
{
alt = ' class="alt"';
}
else
{
alt = '';
}
if ('1' == isGameOver || replay || 'mate' == gameState)
{
theMoves += '<tr'+alt+'>\n<td class="mn">' + (i+1) + '.</td>\n';
theMoves += '<td id="m' + (moveId) + '" class="wm" onclick="moveTo(this);">' + moves[i][0] + '</td>\n';
theMoves += '<td id="m' + (moveId+1) + '" class="bm" onclick="moveTo(this);">' + moves[i][1] + '</td>\n</tr>';
moveId = moveId + 2;
}
else
{
theMoves += '<tr'+alt+'>\n<td class="mn">' + (i+1) + '.</td>\n<td class="wm">';
theMoves += moves[i][0] + '</td>\n<td class="bm">' + moves[i][1] + '</td>\n</tr>';
}
}
theMoves += '\n</table>\n';
if ('' != result)
{
theMoves += '<span class="ctr">Result: ' + result + '</span>\n';
}
objGamebody.innerHTML = theMoves;
element = document.getElementById('gamebody');
element.scrollTop = element.scrollHeight;
}
function toggleInvert( )
{
if ('black' == perspective)
perspective = 'white';
else
perspective = 'black';
theBoard = htmlBoard( );
getObject('chessboard').innerHTML = theBoard;
}
function htmlBoard( )
{ // Returns the HTML-code for the current chessboard (Note: Fixed square size and theme)
var i,j,k;
var classWSquare;
var classBSquare;
var classHeader;
var fileLabel;
var xtra;
var mtra;
var colorside;
var invertBoard = (perspective == 'black');
var rank = 8;
var rankLabel = rank;
if ('' == isBoardDisabled && ! watchgame)
{
classWSquare = 'light_enabled';
classBSquare = 'dark_enabled';
classHeader = 'header_enabled';
}
else
{
classWSquare = 'light_disabled';
classBSquare = 'dark_disabled';
classHeader = 'header_disabled';
}
var sqBackground = [classBSquare, classWSquare];
if (invertBoard)
{
rankLabel = 1;
colorside = "white";
}
else
{
colorside = "black";
}
j = 1;
//changement du plateau selon le nombre de parteis gagnées
if(parties_gagnees < 100){
theBoard = '\n<div id="theBoard" style="background: url(./images/bois.png);">\n';
var couleur = 'style="color:#111;"'; //correspond aux lettres et chiffres du bord de l'échiquier
}else if(parties_gagnees >= 100){
theBoard = '\n<div id="theBoard" style="background: url(./images/marbre.png);">\n';
var couleur = 'style="color:#555;"'; //correspond aux lettres et chiffres du bord de l'échiquier
}
theBoard += '<div class="' + classHeader + ' ' + colorside + 'corner"> <\/div>\n';
for(i = 0; i < 8; i++)
{
if(invertBoard)
fileLabel = Files[7-i];
else
fileLabel = Files[i];
theBoard += '<div '+couleur+' id="file_t' + i + '" class="' + classHeader + ' horz">' + fileLabel + '<\/div>\n';
}
theBoard += '<div class="' + classHeader + ' ' + colorside + 'corner"> <\/div>\n';
theBoard += '<div '+couleur+' id="rank_l' + rank-- + '" class="' + classHeader + ' vert">' + rankLabel + '</div>\n';
for (k = 63; k >= 0; k--)
{
if ((k+1) % 8 == 0)
{
i = k - 7;
if (invertBoard)
i = 63 - i;
}
else
{
if (invertBoard)
i--;
else
i++;
}
var row = parseInt(i / 8);
var col = i % 8;
if (prevMove && row == prevMove.fromRow && col == prevMove.fromCol && '' == isBoardDisabled && ! watchgame && lastMoveIndicator)
xtra = " fromSquare";
else if (prevMove && row == prevMove.toRow && col == prevMove.toCol && '' == isBoardDisabled && ! watchgame && lastMoveIndicator)
xtra = " toSquare";
else
xtra = "";
theBoard += '<div id="tsq' + i + '" class="' + sqBackground[j] + xtra + '">';
var piece = '';
var source = '';
if(board[row][col] != 0)
{
piece = getPieceColor(board[row][col]) + '_' + getPieceName(board[row][col]);
source = 'images/' + currentTheme + '/' + piece + '.' + ((-1 !== currentTheme.indexOf('gnuchess')) ? 'png' : 'gif'); // Update the square
theBoard += '<img alt="' + piece + '" id="sq' + i + '" ';
theBoard += 'src="' + source + '" width="50" height="50" />';
}
else
{
theBoard += '';
}
theBoard += '<\/div>\n';
if ( (k % 8) === 0 )
{
theBoard += '<div '+couleur+' id="rank_r' + (rank+1) + '" class="' + classHeader + ' vert">' + rankLabel + '<\/div>\n';
if (k != 0)
{
if(invertBoard)
rankLabel = 9 - rank;
else
rankLabel = rank;
theBoard += '<div '+couleur+' id="rank_l' + rank-- + '" class="' + classHeader + ' vert">' + rankLabel + '</div>\n';
}
}
else
{
j = 1 - j;
}
}
if ("white" == colorside)
colorside = "black";
else
colorside = "white";
theBoard += '<div '+couleur+' class="' + classHeader + ' ' + colorside + 'corner"> <\/div>\n';
for (i = 0; i < 8; i++)
{
if (invertBoard)
fileLabel = Files[7-i];
else
fileLabel = Files[i];
xtra = "";mtra = ""; // erase any previous values
if ("518" != id960 && "header_disabled" != classHeader) // if we are not in a normal game and not disabled
{
if ("c" == fileLabel || "g" == fileLabel)
{
xtra = "<span class=\"kingto\">K</span>";
mtra = "<span class=\"spacer\">K</span>";
}
else if ("d" == fileLabel)
{
xtra = "<span class=\"rookato\">R</span>";
mtra = "<span class=\"spacer\">R</span>";
}
else if ("f" == fileLabel)
{
xtra = "<span class=\"rookhto\">R</span>";
mtra = "<span class=\"spacer\">R</span>";
}
var LorigARookPos = origARookPos;
var LorigKingPos = origKingPos;
var LorigHRookPos = origHRookPos;
if (invertBoard)
{
LorigARookPos = 7 - LorigARookPos;
LorigKingPos = 7 - LorigKingPos;
LorigHRookPos = 7 - LorigHRookPos;
}
if (i == LorigARookPos)
fileLabel = '<span class="origarook">' + fileLabel + '</span>';
else if (i == LorigKingPos)
fileLabel = '<span class="origking">' + fileLabel + '</span>';
else if (i == LorigHRookPos)
fileLabel = '<span class="orighrook">' + fileLabel + '</span>';
}
theBoard += '<div '+couleur+' id="file_b' + i + '" class="' + classHeader + ' horz">' + mtra + fileLabel + xtra + '<\/div>\n';
}
theBoard += '<div class="' + classHeader + ' ' + colorside + 'corner"> <\/div>\n<\/div>\n';
return theBoard;
}
// only do disabled = true for btnWakeUp, it is set as disabled if no email is present.
FENToBoard(FEN[FEN.length - 1]); // save the last entry in the FEN array to the board
var theBoard = htmlBoard( ); // The HTML code for the board
var currMoveIdx = 0;
var intervalId = 0;
window.onload = function( )
{
var i;
var lastMove;
var navButtons;
var gameIdDisplay;
var invertBoard = (perspective == 'black');
getObject('chessboard').innerHTML = theBoard;
//displayCurFEN( );
FENToCapt(numMoves);
displayCaptPieces( );
if (0 != gameId) // is it a database game ?
{
gameIdDisplay = 'Partie ' + gameId;
getObject('btnPGN').disabled = false;
}
else // or a PGN file game
{
gameIdDisplay = 'PGN Game';
}
if ( ! watchgame)
{
if ('518' != id960) // if it's a Chess960 game
{
gameIdDisplay += ' - ' + id960 // display the id
}
else // or a regular game
{
getObject("castle").style.display = 'none';
}
}
if ('1' != isBoardDisabled && ! watchgame)
{
if (0 < numMoves)
{
getObject("btnUndo").disabled = false;
}
getObject("btnDraw").disabled = false;
getObject("btnResign").disabled = false;
//document.querySelector('btnResign').disabled = false;
}
if ( ! watchgame) // are we playing the game
{
displayMoves( );
getObject("btnReload").disabled = false;
getObject("btnReplay").disabled = false;
getObject("btnReload").onclick = function( ) { reloadPage(this); };
getObject("btnReplay").onclick = function( ) { replay( ); };
if (0 < moves.length) // if there are moves
{
lastMove = moves.length + '-'; // get the move number
if ('' != moves[moves.length-1][1]) // if we are showing a black move
{
getObject('curmove').innerHTML = lastMove + ' ... ' + moves[moves.length-1][1];
}
else // we are showing a white move
{
getObject('curmove').innerHTML = lastMove + ' ' + moves[moves.length-1][0];
}
if ('1' != isGameOver)
{
getObject("curmove").onclick = function( ) { highlightCurMove( ); };
}
}
if ('check' == gameState)
{
getObject('checkmsg').style.display = '';
getObject('checkmsg').innerHTML = 'Echec !';
// convert the board border to red if in check
var divs = document.all ? document.all : document.getElementById("theBoard").getElementsByTagName("div");
for ( var i = 0; i < divs.length; i++)
{
if (divs[i].className.match(/.*?(horz|vert).*?/))
{
divs[i].style.backgroundColor = "#BF2F35"; // TODO : stylefix
}
}
}
if ('' != statusMessage)
{
getObject('statusmsg').style.display = '';
getObject('statusmsg').innerHTML = statusMessage;
// if the statusMessage says anything about undo's
// prevent multiple undo's from being requested
if (statusMessage.match(/ undo /i))
{
getObject('btnUndo').disabled = true;
}
}
}
else // or just watching the game
{
displayMoves(true);
}
getObject('gameid').innerHTML = gameIdDisplay;
getObject('players').innerHTML = players;
//getObject('btnMainMenu').disabled = false;
getObject('btnPGN').disabled = false;
//getObject('btnMainMenu').onclick = function( ) { displayMainmenu( ); };
getObject('btnPGN').onclick = function( ) { downloadPGN( ); };
if ( ! watchgame)
{
getObject("btnUndo").onclick = function() {
alert("Votre demande d'annulation de coup est en attente.");
undo();
};
getObject("btnDraw").onclick = function() {
alert("Votre demande de match nul est en attente.");
draw();
};
getObject("btnResign").onclick = function() {
alert("Votre demande d'abandon est validée.");
resigngame();
};
}
if ('1' == isGameOver || watchgame || 'mate' == gameState) // Allow game replay
{
if ( ! watchgame)
{
getObject('gamebuttons').style.display = 'none';
getObject('btnWakeUp').disabled = true;
getObject('btnReload').disabled = true;
getObject('btnReplay').disabled = true;
}
currMoveIdx = FEN.length - 1;
navButtons = '<form id="navigation" action="">';
navButtons += '<span id="navbuttons">';
navButtons += '<input id="start" title="Début de la partie" type="button" value="Start" />';
navButtons += '<input id="jmpback" title="Retour en arrière de 5 demi-coups" type="button" value=" << " />';
navButtons += '<input id="prev" title="Retour en arrière d\'un demi-coup" type="button" value=" < " />';
navButtons += '<input id="next" title="Avancer d\'un demi-coup" type="button" value=" > " />';
navButtons += '<input id="jmpfwd" title="Avancer de 5 demi-coups" type="button" value=" >> " />';
navButtons += '<input id="end" title="Fin de la partie" type="button" value="End" /> <br> ';
navButtons += '<input style="width:100px" id="invert" title="Inverser" type="button" value="< Tourner" />';
navButtons += '<input style="width:100px" id="invert2" title="Inverser" type="button" value="Tourner >" disabled />';
navButtons += '</span>';
navButtons += '</form>';
function invert1(){ /*toggleInvert( )*/
document.getElementById("invert").disabled = true;
document.getElementById("invert2").disabled = false;
document.getElementById("theBoard").style.transform = "rotate(180deg)";
document.getElementById("theBoard").style.transition = ".3s";
for (var i=0; i < 64; i++) {
var element = document.getElementById("sq"+i);
if (typeof(element) != 'undefined' && element != null)
{
document.getElementById("sq"+i).style.transform = "rotate(180deg)";
}
}
};
function invert2(){ /*toggleInvert( )*/
document.getElementById("invert2").disabled = true;
document.getElementById("invert").disabled = false;
document.getElementById("theBoard").style.transform = "rotate(0deg)";
document.getElementById("theBoard").style.transition = ".3s";
for (var i=0; i < 64; i++) {
var element = document.getElementById("sq"+i);
if (typeof(element) != 'undefined' && element != null)
{
document.getElementById("sq"+i).style.transform = "rotate(0deg)";
//document.getElementById("theBoard").style.transition = ".3s";
}
}
//document.getElementById("invert").style.display = "block";
//document.getElementById("invert2").style.display = "none";
};
getObject('gamenav').innerHTML = navButtons;
getObject("start").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(-10000);invert1();}else{moveJmp(-10000)} ;};
getObject("jmpback").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(-5);invert1();}else{moveJmp(-5)};};
getObject("prev").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(-1);invert1();}else{moveJmp(-1)};};
getObject("next").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(1);invert1();}else{moveJmp(1)};};
getObject("jmpfwd").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(5);invert1();}else{moveJmp(5)};};
getObject("end").onclick = function( ){if(document.getElementById("invert").disabled == true){invert2();moveJmp(10000);invert1();}else{moveJmp(10000)};};
getObject("invert").onclick = function( ){invert1()};
getObject("invert2").onclick = function( ){invert2()};
}
else // game is not over and we are not replaying it
{
isGameDrawn( ); // Alert the players it's stalemate, 50 move draw or the same position has occurred three times
if (true == isPlayersTurn)
{ // No need to set event handlers unless it's the player's move
for(i = 0; i < 64; i++)
{
getObject('tsq' + i).onclick = function( ) { squareClicked(this); };
}
getObject('btnWakeUp').disabled = true;
}
if (autoreload > 0 && ! DEBUG) // if we need the board refreshed
{
intervalId = setTimeout("window.location.replace('chess.php')", autoreload * 1000); // start the refresh loop
}
}
}
L'image de l'inspecteur:
La console n'indique rien.
Merci de bien vouloir m'aider à faire fonctionner à nouveau ce bouton.
En sachant que tous les autres (Recharger (btnReload), Revoir la partie ( btnReplay) et PGN) fonctionnent.
Merci.
function wakeUp( )
{
if (confirm('Confirmez le mail de rappel.'))
{
document.wakeup.submit( );
}
}
Autrement dit... elle déclenche le submit d'un formulaire HTML / PHP
Le formulaire étant le suivant :
<form name="wakeup" id="wakeup" method="post" action="chess.php" style="display:inline;">
<?php
// test for opponents email, and if none, disable the wake up button
$temp = ('' == $_SESSION['opponent']['p_email']) ? ' disabled="disabled"' : ''; // check the var and disable if no email is found
?>
<input type="button" id="btnWakeUp" value="Rappel" onclick="wakeUp( );"<?php echo $temp; ?> />
<input type="hidden" name="wakeID" value="<?php echo $_SESSION['game_id']; ?>" /><a href="#" class="help" onclick="window.open('./help/wakeup.html','help','resizable,scrollbars,width=550,height=500,top=50,left=50','_blank');return false;">?</a>
</form>
et pour finir... ce code fait appel à des fonctions (PHP ) qui ne se trouvent pas dans les fichiers que tu nous montres
=> webchessMail()
Bref, il semble que ton souci soit côté PHP et non Javascript. (donc mauvais forum)
Et sans toutes les infos nécéssaires.. impossible pour nous de te renseigner.
NB: Nous donner pleins d'infos ... c'est bien.... cibler les infos utiles.. c'est mieux.
Essaye d'affiner les infos que tu nous donnes... on n'a pas toujours le temps (ou l'envie...) de se palucher 30000 lignes de code pour trouver où se situe l'erreur...
Je suis bien conscient que les personnes qui aident les faibles en programmation ne désirent pas étudier 3000 lignes de code ainsi.
C'est pourquoi que je m' efforce de cibler au maximum les infos.
D'y inclure des images. Cependant ne cernant pas toujours le cheminement des actions de codes, il peut m'arriver de passer à côté d'une information importante.
Tu voudras bien m'en excuser car cela est indépendant de ma volonté.
Ceci étant précisé, je peux désormais te présenter le fichier que tu me demandes webchessmail.inc.php et que voici ci dessous avec en ligne 5 la fonction webchessMail afin de communiquer par e-mail:
<?php
// get required scripts
require_once 'config.inc.php';
function webchessMail($type, $msgTo, $move, $opponent, $game_id)
{
global $CFG_MAILADDRESS, $CFG_MAINPAGE, $CFG_USEEMAIL;
// make sure we can use email
if ( ! $CFG_USEEMAIL)
{
return false;
}
// make sure there's an email address given
if ('' == $msgTo && ! DEBUG)
{
return false;
}
//header('Content-Type: text/html;charset=iso-8859-1');
//header('Content-Type: text/html;charset= utf-8’);
//header('Content-Type: text/html;charset=iso-8859-1');
// default subject header prefix
$subject = 'CheckMat: ';
// load specific message and subject
switch($type)
{
case 'test':
$subject .= 'Test Message';
$message = "Félicitations !!\n"
. "Si vous voyez ce message, c'est que vous avez réglé avec succès votre notification par email !\n"
. "Maintenant, allez à {$CFG_MAINPAGE} pour jouer aux échecs !\n";
break;
//------------------------------------------------------------------------------
case 'invitation':
$subject .= "{$opponent} vous a invité à jouer une nouvelle partie";
$message = $opponent." vous a invité à jouer une nouvelle partie.\n"
. "Allez à {$CFG_MAINPAGE} pour accepter ou décliner cette invitation.\n";
break;
//------------------------------------------------------------------------------
case 'withdrawal':
$subject .= 'Invitation annulée';
$message = "Votre adversaire, {$opponent} a annulé son invitation à jouer une nouvelle partie.\n"
. "Allez à {$CFG_MAINPAGE} pour inviter un joueur, ou poursuivre une partie.\n";
break;
//------------------------------------------------------------------------------
case 'resignation':
$subject .= "{$opponent} a abandonné la partie {$game_id}.";
$message = "Votre adversaire, {$opponent} a abandonné la partie {$game_id}.\n\n"
. "Allez à {$CFG_MAINPAGE} pour commencer une nouvelle partie.\n";
break;
//------------------------------------------------------------------------------
case 'move':
$subject .= "{$opponent} a joué {$move} dans la partie {$game_id}.";
$message = "Votre adversaire, {$opponent} a joué le coup :\n"
. "{$move}\n\n"
. "C'est à vous de jouer\n"
. "Allez à {$CFG_MAINPAGE} pour jouer.\n";
break;
//------------------------------------------------------------------------------
case 'accepted':
$subject .= 'Invitation acceptée';
$message = $opponent." a accepté votre invitation à jouer une nouvelle partie.\n"
. "Allez à {$CFG_MAINPAGE} pour jouer.\n";
break;
//------------------------------------------------------------------------------
case 'declined':
$subject .= 'Invitation déclinée';
$message = $opponent." a decliné votre invitation à jouer une nouvelle partie.\n"
. "Allez à {$CFG_MAINPAGE} pour annuler votre invitation.\n";
break;
//------------------------------------------------------------------------------
case 'deletewarning':
$subject .= 'Alerte d\'effacement de partie';
$message = "Votre partie ({$game_id}) va être bientôt effacée.\n"
. "Allez à {$CFG_MAINPAGE} pour la revoir.\n";
break;
//------------------------------------------------------------------------------
case 'passupdate':
$subject .= 'Notification de ré-initialisation de mot de passe!!';
$message = "Votre mot de passe pour CheckMat a été ré-initialisé.\n"
. "Votre nouveau de passe est : change!me\n\n"
. "Allez à {$CFG_MAINPAGE} pour vous connecter maintenant, selectionnez 'personel' dans le menu,\n"
. "et changez votre mot de passe pour quelque chose de plus sécurisé.\n";
break;
//------------------------------------------------------------------------------
case 'wakeup':
$subject .= 'Fonction Réveil';
$message = "Votre adversaire, {$opponent} vous a adressé un e-mail de réveil.\n"
. "C'est à votre tour de jouer dans la partie #{$game_id}.\n\n"
. "Allez à {$CFG_MAINPAGE} pour jouer.\n";
break;
//------------------------------------------------------------------------------
case 'checkmate':
$subject .= 'Echec et mat !';
$message = "Votre adversaire, {$opponent} vous a mis échec et mat.\n"
. "Vous aurez plus de chance la prochaine fois.\n\n"
. "Allez à {$CFG_MAINPAGE} pour commencer une nouvelle partie.\n";
break;
// ToDo: mailmsgundorequest.php ??
}
$message .= "\n\n----------------------------------------------\n"
. "Ce message a été envoyé automatiquement\n"
. 'par CheckMat et ne requiert pas de réponse.';
//$message = htmlentities($message);
$headers = "From: CheckMat <{$CFG_MAILADDRESS}>\r\n";
// Some MTAs may require for you to uncomment the following line. Do so if mail notification doesn't work
// $headers = "To: {$msgTo}\r\n" . $headers;
call('---MAIL---');
call($msgTo);
call($subject);
call($message);
call($headers);
return mail($msgTo,$subject,$message,$headers);
}
Ainsi que le fichier config.inc.php puisqu'il est souvent question de la variable $CFG_MAINPAGE que l'on retrouve dans le fichier webchessmail.inc.php
<?php
/* Database settings */
/* ----------------- */
/*$CFG_HOSTNAME = 'localhost';
$CFG_USERNAME = 'root';
$CFG_PASSWORD = '';
$CFG_DATABASE = 'jeuxechecs_fr';/*
/*$CFG_HOSTNAME = '127.0.0.1';
$CFG_USERNAME = 'root';
$CFG_PASSWORD = '';
$CFG_DATABASE = 'echecs';*/
$CFG_HOSTNAME = 'XXXXXX';
$CFG_USERNAME = 'XXXXXX';
$CFG_PASSWORD = 'XXXXXX';
$CFG_DATABASE = 'XXXXXX';
/* Table settings */
/* -------------- */
$prefix = 'wc2_'; // table name prefix
define('T_CHAT' , $prefix . 'chat'); // the in-game chat/personal notes table
define('T_GAME' , $prefix . 'game'); // the game data table
define('T_HISTORY' , $prefix . 'history'); // the moves history table
define('T_MESSAGE' , $prefix . 'message'); // the game message table
define('T_PLAYER' , $prefix . 'player'); // the player data table
define('T_STAT' , $prefix . 'stat'); // the stats table
define('T_TALK' , $prefix . 'talk'); // the player messaging table
define('T_TALK_GLUE' , $prefix . 'talk_glue'); // the message glue table
/* Root Admin setting */
/* ------------------ */
$CFG_ROOT_ADMIN = 'mathieu'; // Permanent admin username (case-sensitive)
/* Server / Site settings */
/* ---------------------- */
/*
--- PLEASE READ ---
this first setting is the color theme for your webchess installation
look inside the /css directory and you will find several css files with a
filename like c_{color_name}.css. pick one, and enter that name here, or you can easily
create your own, using one of the included styles as a guide.
if you do create your own, please add a pull request to my repo at
https://github.com/benjamw/chess/ so that others may have access to it.
*/
$CFG_COLOR_CSS = 'c_new.css'; // the name of the color css file you wish to use (in the /css directory)
$CFG_MAINPAGE = 'http://www.jeuxechecs.fr/echecs/'; // The home page of the webchess script (include closing / )
$CFG_SITENAME = 'http://www.jeuxechecs.fr'; // The name of your website
$CFG_SESSIONTIMEOUT = 0; // Number of minutes before session timeout (0 to disable)
$CFG_EXPIREGAME = 60; // Number of days before untouched games are deleted (0 to disable)
$CFG_EXPIREUSERS = 0; // Number of days before untouched accounts are deleted (0 to disable) <30>
$CFG_MINAUTORELOAD = 25; // Minimum number of secs between automatic page reloads (0 to disable)
$CFG_USEEMAIL = true; // SMTP operations. Test it before putting it into production
$CFG_MAILADDRESS = 'XXXX@XXXXcom'; // Email address people see when receiving WebChess generated mail
//Adresse électronique que les gens voient lors de la réception du courrier généré par WebChess
$CFG_MAXUSERS = 0; // Maximum number of users allowed (0 to disable)
$CFG_CHANGEUSERNAME = false; // Whether a user can change their username from the main menu
$CFG_NEWUSERS = true; // Whether a new user can register
$CFG_LONGDATE = ' j / m / Y à \&\n\b\s\p\;G:i '; // PHP date format
$CFG_SHORTDATE = 'Y.m.d H:i'; // PHP date format
$CFG_CHESS960 = true; // Whether users can play Chess960 (Fischer Random Chess) games
$CFG_RATING_START = 1500; // the starting ELO rating for new players
$CFG_RATING_STEP = 32; // the max ELO rating change allowed per game
//$CFG_NAVLINKS = '<a href="/">Accueil</a>'; // your site's nav links
/* MySQL Error / debug settings */
/* ---------------------------- */
define ('DB_ERR_EMAIL_ERRORS', true); // (true / false) set to true to email errors to TO address below
define ('DB_ERR_LOG_ERRORS' , true); // (true / false) set to true to log errors in mysql.err file
define ('DB_ERR_TO' , 'XXXXX@XXXXXcom'); // set your TO email address
define ('DB_ERR_SUBJECT' , 'CheckMat Query Error'); // don't really need to change this
define ('DB_ERR_FROM' , $CFG_MAILADDRESS); // set your FROM email address (can be the same as TO above)
define ('DB_STATS_LOG' , true); // (true / false) set to true to log query stats in mysql.err file (or database)
define ('FILE_PATH_END' , 'echec/'); // set the name of the directory containing the script (with wrapping / )
/* DEVELOPER USE ONLY */
/* ------------------ */
/* INCLUDE SOME GLOBAL INCLUDES */
require_once 'mysql.class.php';
require_once 'chessgame.inc.php';
// instantiate the class and connect to the database
$mysql = new mysql($CFG_HOSTNAME, $CFG_USERNAME, $CFG_PASSWORD, $CFG_DATABASE);
$mysql->connect_select(__LINE__,__FILE__);
//@mysqli_set_charset($mysql->linkid,'utf8');
@mysqli_set_charset($mysql->linkid,'utf8mb4');
// instantiate the chess class
$chess = new ChessGame( );
define('DEBUG', false); // set to true for output of debugging code
define('JS_DEBUG', 0); // set to 1 for really annoying jvascript debug
if (defined('DEBUG') && DEBUG)
{
ini_set('display_errors', 'On');
error_reporting(-1);
$mysql->error_debug = true; // Allows for error debug output
$mysql->query_debug = true; // Allows for output of all queries all the time
$mysql->super_debug = false; // Allows output of ALL debugging output
}
require_once('func.global.php');
require_once('func.array.php');
require_once('func.bitwise.php');
require_once('message.class.php');
require_once('phpass.class.php');
$CFG_SESSIONTIMEOUT *= 60; // convert minutes to seconds
date_default_timezone_set('Europe/Paris');
Merci beaucoup de bien vouloir m'aider à trouver la solution.
tu peux aussi faire un test simple pour voir si la fonction php "mail" fonctionne
if(mail('tonadressemail@truc.fr', 'TEST', "Message de test")){
echo "OK";
}else{
echo " La fonction mail ne marche pas !";
}
NB: Si tu es en LOCAL et non sur un serveur, il faut utiliser FakeSendMail.
Tu trouveras des tutos pour l'installer et l'utiliser avec ton logiciel ( Wamp, Xampp .... )
Si tu es sur un serveur et que le test ne fonctionne pas... c'est que le serveur n'autorise pas l'utilisation de cette fonction php. Dans ce cas.. il ta faudra voir avec ton hébergeur.
Bien entendu, tu peux remplacer ce code d'envoi par l'utilisation de la class php : phpMailer et utiliser une adresse (gmail par exemple) pour générer l'envoi de mail. Là aussi tu trouveras les tutos sur le net à ce sujet.
Je viens de placer le code permettant de savoir si la fonction mail fonctionne dans le fichier webchessmail.inc.php comme ceci:
call('---MAIL---');
call($msgTo);
call($subject);
call($message);
call($headers);
//print_r(array($msgTo,$subject,$message,$headers));
if(mail('xxxx@xxxx.fr', 'TEST', "Message de test")){
echo "OK";
}else{
echo " La fonction mail ne marche pas !";
}
return mail($msgTo,$subject,$message,$headers);
}
Et voici le message retourné:
J'ai bien sûr inscrit un e-mail valide à la place des xxxx.
Et vu le résultat du test il me semble que la fonction webchessMail aurait un problème alors que je reçois certaines information du site concernant les coups joués par exemple.
Ce qui m'étonne c'est que tu nous as montré, dans ton message précédent, un mail envoyé par cette fonction dans ta boite mail.
La fonction doit donc marcher....
peux tu créer un fichier test.php et y placer le code que je t'ai donné puis appeller cette page pour voir le résultat ?
NB: Le code est assez bordélique... sans parler du fait qu'il utiliser une vielle extension mysql considérée désormais comme obsolète. Même si ça n'est pas la cause du souci, une refonte du code serait la bienvenue...et ne pourrait qu'améliorer le fonctionnement et la maintenabilité du code
par exemple : https://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code
Oui c'est déconcertant de voir que je reçois bien les messages en provenance de mon site tel les coups joués par les adversaires.
Voici en image ce qui est retourné par le fichier que j'ai créée:
Avec les codes correspondants:
<?php
if(mail('tonadressemail@truc.fr', 'TEST', "Message de test")){
echo "OK";
}else{
echo " La fonction mail ne marche pas !";
}
?>
A tout hasard voici un fichier nommé index.inc.php dont tu trouveras en ligne 959 et qui traite de tests e-mail:
<?php
$parts = pathinfo($_SERVER['REQUEST_URI']);
$path = $parts['dirname'];
if (empty($parts['extension'])) {
//$path .= '/'.$parts['jeuxechecs_fr'];
$path .= '/index.php';
}
$path = str_replace('\\', '/', $path).'/';
session_set_cookie_params(time()+365*24*3600, $path);
@session_start( );
require_once 'config.inc.php';
require 'login.inc.php';
require_once 'html.inc.php';
require_once 'html.tables.php';
// reset any shared data we may have collected
$_SESSION['shared'] = false;
// run some things first for the menu and data below
// open the PGN dir
$pgnDir = opendir("./pgn");
$fullFiles = array( );
// collect the game IDs for the games already exported
while (false !== ($file = readdir($pgnDir)))
{
if (('..' != $file) && ('.' != $file) && ('index.php' != $file))
{
// collect the complete filename
$fullFiles[] = $file;
// collect just the game id for searching below
if (preg_match('/game_(\\d++)/i', $file, $match))
{
$pgnFiles[] = $match[1];
}
}
}
// count the files for menu display
$numFiles = count($fullFiles);
// run a switch so that all the stuff being run here is not run all at once
// when viewing the page, it makes it so that the index page takes FOREVER
// to load
// make sure we have something to look at
$page = (isset($_GET['page'])) ? $_GET['page'] : 'mygames';
switch ($page)
{
// =========================================================================
case 'mygames' :
break;
// =========================================================================
case 'current' :
//******************************************************************
// cleanup dead games
//******************************************************************
// if we want to delete old games
if (0 != $CFG_EXPIREGAME)
{
// find out which games are older
$query = "
SELECT *
FROM ".T_GAME."
WHERE g_last_move < DATE_SUB(NOW( ), INTERVAL {$CFG_EXPIREGAME} DAY)
";
$result = $mysql->fetch_array($query, __LINE__, __FILE__);
// and for every old game...
foreach ($result as $old_game)
{
// if the game is in progress...
if ('' == $old_game['g_game_message'])
{
// find out who's turn it was...
$query = "
SELECT COUNT(*)
FROM ".T_HISTORY."
WHERE h_game_id = '{$old_game['g_id']}'
";
$old_moves = $mysql->fetch_value($query, __LINE__, __FILE__);
// if it's black's turn...
if (0 == ($old_moves % 2))
{
$player1 = $old_game['g_white_player_id']; // give white a win
$player2 = $old_game['g_black_player_id']; // give black a loss
}
else // it was white's turn...
{
$player1 = $old_game['g_black_player_id']; // give black a win
$player2 = $old_game['g_white_player_id']; // give white a loss
}
// require a file
require_once './includes/chessdb.inc.php';
adjust_stats($player1, $player2, 1, 0);
}
// ...clear the history...
$query = "
DELETE FROM ".T_HISTORY."
WHERE h_game_id = '{$old_game['g_id']}'
";
$mysql->query($query, __LINE__, __FILE__);
// ...and the messages...
$query = "
DELETE FROM ".T_MESSAGE."
WHERE m_game_id = '{$old_game['g_id']}'
";
$mysql->query($query, __LINE__, __FILE__);
// ...and the chat...
$query = "
DELETE FROM ".T_CHAT."
WHERE c_game_id = '{$old_game['g_id']}'
";
$mysql->query($query, __LINE__, __FILE__);
// ...and finally the game itself from the database
$query = "
DELETE FROM ".T_GAME."
WHERE g_id = '{$old_game['g_id']}'
";
$mysql->query($query, __LINE__, __FILE__);
}
}
break;
// =========================================================================
case 'finished' :
require_once 'chessutils.inc.php';
require_once 'gui.inc.php';
//******************************************************************
// Export finished games to PGN directory
//******************************************************************
// save the current session vars
if (isset($_SESSION['game_id']))
{
$prevSessionGameID = $_SESSION['game_id'];
}
if (isset($_SESSION['id960']))
{
$prevSessionId960 = $_SESSION['id960'];
}
// save the list to exclude them below
$pgnFiles = isset($pgnFiles) ? implode(',', $pgnFiles) : '0';
// get all the games that are finished, but not yet exported to PGN
$query = "
SELECT G.*
, P1.p_username AS white_username
, P2.p_username AS black_username
FROM ".T_GAME." AS G
LEFT JOIN ".T_PLAYER." AS P1
ON P1.p_id = G.g_white_player_id
LEFT JOIN ".T_PLAYER." AS P2
ON P2.p_id = G.g_black_player_id
WHERE G.g_id NOT IN ({$pgnFiles})
AND G.g_game_message IN ('Draw','Player Resigned','Checkmate')
ORDER BY G.g_id
";
$result = $mysql->fetch_array($query, __LINE__, __FILE__);
// save those games to PGN
foreach ($result as $game)
{
$_SESSION['game_id'] = $game['g_id'];
$_SESSION['id960'] = $game['g_id960'];
ob_start( );
// get the FEN data from the database
$i = 0;
$query = "
SELECT h_fen
FROM ".T_HISTORY."
WHERE h_game_id = '{$_SESSION['game_id']}'
ORDER BY h_time
";
$result = $mysql->fetch_array($query, __LINE__, __FILE__);
unset($FENarray);
foreach ($result as $FEN)
{
$FENarray[$i] = $FEN[0];
$i++;
}
FENtomoves( ); // (chessutils.inc.php)
returnGameInfo($_SESSION['game_id']);
echo getPGN( ); // (gui.inc.php)
$pgnFile = "./pgn/WebChess2_Game_{$game['g_id']}_".str_replace('-', '', substr($game['g_last_move'], 0, 10 )).'.pgn';
$fh = fopen($pgnFile, "w")
or die("Impossible d\'ouvrir le fichier {$pgnFile}. Vérifiez les permissions d\'accès au fichier\n");
fwrite($fh, ob_get_contents( ))
or die("Impossible d\'écrire dans le fichier $pgnFile. Vérifiez les permissions d\'accès au fichier\n");
fclose($fh);
ob_end_clean( );
}
// reinstate the saved session vars
if (isset($prevSessionGameID))
{
$_SESSION['game_id'] = $prevSessionGameID;
}
if (isset($prevSessionId960))
{
$_SESSION['id960'] = $prevSessionId960;
}
//*/
//******************************************************************
// send email notice for nearly dead games
/******************************************************************
// get 2/3 of expire length
$targetDate = mktime(0,0,0, date('m'), date('d') - ($CFG_EXPIREGAME * (2/3)), date('Y'));
$query = "
SELECT *
FROM ".T_GAME."
WHERE g_last_move < '{$targetDate}'
";
$result = $mysql->fetch_array($query, __LINE__, __FILE__);
foreach ($result as $game)
{
$query = "
SELECT p_email
FROM ".T_PLAYER."
WHERE p_id = '{$game['g_white_player_id']}'
";
$whiteEmail = $mysql->fetch_value($query, __LINE__, __FILE__);
$query = "
SELECT p_email
FROM ".T_PLAYER."
WHERE p_id = '{$game['g_black_player_id']}'
";
$blackEmail = $mysql->fetch_value($query, __LINE__, __FILE__);
webchessMail("deletewarning",$whiteEmail,0,0,$game['g_id']);
webchessMail("deletewarning",$blackEmail,0,0,$game['g_id']);
}
//*/
break;
// =========================================================================
case 'invite' :
require_once 'newgame.inc.php';
require_once 'webchessmail.inc.php';
//******************************************************************
// send invitation for a new game
//******************************************************************
if (isset($_POST['opponent']))
{
// prevent multiple invites from the same originator
$P = sani($_POST);
$query = "
SELECT g_id
FROM ".T_GAME."
WHERE g_game_message = 'Player Invited'
AND
(
(
g_message_from = 'white'
AND g_white_player_id = '{$_SESSION['player_id']}'
AND g_black_player_id = '{$P['opponent']}'
)
OR
(
g_message_from = 'black'
AND g_white_player_id = '{$P['opponent']}'
AND g_black_player_id = '{$_SESSION['player_id']}'
)
)
";
$mysql->query($query, __LINE__, __FILE__);
if (0 == $mysql->num_rows( ))
{
// set the color to a random color if 'random', otherwise, set the color given
$color = ('random' == $P['color']) ? ((1 == mt_rand(0, 1)) ? 'white' : 'black') : $P['color'];
$query = "
INSERT INTO ".T_GAME."
(g_id960, g_white_player_id, g_black_player_id, g_game_message, g_message_from, g_date_created, g_last_move)
VALUES ('";
// set the C960 ID
if ( ! isset($P['txtId960']) || '' === $P['txtId960'] )
{
$query .= "518','";
}
else
{
$query .= (int) trim($P['txtId960']) . "','";
}
// put the players in the right order
if ('white' == $color)
{
$query .= $_SESSION['player_id'] . "','" . $P['opponent'];
}
else
{
$query .= $P['opponent'] . "','" . $_SESSION['player_id'];
}
$query .= "','Player Invited','{$color}',NOW( ),NOW( )) ";
$mysql->query($query, __LINE__, __FILE__);
// if email notification is activated...
if ($CFG_USEEMAIL)
{
// if opponent is using email notification...
$query = "
SELECT p_email
FROM ".T_PLAYER."
WHERE p_id = '{$_POST['opponent']}'
";
$opponentEmail = $mysql->fetch_value($query, __LINE__, __FILE__);
if (0 < $mysql->num_rows( ))
{
if ('' != $opponentEmail)
{
// notify opponent of invitation via email
call("webchessMail('invitation',$opponentEmail,'',{$_SESSION['username']},'')");
webchessMail('invitation',$opponentEmail,'',$_SESSION['username'],'');
}
}
}
}
}
//*/
//******************************************************************
// respond to invitation
//******************************************************************
if (isset($_POST['respond']))
{
if ('accepted' == $_POST['respond'])
{
// update game data
$query = "
UPDATE ".T_GAME."
SET g_game_message = ''
, g_message_from = ''
WHERE g_id = '{$_POST['game_id']}'
";
$mysql->query($query, __LINE__, __FILE__);
// get the opponents ID for email
$query = "
SELECT *
FROM ".T_GAME."
WHERE g_id = '{$_POST['game_id']}'
";
$game = $mysql->fetch_assoc($query, __LINE__, __FILE__);
$oppID = ($game['g_white_player_id'] == $_SESSION['player_id']) ? $game['g_black_player_id'] : $game['g_white_player_id'];
// setup new board
$_SESSION['game_id'] = $_POST['game_id'];
createNewGame($_POST['game_id'],$game['g_id960']); // (newgame.inc.php)
# saveGame( ); // (chessdb.inc.php)
// if email notification is activated...
if ($CFG_USEEMAIL)
{
// if opponent is using email notification...
$query = "
SELECT p_email
FROM ".T_PLAYER."
WHERE p_id = '{$oppID}'
";
$opponentEmail = $mysql->fetch_value($query, __LINE__, __FILE__);
if (0 < $mysql->num_rows( ))
{
if ('' != $opponentEmail)
{
// notify opponent of invitation via email
call("webchessMail('accepted',$opponentEmail,'',{$_SESSION['username']},'')");
webchessMail('accepted',$opponentEmail,'',$_SESSION['username'],'');
}
}
}
}
else
{
$query = "
UPDATE ".T_GAME."
SET g_game_message = 'Invite Declined'
, g_message_from = '{$_POST['message_from']}'
WHERE g_id = '{$_POST['game_id']}'
";
$mysql->query($query, __LINE__, __FILE__);
// get the opponents ID for email
$query = "
SELECT *
FROM ".T_GAME."
WHERE g_id = '{$_POST['game_id']}'
";
$game = $mysql->fetch_assoc($query, __LINE__, __FILE__);
$oppID = ($game['g_white_player_id'] == $_SESSION['player_id']) ? $game['g_black_player_id'] : $game['g_white_player_id'];
// if email notification is activated...
if ($CFG_USEEMAIL)
{
// if opponent is using email notification...
$query = "
SELECT p_email
FROM ".T_PLAYER."
WHERE p_id = '{$oppID}'
";
$opponentEmail = $mysql->fetch_value($query, __LINE__, __FILE__);
if (0 < $mysql->num_rows( ))
{
if ('' != $opponentEmail)
{
// notify opponent of decline via email
call("webchessMail('declined',$opponentEmail,'',{$_SESSION['username']},'')");
webchessMail('declined',$opponentEmail,'',$_SESSION['username'],'');
}
}
}
}
}
//*/
//******************************************************************
// withdraw invitation
//******************************************************************
if (isset($_POST['withdrawl']))
{
// get opponent's player ID
$query = "
SELECT g_white_player_id
FROM ".T_GAME."
WHERE g_id = '{$_POST['game_id']}'
";
$opponentID = $mysql->fetch_value($query, __LINE__, __FILE__);
if (0 < $mysql->num_rows( ))
{
if ($opponentID == $_SESSION['player_id'])
{
$query = "
SELECT g_black_player_id
FROM ".T_GAME."
WHERE g_id = '{$_POST['game_id']}'
";
$opponentID = $mysql->fetch_value($query, __LINE__, __FILE__);
}
$query = "
DELETE FROM ".T_GAME."
WHERE g_id = '{$_POST['game_id']}'
";
$mysql->query($query, __LINE__, __FILE__);
// if email notification is activated...
if ($CFG_USEEMAIL)
{
// if opponent is using email notification...
$query = "
SELECT p_email
FROM ".T_PLAYER."
WHERE p_id = '{$opponentID}'
";
$opponentEmail = $mysql->fetch_value($query, __LINE__, __FILE__);
if (0 < $mysql->num_rows( ))
{
if ($opponentEmail != '')
{
// notify opponent of invitation via email
call("webchessMail('withdrawal', $opponentEmail, '', {$_SESSION['username']}, {$_POST['game_id']})");
webchessMail('withdrawal', $opponentEmail, '', $_SESSION['username'], $_POST['game_id']);
}
}
}
}
}
//*/
break;
// =========================================================================
case 'stats' :
require_once 'chessutils.inc.php';
//******************************************************************
// run the games data for the stats
//******************************************************************
// collect current stats from database
$query = "
SELECT s_id
, s_moves
, s_days
FROM ".T_STAT."
WHERE
(
s_moves IS NOT NULL
AND s_moves != 0
)
OR
(
s_days IS NOT NULL
AND s_days != 0
)
";
$statsdata = $mysql->fetch_array($query, __LINE__, __FILE__);
// parse stats data into an array for easier searching
foreach ($statsdata as $stat)
{
$curstats[$stat['s_id']]['moves'] = $stat['s_moves'];
$curstats[$stat['s_id']]['days'] = $stat['s_days'];
}
// collect any finished game data from the database
$query = "
SELECT COUNT(h_game_id) AS moves
, DATEDIFF(g_last_move, g_date_created) AS days
, h_game_id AS id
FROM ".T_HISTORY."
, ".T_GAME."
WHERE ".T_HISTORY.".h_game_id = ".T_GAME.".g_id
AND g_game_message IN ('Draw', 'Player Resigned', 'Checkmate')
GROUP BY h_game_id
";
$gamedata = $mysql->fetch_array($query, __LINE__, __FILE__);
// parse through each, compare with current, and add stats as needed
foreach ($gamedata as $game)
{
// clear any previous query
$query = '';
if ( ! isset($curstats[$game['id']]))
{
$query = "
INSERT INTO ".T_STAT."
(s_id, s_days, s_moves)
VALUES
('{$game['id']}', '{$game['days']}', '{$game['moves']}')
";
}
elseif ($curstats[$game['id']]['moves'] != $game['moves'] || $curstats[$game['id']]['days'] != $game['days'])
{
$query = "
UPDATE ".T_STAT."
SET s_moves = '{$game['moves']}'
, s_days = '{$game['days']}'
WHERE s_id = '{$game['id']}'
";
}
// run the query
if ('' != $query)
{
$mysql->query($query, __LINE__, __FILE__);
}
}
//*/
// stats -----------------------------------------------------------
$query = "
SELECT distinct concat('#',g_id,' ',(select p_username from ".T_PLAYER." WHERE p_id = g_white_player_id),' - ',(select p_username from ".T_PLAYER." WHERE p_id = g_black_player_id)) as joueurs
, s_days
FROM ".T_STAT."
JOIN ".T_GAME." ON g_id = s_id
WHERE s_days IS NOT NULL
ORDER BY s_days DESC
LIMIT 0,5
";
$daysLdata = $mysql->fetch_array($query, __LINE__, __FILE__);
$query = "
SELECT distinct concat('#',g_id,' ',(select p_username from ".T_PLAYER." WHERE p_id = g_white_player_id),' - ',(select p_username from ".T_PLAYER." WHERE p_id = g_black_player_id)) as joueurs
, s_days
FROM ".T_STAT."
JOIN ".T_GAME." ON g_id = s_id
WHERE s_days IS NOT NULL
ORDER BY s_days ASC
LIMIT 0,5
";
$daysSdata = $mysql->fetch_array($query, __LINE__, __FILE__);
$query = "
SELECT distinct concat('#',g_id,' ',(select p_username from ".T_PLAYER." WHERE p_id = g_white_player_id),' - ',(select p_username from ".T_PLAYER." WHERE p_id = g_black_player_id)) as joueurs
, (s_moves - 1) as s_moves
FROM ".T_STAT."
JOIN ".T_GAME." ON g_id = s_id
WHERE s_moves IS NOT NULL
ORDER BY s_moves DESC
LIMIT 0,5
";
$movesLdata = $mysql->fetch_array($query, __LINE__, __FILE__);
$query = "
SELECT distinct concat('#',g_id,' ',(select p_username from ".T_PLAYER." WHERE p_id = g_white_player_id),' - ',(select p_username from ".T_PLAYER." WHERE p_id = g_black_player_id)) as joueurs
,(s_moves - 1) as s_moves
FROM ".T_STAT."
JOIN ".T_GAME." ON g_id = s_id
WHERE s_moves IS NOT NULL
ORDER BY s_moves ASC
LIMIT 0,5
";
$movesSdata = $mysql->fetch_array($query, __LINE__, __FILE__);
$query = "
SELECT s_id
, MAX(ABS(s_streak)) AS s_streak
, p_username
FROM ".T_STAT."
LEFT JOIN ".T_PLAYER."
ON p_id = s_id
WHERE s_streak IS NOT NULL
GROUP BY s_id
ORDER BY s_streak DESC
LIMIT 0,5
";
$streakdata = $mysql->fetch_array($query, __LINE__, __FILE__);
$query = "
SELECT *
FROM ".T_PLAYER."
ORDER BY p_rating DESC
";
$playerdata = $mysql->fetch_array($query, __LINE__, __FILE__);
$query = "
SELECT p_username,
(p_wins + p_draws + p_losses) as nb_p
FROM ".T_PLAYER."
WHERE p_wins + p_draws + p_losses != 0
ORDER BY nb_p DESC
LIMIT 0,5
";
$statspartiejouees = $mysql->fetch_array($query, __LINE__, __FILE__);
break;
// =========================================================================
case 'messages' :
if (isset($_POST['action'])) {
try {
switch ($_POST['action']) {
case 'read' :
$Message->set_message_read($_POST['ids']);
break;
case 'unread' :
$Message->set_message_unread($_POST['ids']);
break;
case 'delete' :
$Message->delete_message($_POST['ids']);
break;
default :
break;
}
}
catch (Exception $e) { }
}
break;
// =========================================================================
case 'send' :
if (isset($_POST['submit'])) {
// clean the data
$subject = $_POST['subject'];
$message = $_POST['message'];
$user_ids = (array) ife($_POST['user_ids'], array( ), false);
$send_date = ife($_POST['send_date'], false, false);
$expire_date = ife($_POST['expire_date'], false, false);
try {
$Message->send_message($subject, $message, $user_ids, $send_date, $expire_date);
}
catch (Exception $e) {
}
header('Location: index.php?page=messages');
exit;
}
$message = array(
'subject' => '',
'message' => '',
);
if (isset($_GET['id'])) {
try {
if (isset($_GET['type']) && ('fw' == $_GET['type'])) { // forward
$message = $Message->get_message_forward((int) $_GET['id']);
}
elseif (isset($_GET['type']) && ('rs' == $_GET['type'])) { // resend
$message = $Message->get_message((int) $_GET['id']);
}
else { // reply
$message = $Message->get_message_reply((int) $_GET['id']);
$reply_flag = true;
}
}
catch (Exception $e) { }
}
// grab a list of the players
$query = "
SELECT `p_id`
, `p_username`
FROM `".T_PLAYER."`
ORDER BY `p_username`
";
$list = $mysql->fetch_array($query);
$recipient_options = '';
if (is_array($list)) {
// send global messages if we can
if ($_SESSION['is_admin']) {
$recipient_options .= '<option value="0">GLOBAL</option>';
}
$recipient_id = (isset($message['recipients'][0]['from_id']) && ! empty($reply_flag)) ? $message['recipients'][0]['from_id'] : 0;
foreach ($list as $player) {
// remove ourselves from the list
if ($player['p_id'] == $_SESSION['player_id']) {
continue;
}
if ($player['p_id'] == 1){ $sel = 'selected';}else{$sel="";} // envoie à l'admin à défaut, il faut un destinataire à défaut.
$recipient_options .= '<option '.$sel.' value="'.$player['p_id'].'"'.get_selected($recipient_id, $player['p_id']).'>'.$player['p_username'].'</option>';
}
}
break;
// =========================================================================
case 'read' :
if (isset($_POST['type']) && ('' != $_POST['type'])) {
switch ($_POST['type']) {
case 'delete' :
$Message->delete_message((int) $_POST['message_id']);
header('Location: index.php?page=messages');
exit;
break;
default :
break;
}
}
if ( ! isset($_GET['id'])) {
session_write_close( );
header('Location: index.php?page=messages');
exit;
}
try {
$message = $Message->get_message($_GET['id'], $_SESSION['is_admin']);
$message['message'] = str_replace("\t", ' ', $message['message']);
$message['message'] = str_replace(' ', ' ', $message['message']);
$message['message'] = htmlentities($message['message'], ENT_QUOTES, 'UTF-8', false);
$message['message'] = nl2br($message['message']);
$message['subject'] = htmlentities($message['subject'], ENT_QUOTES, 'UTF-8', false);
// find out if we're reading an inbox message, or an outbox message
if ($message['inbox']) {
$list = $Message->get_outbox_list( );
}
elseif ($message['allowed']) {
$list = $Message->get_inbox_list( );
}
else {
$list = $Message->get_admin_list( );
}
}
catch (Exception $e) { }
// grab data for our prev | next links
$prev = false;
$next = false;
$current = false;
$prev_item = false;
foreach ($list as $item) {
if ($current) {
$current = false;
$next = $item['message_id'];
}
if ($item['message_id'] == $_GET['id']) {
$current = true;
$prev = $prev_item['message_id'];
}
$prev_item = $item;
}
break;
// =========================================================================
case 'prefs' :
//******************************************************************
// update your preferences
//******************************************************************
if (isset($_POST['selHistory']))
{
call("UPDATE PREFS");
// set auto-reload preference
$reload = (is_numeric($_POST['txtReload']) && ( intval($_POST['txtReload']) >= $CFG_MINAUTORELOAD) ) ? $_POST['txtReload'] : $CFG_MINAUTORELOAD;
$lastMove = isset($_POST['boxLastMove']) ? 1 : 0;
// Theme
$query = "
UPDATE ".T_PLAYER."
SET p_theme = '{$_POST['rdoTheme']}'
, p_history = '{$_POST['selHistory']}'
, p_auto_reload = '".sani($reload)."'
, p_max_games = '".sani($_POST['txtmaxGames'])."'
, p_show_last_move = '{$lastMove}'
WHERE p_id = '{$_SESSION['player_id']}'
";
$mysql->query($query, __LINE__, __FILE__);
// update current session vars with a page refresh
header('Location: index.php?page=prefs');
exit;
}
//*/
break;
// =========================================================================
case 'personal' :
//******************************************************************
// update your personal information
//******************************************************************
if (isset($_POST['txtFirstName']))
{
$query = "
SELECT p_password
FROM ".T_PLAYER."
WHERE p_id = '{$_SESSION['player_id']}'
";
$dbPassword = $mysql->fetch_value($query, __LINE__, __FILE__);
if ((isset($_POST['pwdPassword']) && ('' != $_POST['pwdPassword'])) && ! password_test($_POST['pwdOldPassword'], $dbPassword))
{
$errMsg = "Désolé, le mot de passe est incorrect!";
}
else
{
$doUpdate = true;
if ($CFG_CHANGEUSERNAME)
{
$query = "
SELECT p_id
FROM ".T_PLAYER."
WHERE p_username = '".sani($_POST['txtUsername'])."'
AND p_id != '{$_SESSION['player_id']}'
";
$mysql->query($query, __LINE__, __FILE__);
if (0 < $mysql->num_rows( ))
{
$errMsg = "Désolé, ce nom d\'utilisateur est déjà utilisé.";
$doUpdate = false;
}
}
// if it's set, then it's allowed
$email = isset($_POST['txtEmail']) ? $_POST['txtEmail'] : '';
if ($doUpdate)
{
// update DB
$query = "
UPDATE ".T_PLAYER."
SET p_first_name = '".sani($_POST['txtFirstName'])."'
, p_last_name = '".sani($_POST['txtLastName'])."'
, p_email = '".sani($email)."'
"; // continued...
if (isset($_POST['pwdPassword']) && ('' != $_POST['pwdPassword']))
{
$query .= " , p_password = '".password_make($_POST['pwdPassword'])."' "; // continued...
}
if ((false != $CFG_CHANGEUSERNAME) && ('' != $_POST['txtUsername']))
{
$_SESSION['username'] = $_POST['txtUsername'];
$query .= " , p_username = '".sani($_POST['txtUsername'])."' "; // continued...
}
$query .= " WHERE p_id = '{$_SESSION['player_id']}' ";
$mysql->query($query, __LINE__, __FILE__);
// update current session vars with a page refresh
header('Location: index.php?page=personal');
exit;
}
}
}
//*/
//******************************************************************
// test your email address
//******************************************************************
if (isset($_POST['testmail']) && (false != $CFG_USEEMAIL))
{
webchessMail('test', $_SESSION['email'], '', '', '');
}
//*/
break;
// =========================================================================
case 'admin' :
require_once 'webchessmail.inc.php';
//******************************************************************
// run administration functions
//******************************************************************
if (isset($_POST))
{
// set all admin flags to 0...
$query = "
UPDATE ".T_PLAYER."
SET p_is_admin = '0'
WHERE 1
";
$mysql->query($query, __LINE__, __FILE__);
// set the current user to admin
// because if they accessed this, they are admin
$query = "
UPDATE ".T_PLAYER."
SET p_is_admin = '1'
WHERE p_id = '{$_SESSION['player_id']}'
LIMIT 1
";
$mysql->query($query, __LINE__, __FILE__);
// update admin before deleting
if ( isset($_POST['admin']) )
{
foreach ( $_POST['admin'] as $user )
{
// ...then adminify all the checked ones
$query = "
UPDATE ".T_PLAYER."
SET p_is_admin = '1'
WHERE p_id = '{$user}'
LIMIT 1
";
$mysql->query($query, __LINE__, __FILE__);
}
}
// reset passwords before deleting as well
if ( isset($_POST['resetpass']) )
{
foreach ( $_POST['resetpass'] as $user )
{
// reset the password to change!me
$pass = password_make('change!me');
$query = "
UPDATE ".T_PLAYER."
SET p_password = '{$pass}'
WHERE p_id = '{$user}'
LIMIT 1
";
$mysql->query($query, __LINE__, __FILE__);
// obtenir l'adresse électronique des utilisateurs
$query = "
SELECT p_email
FROM ".T_PLAYER."
WHERE p_id = '{$user}'
";
$email = $mysql->fetch_value($query, __LINE__, __FILE__);
// envoyer l'utilisateur et leur faire savoir leur mot de passe a été changé
call("webchessMail('passupdate',$email,'','','')");
webchessMail('passupdate',$email,'','','');
}
}
$i = 0;
if ( isset($_POST['delete']) )
{
foreach ( $_POST['delete'] as $user )
{
$query = "
SELECT p_username
FROM ".T_PLAYER."
WHERE p_id = '{$user}'
";
$name = $mysql->fetch_value($query, __LINE__, __FILE__);
// protect the root admin, just in case
if ($CFG_ROOT_ADMIN != $name)
{
// find all the games that user was playing
$query = "
SELECT g_id
FROM ".T_GAME."
WHERE g_black_player_id = '{$user}'
OR g_white_player_id = '{$user}'
";
$list = $mysql->fetch_value_array($query, __LINE__, __FILE__);
call('list');
$list[] = 0;
$games = implode(',', $list);
// delete all database entries related to those games
$query = "
DELETE FROM ".T_CHAT."
WHERE c_game_id IN ({$games})
";
$mysql->query($query, __LINE__, __FILE__);
$query = "
DELETE FROM ".T_HISTORY."
WHERE h_game_id IN ({$games})
";
$mysql->query($query, __LINE__, __FILE__);
$query = "
DELETE FROM ".T_MESSAGE."
WHERE m_game_id IN ({$games})
";
$mysql->query($query, __LINE__, __FILE__);
$query = "
DELETE FROM ".T_GAME."
WHERE g_id IN ({$games})
";
$mysql->query($query, __LINE__, __FILE__);
// supprimer les communications liées à ce joueur
/*$query = "
DELETE FROM ".T_TALK."
WHERE t_from_player_id = '{$user}'
OR t_to_player_id = '{$user}'
";
$mysql->query($query, __LINE__, __FILE__);*/
// enfin, supprimer le joueur
$query = "
DELETE FROM ".T_PLAYER."
WHERE p_id = {$user}
LIMIT 1
";
$mysql->query($query, __LINE__, __FILE__);
$i++;
}
}
}
if ( isset($i) && $i )
{
$errMsg = "! {$i} users deleted !";
}
}
//*/
// admin -----------------------------------------------------------
$query = "
SELECT *
, UNIX_TIMESTAMP(p_created) AS u_created
FROM ".T_PLAYER."
WHERE p_id != '{$_SESSION['player_id']}'
AND p_username != '{$CFG_ROOT_ADMIN}'
ORDER BY p_username
";
$admin = $mysql->fetch_array($query, __LINE__, __FILE__);
break;
// ====================================================
default :
// send them to the login page, if they are logged in
// it will send them back to the index with proper data
header('Location: login.php');
exit;
break;
} // the big switch
//******************************************************************************
// run the queries (needed outside for the menu)
//******************************************************************************
// active ------------------------------------------------------------------
$query = "
SELECT G.*
, UNIX_TIMESTAMP(G.g_date_created) AS u_date_created
, UNIX_TIMESTAMP(G.g_last_move) AS u_last_move
, COUNT(H.h_time) - 1 AS num_moves
, P1.p_username AS white_username
, P2.p_username AS black_username
FROM ".T_GAME." AS G
LEFT JOIN ".T_HISTORY." AS H
ON H.h_game_id = G.g_id
LEFT JOIN ".T_PLAYER." AS P1
ON P1.p_id = G.g_white_player_id
LEFT JOIN ".T_PLAYER." AS P2
ON P2.p_id = G.g_black_player_id
WHERE G.g_game_message = ''
AND (
G.g_white_player_id = '{$_SESSION['player_id']}'
OR G.g_black_player_id = '{$_SESSION['player_id']}'
)
GROUP BY G.g_id
ORDER BY G.g_date_created
";
$active = $mysql->fetch_array($query, __LINE__, __FILE__);
$numActive = $mysql->num_rows( );
// messages ----------------------------------------------------------------
list($numMsgs, $newMsgs) = Message::get_count($_SESSION['player_id']);
// invites -----------------------------------------------------------------
$query = "
SELECT G.*
, UNIX_TIMESTAMP(G.g_date_created) AS u_date_created
, P1.p_username AS white_username
, P2.p_username AS black_username
, 'invite' AS invite
, 0 AS num_moves
FROM ".T_GAME." AS G
LEFT JOIN ".T_PLAYER." AS P1
ON P1.p_id = G.g_white_player_id
LEFT JOIN ".T_PLAYER." AS P2
ON P2.p_id = G.g_black_player_id
WHERE G.g_game_message = 'Player Invited'
AND (
(
G.g_white_player_id = '{$_SESSION['player_id']}'
AND G.g_message_from = 'black'
)
OR (
G.g_black_player_id = '{$_SESSION['player_id']}'
AND G.g_message_from = 'white'
)
)
ORDER BY G.g_date_created
";
$invites = $mysql->fetch_array($query, __LINE__, __FILE__);
$numInvites = $mysql->num_rows( );
// outvites ----------------------------------------------------------------
// if game is marked playerInvited and the invite is from the current player
// OR game is marked inviteDeclined and the response is from the opponent
$query = "
SELECT G.*
, UNIX_TIMESTAMP(G.g_date_created) AS u_date_created
, P1.p_username AS white_username
, P2.p_username AS black_username
, 'outvite' AS outvite
, 0 AS num_moves
FROM ".T_GAME." AS G
LEFT JOIN ".T_PLAYER." AS P1
ON P1.p_id = G.g_white_player_id
LEFT JOIN ".T_PLAYER." AS P2
ON P2.p_id = G.g_black_player_id
WHERE
(
G.g_game_message = 'Player Invited'
AND (
(
G.g_white_player_id = '{$_SESSION['player_id']}'
AND G.g_message_from = 'white'
)
OR (
G.g_black_player_id = '{$_SESSION['player_id']}'
AND G.g_message_from = 'black'
)
)
)
OR (
G.g_game_message = 'Invite Declined'
AND (
(
G.g_white_player_id = '{$_SESSION['player_id']}'
AND G.g_message_from = 'black'
)
OR (
G.g_black_player_id = '{$_SESSION['player_id']}'
AND G.g_message_from = 'white'
)
)
)
ORDER BY G.g_date_created
";
$outvites = $mysql->fetch_array($query, __LINE__, __FILE__);
$numOutvites = $mysql->num_rows( );
// others ------------------------------------------------------------------
// generate a list of games with at least one move in it
$query = "
SELECT DISTINCT h_game_id
, COUNT(*) AS h_moves
FROM ".T_HISTORY."
GROUP BY h_game_id
";
$result = $mysql->fetch_array($query, __LINE__, __FILE__);
foreach ($result as $game)
{
$others[] = $game['h_game_id'];
$count[$game['h_game_id']] = $game['h_moves'];
}
$list = isset($others) ? implode(',',$others) : 0;
// now select all current games from that list
$query = "
SELECT G.*
, UNIX_TIMESTAMP(G.g_date_created) AS u_date_created
, UNIX_TIMESTAMP(G.g_last_move) AS u_last_move
, COUNT(H.h_time) - 1 AS num_moves
, P1.p_username AS white_username
, P2.p_username AS black_username
FROM ".T_GAME." AS G
LEFT JOIN ".T_HISTORY." AS H
ON H.h_game_id = G.g_id
LEFT JOIN ".T_PLAYER." AS P1
ON P1.p_id = G.g_white_player_id
LEFT JOIN ".T_PLAYER." AS P2
ON P2.p_id = G.g_black_player_id
WHERE G.g_game_message = ''
AND G.g_id IN ({$list})
AND G.g_white_player_id != '{$_SESSION['player_id']}'
AND G.g_black_player_id != '{$_SESSION['player_id']}'
GROUP BY G.g_id
ORDER BY G.g_date_created
";
$others = $mysql->fetch_array($query, __LINE__, __FILE__);
$numOthers = $mysql->num_rows( );
// done --------------------------------------------------------------------
$query = "
SELECT G.*
, UNIX_TIMESTAMP(G.g_date_created) AS u_date_created
, UNIX_TIMESTAMP(G.g_last_move) AS u_last_move
, COUNT(H.h_time) - 1 AS num_moves
, P1.p_username AS white_username
, P2.p_username AS black_username
FROM ".T_GAME." AS G
LEFT JOIN ".T_HISTORY." AS H
ON h_game_id = G.g_id
LEFT JOIN ".T_PLAYER." AS P1
ON P1.p_id = G.g_white_player_id
LEFT JOIN ".T_PLAYER." AS P2
ON P2.p_id = G.g_black_player_id
WHERE G.g_game_message NOT IN ('','Player Invited','Invite Declined')
GROUP BY G.g_id
ORDER BY G.g_id
";
$done = $mysql->fetch_array($query, __LINE__, __FILE__);
$numDone = $mysql->num_rows( );
// other various bits ------------------------------------------------------
// get number of players
$query = "
SELECT COUNT(*)
FROM ".T_PLAYER."
";
$numPlayers = $mysql->fetch_value($query, __LINE__, __FILE__);
// get number of active games
$query = "
SELECT COUNT(*)
FROM ".T_GAME."
WHERE g_game_message = ''
";
$numGames = $mysql->fetch_value($query, __LINE__, __FILE__);
// get number of total games
$query = "
SELECT MAX(g_id)
FROM ".T_GAME."
";
$totGames = $mysql->fetch_value($query, __LINE__, __FILE__);
$numMyturn = get_num_mine($active);
//*/
?>
Merci pour les deux liens très utiles que je garde précieusement pour y revenir ensuite!
On en revient donc à un de mes précédents messages..... peux tu vérifier l'encodage des fichiers de ton site (surtout celui qui contient l'envoi de mail ).
J'ai revu l'encodage du fichier webchessmail.inc.php .
Mais je n'ai rien trouvé d'anormal.
Par contre j'ai trouvé une piste de recherche dans le fichier chess.php.
Il s'agit des lignes ci dessous que auxquelles j'ai ajouté les lignes:
4 à 9 ainsi que celles 12 et 13.
Démontrant que la variable $wake_up_sent est vide si je ne me trompe pas.
C'est ainsi que je pense qu'une erreur pourrait provenir des lignes 9 et 10 dont je ne maîtrise pas toute la compréhension.
Notamment pour call dont je ne connais pas la signification et 'wakeup' dont je ne vois pas trop bien l'utilité.
Autrement pour webchessMail je sais que c'est une fonction et les $_SESSION['xxx'] je connais aussi.
A mon humble avis la clé du mystère pourrait bien se trouver sur l'une de ces deux lignes ou avant d'y parvenir.
N'est ce pas?
Le nombre 334 est le numéro de la partie EN COURS.
J'ai revu l'encodage du fichier webchessmail.inc.php .
C'est à dire ? Il est encodé en quoi ?
Notamment pour call dont je ne connais pas la signification et 'wakeup' dont je ne vois pas trop bien l'utilité.
Nous non plus... vu qu'il s'agit d'une fonction .... et que tu ne nous en as pas montré le code
Démontrant que la variable $wake_up_sent est vide si je ne me trompe pas.
Oui.. c'est en effet la raison pour laquelle le message s'affiche.
Mais ça n'explique pas la cause du problème ... qui se situe, visiblement, sur la ligne de code :
return mail($msgTo,$subject,$message,$headers);
L'erreur pouvant se trouver parmi l'une des variables utilisée dans l'envoie de mail... sachant que le mail part quand même....
Bizarre......
Je ne comprends pas bien ta question sur l'encodage webchessmail.inc.php ?
Il est encodé en php selon moi.
Pour la fonction call, celle ci se trouve dans le fichier func.global.php en ligne 112.
<?php
/** function ife
* if-else
* This function returns the value if it exists (or is optionally not empty)
* or a default value if it does not exist (or is empty)
*
* @param mixed var to test
* @param mixed optional default value
* @param bool optional allow empty value
* @param bool optional change the passed reference var
* @return mixed $var if exists (and not empty) or default otherwise
*/
function ife( & $var, $default = null, $allow_empty = true, $change_reference = false) {
if ( ! isset($var) || ( ! (bool) $allow_empty && empty($var))) {
if ((bool) $change_reference) {
$var = $default; // so it can also be used by reference
}
return $default;
}
return $var;
}
/** function ifer
* if-else reference
* This function returns the value if it exists (or is optionally not empty)
* or a default value if it does not exist (or is empty)
* It also changes the reference var
*
* @param mixed var to test
* @param mixed optional default value
* @param bool optional allow empty value
* @action updates/sets the reference var if needed
* @return mixed $var if exists (and not empty) or default otherwise
*/
function ifer( & $var, $default = null, $allow_empty = true) {
return ife($var, $default, $allow_empty, true);
}
/** function ifenr
* if-else non-reference
* This function returns the value if it is not empty
* or a default value if it is empty
*
* @param mixed var to test
* @param mixed optional default value
* @return mixed $var if not empty or default otherwise
*/
function ifenr($var, $default = null) {
if (empty($var)) {
return $default;
}
return $var;
}
/** function password_make
* wrapper function for PasswordHash (PHPass)
*
* @param string password
* @return string hash
*/
function password_make($pass) {
// bcrypt only uses the first 72 characters,
// this also prevents DoS attacks
if (72 < strlen($pass)) {
return false;
}
$PH = new PasswordHash(8, false);
$hash = $PH->HashPassword($pass);
if (20 > strlen($hash)) {
return false;
}
return $hash;
}
/** function password_test
* wrapper function for PasswordHash (PHPass)
*
* @param string password
* @param string hash
* @return bool valid password
*/
function password_test($pass, $hash) {
$PH = new PasswordHash(8, false);
return $PH->CheckPassword($pass, $hash);
}
/** function call
* simple configurable debugging output
*
* @param optional mixed
* @return void
*/
if ( ! function_exists('call')) {
function call($var = '^^k8)SJ2di!U') {
if ( ! defined('DEBUG') || (false == DEBUG)) {
return;
}
if ('^^k8)SJ2di!U' === $var) {
echo '<span style="font-weight:bold;background:white;color:red;">*****</span>';
}
else {
// begin output buffering so we can escape any html
ob_start( );
if (is_string($var) && isset($GLOBALS[$var])) {
echo '$' . $var . ' = ';
$var = $GLOBALS[$var];
}
if (is_bool($var) || is_null($var)) {
var_dump($var);
}
else {
print_r($var);
}
// end output buffering and output the result
$contents = htmlentities(ob_get_contents( ));
ob_end_clean( );
echo '<pre style="background:#FFF;color:#000;font-size:larger;">'.$contents.'</pre>';
}
}
}
Le message d'alerte ne s'affiche pour le Wakeup correspondant au bouton Rappel.
Nous recevons bien les autres messages comme par exemple les coups joués par l'adversaire et les invitations à jouer.
Le 18 / 05 / 2018 Le bouton Rappel fonctionnait encore comme l'atteste l'image ci dessous!
Désormais l'e-mail ne part plus pour le Rappel.
Quel serait l'une ou les variables correspondant à la demande de Rappel parmi celles ci:
Je ne comprends pas bien ta question sur l'encodage webchessmail.inc.php ?
Il est encodé en php selon moi.
Oulalala.... encodé ... pas " codé " !
Et puis.. ce n'est pas comme si je t'avais donné un lien pour expliquer comment faire la vérification !
Quand aux variables... elles ne sont pas vides puisque le print_r que tu m'as affiché contenait bien des valeurs.
Tu peux d'ailleurs reprendre le code de test (qui fonctionne d'après ce que tu m'as dit ) et y mettre les valeurs correspondantes à ce qu'il y a dans le print_r
Tu verras bien si ça fonctionne ou non.
A force de chercher j'ai trouvé.
Voici l'image l'attestant:
Pour cela j'ai modifié le fichier webchessmail.inc.php où la ligne 5 est remplacée par la ligne 7.
Saurais tu m'en fournir une explication sur le fonctionnement meilleur de la ligne 7 par rapport à la ligne 5?
Si oui , merci.
Comme tu pourras le constater à la lecture des précédentes présentation de ce fichier, la ligne 5 était désactivée.
Cela ayant été fait il y a plusieurs années, je ne me souviens plus la ou les raisons de cette modification.
$message .= "\n\n----------------------------------------------\n"
. "Ce message a été envoyé automatiquement\n"
. 'par CheckMat et ne requiert pas de réponse.';
//$message = htmlentities($message);
/*$headers = "From: CheckMat <{$CFG_MAILADDRESS}>\r\n";*/
// Some MTAs may require for you to uncomment the following line. Do so if mail notification doesn't work
$headers = "To: {$msgTo}\r\n" . $headers;
call('---MAIL---');
call($msgTo);
call($subject);
call($message);
call($headers);
return mail($msgTo,$subject,$message,$headers);
}
L' informatique à ces mystères dont les voies sont impénétrables.....
Il me reste à voir comment améliorer si possible la présentation des caractères envoyés par e-mail dont l' UTF"8" semble inefficace.
Cela malgré avoir placé cette information dans la base de données, les tables, les fichiers à différents endroits, etc.....
Je te remercie pour les informations que tu m'as donnés et de m'avoir guidé.
Néanmoins tout n'est pas clair.
Mais la barre était placée trop haute pour que cela le soit!
J'en suis bien conscient.
C'est donc sur la base des échanges ici entre nous que je vais continuer ma quête à la compréhension de cette partie de mon site de jeu d'échecs et clore ce sujet en le considérant comme "résolu".
Sincèrement.