Explorar o código

Game Server Ordering - Can be set by admin user only (#449)

* Allow Admin to Set Game Server Order #1

* Allow Admin to Set Game Server Order #2

* Allow Admin to Set Game Server Order #3

* Allow Admin to Set Game Server Order #4

* Allow Admin to Set Game Server Order #5

* Allow Admin to Set Game Server Order #6

* Allow Admin to Set Game Server Order #7

* Allow Admin to Set Game Server Order #8

* Allow Admin to Set Game Server Order #9

* Allow Admin to Set Game Server Order #10

* Allow Admin to Set Game Server Order #1q

* Allow Admin to Set Game Server Order #12

* Allow Admin to Set Game Server Order #13

* Allow Admin to Set Game Server Order #14

* Allow Admin to Set Game Server Order #15

* Allow Admin to Set Game Server Order #16

* Allow Admin to Set Game Server Order #17

* Allow Admin to Set Game Server Order #18

* Allow Admin to Set Game Server Order #19

* Allow Admin to Set Game Server Order #20

* Allow Admin to Set Game Server Order #21

* Allow Admin to Set Game Server Order #22

* Allow Admin to Set Game Server Order #23

* Include Already Assigned Homes in Group to Be Available to Be Assigned to a New Group

* Allow Admin to Set Game Server Order #24

* Allow Admin to Set Game Server Order #25

* Set New Session Variable Post Update
OwN-3m-All %!s(int64=6) %!d(string=hai) anos
pai
achega
e8a2307e55

+ 3 - 0
includes/api_functions.php

@@ -39,6 +39,9 @@ function get_function_args($main_request)
 	$functions["gamemanager/restart"] = array("token" => true, "ip" => true, "port" => true, "mod_key" => false);
 	$functions["gamemanager/rcon"] = array("token" => true, "ip" => true, "port" => true, "mod_key" => false, "command" => true);
 	$functions["gamemanager/update"] = array("token" => true, "ip" => true, "port" => true, "mod_key" => false, "type" => true, "manual_url" => false);
+	
+	//______________ Game Manager Admin
+	$functions["gamemanager_admin/reorder"] = array("token" => true);
 
 	//______________ Lite File Manager
 	$functions["litefm/list"] = array("token" => true, "ip" => true, "port" => true, "relative_path" => true);

+ 6 - 0
includes/database.php

@@ -288,6 +288,12 @@ abstract class OGPDatabase {
     abstract public function getTablePrefix();
     
     abstract public function getHomeAffinity($home_id);
+    
+    abstract public function saveGameServerOrder($order);
+    
+    abstract public function resetGameServerOrder();
+    
+    abstract public function runMultiSQLQuery($sql);
 }
 
 ?>

+ 92 - 23
includes/database_mysqli.php

@@ -1470,7 +1470,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 							FROM `%1$shome_ip_ports`
 							WHERE `force_mod_id` = %1$sgame_mods.mod_id OR %1$shome_ip_ports.force_mod_id = 0
 						)
-						OR %1$shome_ip_ports.force_mod_id IS NULL;';
+						OR %1$shome_ip_ports.force_mod_id IS NULL ORDER BY home_user_order ASC, %1$sserver_homes.home_id ASC;';
 			$template2 = 'SELECT user_expiration_date, home_id FROM %1$suser_homes WHERE user_id = %2$d;';
 			$template3 = 'SELECT user_group_expiration_date, home_id FROM %1$suser_group_homes WHERE group_id IN(
 							SELECT %1$suser_groups.group_id
@@ -1484,7 +1484,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 				%1$suser_homes.user_expiration_date, %1$sremote_servers.*, %1$sconfig_homes.*
 				FROM %1$sremote_servers NATURAL JOIN %1$suser_homes
 				NATURAL JOIN %1$sserver_homes NATURAL JOIN %1$sconfig_homes
