PageRenderTime 38ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/components/com_uplab/controllers/play.php

https://bitbucket.org/StasPiv/playzone
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
  1. <?php
  2. defined('_JEXEC') or die('Restricted access');
  3. jimport('joomla.application.component.controller');
  4. jimport('joomla.html.pagination');
  5. class PlayController extends PlayzoneController
  6. {
  7. public function prepare()
  8. {
  9. JLoader::importFiles('chess');
  10. $this -> users = new JModel( array('table' => 'jos_uplab_register_users'));
  11. $this -> games = new JModel( array('table' => 'jos_uplab_games_list'));
  12. $this -> tournaments_games = new JModel( array('table' => 'jos_uplab_tournaments_games'));
  13. $this -> chat = new JModel( array('table' => 'jos_uplab_games_chats'));
  14. $this -> timecontrols = new JModel( array('table' => 'jos_uplab_games_timecontrols'));
  15. SeoHelper::getInstance() -> setMetaTags("Игра");
  16. }
  17. /**
  18. * Это функция для отображения текущей партии
  19. */
  20. function play($idGame, $play = true)
  21. {
  22. // сохраняем настройки доски
  23. if (!empty($_POST['bs']))
  24. {
  25. foreach ($_POST['bs'] as $key => $value)
  26. {
  27. profileHelper::getInstance() -> setSetting($key, $value);
  28. }
  29. }
  30. $arUsers = usersHelper::getInstance() -> getUsers();
  31. if ($play)
  32. {
  33. VictoriaHelper::addBreadCrumb('Мои партии', "/games/my/");
  34. $sql = "SELECT *,TIMESTAMPDIFF(SECOND , time_last_move, NOW( ) ) AS diff FROM `jos_uplab_games_list` WHERE
  35. `id` = '$idGame' AND (`id_white` = '{$_SESSION['id_user']}' OR `id_black` = '{$_SESSION['id_user']}')
  36. ORDER BY `jos_uplab_games_list`.`id` DESC LIMIT 0,100";
  37. }
  38. else
  39. {
  40. VictoriaHelper::addBreadCrumb('Все партии', "/games/personal/");
  41. $sql = "SELECT *,TIMESTAMPDIFF(SECOND , time_last_move, NOW( ) ) AS diff FROM `jos_uplab_games_list` WHERE
  42. `id` = '$idGame'
  43. ORDER BY `jos_uplab_games_list`.`id` DESC LIMIT 0,100";
  44. }
  45. $arGame = mysql_fetch_assoc(mysql_query($sql));
  46. if (!$arGame)
  47. {
  48. $_SESSION['msg'] = Array(
  49. 'string' => 'Партия не найдена',
  50. 'type' => 'error'
  51. );
  52. header('location:/games/');
  53. die ;
  54. }
  55. else
  56. {
  57. // не турнирная ли это партия
  58. if ($arTournament = $this -> tournaments_games -> load("`id_game` = '$idGame'"))
  59. {
  60. VictoriaHelper::addBreadCrumb("Турнир №{$arTournament['id_tournament']}", "/tournaments/{$arTournament['id_tournament']}/show/");
  61. $this -> view -> set('id_tournament', $arTournament['id_tournament']);
  62. }
  63. // здесь очень плохое место - мы дублируем функцию для отображения своих партий
  64. $arUsersTmp = $this -> users -> loadList("`id` IN ({$arGame['id_white']},{$arGame['id_black']})", null, array(
  65. 'id',
  66. 'login',
  67. 'in_rest',
  68. 'rating'
  69. ));
  70. $arTimeControls = $this -> timecontrols -> loadList();
  71. $arGameRest = array();
  72. foreach ($arTimeControls as $arTimeControl)
  73. {
  74. $arGameRest[$arTimeControl['id']] = $arTimeControl['rest'];
  75. }
  76. $arUsers = $arUsersRest = array();
  77. foreach ($arUsersTmp as $arUserTmp)
  78. {
  79. $arUsers[$arUserTmp['id']] = $arUserTmp['login'];
  80. $arUsersRest[$arUserTmp['id']] = $arUserTmp['in_rest'];
  81. $arUsersRating[$arUserTmp['id']] = $arUserTmp['rating'];
  82. }
  83. // смотрим на отпуска в турнирах и также формируем массив
  84. $sQueryRests = "SELECT `id_player`,`id_tournament`,`in_rest` FROM `jos_uplab_rests_list` WHERE 1";
  85. $rQueryRests = mysql_query($sQueryRests);
  86. while ($row = mysql_fetch_assoc($rQueryRests))
  87. {
  88. $arRestsTournaments[$row['id_player']][$row['id_tournament']] = $row['in_rest'];
  89. }
  90. $arGame['rest_white'] = $arUsersRest[$arGame['id_white']] || $arRestsTournaments[$arGame['id_white']][$arTournament['id_tournament']];
  91. $arGame['rest_black'] = $arUsersRest[$arGame['id_black']] || $arRestsTournaments[$arGame['id_black']][$arTournament['id_tournament']];
  92. $arGame['rest_game'] = $arGameRest[$arGame['id_timecontrol']];
  93. // конец очень плохого места
  94. $arTimeControls = gamesHelper::getInstance() -> getTimeControls();
  95. $this -> view -> set('time_control_name', $arTimeControls[$arGame['id_timecontrol']]);
  96. $arGame['login_white'] = $arUsers[$arGame['id_white']];
  97. $arGame['login_black'] = $arUsers[$arGame['id_black']];
  98. $arGame['rating_white'] = $arUsersRating[$arGame['id_white']];
  99. $arGame['rating_black'] = $arUsersRating[$arGame['id_black']];
  100. $arGame['online_white'] = gamesHelper::getInstance() -> isPlayerOnline($arGame['id_white']);
  101. $arGame['online_black'] = gamesHelper::getInstance() -> isPlayerOnline($arGame['id_black']);
  102. $this -> view -> set('game', $arGame);
  103. // определяем свой цвет
  104. if ($_SESSION['id_user'] == $arGame['id_white'])
  105. {
  106. $this -> view -> set('color', 'white');
  107. }
  108. else
  109. {
  110. $this -> view -> set('color', 'black');
  111. }
  112. // не предложена ли ничья
  113. $game = ioLoadGame($idGame, $_SESSION['id_user']);
  114. if ($game['curstate'] == 'D')
  115. {
  116. $this -> view -> set('draw_offered', true);
  117. }
  118. else
  119. {
  120. $this -> view -> set('draw_offered', false);
  121. }
  122. VictoriaHelper::addBreadCrumb("Партия №{$arGame['id']}", "/play/{$arGame['id']}/show/");
  123. SeoHelper::getInstance() -> setMetaTags("Партия #{$arGame['id']}. {$arGame['login_white']} - {$arGame['login_black']}");
  124. return array(
  125. 'layout' => 'default',
  126. 'template' => 'board'
  127. );
  128. }
  129. }
  130. /**
  131. * Это функция для исполнения хода в партии или проверки на его возможность
  132. */
  133. function move($idGame, $sMove, $bSave = true, $bVariation = false)
  134. {
  135. // сначала проверяем разницу между текущим временем и последним ходом
  136. // в случае если эта разница отрицательная - возвращаем ошибку
  137. $sQuery = "SELECT TIMESTAMPDIFF(SECOND , time_last_move, NOW( ) ) AS diff FROM jos_uplab_games_list WHERE `id` = '$idGame'";
  138. $iDiff = mysql_result(mysql_query($sQuery), 0);
  139. if ($iDiff < 0)
  140. {
  141. die('ERROR. Game does not begin');
  142. }
  143. $arUsers = usersHelper::getInstance() -> getUsers();
  144. $arGame = $this -> games -> load("`id` = '$idGame' AND `status` = 'play' AND (`id_white` = '{$_SESSION['id_user']}' OR `id_black` = '{$_SESSION['id_user']}')");
  145. // если игрок, который пытается сделать ход, не имеет никакого отношения к этой партии,
  146. // возвращаем ошибку
  147. if (!isset($_SESSION['id_user']) || !in_array($_SESSION['id_user'], array(
  148. $arGame['id_white'],
  149. $arGame['id_black']
  150. )))
  151. {
  152. die('ERROR: Вы не имеете отношения к этой партии');
  153. }
  154. if ($arGame)
  155. {
  156. if (empty($arGame['pgn_alt']))
  157. {
  158. ioCreateGame($arUsers[$arGame['id_white']], $arUsers[$arGame['id_black']], $idGame);
  159. }
  160. }
  161. echo handleMove($idGame, $_SESSION['login'], $sMove, $bSave);
  162. if (empty($arGame['pgn_alt']) && !$bSave)
  163. {
  164. $this -> games -> update(array(
  165. 'time_last_move' => $arGame['time_last_move'],
  166. 'time_white' => $arGame['time_white'],
  167. 'time_black' => $arGame['time_black'],
  168. 'pgn' => $arGame['pgn'],
  169. 'pgn_alt' => '',
  170. 'id_to_move' => $arGame['id_white']
  171. ), "`id` = '{$idGame}'");
  172. }
  173. if ($bSave)
  174. {
  175. mysql_query("UPDATE `jos_uplab_games_list` SET `time_last_move` = NOW() WHERE `id` = '$idGame'");
  176. // обновляем последний ход обоих игроков
  177. mysql_query("UPDATE `jos_uplab_register_users` SET last_move = NOW() WHERE `id` IN ('{$arGame['id_white']}','{$arGame['id_black']}')");
  178. // записываем партию в лог
  179. gamesHelper::recordToLog($idGame);
  180. // если это турнирная партия, то проверяем - не закончился ли турнир. выставляем ему флаг
  181. tournamentsHelper::getInstance() -> checkEndTournament($idGame);
  182. }
  183. // если это ввод варианта, то откатываем партию до момента ввода варианта
  184. if ($bVariation)
  185. {
  186. $this -> recoverGame($idGame, $arGame['time_last_move']);
  187. }
  188. die ;
  189. }
  190. /**
  191. * Пишем сообщение в чат и возвращаем содержимое чата обратно
  192. */
  193. function chat($idGame)
  194. {
  195. if ($this -> games -> load("`id` = '$idGame' AND (`id_white` = '{$_SESSION['id_user']}' OR `id_black` = '{$_SESSION['id_user']}')"))
  196. ;
  197. {
  198. $idGame = addslashes($idGame);
  199. $sMessage = addslashes(JRequest::getVar('message'));
  200. if (JString::strlen($sMessage) > 0)
  201. {
  202. $this -> chat -> insert(array(
  203. 'message' => $sMessage,
  204. 'id_game' => $idGame,
  205. 'id_user' => $_SESSION['id_user']
  206. ));
  207. die(json_encode(gamesHelper::getInstance() -> printChat($idGame)));
  208. }
  209. }
  210. }
  211. /**
  212. * Функция для восстановления партии
  213. */
  214. function recover($idGame)
  215. {
  216. VictoriaHelper::addBreadCrumb('Все партии', "/games/personal/");
  217. VictoriaHelper::addBreadCrumb('Партия №' . $idGame, "/play/$idGame/show/");
  218. VictoriaHelper::addBreadCrumb('Восстановление партии', "/play/$idGame/recover/");
  219. $arAdmins = array('PozitiFF');
  220. $this -> view -> set('admins', $arAdmins);
  221. $time = addslashes(JRequest::getVar('recover_change'));
  222. if (JRequest::getVar('postback') != null && in_array($_SESSION['login'], $arAdmins))
  223. {
  224. $this -> recoverGame($idGame, $time);
  225. eventHelper::headMessage('Партия успешно восстановлена', 'success', "/play/$idGame/show/");
  226. }
  227. elseif (JRequest::getVar('postback') != null && !in_array($_SESSION['login'], $arAdmins))
  228. {
  229. if (eventHelper::sendMail(array(
  230. '#LINK_GAME#' => $_SERVER['HTTP_HOST'] . "/play/$idGame/recover/",
  231. '#TIME#' => $time,
  232. '#LOGIN#' => $_SESSION['login']
  233. ), 'play/recover_request.php', "Запрос на восстановление от {$_SESSION['login']}"))
  234. {
  235. eventHelper::headMessage('Запрос на восстановление принят');
  236. }
  237. else
  238. {
  239. eventHelper::headMessage('Не удалось отправить запрос. Попробуйте позже', 'error');
  240. }
  241. }
  242. else
  243. {
  244. $gamesImages = new JModel( array('table' => 'jos_uplab_games_list_images'));
  245. $gamesImages -> setLimit(0, 100);
  246. $arGamesImages = $gamesImages -> loadList("`id` = '$idGame'", 'time_last_move DESC');
  247. $this -> view -> set('games_images', $arGamesImages);
  248. //return array('layout' => 'default', 'template' => 'recover_admin');
  249. }
  250. }
  251. function recoverGame($idGame, $time)
  252. {
  253. mysql_query("DELETE FROM `jos_uplab_games_list` WHERE `id` = '$idGame'");
  254. $sQuery = "INSERT INTO `jos_uplab_games_list`
  255. SELECT *
  256. FROM `jos_uplab_games_list_images` WHERE `id` = '$idGame' AND `time_last_move` = '$time'";
  257. mysql_query($sQuery);
  258. mysql_query("
  259. UPDATE `jos_uplab_games_list`
  260. SET `time_white` = `time_white` + TIMESTAMPDIFF(SECOND,time_last_move,NOW())
  261. WHERE `id_to_move` = `id_white` AND `id` = '$idGame'");
  262. mysql_query("
  263. UPDATE `jos_uplab_games_list`
  264. SET `time_black` = `time_black` + TIMESTAMPDIFF(SECOND,time_last_move,NOW())
  265. WHERE `id_to_move` = `id_black` AND `id` = '$idGame'");
  266. mysql_query("
  267. UPDATE `jos_uplab_games_list`
  268. SET `status` = 'play'
  269. WHERE `id` = '$idGame'");
  270. }
  271. }
  272. ?>