/**
 * Update last login time, last logout time, onlinetime
 *
 * @global type $UMC_USER
 * @param type $type
 */
function umc_uuid_record_usertimes($type)
{
    XMPP_ERROR_trace(__FUNCTION__, func_get_args());
    global $UMC_USER;
    $uuid = $UMC_USER['uuid'];
    $username = $UMC_USER['username'];
    // make sure the userdata exists
    $D = umc_uuid_userdata($uuid, $username);
    umc_uuid_login_logout_update($type);
    // in case the user logged out just now, we update the onlinetime of the user
    if ($type == 'lastlogout') {
        // get the data again since it just changed
        $D = umc_uuid_userdata($uuid, $username);
        // we only calculate this in case the time is properly recorded
        if ($D['lastlogin'] <= $D['lastlogout']) {
            $login = umc_datetime($D['lastlogin']);
            $logout = umc_datetime($D['lastlogout']);
            $seconds = umc_timer_raw_diff($login, $logout);
            $online_sql = "UPDATE minecraft_srvr.UUID SET onlinetime=onlinetime+{$seconds} WHERE UUID='{$uuid}';";
            umc_mysql_query($online_sql);
        } else {
            XMPP_ERROR_trigger("User login was later than last logout! " . var_export($D, true));
        }
    }
}
function run_umc_scheduler()
{
    XMPP_ERROR_trace(__FUNCTION__, func_get_args());
    // list of what to do & undo or temp permissions
    $schedule_arr = array(1 => array('on_cmd' => array(0 => 'ch qm u Today bloody is Monday, beware of the mobs!', 1 => 'bloodmoon start darklands'), 'off_cmd' => array()), 2 => array('on_cmd' => array(0 => 'ch qm u Today is Tuesday, nothing special!', 1 => 'bloodmoon stop darklands', 2 => 'time 00:00 darklands'), 'off_cmd' => array()), 3 => array('on_cmd' => array(0 => 'ch qm u Hungry Wednesday started!', 1 => 'mv modify set autoheal false darklands', 2 => 'mv gamerule naturalRegeneration false darklands', 3 => 'region flag darklands_spawn greeting -w darklands ATTENTION: Today Darklands autoheal is OFF! You being fed does not heal you!'), 'off_cmd' => array(0 => 'ch qm u Hungry Wednesday is over!', 1 => 'mv modify set autoheal true darklands', 2 => 'mv gamerule naturalRegeneration true darklands', 3 => 'region flag darklands_spawn greeting -w darklands Welcome to the Darklands! Today everything is normal. Whatever that means.')), 4 => array('on_cmd' => array(0 => 'ch qm u Today is Thursday, nothing special!'), 'off_cmd' => array()), 5 => array('on_cmd' => array(0 => 'ch qm u Freaky Frydays started!', 1 => 'time 12:00 darklands', 2 => 'sunburn darklands on', 3 => 'region flag darklands_spawn greeting -w darklands ATTENTION: Today it\'s daylight in the Darklands, but the sun will burn you! find shadow!'), 'off_cmd' => array(0 => 'ch qm u Freaky Frydays is over!', 1 => 'time 00:00 darklands', 2 => 'sunburn darklands off', 3 => 'region flag darklands_spawn greeting -w darklands Welcome to the Darklands! Today everything is normal. Whatever that means.')), 6 => array('on_cmd' => array(0 => 'ch qm u Today is Saturday, nothing special!'), 'off_cmd' => array()), 0 => array('on_cmd' => array(0 => 'mv modify set pvp true darklands', 1 => 'region flag darklands_spawn greeting -w darklands ATTENTION: Today Darklands is PVP ON! You are safe here, but further out it\'s dangerous!', 2 => 'ch qm u ATTENTION: PVP is now ON in the darklands (except the area around spawn)!', 3 => 'region flag darklands_spawn farewell -w darklands ATTENTION: You are now entering a PVP area!!'), 'off_cmd' => array(0 => 'mv modify set pvp false darklands', 1 => 'region flag darklands_spawn greeting -w darklands Today Darklands is PVP OFF!', 2 => 'ch qm u ATTENTION: PVP is now OFF in the darklands. You are safe!', 3 => 'region flag darklands_spawn farewell -w darklands Welcome to the Darklands! Today everything is normal. Whatever that means.')));
    // find current day
    $date_new = umc_datetime();
    $today = $date_new->format('w');
    // echo "Echo today is $today: " . $date_new->format("Y-m-d H:i:s");
    if ($today == 0) {
        $yesterday = 6;
    } else {
        $yesterday = $today - 1;
    }
    // execute last day's off-commands
    $cmds = $schedule_arr[$yesterday]['off_cmd'];
    // var_dump($cmds);
    umc_schedule_exec($cmds);
    umc_log('scheduler', "yesterday", "executing commands for yesterday: {$yesterday}");
    // execute todays on-commands
    $cmds = $schedule_arr[$today]['on_cmd'];
    umc_log('scheduler', "today", "executing commands for yesterday: {$today}");
    umc_schedule_exec($cmds);
    $default_commands = array("mv gamerule doDaylightCycle false darklands", "mv gamerule naturalRegeneration false deathlands");
    foreach ($default_commands as $cmd) {
        umc_exec_command($cmd);
    }
    umc_ban_to_database();
    // make a new ID file in case item data has changed
    include_once '/home/minecraft/server/bin/commands/make_id_file.php';
}
/**
 * resets lots
 *
 * @global type $UMC_SETTING
 * @global array $UMC_PATH_MC
 * @param type $debug\
 */