-				WHERE %1$suser_homes.user_id = %2$d ORDER BY home_id ASC;';
+				WHERE %1$suser_homes.user_id = %2$d ORDER BY home_user_order ASC, %1$sserver_homes.home_id ASC;';
 		}
 		else if ( $id_type == "group" )
 		{
@@ -1492,7 +1492,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 				%1$suser_group_homes.user_group_expiration_date, %1$sremote_servers.*, %1$sconfig_homes.*
 				FROM %1$sremote_servers NATURAL JOIN %1$suser_group_homes
 				NATURAL JOIN %1$sserver_homes NATURAL JOIN %1$sconfig_homes
-				WHERE %1$suser_group_homes.group_id = %2$d;';
+				WHERE %1$suser_group_homes.group_id = %2$d ORDER BY home_user_order ASC, %1$sserver_homes.home_id ASC;';
 		}
 		else if ( $id_type == "user_and_group" )
 		{
@@ -1502,6 +1502,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 								%1$sconfig_homes.*, 
 								%1$shome_ip_ports.port,
 								%1$shome_ip_ports.force_mod_id,
+								%1$sserver_homes.home_id as hid,
 								%1$sremote_server_ips.ip_id,
 								%1$sremote_server_ips.ip,
 								%1$sgame_mods.mod_id,
@@ -1543,6 +1544,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 								%1$sconfig_homes.*, 
 								%1$shome_ip_ports.port,
 								%1$shome_ip_ports.force_mod_id,
+								%1$sserver_homes.home_id as hid,
 								%1$sremote_server_ips.ip_id,
 								%1$sremote_server_ips.ip,
 								%1$sgame_mods.mod_id,
@@ -1581,7 +1583,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 								WHERE `force_mod_id` = %1$sgame_mods.mod_id OR %1$shome_ip_ports.force_mod_id = 0
 							)
 							OR %1$shome_ip_ports.force_mod_id IS NULL
-						);';
+						) ORDER BY home_user_order ASC, hid ASC;';
 		}
 		else
 		{
@@ -1801,9 +1803,9 @@ class OGPDatabaseMySQL extends OGPDatabase
 						OR agent_ip = \''.$search_field.'\' OR port = \''.$search_field.'\'
 						OR ip LIKE \'%%'.$search_field.'%%\'
 						' : '').'
-						').' OR %1$shome_ip_ports.force_mod_id IS NULL LIMIT '.$gethome_page_forlimit.','.$home_limit.';';
+						').' OR %1$shome_ip_ports.force_mod_id IS NULL ORDER BY home_user_order ASC, %1$sserver_homes.home_id ASC LIMIT '.$gethome_page_forlimit.','.$home_limit.';';
 						
-			$template2 = 'SELECT user_expiration_date, home_id FROM %1$suser_homes WHERE user_id = %2$d;';
+			$template2 = 'SELECT user_expiration_date, home_id FROM %1$suser_homes WHERE user_id = %2$d ORDER BY home_id ASC;';
 			$template3 = 'SELECT user_group_expiration_date, home_id FROM %1$suser_group_homes WHERE group_id IN(
 							SELECT %1$suser_groups.group_id
 							FROM %1$suser_groups
@@ -1816,7 +1818,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 				%1$suser_homes.user_expiration_date, %1$sremote_servers.*, %1$sconfig_homes.*
 				FROM %1$sremote_servers NATURAL JOIN %1$suser_homes
 				NATURAL JOIN %1$sserver_homes NATURAL JOIN %1$sconfig_homes
-				WHERE %1$suser_homes.user_id = %2$d '.($home_cfg_id ? 'AND %1$sserver_homes.home_cfg_id = '.$home_cfg_id : '').' ORDER BY home_id ASC LIMIT '.$gethome_page_forlimit.','.$home_limit.';';
+				WHERE %1$suser_homes.user_id = %2$d '.($home_cfg_id ? 'AND %1$sserver_homes.home_cfg_id = '.$home_cfg_id : '').' home_user_order ASC, %1$sserver_homes.home_id ASC LIMIT '.$gethome_page_forlimit.','.$home_limit.';';
 		}
 		else if ( $id_type == "group" )
 		{
@@ -1824,7 +1826,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 				%1$suser_group_homes.user_group_expiration_date, %1$sremote_servers.*, %1$sconfig_homes.*
 				FROM %1$sremote_servers NATURAL JOIN %1$suser_group_homes
 				NATURAL JOIN %1$sserver_homes NATURAL JOIN %1$sconfig_homes
-				WHERE %1$suser_group_homes.group_id = %2$d '.($home_cfg_id ? 'AND %1$sserver_homes.home_cfg_id = '.$home_cfg_id : '').' ORDER BY home_id ASC LIMIT '.$gethome_page_forlimit.','.$home_limit.';';
+				WHERE %1$suser_group_homes.group_id = %2$d '.($home_cfg_id ? 'AND %1$sserver_homes.home_cfg_id = '.$home_cfg_id : '').' ORDER BY home_user_order ASC, %1$sserver_homes.home_id ASC LIMIT '.$gethome_page_forlimit.','.$home_limit.';';
 		}
 		else if ( $id_type == "user_and_group" )
 		{
@@ -1835,6 +1837,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 								%1$sconfig_homes.*, 
 								%1$shome_ip_ports.port,
 								%1$shome_ip_ports.force_mod_id,
+								%1$sserver_homes.home_id as hid,
 								%1$sremote_server_ips.ip_id,
 								%1$sremote_server_ips.ip,
 								%1$sgame_mods.mod_id,
@@ -1900,6 +1903,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 								%1$sconfig_homes.*, 
 								%1$shome_ip_ports.port,
 								%1$shome_ip_ports.force_mod_id,
+								%1$sserver_homes.home_id as hid,
 								%1$sremote_server_ips.ip_id,
 								%1$sremote_server_ips.ip,
 								%1$sgame_mods.mod_id,
@@ -1958,7 +1962,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 						').'
 							OR %1$shome_ip_ports.force_mod_id IS NULL 
 						) 
