/components/com_uplab/controllers/play.php
PHP | 283 lines | 244 code | 11 blank | 28 comment | 28 complexity | 785ffc3e3eac8ae5c09ed6aa3cecec43 MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, GPL-2.0, LGPL-2.1
- <?php
-
- defined('_JEXEC') or die('Restricted access');
- jimport('joomla.application.component.controller');
- jimport('joomla.html.pagination');
-
- class PlayController extends PlayzoneController
- {
-
- public function prepare()
- {
- JLoader::importFiles('chess');
- $this -> users = new JModel( array('table' => 'jos_uplab_register_users'));
- $this -> games = new JModel( array('table' => 'jos_uplab_games_list'));
- $this -> tournaments_games = new JModel( array('table' => 'jos_uplab_tournaments_games'));
- $this -> chat = new JModel( array('table' => 'jos_uplab_games_chats'));
- $this -> timecontrols = new JModel( array('table' => 'jos_uplab_games_timecontrols'));
- SeoHelper::getInstance() -> setMetaTags("Игра");
- }
-
- /**
- * Это функция для отображения текущей партии
- */
- function play($idGame, $play = true)
- {
- // сохраняем настройки доски
- if (!empty($_POST['bs']))
- {
- foreach ($_POST['bs'] as $key => $value)
- {
- profileHelper::getInstance() -> setSetting($key, $value);
- }
- }
- $arUsers = usersHelper::getInstance() -> getUsers();
- if ($play)
- {
- VictoriaHelper::addBreadCrumb('Мои партии', "/games/my/");
- $sql = "SELECT *,TIMESTAMPDIFF(SECOND , time_last_move, NOW( ) ) AS diff FROM `jos_uplab_games_list` WHERE
- `id` = '$idGame' AND (`id_white` = '{$_SESSION['id_user']}' OR `id_black` = '{$_SESSION['id_user']}')
- ORDER BY `jos_uplab_games_list`.`id` DESC LIMIT 0,100";
- }
- else
- {
- VictoriaHelper::addBreadCrumb('Все партии', "/games/personal/");
- $sql = "SELECT *,TIMESTAMPDIFF(SECOND , time_last_move, NOW( ) ) AS diff FROM `jos_uplab_games_list` WHERE
- `id` = '$idGame'
- ORDER BY `jos_uplab_games_list`.`id` DESC LIMIT 0,100";
- }
- $arGame = mysql_fetch_assoc(mysql_query($sql));
- if (!$arGame)
- {
- $_SESSION['msg'] = Array(
- 'string' => 'Партия не найдена',
- 'type' => 'error'
- );
- header('location:/games/');
- die ;
- }
- else
- {
- // не турнирная ли это партия
- if ($arTournament = $this -> tournaments_games -> load("`id_game` = '$idGame'"))
- {
- VictoriaHelper::addBreadCrumb("Турнир №{$arTournament['id_tournament']}", "/tournaments/{$arTournament['id_tournament']}/show/");
- $this -> view -> set('id_tournament', $arTournament['id_tournament']);
- }
- // здесь очень плохое место - мы дублируем функцию для отображения своих партий
- $arUsersTmp = $this -> users -> loadList("`id` IN ({$arGame['id_white']},{$arGame['id_black']})", null, array(
- 'id',
- 'login',
- 'in_rest',
- 'rating'
- ));
- $arTimeControls = $this -> timecontrols -> loadList();
- $arGameRest = array();
- foreach ($arTimeControls as $arTimeControl)
- {
- $arGameRest[$arTimeControl['id']] = $arTimeControl['rest'];
- }
- $arUsers = $arUsersRest = array();
- foreach ($arUsersTmp as $arUserTmp)
- {
- $arUsers[$arUserTmp['id']] = $arUserTmp['login'];
- $arUsersRest[$arUserTmp['id']] = $arUserTmp['in_rest'];
- $arUsersRating[$arUserTmp['id']] = $arUserTmp['rating'];
- }
- // смотрим на отпуска в турнирах и также формируем массив
- $sQueryRests = "SELECT `id_player`,`id_tournament`,`in_rest` FROM `jos_uplab_rests_list` WHERE 1";
- $rQueryRests = mysql_query($sQueryRests);
- while ($row = mysql_fetch_assoc($rQueryRests))
- {
- $arRestsTournaments[$row['id_player']][$row['id_tournament']] = $row['in_rest'];
- }
-
- $arGame['rest_white'] = $arUsersRest[$arGame['id_white']] || $arRestsTournaments[$arGame['id_white']][$arTournament['id_tournament']];
- $arGame['rest_black'] = $arUsersRest[$arGame['id_black']] || $arRestsTournaments[$arGame['id_black']][$arTournament['id_tournament']];
- $arGame['rest_game'] = $arGameRest[$arGame['id_timecontrol']];
- // конец очень плохого места
- $arTimeControls = gamesHelper::getInstance() -> getTimeControls();
- $this -> view -> set('time_control_name', $arTimeControls[$arGame['id_timecontrol']]);
- $arGame['login_white'] = $arUsers[$arGame['id_white']];
- $arGame['login_black'] = $arUsers[$arGame['id_black']];
- $arGame['rating_white'] = $arUsersRating[$arGame['id_white']];
- $arGame['rating_black'] = $arUsersRating[$arGame['id_black']];
- $arGame['online_white'] = gamesHelper::getInstance() -> isPlayerOnline($arGame['id_white']);
- $arGame['online_black'] = gamesHelper::getInstance() -> isPlayerOnline($arGame['id_black']);
- $this -> view -> set('game', $arGame);
- // определяем свой цвет
- if ($_SESSION['id_user'] == $arGame['id_white'])
- {
- $this -> view -> set('color', 'white');
- }
- else
- {
- $this -> view -> set('color', 'black');
- }
- // не предложена ли ничья
- $game = ioLoadGame($idGame, $_SESSION['id_user']);
- if ($game['curstate'] == 'D')
- {
- $this -> view -> set('draw_offered', true);
- }
- else
- {
- $this -> view -> set('draw_offered', false);
- }
- VictoriaHelper::addBreadCrumb("Партия №{$arGame['id']}", "/play/{$arGame['id']}/show/");
- SeoHelper::getInstance() -> setMetaTags("Партия #{$arGame['id']}. {$arGame['login_white']} - {$arGame['login_black']}");
- return array(
- 'layout' => 'default',
- 'template' => 'board'
- );
- }
- }
-
- /**
- * Это функция для исполнения хода в партии или проверки на его возможность
- */
- function move($idGame, $sMove, $bSave = true, $bVariation = false)
- {
- // сначала проверяем разницу между текущим временем и последним ходом
- // в случае если эта разница отрицательная - возвращаем ошибку
- $sQuery = "SELECT TIMESTAMPDIFF(SECOND , time_last_move, NOW( ) ) AS diff FROM jos_uplab_games_list WHERE `id` = '$idGame'";
- $iDiff = mysql_result(mysql_query($sQuery), 0);
- if ($iDiff < 0)
- {
- die('ERROR. Game does not begin');
- }
-
- $arUsers = usersHelper::getInstance() -> getUsers();
- $arGame = $this -> games -> load("`id` = '$idGame' AND `status` = 'play' AND (`id_white` = '{$_SESSION['id_user']}' OR `id_black` = '{$_SESSION['id_user']}')");
- // если игрок, который пытается сделать ход, не имеет никакого отношения к этой партии,
- // возвращаем ошибку
- if (!isset($_SESSION['id_user']) || !in_array($_SESSION['id_user'], array(
- $arGame['id_white'],
- $arGame['id_black']
- )))
- {
- die('ERROR: Вы не имеете отношения к этой партии');
- }
- if ($arGame)
- {
- if (empty($arGame['pgn_alt']))
- {
- ioCreateGame($arUsers[$arGame['id_white']], $arUsers[$arGame['id_black']], $idGame);
- }
- }
- echo handleMove($idGame, $_SESSION['login'], $sMove, $bSave);
- if (empty($arGame['pgn_alt']) && !$bSave)
- {
- $this -> games -> update(array(
- 'time_last_move' => $arGame['time_last_move'],
- 'time_white' => $arGame['time_white'],
- 'time_black' => $arGame['time_black'],
- 'pgn' => $arGame['pgn'],
- 'pgn_alt' => '',
- 'id_to_move' => $arGame['id_white']
- ), "`id` = '{$idGame}'");
- }
- if ($bSave)
- {
- mysql_query("UPDATE `jos_uplab_games_list` SET `time_last_move` = NOW() WHERE `id` = '$idGame'");
- // обновляем последний ход обоих игроков
- mysql_query("UPDATE `jos_uplab_register_users` SET last_move = NOW() WHERE `id` IN ('{$arGame['id_white']}','{$arGame['id_black']}')");
- // записываем партию в лог
- gamesHelper::recordToLog($idGame);
- // если это турнирная партия, то проверяем - не закончился ли турнир. выставляем ему флаг
- tournamentsHelper::getInstance() -> checkEndTournament($idGame);
- }
- // если это ввод варианта, то откатываем партию до момента ввода варианта
- if ($bVariation)
- {
- $this -> recoverGame($idGame, $arGame['time_last_move']);
- }
- die ;
- }
-
- /**
- * Пишем сообщение в чат и возвращаем содержимое чата обратно
- */
- function chat($idGame)
- {
- if ($this -> games -> load("`id` = '$idGame' AND (`id_white` = '{$_SESSION['id_user']}' OR `id_black` = '{$_SESSION['id_user']}')"))
- ;
- {
- $idGame = addslashes($idGame);
- $sMessage = addslashes(JRequest::getVar('message'));
- if (JString::strlen($sMessage) > 0)
- {
- $this -> chat -> insert(array(
- 'message' => $sMessage,
- 'id_game' => $idGame,
- 'id_user' => $_SESSION['id_user']
- ));
- die(json_encode(gamesHelper::getInstance() -> printChat($idGame)));
- }
- }
- }
-
- /**
- * Функция для восстановления партии
- */
- function recover($idGame)
- {
- VictoriaHelper::addBreadCrumb('Все партии', "/games/personal/");
- VictoriaHelper::addBreadCrumb('Партия №' . $idGame, "/play/$idGame/show/");
- VictoriaHelper::addBreadCrumb('Восстановление партии', "/play/$idGame/recover/");
- $arAdmins = array('PozitiFF');
- $this -> view -> set('admins', $arAdmins);
- $time = addslashes(JRequest::getVar('recover_change'));
- if (JRequest::getVar('postback') != null && in_array($_SESSION['login'], $arAdmins))
- {
- $this -> recoverGame($idGame, $time);
- eventHelper::headMessage('Партия успешно восстановлена', 'success', "/play/$idGame/show/");
- }
- elseif (JRequest::getVar('postback') != null && !in_array($_SESSION['login'], $arAdmins))
- {
- if (eventHelper::sendMail(array(
- '#LINK_GAME#' => $_SERVER['HTTP_HOST'] . "/play/$idGame/recover/",
- '#TIME#' => $time,
- '#LOGIN#' => $_SESSION['login']
- ), 'play/recover_request.php', "Запрос на восстановление от {$_SESSION['login']}"))
- {
- eventHelper::headMessage('Запрос на восстановление принят');
- }
- else
- {
- eventHelper::headMessage('Не удалось отправить запрос. Попробуйте позже', 'error');
- }
- }
- else
- {
- $gamesImages = new JModel( array('table' => 'jos_uplab_games_list_images'));
- $gamesImages -> setLimit(0, 100);
- $arGamesImages = $gamesImages -> loadList("`id` = '$idGame'", 'time_last_move DESC');
- $this -> view -> set('games_images', $arGamesImages);
- //return array('layout' => 'default', 'template' => 'recover_admin');
- }
- }
-
- function recoverGame($idGame, $time)
- {
- mysql_query("DELETE FROM `jos_uplab_games_list` WHERE `id` = '$idGame'");
- $sQuery = "INSERT INTO `jos_uplab_games_list`
- SELECT *
- FROM `jos_uplab_games_list_images` WHERE `id` = '$idGame' AND `time_last_move` = '$time'";
- mysql_query($sQuery);
- mysql_query("
- UPDATE `jos_uplab_games_list`
- SET `time_white` = `time_white` + TIMESTAMPDIFF(SECOND,time_last_move,NOW())
- WHERE `id_to_move` = `id_white` AND `id` = '$idGame'");
- mysql_query("
- UPDATE `jos_uplab_games_list`
- SET `time_black` = `time_black` + TIMESTAMPDIFF(SECOND,time_last_move,NOW())
- WHERE `id_to_move` = `id_black` AND `id` = '$idGame'");
- mysql_query("
- UPDATE `jos_uplab_games_list`
- SET `status` = 'play'
- WHERE `id` = '$idGame'");
- }
-
- }
- ?>