function ManageGames() { global $scripturl, $txt, $context, $sourcedir, $smcFunc, $modSettings; require_once $sourcedir . '/Arcade.php'; require_once $sourcedir . '/Subs-ArcadeAdmin.php'; // Templates loadTemplate('ManageGames'); SMFArcade::loadArcade('admin', 'manage_games'); loadClassFile('Class-Package.php'); // Need to update files in database? if (!empty($modSettings['arcadeGamecacheUpdate']) && (empty($modSettings['arcadeDBUpdate']) || $modSettings['arcadeDBUpdate'] < max(filemtime($modSettings['gamesDirectory']), filemtime(__FILE__)))) { updateGameCache(); } if (isset($_REQUEST['uninstall_submit']) && !isset($_REQUEST['sa'])) { $_REQUEST['sa'] = 'uninstall'; } if (isset($_REQUEST['done']) && !empty($_SESSION['qaction'])) { $context['show_done'] = true; if ($_SESSION['qaction'] == 'install') { $context['qaction_title'] = $txt['arcade_install_complete']; $context['qaction_text'] = $txt['arcade_install_following_games']; } elseif ($_SESSION['qaction'] == 'uninstall') { $context['qaction_title'] = $txt['arcade_uninstall_complete']; $context['qaction_text'] = $txt['arcade_uninstall_following_games']; } if (isset($_SESSION['qaction_data']) && is_array($_SESSION['qaction_data'])) { $context['qaction_data'] = $_SESSION['qaction_data']; } unset($_SESSION['qaction_data']); unset($_SESSION['qaction']); } $subActions = array('list' => array('ManageGamesList', 'arcade_admin'), 'uninstall' => array('ManageGamesUninstall', 'arcade_admin'), 'uninstall2' => array('ManageGamesUninstall2', 'arcade_admin'), 'install' => array('ManageGamesInstall', 'arcade_admin'), 'install2' => array('ManageGamesInstall2', 'arcade_admin'), 'upload' => array('ManageGamesUpload', 'arcade_admin'), 'upload2' => array('ManageGamesUpload2', 'arcade_admin'), 'quickedit' => array('ManageGamesQuickEdit', 'arcade_admin'), 'edit' => array('EditGame', 'arcade_admin'), 'edit2' => array('EditGame2', 'arcade_admin'), 'export' => array('ExportGameinfo', 'arcade_admin')); // What user wants to do? $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'list'; // Do we have reason to allow him/her to do it? isAllowedTo($subActions[$_REQUEST['sa']][1]); $context[$context['admin_menu_name']]['tab_data']['title'] = $txt['arcade_manage_games']; $context[$context['admin_menu_name']]['tab_data']['description'] = $txt['arcade_manage_games_desc']; $subActions[$_REQUEST['sa']][0](); }
function MaintenanceGameCache() { global $db_prefix, $modSettings, $smcFunc, $context; loadClassFile('Class-Package.php'); updateGameCache(); }
function installGames($games, $move_games = false) { global $scripturl, $txt, $db_prefix, $modSettings, $context, $sourcedir, $smcFunc, $boarddir, $boardurl; loadClassFile('Class-Package.php'); // SWF Reader will be needed require_once $sourcedir . '/SWFReader.php'; $swf = new SWFReader(); $status = array(); $trigger = array(); $acc = 0; $request_file = $smcFunc['db_query']('', ' SELECT game_file, status FROM {db_prefix}arcade_files WHERE status != 10'); while ($row = $smcFunc['db_fetch_assoc']($request_file)) { $trigger[$acc] = $row['game_file']; $acc++; } $smcFunc['db_free_result']($request_file); $request = $smcFunc['db_query']('', ' SELECT f.id_file, f.game_name, f.status, f.game_file, f.game_directory FROM {db_prefix}arcade_files AS f WHERE id_file IN ({array_int:games}) AND f.status = 10', array('games' => $games)); while ($row = $smcFunc['db_fetch_assoc']($request)) { $errors = array(); $failed = true; $moveFail = false; $directory = $modSettings['gamesDirectory'] . (!empty($row['game_directory']) ? '/' . $row['game_directory'] : ''); $internal_name = getInternalName($row['game_file'], $directory); foreach ($trigger as $trig) { $trig2 = strtolower($row['game_file']); $fileSuffix = array('.gif', '1.gif', '2.gif', '.php', '.ini', '.xap'); if ($trig == $row['game_file'] || $trig == $trig2) { deleteArcadeArchives($modSettings['gamesDirectory'] . '/gamedata/' . $internal_name); deleteArcadeArchives($modSettings['gamesDirectory'] . '/gamedata/' . substr($row['game_file'], 0, -4)); if ($directory != $modSettings['gamesDirectory']) { foreach ($fileSuffix as $suffix) { deleteArcadeFile($directory . '/' . $internal_name . $suffix); $similar = similar_arcade_file_exists($directory . '/' . $internal_name . $suffix); if ($similar != $directory . '/' . $internal_name . $suffix) { deleteArcadeFile($directory . '/' . $similar); } } deleteArcadeFile($directory . '/' . $row['game_file']); $similar = similar_arcade_file_exists($directory . '/' . $row['game_file']); if ($similar != $directory . '/' . $row['game_file']) { deleteArcadeFile($directory . '/' . $similar); } } else { deleteArcadeFile($directory . '/' . $row['game_file']); $similar = similar_arcade_file_exists($directory . '/' . $row['game_file']); if ($similar != $directory . '/' . $row['game_file']) { deleteArcadeFile($directory . '/' . $similar); } foreach ($fileSuffix as $suffix) { deleteArcadeFile($directory . '/' . $internal_name . $suffix); $similar = similar_arcade_file_exists($directory . '/' . $internal_name . $suffix); if ($similar != $directory . '/' . $internal_name . $suffix) { deleteArcadeFile($directory . '/' . $similar); } } } updateGameCache(); if (@is_dir($directory) && $directory != $modSettings['gamesDirectory']) { $countfile = 0; if ($handle = @opendir($directory)) { while (false !== ($file = @readdir($handle))) { if ($file != "." && $file != "..") { $countfile++; } } @closedir($handle); } if ($countfile == 0) { deleteArcadeArchives($directory); } } if (empty($status)) { $status = array(); } $file_num = (int) $row['id_file']; $status[] = array('id' => $file_num, 'name' => $txt['directory_make_exists'] . $internal_name, 'error' => false); continue 2; } } // Search for thumbnails chdir($directory); if (file_exists($directory . '/game-info.xml')) { $gameinfo = readGameInfo($directory . '/game-info.xml'); if (!isset($gameinfo['id'])) { unset($gameinfo); } } $thumbnail = glob($internal_name . '1.{png,gif,jpg}', GLOB_BRACE); if (empty($thumbnail)) { $thumbnail = glob($internal_name . '.{png,gif,jpg}', GLOB_BRACE); } $thumbnailSmall = glob($internal_name . '2.{png,gif,jpg}', GLOB_BRACE); $game = array('id_file' => $row['id_file'], 'name' => $row['game_name'], 'class' => '', 'directory' => $row['game_directory'], 'file' => $row['game_file'], 'internal_name' => $internal_name, 'thumbnail' => isset($thumbnail[0]) ? $thumbnail[0] : '', 'thumbnail_small' => isset($thumbnailSmall[0]) ? $thumbnailSmall[0] : '', 'game_settings' => array()); unset($thumbnail, $thumbnailSmall); // Get information from flash if (substr($row['game_file'], -3) == 'swf') { if (isset($gameinfo['flash'])) { if (!empty($gameinfo['flash']['width']) && is_numeric($gameinfo['flash']['width'])) { $game['game_settings']['width'] = (int) $gameinfo['flash']['width']; } if (!empty($gameinfo['flash']['height']) && is_numeric($gameinfo['flash']['height'])) { $game['game_settings']['height'] = (int) $gameinfo['flash']['height']; } if (!empty($gameinfo['flash']['version']) && is_numeric($gameinfo['flash']['version'])) { $game['game_settings']['flash_version'] = (int) $gameinfo['flash']['version']; } if (!empty($gameinfo['flash']['bgcolor']) && strlen($gameinfo['flash']['bgcolor']) == 6) { $game['game_settings']['background_color'] = array(hexdec(substr($gameinfo['flash']['bgcolor'], 0, 2)), hexdec(substr($gameinfo['flash']['bgcolor'], 2, 2)), hexdec(substr($gameinfo['flash']['bgcolor'], 4, 2))); } } // Do we need to detect at least something? if (!isset($game['game_settings']['width']) || !isset($game['game_settings']['height']) || !isset($game['game_settings']['version']) || !isset($game['game_settings']['bgcolor'])) { $swf->open($directory . '/' . $row['game_file']); // Add missing values if (!$swf->error) { $game['game_settings'] += array('width' => $swf->header['width'], 'height' => $swf->header['height'], 'flash_version' => $swf->header['version'], 'background_color' => $swf->header['background']); } $swf->close(); } } // Detect submit system if (empty($row['class'])) { if (isset($gameinfo)) { $row['class'] = $gameinfo['submit']; } elseif (substr($row['game_file'], -3) == 'xap') { $row['class'] = 'Arcade_Game_silver'; } elseif (file_exists($boarddir . '/arcade/gamedata/' . $internal_name . '/v32game.txt')) { $row['class'] = 'Arcade_Game_ibp32'; } elseif (file_exists($boarddir . '/arcade/gamedata/' . $internal_name . '/v3game.txt')) { $row['class'] = 'Arcade_Game_ibp3'; } elseif (file_exists($directory . '/' . $internal_name . '.ini')) { $row['class'] = 'Arcade_Game_pnflash'; } elseif (file_exists($directory . '/' . $internal_name . '.php')) { $file = file_get_contents($directory . '/' . $internal_name . '.php'); if (strpos($file, '$config = array(') !== false) { $row['class'] = 'Arcade_Game_ibp'; } else { $row['class'] = 'Arcade_Game_v1game'; } unset($file); } else { $row['class'] = 'Arcade_Game_v1game'; } } $game['class'] = $row['class']; $game['score_type'] = isset($gameinfo) && isset($gameinfo['scoring']) ? (int) $gameinfo['scoring'] : 0; if (!empty($gameinfo['thumbnail'])) { $game['thumbnail'] = $gameinfo['thumbnail']; } if (!empty($gameinfo['thumbnail-small'])) { $game['thumbnail_small'] = $gameinfo['thumbnail-small']; } $game_directory = $game['directory']; // Move files if necessary if ($game_directory != $internal_name && $move_games) { if (!is_dir($modSettings['gamesDirectory'] . '/' . $internal_name) && !mkdir($modSettings['gamesDirectory'] . '/' . $internal_name, 0777)) { $moveFail = true; $game['error'] = array('directory_make_failed', array($modSettings['gamesDirectory'] . '/' . $internal_name)); continue; } if (!is_writable($modSettings['gamesDirectory'] . '/' . $internal_name)) { @chmod($modSettings['gamesDirectory'] . '/' . $internal_name, 0777); } $renames = array($directory . '/' . $game['file'] => $modSettings['gamesDirectory'] . '/' . $internal_name . '/' . $game['file']); if (!empty($game['thumbnail'])) { $renames[$directory . '/' . $game['thumbnail']] = $modSettings['gamesDirectory'] . '/' . $internal_name . '/' . $game['thumbnail']; } if (!empty($game['thumbnail_small'])) { $renames[$directory . '/' . $game['thumbnail_small']] = $modSettings['gamesDirectory'] . '/' . $internal_name . '/' . $game['thumbnail_small']; } foreach ($renames as $from => $to) { if (!file_exists($from) && file_exists($to)) { continue; } if (!rename($from, $to)) { $moveFail = true; $game['error'] = array('file_move_failed', array($from, $to)); continue; } } if (!$moveFail) { $game_directory = $internal_name; $directory = $modSettings['gamesDirectory'] . '/' . $game_directory; } } if (@file_exists($modSettings['gamesDirectory'] . '/' . $game_directory . '/game-info.xml')) { $gameinfo = readGameInfo($modSettings['gamesDirectory'] . '/' . $game_directory . '/game-info.xml'); $game['description'] = !empty($gameinfo['description']) ? $gameinfo['description'] : false; } if (empty($game['description']) && @file_exists($modSettings['gamesDirectory'] . '/' . $game_directory . '/' . $game['internal_name'] . '.php')) { @(require_once $modSettings['gamesDirectory'] . '/' . $game_directory . '/' . $game['internal_name'] . '.php'); $game_info = array('gtitle', 'gwords', 'gkeys'); $arcade_info = array('name', 'description', 'help'); $x = 0; foreach ($game_info as $info) { if (!empty($config[$info])) { $config[$info] = un_htmlspecialchars($config[$info]); $game[$arcade_info[$x]] = $config[$info]; } $x++; } } // Final install data $gameOptions = array('internal_name' => $game['internal_name'], 'name' => $game['name'], 'description' => !empty($game['description']) ? $game['description'] : '', 'thumbnail' => $game['thumbnail'], 'thumbnail_small' => $game['thumbnail_small'], 'help' => !empty($game['help']) ? $game['help'] : '', 'game_file' => $game['file'], 'game_directory' => $game_directory, 'class' => $game['class'], 'score_type' => $game['score_type'], 'game_settings' => $game['game_settings']); $success = false; if (!isset($game['error']) && ($id_game = createGame($gameOptions))) { $success = true; } else { $game['error'] = array('arcade_install_general_fail', array()); } $smcFunc['db_query']('', ' UPDATE {db_prefix}arcade_files SET id_game = {int:game}, status = {int:status}, game_directory = {string:directory} WHERE id_file = {int:file}', array('game' => empty($success) ? 0 : $id_game, 'status' => empty($success) ? 10 : 1, 'file' => $game['id_file'], 'directory' => $game_directory)); $status[] = array('id' => $id_game, 'name' => $game['name'], 'error' => isset($game['error']) ? $game['error'] : false); } $smcFunc['db_free_result']($request); return $status; }