-						LIMIT '.$gethome_page_forlimit.','.$home_limit.';';
+						ORDER BY home_user_order ASC, hid ASC LIMIT '.$gethome_page_forlimit.','.$home_limit.';';
 		}
 		else
 		{
@@ -2104,7 +2108,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 					SELECT `force_mod_id`
 					FROM `%1$shome_ip_ports`
 					WHERE `force_mod_id` = %1$sgame_mods.mod_id OR `force_mod_id` = "0"
-				);',
+				) ORDER BY home_user_order ASC, %1$sserver_homes.home_id ASC;',
 				$this->table_prefix,
 				$this->realEscapeSingle($user_id) );
 								
@@ -2146,7 +2150,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 				SELECT `force_mod_id`
 				FROM `%1$shome_ip_ports`
 				WHERE `force_mod_id` = %1$sgame_mods.mod_id OR `force_mod_id` = "0"
-			) ORDER BY %1$shome_ip_ports.home_id ASC LIMIT '.$user_request_page.','.$limit_dashboardlist.';',
+			) ORDER BY home_user_order ASC, %1$sserver_homes.home_id ASC LIMIT '.$user_request_page.','.$limit_dashboardlist.';',
 			$this->table_prefix,
 			$this->realEscapeSingle($user_id) );
 							
@@ -2175,7 +2179,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 				SELECT `force_mod_id`
 				FROM `%1$shome_ip_ports`
 				WHERE '.$ip_id_and.'(`force_mod_id` = %1$sgame_mods.mod_id OR `force_mod_id` = "0")
-			) ORDER BY %1$shome_ip_ports.home_id ASC;',
+			) ORDER BY home_user_order ASC, %1$sserver_homes.home_id ASC;',
 			$this->table_prefix );
 
 		return $this->listQuery($query);
@@ -2207,7 +2211,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 				SELECT `force_mod_id`
 				FROM `%1$shome_ip_ports`
 				WHERE '.$ip_id_and.'(`force_mod_id` = %1$sgame_mods.mod_id OR `force_mod_id` = "0")
-			) ORDER BY %1$shome_ip_ports.home_id ASC LIMIT '.$user_request_page.','.$limit_dashboardlist.';',
+			) ORDER BY home_user_order ASC, %1$sserver_homes.home_id ASC LIMIT '.$user_request_page.','.$limit_dashboardlist.';',
 			$this->table_prefix );
 
 		return $this->listQuery($query);
