コード例 #1
0
ファイル: ManageGames.php プロジェクト: nikop/SMF-Arcade
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]();
}
コード例 #2
0
function MaintenanceGameCache()
{
    global $db_prefix, $modSettings, $smcFunc, $context;
    loadClassFile('Class-Package.php');
    updateGameCache();
}
コード例 #3
0
ファイル: Subs-ArcadeAdmin.php プロジェクト: nikop/SMF-Arcade
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;
}