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; }
function EditGame2() { global $scripturl, $txt, $db_prefix, $modSettings, $context, $sourcedir, $smcFunc, $boarddir; $context['game_permissions'] = $modSettings['arcadePermissionMode'] > 2; $context['edit_page'] = !isset($_REQUEST['advanced']) ? 'basic' : 'advanced'; if (!isset($context['game'])) { $id = loadGame((int) $_REQUEST['game'], true); if ($id === false) { fatal_lang_error('arcade_game_not_found', false); } $game =& $context['arcade']['game_data'][$id]; $context['game'] = array('id' => $game['id_game'], 'internal_name' => $game['internal_name'], 'category' => $game['id_cat'], 'name' => htmlspecialchars($game['game_name']), 'thumbnail' => htmlspecialchars($game['thumbnail']), 'thumbnail_small' => htmlspecialchars($game['thumbnail_small']), 'description' => htmlspecialchars($game['description']), 'help' => htmlspecialchars($game['help']), 'game_file' => $game['game_file'], 'game_directory' => $game['game_directory'], 'submit_system' => $game['submit_system'], 'score_type' => $game['score_type'], 'member_groups' => explode(',', $game['member_groups']), 'extra_data' => unserialize($game['extra_data']), 'enabled' => !empty($game['enabled'])); if (!is_array($context['game']['extra_data']) || isset($_REQUEST['detect'])) { require_once $sourcedir . '/SWFReader.php'; $swf = new SWFReader(); if (substr($game['game_file'], -3) == 'swf') { $swf->open($modSettings['gamesDirectory'] . '/' . $game['game_directory'] . '/' . $game['game_file']); $context['game']['extra_data'] = array('width' => $swf->header['width'], 'height' => $swf->header['height'], 'flash_version' => $swf->header['version'], 'background_color' => $swf->header['background']); $swf->close(); } else { $context['game']['extra_data'] = array('width' => '', 'height' => '', 'flash_version' => '', 'background_color' => array('', '', '')); } } } $context['game_permissions'] = $modSettings['arcadePermissionMode'] > 2; // Load categories if (!isset($context['arcade_category'])) { $request = $smcFunc['db_query']('', ' SELECT id_cat, cat_name FROM {db_prefix}arcade_categories'); $context['arcade_category'] = array(); while ($row = $smcFunc['db_fetch_assoc']($request)) { $context['arcade_category'][] = array('id' => $row['id_cat'], 'name' => $row['cat_name']); } $smcFunc['db_free_result']($request); } // Load Sumbit Systems if (!isset($context['submit_systems'])) { $context['submit_systems'] = SubmitSystemInfo('*'); } $gameOptions = array(); $errors = array(); if (checkSession('post', '', false) !== '') { $errors['session'] = 'session_timeout'; } // Basic if (empty($_REQUEST['edit_page']) || $_REQUEST['edit_page'] == 'basic') { if (isset($_POST['game_name']) && trim($_POST['game_name']) == '') { $errors['game_name'] = 'invalid'; } $gameOptions['name'] = $_POST['game_name']; $gameOptions['description'] = $_POST['description']; $gameOptions['thumbnail'] = $_POST['thumbnail']; $gameOptions['thumbanil_small'] = $_POST['thumbnail_small']; $gameOptions['help'] = $_POST['help']; $gameOptions['enabled'] = !empty($_POST['game_enabled']); if ($context['game_permissions']) { $gameOptions['member_groups'] = array(); if (!empty($_POST['groups'])) { foreach ($_POST['groups'] as $id) { $gameOptions['member_groups'][] = (int) $id; } } } $gameOptions['category'] = (int) $_POST['category']; } else { if (trim($_POST['internal_name']) == '') { $errors['internal_name'] = 'invalid'; } if (trim($_POST['game_file']) == '') { $errors['game_file'] = 'invalid'; } if (!isset($context['submit_systems'][$_POST['submit_system']])) { $errors['submit_system'] = 'invalid'; } $extra_data = $context['game']['extra_data']; if (isset($_POST['extra_data'])) { foreach ($_POST['extra_data'] as $item => $value) { $extra_data[$item] = $value; } } $gameOptions['internal_name'] = $_POST['internal_name']; $gameOptions['submit_system'] = $_POST['submit_system']; $gameOptions['game_directory'] = $_POST['game_directory']; $gameOptions['game_file'] = $_POST['game_file']; $gameOptions['score_type'] = (int) $_POST['score_type']; $gameOptions['extra_data'] = $extra_data; } if (!empty($errors)) { $context['errors'] = $errors; return EditGame(); } updateGame($context['game']['id'], $gameOptions, true); redirectexit('action=admin;area=managegames'); }