@@ -2980,7 +2984,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 				(
 					SELECT `home_id` FROM `%1$suser_homes`
 					WHERE `user_id` = %2$d
-				);';
+				) ORDER BY home_user_order ASC, home_id ASC;';
 		}
 		else if ( $id_type == "group" )
 		{
@@ -2989,7 +2993,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 				(
 					SELECT `home_id` FROM `%1$suser_group_homes`
 					WHERE `group_id` = %2$d
-				);';
+				) ORDER BY home_user_order ASC, home_id ASC;';
 		}
 		else
 		{
@@ -3006,19 +3010,37 @@ class OGPDatabaseMySQL extends OGPDatabase
 	public function getAvailableUserHomesFor($id_type, $assign_id, $user_id) {
 		if ( $id_type == "group" )
 		{
+			$gid = array();
+			$currentGroups = $this->getUsersGroups($user_id);
+			foreach($currentGroups as $group){
+				$gid[] = $group["group_id"];
+			}
+			
 			$template ='SELECT * FROM `%1$sserver_homes`
-						WHERE
+						WHERE (
 						`home_id` IN
 						(
 							SELECT `home_id` FROM `%1$suser_homes`
 							WHERE `user_id` = %3$d
-						)
-						AND
+						)';
+						
+			if(count($gid)){
+				
+				$template .= ' OR `home_id` IN
+						(
+							SELECT `home_id` FROM `%1$suser_group_homes`
+							WHERE `group_id` IN (' . implode(',', $gid) . ')
+						)';
+			}
+						
+			$template .= ') AND
 						`home_id` NOT IN
 						(
 							SELECT `home_id` FROM `%1$suser_group_homes`
 							WHERE `group_id` = %2$d
 						)';
+						
+			$template .= ' ORDER BY %1$sserver_homes.home_user_order ASC, %1$sserver_homes.home_id ASC';
 		}
 		else
 		{
@@ -3034,9 +3056,10 @@ class OGPDatabaseMySQL extends OGPDatabase
 	}
 
 	public function getGameHomes(){
-		$query = sprintf('SELECT %1$sserver_homes.*,%1$sremote_servers.*, %1$sconfig_homes.*
-			FROM `%1$sserver_homes` NATURAL JOIN `%1$sconfig_homes` NATURAL JOIN `%1$sremote_servers`;',
-			$this->table_prefix);
+		$sql = 'SELECT %1$sserver_homes.*,%1$sremote_servers.*, %1$sconfig_homes.*
+				FROM `%1$sserver_homes` NATURAL JOIN `%1$sconfig_homes` NATURAL JOIN `%1$sremote_servers`
+				ORDER BY %1$sserver_homes.home_user_order ASC, %1$sserver_homes.home_id ASC;';
+		$query = sprintf($sql, $this->table_prefix);
 		return $this->listQuery($query);
 	}
 	
@@ -3076,7 +3099,7 @@ class OGPDatabaseMySQL extends OGPDatabase
 			}
 		}
 
-		$sql .= "ORDER BY home_id ASC LIMIT $game_home_id, $limit_gameHomes;";
+		$sql .= 'ORDER BY %1$sserver_homes.home_user_order ASC, %1$sserver_homes.home_id ASC LIMIT' . " $game_home_id, $limit_gameHomes;";
 		$sql = sprintf($sql, $this->table_prefix);
 
 		return $this->listQuery($sql);
@@ -3882,6 +3905,52 @@ class OGPDatabaseMySQL extends OGPDatabase
 		
 		return $tmp[0];
 	}
+	
+	public function saveGameServerOrder($order){
+		if(is_array($order) && count($order)){
+			$sql = "";
+			foreach($order as $homeOrder){
+				if(is_numeric($homeOrder["home_id"]) && is_numeric($homeOrder["order"])){
+					$sql .= sprintf("UPDATE %sserver_homes SET home_user_order='%d'
+						WHERE home_id = '%d';",
+						$this->table_prefix,
+						$this->realEscapeSingle($homeOrder["order"]),
+						$this->realEscapeSingle($homeOrder["home_id"]));
+				}
+			}
+			
+			if ( !$this->link || empty($sql)) return FALSE;
+			return $this->runMultiSQLQuery($sql);
+		}
+		
+		return false;
+	}
+	
+	public function resetGameServerOrder(){
+		$query = sprintf("UPDATE %sserver_homes SET home_user_order=99999;",
+			$this->table_prefix);
+		++$this->queries_;
+		$result = mysqli_query($this->link,$query);
+		if( mysqli_affected_rows($this->link) == '0' )
+			return FALSE;
+		return TRUE;
+	}
+	
+	public function runMultiSQLQuery($sql){
+		if(!empty($sql) || !$this->link){
+			$success = mysqli_multi_query($this->link, $sql);
+			if($success !== false){
+				do {
+					if($result = mysqli_store_result($this->link)){
+						mysqli_free_result($this->link);
+					}
+				} while(mysqli_next_result($this->link));
+				
+				return $success;
+			}
+		}
+		
+		return false;
+	}
 }