function umc_lot_reset_process()
{
    XMPP_ERROR_trace(__FUNCTION__, func_get_args());
    global $UMC_SETTING, $UMC_PATH_MC;
    // first of all, clean up user dibs
    umc_lot_manager_dib_cleanup();
    // get banned users UUID => username
    $banned_users = umc_banned_users();
    // var_dump($banned_users);
    // donators UUID => leftover days
    $donators = umc_users_donators();
    $dibs = umc_lot_manager_dibs_get_all();
    // Update all userlevels in UUID table
    $upd_sql = 'UPDATE minecraft_srvr.UUID
        LEFT JOIN minecraft_srvr.permissions_inheritance ON UUID.UUID=permissions_inheritance.child
        SET userlevel = parent
        WHERE parent != userlevel';
    umc_mysql_query($upd_sql, true);
    // get dates for -1 Month and -2 months
    $now_datetime = umc_datetime();
    $now_datetime->modify('-1 month');
    $one_months_ago = $now_datetime->format('Y-m-d H:i:s');
    $now_datetime->modify('-1 month');
    // what date was 2 months ago?
    $two_months_ago = $now_datetime->format('Y-m-d H:i:s');
    $longterm = $UMC_SETTING['longterm'];
    $source_path = "{$UMC_PATH_MC}/server/worlds/mint";
    $dest_path = "{$UMC_PATH_MC}/server/bukkit";
    // get all occupied lots and their owners
    // TODO: We should get first all expired users and reset their shop inventory, then do their lots.
    $list_sql = "SELECT region_id as lot, user.UUID as uuid, UUID.username as username, world.name as world, userlevel, lastlogin\n            FROM minecraft_worldguard.region_players LEFT JOIN minecraft_worldguard.user ON user_id=user.id\n            LEFT JOIN minecraft_worldguard.world ON world_id=world.id\n            LEFT JOIN minecraft_srvr.UUID ON user.UUID=UUID.UUID\n            WHERE owner=1 AND LEFT(region_id, 4) IN {$UMC_SETTING['lot_worlds_sql']}";
    $D = umc_mysql_fetch_all($list_sql);
    /**
     * Actions to be taken, with reasons
     */
    $A = array();
    foreach ($D as $row) {
        $owner_username = strtolower($row['username']);
        $owner_uuid = $row['uuid'];
        $owner_lastlogin = $row['lastlogin'];
        $owner_level = $row['userlevel'];
        if ($owner_username == 'uncovery') {
            // we do not reset uncovery's lots
            continue;
        }
        if ($owner_username == 'riedi77') {
            // we do not reset uncovery's lots
            continue;
        }
        // we do not reset active donators, except those who are banned
        if (isset($donators[$owner_uuid]) && !isset($banned_users[$owner_uuid])) {
            continue;
        }
        $lot = $row['lot'];
        $world = $row['world'];
        $lot_dibs = false;
        if (isset($dibs[$lot])) {
            $lot_dibs = $dibs[$lot];
        }
        // sanity check
        if (!isset($row['userlevel']) || !in_array($owner_level, $UMC_SETTING['ranks'])) {
            XMPP_ERROR_trigger("Could not reset lots, userlevel failure for Owner '{$owner_username} / {$owner_uuid} / {$owner_level}': {$list_sql}");
            die("userlevel error");
        }
        if (isset($banned_users[$owner_uuid])) {
            $A[$lot] = array('reason' => "{$lot} was reset because {$owner_username} / {$owner_uuid} was banned", 'source_world' => "{$source_path}/{$world}", 'dest_world' => "{$dest_path}/{$world}", 'remove_users' => true, 'reset_to' => $lot, 'user_shop_clean' => $owner_uuid, 'dibs' => $lot_dibs, 'version_sql' => false, 'del_skyblock_inv' => false);
        } else {
            if ($owner_username == '_abandoned_') {
                $A[$lot] = array('reason' => "{$lot} was reset because Owner was _abandoned_", 'source_world' => "{$source_path}/{$world}", 'dest_world' => "{$dest_path}/{$world}", 'remove_users' => true, 'reset_to' => $lot, 'user_shop_clean' => false, 'dibs' => $lot_dibs, 'version_sql' => false, 'del_skyblock_inv' => false);
            } else {
                $longterm_user = in_array($owner_level, $longterm);
                if ($owner_lastlogin < $two_months_ago && $longterm_user) {
                    $A[$lot] = array('reason' => "{$lot} was reset because {$owner_username} / {$owner_uuid} is 2 months protected but was absent for 2 months (last login {$owner_lastlogin})", 'source_world' => "{$source_path}/{$world}", 'dest_world' => "{$dest_path}/{$world}", 'remove_users' => true, 'reset_to' => $lot, 'user_shop_clean' => $owner_uuid, 'dibs' => $lot_dibs, 'version_sql' => false, 'del_skyblock_inv' => false);
                } else {
                    if ($owner_lastlogin < $one_months_ago && !$longterm_user) {
                        $A[$lot] = array('reason' => "{$lot} was reset because {$owner_username} / {$owner_uuid} was absent for 1 months (last login {$owner_lastlogin})", 'source_world' => "{$source_path}/{$world}", 'dest_world' => "{$dest_path}/{$world}", 'remove_users' => true, 'reset_to' => $lot, 'user_shop_clean' => $owner_uuid, 'dibs' => $lot_dibs, 'version_sql' => false, 'del_skyblock_inv' => false);
                    }
                }
            }
        }
        // reset skyblock inventories
        if ($world == 'skyblock' && isset($A[$lot])) {
            //
            $A[$lot]['del_skyblock_inv'] = $owner_uuid;
        }
    }
    // choice based resets
    $sql = "SELECT lot, world.name as world, choice, version, mint_version\n        FROM minecraft_srvr.lot_version\n        LEFT JOIN minecraft_worldguard.region ON lot=id\n        LEFT JOIN minecraft_worldguard.world ON world_id=world.id\n        WHERE SUBSTR(lot_version.lot, 1, 4) IN {$UMC_SETTING['lot_worlds_sql']} AND choice IS NOT NULL;";
    $R = umc_mysql_fetch_all($sql);
    // fixed choices:
    foreach ($R as $row) {
        $lot = $row['lot'];
        $version = $row['version'];
        $mint_version = $row['mint_version'];
        $choice = $row['choice'];
        $world = $row['world'];
        // reset the lot
        if ($choice == 'reset') {
            // any lot that can be reset
            // set the new version to the chosen lot
            $A[$lot] = array('reason' => "Lot {$lot} version was set from {$version} to {$mint_version} after reset", 'source_world' => "{$source_path}/{$world}", 'dest_world' => "{$dest_path}/{$world}", 'del_skyblock_inv' => false, 'remove_users' => false, 'reset_to' => $lot, 'user_shop_clean' => false, 'dibs' => false, 'version_sql' => "UPDATE minecraft_srvr.lot_version SET choice=NULL, version='{$mint_version}' WHERE lot='{$lot}' LIMIT 1;");
        } else {
            if ($choice == 'mint_king' && $world == 'draftlands') {
                $choice = umc_get_draftlands_kingdom_equivalent($lot);
                $A[$lot] = array('reason' => "Lot {$lot} version was reset to mint kingdom version {$choice} by user choice", 'source_world' => "{$source_path}/kingdom", 'dest_world' => "{$dest_path}/draftlands", 'del_skyblock_inv' => false, 'remove_users' => false, 'reset_to' => $choice, 'user_shop_clean' => false, 'dibs' => false, 'version_sql' => "UPDATE minecraft_srvr.lot_version SET choice=NULL, version='{$choice}' WHERE lot='{$lot}' LIMIT 1;");
            } else {
                if ($choice == 'curr_king' && $world == 'draftlands') {
                    $choice = umc_get_draftlands_kingdom_equivalent($lot);
                    $A[$lot] = array('reason' => "Lot {$lot} version was reset to current kingdom version {$choice} by user choice", 'source_world' => "{$dest_path}/kingdom", 'dest_world' => "{$dest_path}/draftlands", 'del_skyblock_inv' => false, 'remove_users' => false, 'reset_to' => $choice, 'user_shop_clean' => false, 'dibs' => false, 'version_sql' => "UPDATE minecraft_srvr.lot_version SET choice=NULL, version='{$choice}' WHERE lot='{$lot}' LIMIT 1;");
                } else {
                    // other non-default options to reset to, usually lot names on the same world
                    // assume that we always copy from the same world, but mint version
                    $A[$lot] = array('reason' => "Lot {$lot} version was reset to {$choice} (user choice)", 'source_world' => "{$source_path}/" . umc_get_lot_world($choice), 'dest_world' => "{$dest_path}/{$world}", 'del_skyblock_inv' => false, 'remove_users' => false, 'reset_to' => $choice, 'user_shop_clean' => false, 'dibs' => false, 'version_sql' => "UPDATE minecraft_srvr.lot_version SET choice=NULL, version='{$choice}' WHERE lot='{$lot}' LIMIT 1;");
                }
            }
        }
    }
    // iterate the items
    foreach ($A as $lot => $a) {
        umc_lot_manager_reset_lot($lot, $a);
    }
    XMPP_ERROR_trigger("Lot reset process finished");
}
Example #4
0
function umc_create_map()
{
    global $UMC_SETTING, $UMC_DOMAIN, $UMC_PATH_MC, $UMC_ENV;
    $timer = array();
    $UMC_ENV = '2Dmap';
    $file = $UMC_SETTING['map_css_file'];
    $css = "\n" . '<style type="text/css">' . file_get_contents($file) . "\n";
    $worlds = array('city', 'empire', 'aether', 'flatlands', 'kingdom', 'draftlands', 'skyblock', 'empire_new');
    $longterm = $UMC_SETTING['longterm'];
    $s_post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
    $s_get = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
    if (isset($s_get['world'])) {
        $world = $s_get['world'];
        if (!in_array($world, $worlds)) {
            exit;
        }
    } else {
        if (isset($s_post['world'])) {
            $world = $s_post['world'];
            if (!in_array($world, $worlds)) {
                exit;
            }
        } else {
            $world = 'empire';
        }
    }
    // get donators
    $donators = umc_users_donators();
    $track_player_icon = '';
    $find_lot = false;
    $settler_test = false;
    $track_player = false;
    // part of the settler test
    if (isset($s_post['settler_test'])) {
        $settler_test = true;
    } else {
        if (isset($s_post['track_player'])) {
            $player = $s_post['track_player'];
            $loc = umc_read_markers_file('array', $world);
            // something is wrong: player is not online or in the wrong world
            if (!isset($loc[$player])) {
                //umc_error_longmsg("Could not find player $player on the 2D map for the settler test! (track_player)\n" . umc_ws_vardump($loc));
                return "You need to be login on the server and be in the {$world} world to do this. Please go back to the previous page and try again.";
            } else {
                // player is in the right world.
                $track_player = true;
                $track_player_icon = "&identify_user={$player}";
            }
        } else {
            if (isset($s_post['guide_lot'])) {
                $player = $s_post['guide_lot'];
                $loc = umc_read_markers_file('array', $world);
                if (!isset($loc[$player])) {
                    XMPP_ERROR_trigger("Could not find player {$player} on the 2D map for the settler test! (guide_lot)\n" . umc_ws_vardump($loc));
                    return "You need to be login on the server and be in the {$world} world to do this. Please go back to the previous page and try again.";
                } else {
                    // player is in the right world.
                    $find_lot = true;
                    $track_player_icon = "&track_user={$player}";
                }
                $player_z = floor($loc[$player]['top']) + 20;
                $player_x = floor($loc[$player]['left']) + 10;
                $player_lot = $s_post['lot'];
            } else {
                $player_x = 0;
                $player_z = 0;
                $lot_x = 0;
                $lot_z = 0;
            }
        }
    }
    $lag = false;
    if (isset($s_get['lag'])) {
        $lag = true;
    }
    $freeonly = false;
    if (isset($s_get['freeonly']) && $s_get['freeonly'] == 'true' || isset($s_post['freeonly']) && $s_post['freeonly'] == 'true') {
        $freeonly = true;
    }
    $menu = '';
    if ($settler_test) {
        $menu .= "<form action=\"{$UMC_DOMAIN}/server-access/buildingrights/\" method=\"post\">\n" . "<input type=\"hidden\" name=\"step\" value=\"4\">\n<input type=\"hidden\" name=\"world\" value=\"{$world}\">\n";
    } else {
        if ($track_player) {
            $player_lot = $s_post['lot'];
            $menu .= "<form action=\"{$UMC_DOMAIN}/server-access/buildingrights/\" method=\"post\">\n" . "<input type=\"hidden\" name=\"step\" value=\"7\">\n<input type=\"hidden\" name=\"world\" value=\"{$world}\"><input type=\"hidden\" name=\"lot\" value=\"{$player_lot}\">\n";
        } else {
            if ($find_lot) {
                $menu .= "<form action=\"{$UMC_DOMAIN}/server-access/buildingrights/\" method=\"post\">\n" . "<input type=\"hidden\" name=\"step\" value=\"9\">\n<input type=\"hidden\" name=\"world\" value=\"{$world}\"><input type=\"hidden\" name=\"lot\" value=\"{$player_lot}\">\n";
            }
        }
    }
    $menu .= "<div id=\"menu_2d_map\">\n";
    if (!$settler_test && !$track_player && !$find_lot) {
        // create the top menu
        $menu .= umc_map_menu($worlds, $world, $freeonly);
    } else {
        if ($settler_test) {
            $menu .= "Pick a lot that looks nice to you. Closer to spawn is more convenient. <button type='button' onclick='find_spawn()'>Find Spawn</button> Then click here: " . "<input id=\"settler_test_next\" type=\"submit\" name=\"Next\" value=\"Next\">\n";
        } else {
            if ($find_lot) {
                $menu .= "Walk in-game along the red line to your lot {$player_lot} and then press " . "<input type=\"submit\" name=\"Next\" value=\"Next\"> <button type='button' onclick='find_spawn()'>Find Spawn</button> \n";
            } else {
                $menu .= "Find your user head on the map and click on the button next to it!";
            }
        }
    }
    $menu .= "</div>\n";
    $new_choices = array();
    if ($world == 'empire_new') {
        $rights = umc_region_data('empire');
        // this is for the empire_new move only:
        // var_dump($new_choices);
    } else {
        $rights = umc_region_data($world);
    }
    $timer['after_region_data'] = XMPP_ERROR_ptime();
    $map = $UMC_SETTING['world_img_dim'][$world];
    $image = "{$UMC_PATH_MC}/server/maps/" . $world . ".jpg";
    $size = array(0, 0);
    if (file_exists($image)) {
        $size = getimagesize($image);
    }
    $map_width = $size[0];
    $map_height = $size[1];
    if ($lag) {
        $heatworld = $world;
        $world .= '_heatmap';
    }
    $html = '';
    if ($find_lot) {
        $html = "<canvas id=\"lot_pointer\" style=\"position: absolute; top: 30px; left: 10px; z-index: 99;\" width=\"{$map_width}\" height=\"{$map_height}\"></canvas>\n";
    }
    $html .= '<div id="outer_box">' . "\n" . '    <img src="/map/' . $world . '.jpg" id="image_box" alt="map">' . "\n";
    if ($track_player) {
        $html .= umc_read_markers_file('identify_user', $world, $player);
    } else {
        if ($find_lot) {
            $html .= umc_read_markers_file('track_user', $world, $player);
        } else {
            if ($lag) {
                $html .= umc_read_markers_file('html', $heatworld);
            } else {
                $html .= umc_read_markers_file('html', $world);
            }
        }
    }
    //$repl_arr = array(',','-');
    $kingdom = '';
    if ($world == 'kingdom' || $world == 'draftlands') {
        $kingdom = 'center';
    }
    if (isset($UMC_SETTING['world_data'][$world]['spawn'])) {
        $spawn_lot = strtoupper($UMC_SETTING['world_data'][$world]['spawn']);
    } else {
        $spawn_lot = '';
    }
    // $old_users =
    $timer['before_owner_age'] = XMPP_ERROR_ptime();
    $all_lastlogins = umc_users_active_lastlogin_and_level();
    // what date was 1 month ago?
    $now_datetime = umc_datetime();
    $now_datetime->modify('-1 month');
    $one_months_ago = $now_datetime->format('Y-m-d H:i:s');
    $now_datetime->modify('-1 month');
    // what date was 2 months ago?
    $two_months_ago = $now_datetime->format('Y-m-d H:i:s');
    $timer['after_owner_age'] = XMPP_ERROR_ptime();
    $banned_users = umc_banned_users();
    $timer['after_banned_users'] = XMPP_ERROR_ptime();
    $css_lot_sizes = array();
    //$user_str = "<div class=\"user\">";
    //$css_lot_types = array();
    // var_dump($old_users);
    foreach ($rights as $lot => $opt) {
        $class = '';
        if (substr($lot, 0, 2) == '__') {
            continue;
        }
        // we need to switch for the proper coordinates
        // we need the 1 coordinate to be the top left one
        // Lot A1
        // min: {z: 1152.0, y: 0.0, x: -1280.0}
        // max: {z: 1279.0, y: 128.0, x: -1153.0}
        // take the larger X (west)
        $min = $opt['min'];
        $max = $opt['max'];
        if ($min['z'] < $max['z']) {
            $z1 = $min['z'];
            $z2 = $max['z'];
        } else {
            $z1 = $max['z'];
            $z2 = $min['z'];
        }
        // get the smaller z (north)
        if ($min['x'] < $max['x']) {
            $x1 = $min['x'];
            $x2 = $max['x'];
        } else {
            $x1 = $max['x'];
            $x2 = $min['x'];
        }
        $coord_1 = $x1;
        $coord_2 = $z1;
        $chunk = "Region " . floor($x1 / 512) . "/" . floor($z1 / 512) . ", Chunks " . floor($x1 / 16) . "/" . floor($z1 / 16);
        $x1 = conv_x($x1, $map);
        $x2 = conv_x($x2, $map);
        $z1 = conv_z($z1, $map);
        $z2 = conv_z($z2, $map);
        if ($find_lot && $player_lot == $lot) {
            $lot_x = $x1 + 60;
            $lot_z = $z1 + 60;
        }
        $lowercase_lot = $lot;
        $lot = strtoupper($lot);
        $lot_str = $lot;
        $width = $x2 - $x1 - 3;
        $height = $z2 - $z1 - 3;
        //$css .='#'. $lot . ' {width:'. $width. 'px; height:'. $height . 'px; top:' . $z1 . 'px; left:'. $x1 . 'px;}'. "\n";
        $css_lot_location = ' style="top:' . $z1 . 'px; left:' . $x1 . 'px;"';
        $css_lot_sizes["size{$width}_{$height}"] = '{width:' . $width . 'px; height:' . $height . 'px;}';
        $size_class = " size{$width}_{$height}";
        $user_string = '';
        $owner_string = '';
        // $box_color = '';
        $coord_str = "            <span class=\"coords\">{$coord_1}/{$coord_2}, {$chunk}</span>\n";
        //. '<span class="coords bottomleft">'.$x1.'/'.$z2.'</span>'
        //. '<span class="coords topright">'.$x2.'/'.$z1.'</span>'
        //. '<span class="coords bottomright">'.$x2.'/'.$z2.'</span>';
        if ($opt['owners']) {
            $owner_uuid = key($opt['owners']);
            $owner_username = $opt['owners'][$owner_uuid];
            // donation level
            $donation_level = false;
            if (isset($donators[$owner_uuid])) {
                $donation_level = $donators[$owner_uuid];
            }
            // find out who can keep their lot longer than 1 months
            $retain_lot = false;
            // kick out banned users
            if (isset($owner_uuid, $banned_users)) {
                $class = ' redout';
                $lastlogin_str = "Banned!";
            }
            $owner_lastlogin = $all_lastlogins[$owner_uuid]['lastlogin'];
            if (!isset($all_lastlogins[$owner_uuid]['userlevel'])) {
                XMPP_ERROR_trigger("{$owner_username} has no userlevel for the map!");
            }
            $lastlogin_str = $owner_lastlogin;
            $ownergroup = $all_lastlogins[$owner_uuid]['userlevel'];
            // who should be able to be away for 2 months?
            if (in_array($ownergroup, $longterm)) {
                $retain_lot = true;
            }
            // if we show only free lots, use different class
            $border = '';
            if (!$freeonly) {
                $border = 'border';
                // $box_color = ' background: rgba(0, 255, 255, 0.2);';
            }
            if ($retain_lot && $owner_lastlogin < $two_months_ago && $donation_level < 2) {
                // too late
                $class .= ' red' . $border;
            } else {
                if ($retain_lot && $owner_lastlogin < $one_months_ago && $donation_level < 2) {
                    // still yellow
                    $class .= ' yellow' . $border;
                } else {
                    if (!$retain_lot && $owner_lastlogin < $two_months_ago && $world == 'aether' && $donation_level < 1) {
                        $class .= ' red' . $border;
                    } else {
                        if (!$retain_lot && $owner_lastlogin < $one_months_ago && $donation_level < 1) {
                            $class .= ' red' . $border;
                        } else {
                            if (isset($new_choices[$lowercase_lot]) && !in_array($new_choices[$lowercase_lot]['choice'], array('keep', 'reset'))) {
                                $class .= ' whiteborder';
                            } else {
                                $class .= ' black' . $border;
                            }
                        }
                    }
                }
            }
            if (substr($lot, 0, 3) === 'CON') {
                $owner_string .= "{$owner_username}";
                $lot_str = substr($lot_str, 4);
                $class .= " small";
            } else {
                $owner_string .= "{$owner_username} ({$lastlogin_str})";
                $lot_str = $lot;
            }
        } else {
            $class .= ' whiteborder';
        }
        if ($opt['members']) {
            $members = array_unique($opt['members']);
            foreach ($members as $user) {
                $user_string .= "{$user} ";
            }
        }
        //        if ($opt['members']) {
        //            $members = array_unique($opt['members']);
        //            foreach ($members as $user) {
        //                $user_string .= "$user ";
        //            }
        //        }
        if ($opt['owners']) {
            $owner_string = "            <div class=\"Owner\">{$owner_string}</div>\n";
            if ($opt['members']) {
                $user_string = "            <span class=\"user\">{$user_string}</span>\n";
            }
        }
        $onclick = '';
        if ($settler_test && !$opt['owners']) {
            $onclick = " onclick=\"select_lot('radio_{$lot}', '{$lot}')\"";
        }
        $html .= "    <div id=\"{$lot}\" class=\"outerframe{$class}{$size_class}\"{$css_lot_location}{$onclick}>\n";
        if ($settler_test && !$opt['owners']) {
            $html .= "        <input id=\"radio_{$lot}\" class=\"settler_test\" type=\"radio\" name=\"lot\" value=\"{$lot}\"><label for=\"radio_{$lot}\">{$lot_str}</label>\n";
        } else {
            $html .= "        <div class=\"innertext {$kingdom}\">{$lot_str}<br>\n{$owner_string}{$user_string}{$coord_str}        </div>\n";
        }
        $html .= "    </div>\n";
    }
    $timer['after_regions_display'] = XMPP_ERROR_ptime();
    if ($settler_test || $track_player || $find_lot) {
        $html .= '</form>';
    }
    foreach ($css_lot_sizes as $class => $css_string) {
        $css .= ".{$class} {$css_string}\n";
    }
    if ($lag) {
        $world = $heatworld;
    }
    $css .= "</style>\n";
    $header = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <title>Uncovery Minecraft 2D Map: ' . $world . '</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script type="text/javascript" src="/admin/js/jquery-1.11.1.min.js"></script>
        <script type="text/javascript" src="/admin/js/jquery-ui.min.js"></script>
        <script type="text/javascript">
            function find_spawn() {
                window.scrollTo(($(document).width()-$(window).width())/2 + 60,($(document).height()-$(window).height())/2 - 60);
                doBlink("' . $spawn_lot . '");
            }
            function doBlink(element_id) {
                toggleBlink(element_id);
                setTimeout(function() {toggleBlink(element_id);}, 2000);
            }
            function toggleBlink(element_id) {
                $("#" + element_id).toggleClass("blink_me");
            }
            function toggleLotDisplay() {
                $(".blackborder").toggleClass("black");
                $(".redborder").toggleClass("red");
                $(".yellowborder").toggleClass("yellow");
            }
            function find_user(left, top, element_id) {
                window.scrollTo(left - ($(window).width() / 2), top - ($(window).height() / 2))
                $("#" + element_id).effect("shake");
            }
            function select_lot(lot_radio, lot_name) {
                $("#" + lot_radio).prop("checked", true);
                $("#settler_test_next").prop("value", "Chose Lot " + lot_name);
            }
            var markers_url = "' . $UMC_DOMAIN . '/admin/index.php?function=display_markers&world=' . $world . $track_player_icon . '";
            var markers_menu_url = "' . $UMC_DOMAIN . '/admin/index.php?function=display_markers&format=scrollto&world=' . $world . '";
            function update_positions() {
                $.ajax({
                    url: markers_menu_url,
                    success: function(data) {
                        $("#scroll_to_icons").remove();
                        $(data).insertAfter( "#link_3d_maps" );
                        // $("#link_3d_maps").html($("#link_3d_maps").html() + data);
                    }
                });
                $.ajax({
                    url: markers_url,
                    success: function(data) {
                        $("#marker_list").remove();
                        $("#outer_box").html(data + $("#outer_box").html());
                        setTimeout("update_positions()", 4000);' . "\n";
    if ($find_lot) {
        $header .= '                draw_line();
                    }
                });

            }
            function draw_line() {
                var player_left = parseInt($("#' . $player . '_marker").css("left"), 10) + 10;
                var player_top = parseInt($("#' . $player . '_marker").css("top"), 10) + 10;
                var c = document.getElementById("lot_pointer");
                var ctx = c.getContext("2d");
                ctx.setTransform(1, 0, 0, 1, 0, 0);
                ctx.beginPath();
                ctx.clearRect(0, 0, ' . $map_width . ', ' . $map_height . ');
                ctx.strokeStyle="red";
                ctx.moveTo(player_left, player_top);
                ctx.lineTo(' . $lot_x . ',' . $lot_z . ');
                ctx.stroke();
            }
';
    } else {
        $header .= '                        }
                    });
                }
