/** * 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"); }
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}'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> \r\n <a href=\"http://uncovery.me/forums/users/{$user->user_login}/\" title=\"View {$user->display_name}'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); }
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; }
/** * 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; }
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"); } }
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; }
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; }
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; }