-
 ?>

+ 7 - 0
includes/form_table_class.php

@@ -106,6 +106,13 @@ class FormTable {
 
 			echo ">". get_lang("on") ."</option></select>";
 		}
+		else if ($type === "checkbox")
+		{
+			echo "<input type='checkbox' id='".$name."' name='".$name."' value='1' $extra ";
+			if ( @$value == 1 )
+				echo "selected='selected'";
+			echo ">";
+		}
 		else if ($type === "text")
 		{
 			echo "<textarea id='".$name."' name='".$name."' cols='".$size."' rows='3' $extra />";

+ 4 - 0
includes/helpers.php

@@ -414,6 +414,10 @@ function runPostUpdateOperations(){
 	if(function_exists("removeOldPanelFiles")){
 		removeOldPanelFiles();
 	}
+	
+	if(!array_key_exists("users_api_key", $_SESSION)){
+		$_SESSION['users_api_key'] = $db->getApiToken($_SESSION['user_id']);
+	}
 }
 
 function getOGPGitHubURL($gitHubUsername, $repo){

+ 7 - 0
includes/view.php

@@ -127,6 +127,13 @@ class OGPView {
 		// Include our global JS
 		$javascript .= '<script type="text/javascript" src="js/global.js"></script>' . "\n";
 		
+		// Set some useful variables
+		$javascript .= '<script type="text/javascript">';
+		if(array_key_exists("users_api_key", $_SESSION) && !empty($_SESSION['users_api_key'])){
+			$javascript .= 'var userAPIKey = "' . $_SESSION['users_api_key'] . '";';
+		}
+		$javascript .= '</script>' . "\n";
+		
 		// Include global JS for modules
 		if(is_object($db) && array_key_exists("OGPDatabase", class_parents($db))){
 			foreach($db->getInstalledModules() as $m)

+ 1 - 0
index.php

@@ -280,6 +280,7 @@ function ogpHome()
 				$_SESSION['users_group'] = $userInfo['users_role'];
 				$_SESSION['users_lang'] = isset( $_GET['lang'] ) ? $_GET['lang'] : $userInfo['users_lang'];
 				$_SESSION['users_theme'] = $userInfo['users_theme'];
+				$_SESSION['users_api_key'] = $db->getApiToken($userInfo['user_id']);
 				print_success( get_lang("logging_in") ."...");
 				$db->logger( get_lang("logging_in") ."...");
 				$db->query("DELETE FROM `OGP_DB_PREFIXban_list` WHERE client_ip='$client_ip';");

+ 7 - 5
js/global.js

@@ -242,9 +242,11 @@ function getLang(key){
 }
 
 function decodeEntities(encodedString) {
-  var textArea = document.createElement('textarea');
-  textArea.innerHTML = encodedString;
-  var toReturn = textArea.value;
-  textArea.remove();
-  return toReturn;
+	var textArea = document.createElement('textarea');
+	textArea.innerHTML = encodedString;
+	var toReturn = textArea.value;
+	textArea.remove();
+	return toReturn;
 }
+
+

+ 63 - 0
js/modules/gamemanager.js

@@ -155,4 +155,67 @@ $(document).ready(function(){
 			}
 		});
 	});
+	
+	// Allow admin users to set game server order
+	handleOrderingGameServers();
 });