';
    }
    if (!$settler_test) {
        $header .= '$(document).ready(function() {update_positions();});';
    }
    $header .= "\n</script>\n";
    $out = $header . $css . "</head>\n<body>\n" . $menu . $html . "</div>n</body>\n</html>\n";
    XMPP_ERROR_trace("construction done");
    echo $out;
}
function umc_wp_forum_get_postlink($P)
{
    $user = get_userdata($P->post_author);
    $uuid = get_user_meta($user->ID, 'minecraft_uuid', true);
    $icon_url = umc_user_get_icon_url($uuid);
    $date_obj = umc_datetime($P->post_date);
    $time_ago = umc_timer_format_diff($date_obj);
    $link = $P->guid;
    $post_title = $P->post_title;
    $html = "<a class=\"bbp-reply-topic-title\" href=\"{$link}\" title=\"{$post_title}\">{$post_title}</a><br>by\r\n        <a href=\"http://uncovery.me/forums/users/{$user->user_login}/\" title=\"View {$user->display_name}&#039;s profile\"\r\n        class=\"bbp-author-avatar\" rel=\"nofollow\"><img alt='' src='{$icon_url}' class='avatar avatar-14 photo' height='14' width='14' /></a>&nbsp;\r\n        <a href=\"http://uncovery.me/forums/users/{$user->user_login}/\" title=\"View {$user->display_name}&#039;s profile\" class=\"bbp-author-name\" rel=\"nofollow\">\r\n        {$user->display_name}</a><br>{$time_ago} ago";
    return $html;
}
function umc_vanity_set()
{
    global $UMC_USER;
    $player = $UMC_USER['username'];
    $args = $UMC_USER['args'];
    $userlevel = umc_get_userlevel($player);
    // umc_echo("$userlevel");
    if (!isset($args[2]) || !is_numeric($args[2]) || $args[2] < 1) {
        umc_error("{red}You need to specify a number of days");
    } else {
        if (!isset($args[3])) {
            umc_error("{red}You need to specify the title you want to have. See {yellow}/helpme vanity");
        }
    }
    $days = $args[2];
    $vanity_raw = '';
    // concatenate all into a string
    for ($i = 3; $i < count($args); $i++) {
        $vanity_raw .= " " . $args[$i];
    }
    $vanity = trim($vanity_raw);
    $donator_str = '';
    if (strstr($userlevel, 'DonatorPlus')) {
        $donator_str = '&6++&f';
    } else {
        if (strstr($userlevel, 'Donator')) {
            $donator_str = '&6+&f';
        } else {
            if ($userlevel == 'Owner') {
                $donator_str = '&6++&f';
            }
        }
    }
    $final_title = ' [' . $vanity . '&f]';
    // check for invalid chars
    umc_vanity_sanitize($vanity);
    $quote_array = umc_vanity_quote_title($vanity);
    $total_cost = $quote_array['cost'] * $days;
    $balance = umc_money_check($player);
    if ($quote_array['length'] > 20) {
        umc_error("Your title is too long ({$quote_array['length']} vs. 20 max!");
    }
    if ($total_cost > $balance) {
        umc_error("You do not have enough money to pay for this title for {$days} days. You need {$total_cost} but have only {$balance}!");
    }
    // check if there is a title already set
    $check = umc_vanity_get_title();
    if ($final_title == $check . $donator_str) {
        umc_header("Vanity Title");
        umc_echo("The same title is already set and will be extended by {$days} days!");
    } else {
        if ($check && $final_title != $check . $donator_str) {
            umc_error("You have a different title already set. You need to cancel that one first or set the same one to extend it!");
        } else {
            // no title set yet
            $uuid = umc_user2uuid($player);
            umc_header("Vanity Title");
            umc_echo("No title yet set, setting new one...");
            umc_exec_command("pex user {$uuid} suffix \"{$final_title}{$donator_str}\"", 'asConsole');
        }
    }
    // set timer
    umc_money($player, false, $total_cost);
    umc_timer_set($player, 'custom_title', $days);
    $date_out = umc_timer_get($player, 'custom_title');
    $time_out = $date_out->format('Y-m-d H:i:s');
    $date_today = umc_datetime();
    $interval = $date_today->diff($date_out);
    $days_interval = $interval->days;
    $hours_interval = $interval->h;
    umc_echo("Your title [{$vanity}{white}] will expire on {$time_out} (in {$days_interval} days and {$hours_interval} hours)!");
    umc_echo("Your account has been debited {$total_cost}!");
    umc_log('vanity', 'set', "{$player} paid {$total_cost} for {$vanity} for {$days} days");
    umc_footer(true);
}
Example #7
0
function umc_server_status()
{
    global $UMC_DOMAIN;
    XMPP_ERROR_trace(__FUNCTION__, func_get_args());
    $errno = '';
    $errstr = '';
    $fp = @fsockopen('uncovery.me', 25565, $errno, $errstr, 1);
    if (!$fp) {
        echo "{$errstr} ({$errno})<br />\n";
        return "<img src=\"{$UMC_DOMAIN}/admin/img/offline.png\" height=\"50\"><Br>";
    } else {
        global $UMC_USER;
        $out = "<img src=\"{$UMC_DOMAIN}/admin/img/online.png\" height=\"50\"><br>";
        if ($UMC_USER) {
            $uuid = $UMC_USER['uuid'];
            $username = strtolower($UMC_USER['username']);
            $date_new = umc_datetime();
            $now = $date_new->format('Y-m-d H:i');
            $out .= '<strong>Server Address:</strong> uncovery.me<br>' . '<strong>Server Port:</strong> 25565<br>' . "<strong>Server Time:</strong> {$now}<br>" . "<strong>Next reboot in:</strong> " . umc_time_until_restart() . "<br>";
            $result = count_users();
            $out .= '<strong>Registered Users:</strong> ' . $result['total_users'] . '<br>';
            //$rights = umc_read_data('permissions');
            //$users = $rights['permissions']['users'];
            //$result = count($users);
            //$out .= '<strong>Builders:</strong> '.  $result . '<br>';
            $out .= '<strong>Online Users:</strong> ';
            $online_users = umc_read_markers_file('array');
            $no_users = count($online_users);
            if ($no_users > 0 && $online_users != '') {
                $out .= "({$no_users}) ";
                foreach ($online_users as $data) {
                    $out .= "<a href=\"{$UMC_DOMAIN}/users-2/?u={$data['name']}\">{$data['name']}</a>, ";
                }
            } else {
                $out .= "nobody";
            }
            $out = rtrim($out, ", ");
            // $out .= "<br>". umc_donation_stats();
            $dlevel = umc_donation_level($UMC_USER['username']);
            if ($dlevel) {
                $out .= "<br><strong>Your donation lasts</strong>  {$dlevel} more months.";
            }
        } else {
            $out = 'Please login!';
        }
    }
    return $out;
}
Example #8
0
/**
 * This assumes a monthly targetof 135 USD and shows how much of the monthly target we have reached
 *
 * @return string
 */