+
+
+function handleOrderingGameServers(){
+	var elemBeingDragged = null;
+	var childExpanderRow = null;
+	var helperItemBeingDragged = null;
+	if($('h2.isAdminUser').length){
+		$('table#servermonitor tbody').sortable({
+			start: function( event, ui ) {
+				$('.expand-child td').css('display', 'none');
+				ui.helper.css('cursor', 'move');
+				elemBeingDragged = ui.item;	
+				childExpanderRow = elemBeingDragged.nextAll('tr.expand-child').first();
+				helperItemBeingDragged = ui.helper;
+			},
+			stop: function( event, ui ) {
+				if(childExpanderRow && childExpanderRow.length && elemBeingDragged && elemBeingDragged.length){
+					elemBeingDragged.after(childExpanderRow.detach());
+					if(childExpanderRow.next('tr.expand-child').length){
+						elemBeingDragged.before(childExpanderRow.next('tr.expand-child').detach());
+					}
+				}
+				if(helperItemBeingDragged.length){
+					helperItemBeingDragged.css('cursor', '');
+				}
+			},
+			update: function(event, ui){
+				saveGameServerOrder();
+			}
+		});
+	}
+}
+
+function saveGameServerOrder(){
+	var i = 0;
+	var postData = {order: new Array()};
+	var homeId = null;
+	
+	if(userAPIKey){
+		
+		// Build the data
+		$('table#servermonitor tbody .maintr:visible').each(function(e){
+			homeId = $('td.serverId', $(this)).text();
+			if(homeId){
+				postData.order.push({home_id: homeId, order: i});
+				i++;
+			}
+		});
+		
+		// Make the call		
+		$.ajax({
+			type: "POST",
+			url: "ogp_api.php?gamemanager_admin/reorder&token=" + userAPIKey,
+			data: JSON.stringify(postData),
+			success: function(e){
+				logToConsole("Game server order successfully saved!");
+			}
+		});
+	}
+}

+ 3 - 0
lang/English/modules/settings.php

@@ -141,5 +141,8 @@ define('OGP_LANG_remove', "Remove");
 define('OGP_LANG_default_trusted_hosts', "Default Trusted Hosts");
 define('OGP_LANG_trusted_host_or_proxy_addresses_or_cidr', "Trusted Hosts or Proxies (IPv4/IPv6 Addresses or CIDR)");
 define('OGP_LANG_trusted_forwarded_ip_addresses_or_cidr', "Trusted Forwarded IPs (IPv4/IPv6 Addresses or CIDR)");
+define('OGP_LANG_reset_game_server_order', "Reset Game Server Ordering");
+define('OGP_LANG_reset_game_server_order_info', "Resets game server ordering back to the default of using the server ID");
+
 
 ?>

+ 4 - 1
modules/gamemanager/module.php

@@ -25,7 +25,7 @@
 // Module general information
 $module_title = "Game manager";
 $module_version = "1.33";
-$db_version = 7;
+$db_version = 8;
 $module_required = TRUE;
 $module_menus = array( array( 'subpage' => 'game_monitor', 'name'=>'Game Monitor', 'group'=>'user' ) );
 $module_access_rights = array('u' => 'allow_updates', 'p' => 'allow_parameter_usage', 'e' => 'allow_extra_params', 'c' => 'allow_custom_fields');
@@ -107,4 +107,7 @@ $install_queries[6] = array(
 $install_queries[7] = array(
 	"ALTER TABLE `".OGP_DB_PREFIX."server_homes` drop index `remote_server_id`;"
 	);
+	
+$install_queries[8] = array(
+	"ALTER TABLE `".OGP_DB_PREFIX."server_homes` ADD `home_user_order` INT NOT NULL default 99999;");
 ?>

+ 9 - 5
modules/gamemanager/server_monitor.php

@@ -148,7 +148,7 @@ function get_sync_name($server_xml)
 
 function exec_ogp_module() {
 	global $db, $settings, $loggedInUserInfo;
-	echo "<h2>". get_lang("game_monitor") ."</h2>";
+	echo "<h2 class='gameMonitor " . ($db->isAdmin( $_SESSION['user_id'] ) ? "isAdminUser" : "") . "'>". get_lang("game_monitor") ."</h2>";
 	$refresh = new refreshed();
 	set_time_limit(0);
 	$stats_servers_online = 0;
@@ -287,10 +287,13 @@ function exec_ogp_module() {
 			  $post_ip, 
 			  $post_port ) = explode( "-", $_GET['home_id-mod_id-ip-port'] );
 	
+	$j = 1;
 	foreach( $server_homes as $server_home )
 	{
-		if( ( $show_all or isset($_GET['home_cfg_id']) ) AND ( !isset($server_home['ip']) or !isset($server_home['mod_id']) ) )
+		if( ( $show_all or isset($_GET['home_cfg_id']) ) AND ( !isset($server_home['ip']) or !isset($server_home['mod_id']) ) ){
+			$j++;
 			continue;
+		}
 		// Count the number of servers.
 		$stats_servers++;
 		
@@ -416,7 +419,7 @@ function exec_ogp_module() {
 				{
 					// Check if the screen running the server is running.
 					$status = "online";
-					$order=1;
+					$order = 1 + $j;
 					if ($server_xml->protocol == "lgsl")
 					{
 						$get_q_and_s = lgsl_port_conversion($query_name, $server_home['port'], "", "");
@@ -467,7 +470,7 @@ function exec_ogp_module() {
 											 '" type="radio"><img style="border:0;height:15px;" src="' . check_theme_image("images/start.png") . '"/></div><div>&nbsp;'.
 											  get_lang("start_server") .'</div></div>';
 					}
-					$order = 3;
+					$order = 1000 + $j;
 					if(isset($server_home['mod_id']))
 					{
 						ob_start();
@@ -483,7 +486,7 @@ function exec_ogp_module() {
 			}
 			else{
 				$status = "offline";
-				$order = 3;
+				$order = 1000 + $j;
 				$address = "<span style='color:darkred;font-weight:bold;'>Agent Offline</span>";
 			}
 			$user = $db->getUserById($server_home['user_id_main']);
@@ -510,6 +513,7 @@ function exec_ogp_module() {
 			//Echo them all
 			echo "$first$second";
 		}
+		$j++;
 	}
 	echo "</tbody>";
 

+ 8 - 0
modules/settings/settings.php

@@ -73,6 +73,11 @@ function exec_ogp_module()
 		);
 		
 		$db->setSettings($settings);
+		
+		if(array_key_exists("reset_game_server_order", $_REQUEST) && $_REQUEST["reset_game_server_order"] == 1){
+			$db->resetGameServerOrder();
+		}
+		
 		echo "<h2>".get_lang('settings')."</h2>";
 		print_success(get_lang('settings_updated'));
 		$view->refresh("?m=settings");
@@ -177,6 +182,9 @@ function exec_ogp_module()
 	// Use authorized hosts for API - this should be disabled by default since using the KEY alone should be secure enough
 	$ft->add_field('on_off','use_authorized_hosts',@$row['use_authorized_hosts']);	
 	
+	// Add option to reset game server order to default
+	$ft->add_field('checkbox','reset_game_server_order','0');	
+	
 	$ft->end_table();
 	$ft->add_button("submit","update_settings",get_lang('update_settings'));
 	$ft->end_form();

+ 1 - 1
modules/user_games/show_homes.php

@@ -77,7 +77,7 @@ function exec_ogp_module()
 		<th>".get_lang('server_expiration_date')."</th>
 		<th>".get_lang('actions')."</th></tr>";
 	$i = 0;
-	sort($game_homes);
+	// sort($game_homes);
 	foreach( $game_homes as $row )
 	{
 		$display_ip = checkDisplayPublicIP($row['display_public_ip'], (isset($row['ip']) and $row['ip'] != $row['agent_ip']) ? $row['ip'] : $row['agent_ip']);

+ 33 - 1
ogp_api.php

@@ -816,6 +816,38 @@ function api_user_admin()
 	return array("status" => $status, "message" => $message);
 }
 
+function api_gamemanager_admin()
+{
+	global $request, $db, $user_info, $settings;
+	
+	$isAdmin = $db->isAdmin($user_info['user_id']);
+	
+	if($request[0] == "reorder")
+	{
+		if($isAdmin){
+			$data = json_decode(file_get_contents('php://input'), true);
+			if(array_key_exists("order", $data) && is_array($data["order"])){
+				$updatedOrder = $db->saveGameServerOrder($data["order"]);
+				if($updatedOrder){
+					$status = "200";
+					$message = "Game server order was successfully saved.";
+				}else{
+					$status = "335";
+					$message = "Game server order was NOT saved.";
+				}
+			}else{
+				$status = "335";
+				$message = "Invalid inputs.";
+			}
+		}else{
+			$status = "335";
+			$message = "Only admin users can save the game server display order.";
+		}
+	}
+	
+	return array("status" => $status, "message" => $message);
+}
+
 function api_gamemanager()
 {
 	global $request, $db, $user_info, $settings;
@@ -823,7 +855,7 @@ function api_gamemanager()
 	$ip = trim($_POST['ip']);
 	$port = (int) trim($_POST['port']);
 	$mod_key = isset($_POST['mod_key'])?trim($_POST['mod_key']):'';
-		
+	
 	if(!isPortValid($port))
 		return array("status" => '309', "message" => "The given port is not a valid port.");
 	if(!preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/",$ip))