function umc_donation_monthly_target()
{
    $datetime_now = umc_datetime();
    $this_year_month_first = $datetime_now->format('Y-m') . "-01";
    $founding_month = '2010-11-02';
    $datetime_founding = umc_datetime($founding_month);
    $seconds_since_founding = $datetime_now->diff($datetime_founding);
    $months_since_founding = $seconds_since_founding->format('%y') * 12 + $seconds_since_founding->format('%m');
    $monthly_costs = 135;
    $sql = "SELECT SUM(amount) as donated FROM minecraft_srvr.donations WHERE date >= '{$this_year_month_first}';";
    $D = umc_mysql_fetch_all($sql);
    $donated = $D[0]['donated'];
    $percent = floor($donated / ($monthly_costs / 100));
    $percent_css = $percent;
    // since 0% also shows a green bar, we just color it red.
    if ($percent == 0) {
        $color = 'red';
    } else {
        $percent_css = $percent - 1;
        $color = 'green';
    }
    $thanks = '';
    if ($percent >= 100) {
        $thanks = " Thanks for contributing!";
    }
    $overall_costs = $months_since_founding * $monthly_costs;
    $overall_sql = "SELECT SUM(amount) as donated FROM minecraft_srvr.donations;";
    $D = umc_mysql_fetch_all($overall_sql);
    $overall_donated = $D[0]['donated'];
    $overall_percent = floor($overall_donated / ($overall_costs / 100));
    $overall_percent_css = $overall_percent;
    // since 0% also shows a green bar, we just color it red.
    if ($overall_percent == 0) {
        $overall_color = 'red';
    } else {
        $overall_percent_css = $overall_percent - 1;
        $overall_color = 'green';
    }
    $out = "\nThis month's donation target:\n";
    $out .= "<div style=\"overflow: hidden; width:100%; background:red; border:1px solid #000000; border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px;\">\n" . "    <div style=\"width:{$percent_css}%; background:{$color}; float:left; padding-left:5px;color:#ffffff; \">\n" . "        {$percent}%{$thanks}\n" . "    </div>\n" . "    <div style=\"clear:both;\"></div>\n" . "</div>\n" . "\nOverall donation target:\n" . "<div style=\"overflow: hidden; width:100%; background:red; border:1px solid #000000; border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px;\">\n" . "    <div style=\"width:{$overall_percent_css}%; background:{$overall_color}; float:left; padding-left:5px;color:#ffffff; \">\n" . "        {$overall_percent}%\n" . "    </div>\n" . "    <div style=\"clear:both;\"></div>\n" . "</div>\n";
    return $out;
}
Example #9
0
function umc_info_who()
{
    global $UMC_USER;
    $args = $UMC_USER['args'];
    // we predefine the array to make sure proper sorting
    $out_arr = array('Guest' => array(), 'Settler' => array(), 'Citizen' => array(), 'Architect' => array(), 'Designer' => array(), 'Master' => array(), 'Elder' => array(), 'Owner' => array());
    $user_worlds = false;
    if (isset($args[2]) && $args[2] == 'where') {
        $user_worlds = umc_read_markers_file('array');
    } else {
        if (isset($args[2])) {
            // single player info
            $user = umc_check_user($args[2]);
            if ($user) {
                $user_info = umc_get_userinfo($user);
                umc_header("User info for {$user}");
                $data_text = '';
                foreach ($user_info as $desc => $data) {
                    if ($desc == 'Last Seen') {
                        if (isset($UMC_USER['player_data'][$user_info['uuid']])) {
                            $data_text = "{$user} is currently online";
                        } else {
                            $datetime = umc_datetime($data);
                            $diff = umc_timer_format_diff($datetime);
                            $data_text = $diff . " ago";
                        }
                    } else {
                        $data_text = $data;
                    }
                    umc_echo("{green}{$desc}: {white}{$data_text}");
                }
                umc_footer();
                return;
            } else {
                umc_echo("{red}Error: Command/user not recognized");
            }
        }
    }
    $players_data = $UMC_USER['player_data'];
    $count = count($players_data);
    foreach ($players_data as $uuid => $players_details) {
        $level = umc_get_uuid_level($uuid);
        $player = $players_details['Name'];
        if (strstr($level, "DonatorPlus")) {
            $new_lvl = substr($level, 0, -11);
            $new_player = "{$player}{yellow}++{white}";
        } else {
            if (strstr($level, "Donator")) {
                $new_lvl = substr($level, 0, -7);
                $new_player = "{$player}{yellow}+{white}";
            } else {
                $new_lvl = $level;
                $new_player = $player;
            }
        }
        $lower_username = strtolower($player);
        if ($user_worlds && isset($user_worlds[$lower_username])) {
            $new_player .= " {grey}({$user_worlds[$lower_username]['world']}){white}";
        }
        $out_arr[$new_lvl][] = $new_player;
    }
    umc_header("{$count} users online:");
    foreach ($out_arr as $level => $players) {
        if (count($players) > 0) {
            umc_echo("{green}{$level}: {white}" . implode(", ", $players));
        }
    }
    umc_footer();
    if ($user_worlds) {
        umc_echo("{blue}Try {grey}/who <player>{blue} for user details");
    } else {
        umc_echo("{blue}Try {grey}/where{blue} or {grey}/who <player>{blue} for more info");
    }
}
Example #10
0
function umc_get_lot_owner_age($format = 'string', $oneuser = false, $debug = false)
{
    XMPP_ERROR_trace(__FUNCTION__, func_get_args());
    $playerfilter = "";
    if ($oneuser) {
        $uuid = umc_uuid_getone($oneuser, 'uuid');
        $playerfilter = " AND UUID.uuid = '{$uuid}'";
    }
    //temp fix for wrong userlogin
    umc_uuid_firstlogin_update($uuid);
    $sql = "SELECT username, lastlogin, firstlogin, onlinetime\r\n        FROM minecraft_srvr.UUID\r\n        LEFT JOIN minecraft_worldguard.user ON user.uuid=UUID.uuid\r\n        LEFT JOIN minecraft_worldguard.region_players ON id=user_id\r\n        WHERE owner=1 {$playerfilter}\r\n        GROUP BY username, lastlogin\r\n        ORDER BY lastlogin ASC";
    $R = umc_mysql_fetch_all($sql);
    $users = array();
    $diff_steps = array('y' => 'years', 'm' => 'months', 'd' => 'days', 'h' => 'hours', 'i' => 'minutes', 's' => 'seconds');
    /*
    *
       $now = time(); // or your date as well
       $your_date = strtotime("2013-11-20");
       $datediff = $now - $your_date;
       $alt_days = floor($datediff/(60*60*24));
    */
    // umc_error_notify("Could not get player age: $sql");
    if (count($R) == 0) {
        // umc_error_notify("Error to get user age: $sql");
        return false;
    }
    foreach ($R as $row) {
        $username = strtolower($row['username']);
        $last_time = $row['lastlogin'];
        /* if (!function_exists('umc_datetime')) {
                    umc_error_longmsg("umc_Datetime not found ($sql)");
                    include_once("$UMC_PATH_MC/server/bin/includes/timer.inc.php");
                    if (!function_exists('umc_datetime')) {
                        umc_error_longmsg("Datetime function not found (level2)");
                    }
        
                }*/
        $last_datetime = umc_datetime($last_time);
        $first_time = $row['firstlogin'];
        if ($debug) {
            echo "First_time = {$first_time}\n";
        }
        $first_datetime = umc_datetime($first_time);
        if ($debug) {
            echo "First_datetime = " . var_export($first_datetime, true);
        }
        if ($format == 'string') {
            $last_diff = umc_timer_array_diff($last_datetime);
            $first_diff = umc_timer_array_diff($first_datetime);
            foreach ($diff_steps as $code => $text) {
                $last_val = $last_diff->{$code};
                $users[$uuid]['lastlogin'][$text] = $last_val;
                $first_val = $first_diff->{$code};
                $users[$uuid]['firstlogin'][$text] = $first_val;
            }
        } else {
            // days
            $first_seconds = umc_timer_raw_diff($first_datetime);
            if ($debug) {
                echo "First_seconds = " . var_export($first_seconds, true);
            }
            $first_days = round($first_seconds / 60 / 60 / 24);
            $users[$uuid]['firstlogin']['days'] = $first_days;
            $users[$uuid]['firstlogin']['seconds'] = $first_seconds;
            $last_seconds = umc_timer_raw_diff($last_datetime);
            $last_days = round($last_seconds / 60 / 60 / 24);
            $users[$uuid]['lastlogin']['days'] = $last_days;
            $users[$uuid]['lastlogin']['seconds'] = $last_seconds;
        }
        $users[$uuid]['lastlogin']['full'] = $last_time;
        $users[$uuid]['firstlogin']['full'] = $first_time;
        $users[$uuid]['onlinetime']['seconds'] = $row['onlinetime'];
        $users[$uuid]['onlinetime']['days'] = round($row['onlinetime'] / 60 / 60 / 24);
    }
    return $users;
}
Example #11
0
function umc_time_until_restart()
{
    global $UMC_SETTING;
    $restart_time = $UMC_SETTING['restart_time'];
    $target_date = umc_datetime("tomorrow {$restart_time}");
    $interval = umc_timer_array_diff($target_date);
    $out = '';
    if ($interval->h > 0) {
        $out .= $interval->h . " hours and ";
    }
    $out .= $interval->i . " min";
    return $out;
}
function umc_hardcore_get_period()
{
    global $HARDCORE;
    $first_date_obj = umc_datetime($HARDCORE['first_date']);
    $interval = umc_timer_array_diff($first_date_obj);
    $days_count = $interval->format('%a');
    $period_length = $HARDCORE['period_length'];
    $period_no = floor($days_count / $period_length);
    $period_days_since = $period_no * $period_length;
    $first_date_obj->add(new DateInterval('P' . $period_days_since . 'D'));
    $period_start_date = $first_date_obj->format('Y-m-d 00:00:00');
    $first_date_obj->add(new DateInterval('P' . $period_length . 'D'));
    $period_end_date = $first_date_obj->format('Y-m-d 00:00:00');
    $retval = array('number' => $period_no, 'start_date' => $period_start_date, 'end_date' => $period_end_date);
    return $retval;
}
Example #13
0
function umc_log_chat_import()
{
    global $UMC_PATH_MC;
    $pattern_path = "{$UMC_PATH_MC}/server/bukkit/plugins/Herochat/logs/*";
    $files = umc_glob_recursive($pattern_path);
    $pattern_line = '/([0-9.]{10} [0-9:]{8})( \\[[A-Z]\\])? ?\\*? ?(\\[Trivia\\]|[_0-9a-zA-Z]*)( -> ([_0-9a-zA-Z]*|)?)?(.*: )?(.*)/';
    $target_path = '/disk2/backup/log/minecraft';
    // erase the file
    foreach ($files as $file) {
        $text_arr = file($file);
        // get the first text
        $sql = "INSERT INTO `minecraft_log`.`chat_log` (`timestamp`, `source`, `target`, `text`, `raw`) VALUES \n";
        if (count($text_arr) == 0) {
            continue;
        }
        foreach ($text_arr as $line) {
            $match = array();
            $raw = umc_mysql_real_escape_string(trim($line));
            preg_match($pattern_line, $line, $match);
            // $raw = bzcompress($match[0]);
            $time = $match[1];
            $source = trim($match[3]);
            $target = trim($match[4]);
            if (strlen($match[2]) > 0) {
                $target = trim($match[2]);
            } else {
                if (strlen($match[5]) > 0) {
                    $target = trim($match[5]);
                }
            }
            $text = trim($match[7]);
            $text_sql = umc_mysql_real_escape_string($text);
            if (strlen($time) > 0) {
                $sql .= "('{$time}', '{$source}', '{$target}', {$text_sql}, {$raw}),";
            }
        }
        $ins = substr($sql, 0, -1) . ";";
        $date_today = umc_datetime();
        $today = $date_today->format('Y|m|d|H|i');
        $date_parts = explode("|", $today);
        $year = $date_parts[0];
        $month = $date_parts[1];
        $day = $date_parts[2];
        $hour = $date_parts[3];
        $min = $date_parts[3];
        umc_mysql_query($ins, true);
        $file = "{$year}-{$month}-{$day}_{$hour}_{$min}_chat_log.tar.bz2";
        rename($file, "{$target_path}/{$year}/{$month}/{$file}");
    }
}
function umc_trivia_webstats()
{
    $out = '<table>';
    $quiz_sql = "SELECT * FROM minecraft_quiz.quizzes WHERE end <> '' ORDER BY start DESC;";
    $D = umc_mysql_fetch_all($quiz_sql);
    foreach ($D as $quiz_row) {
        $quiz_id = $quiz_row['quiz_id'];
        $master = $quiz_row['master'];
        $quiz_start = $quiz_row['start'];
        $quiz_end = $quiz_row['end'];
        $winner = $quiz_row['winner'];
        $points = $quiz_row['points'];
        $prize = $quiz_row['points'];
        $out .= "<tr style=\"background-color:#99CCFF;\"><td>Quiz No.{$quiz_id}, Quizmaster: {$master}</td><td>Start: {$quiz_start}</td></tr>";
        $out .= "<tr><td colspan=2>Winner: {$winner} with {$points} points won {$prize} Uncs each</tr>";
        $datetime = umc_datetime($quiz_start);
        $seconds = umc_timer_raw_diff($datetime);
        $days = $seconds / 60 / 60 / 24;
        if ($days > 3) {
            continue;
        }
        $question_sql = "SELECT question_no, question, answer, quiz_questions.question_id FROM minecraft_quiz.quiz_questions\r\n            LEFT JOIN minecraft_quiz.catalogue ON quiz_questions.question_id = catalogue.question_id\r\n            WHERE quiz_id = {$quiz_id} ORDER BY question_no;";
        $Q = umc_mysql_fetch_all($question_sql);
        foreach ($Q as $question_row) {
            $question_no = $question_row['question_no'];
            $question_id = $question_row['question_id'];
            $question = $question_row['question'];
            $answer = $question_row['answer'];
            $out .= "<tr style=\"font-size:70%; background-color:#99FFCC;\"><td style=\"padding-left:40px\">Q. No.{$question_no}: {$question}</td><td>A.: {$answer}</td></tr>";
            $answer_sql = "SELECT * FROM minecraft_quiz.quiz_answers WHERE quiz_id={$quiz_id} AND question_id={$question_id} ORDER BY answer_id;";
            $A = umc_mysql_fetch_all($answer_sql);
            $out .= "<tr style=\"font-size:70%;\"><td style=\"padding-left:80px\" colspan=2>";
            foreach ($A as $answer_row) {
                $answer_id = $answer_row['answer_id'];
                $user_answer = $answer_row['answer_text'];
                $username = $answer_row['username'];
                $result = $answer_row['result'];
                $style = "style=\"margin-right:10px;\"";
                if ($result == 'right') {
                    $style = " style=\"color:green; margin-right:10px;\"";
                }
                $out .= "<span {$style}>{$answer_id} ({$username}): {$user_answer}</span>";
            }
            $out .= "</td></tr>";
        }
    }
    $out .= "</table>";
    return $out;
}