own MatchSettings management suggestion

ManiaControl, the completely new designed and easy to use controller managing all your Maniaplanet server.

Moderators: kremsy, steeffeen, Jocy, Wabbitface, NADEO

Post Reply
User avatar
niarfman
Posts: 306
Joined: 07 Dec 2012, 10:46

own MatchSettings management suggestion

Post by niarfman » 18 Oct 2014, 11:40

Hi All,

I am launching many Maniaplanet servers from a same Linux server and I am using a sctrict naming convention for folders with a specific folder with its own MatchSettings folder.

My idea is to use a string replacement instead of forcing a specific and static Name for all servers.

So, using a string like "{serverlogin}/MatchSettings/{serverlogin}.txt" where {serverlogin} will be dynamically replaced by the real server login.

There is the way I was thinking for doing that (near line 506 of core/Maps/MapManager.php):

Code: Select all

		// Write MapList
		if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_AUTOSAVE_MAPLIST)
		) {
			$serverLogin           = $this->maniaControl->getServer()->login;
			
			$matchSettingsFileName = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MAPLIST_FILE);
			$matchSettingsFileName = str_replace('{serverlogin}',$serverLogin,$matchSettingsFileName);//Dynamically Replace {serverlogin} by Server Login in the string
			
			try {
				$this->maniaControl->getClient()->saveMatchSettings($matchSettingsFileName);
			} catch (FileException $e) {
				Logger::logError("Unable to write the playlist file, please checkout your MX-Folders File permissions!");
			}
		}
So you can remove "Write a own Maplist File for every Server called serverlogin.txt" settings and allow more choice from admin :)
Image
Ľѷҳ Choupa Oups! ツ

User avatar
niarfman
Posts: 306
Joined: 07 Dec 2012, 10:46

Re: own MatchSettings management suggestion

Post by niarfman » 18 Oct 2014, 12:49

Forgetting other things to modify ... At the end I share all modifications I done ...

core/Maps/MapManager.php (adding getMatchSettingsFileName public function):

Code: Select all

<?php

namespace ManiaControl\Maps;

use ManiaControl\Admin\AuthenticationManager;
use ManiaControl\Callbacks\CallbackListener;
use ManiaControl\Callbacks\CallbackManager;
use ManiaControl\Callbacks\Callbacks;
use ManiaControl\Files\FileUtil;
use ManiaControl\Logger;
use ManiaControl\ManiaControl;
use ManiaControl\ManiaExchange\ManiaExchangeList;
use ManiaControl\ManiaExchange\ManiaExchangeManager;
use ManiaControl\ManiaExchange\MXMapInfo;
use ManiaControl\Players\Player;
use ManiaControl\Utils\Formatter;
use Maniaplanet\DedicatedServer\InvalidArgumentException;
use Maniaplanet\DedicatedServer\Xmlrpc\AlreadyInListException;
use Maniaplanet\DedicatedServer\Xmlrpc\Exception;
use Maniaplanet\DedicatedServer\Xmlrpc\FileException;
use Maniaplanet\DedicatedServer\Xmlrpc\IndexOutOfBoundException;
use Maniaplanet\DedicatedServer\Xmlrpc\InvalidMapException;
use Maniaplanet\DedicatedServer\Xmlrpc\NotInListException;
use Maniaplanet\DedicatedServer\Xmlrpc\UnavailableFeatureException;

/**
 * ManiaControl Map Manager Class
 *
 * @author    ManiaControl Team <mail@maniacontrol.com>
 * @copyright 2014 ManiaControl Team
 * @license   http://www.gnu.org/licenses/ GNU General Public License, Version 3
 */
class MapManager implements CallbackListener {
	/*
	 * Constants
	 */
	const TABLE_MAPS                      = 'mc_maps';
	const CB_MAPS_UPDATED                 = 'MapManager.MapsUpdated';
	const CB_KARMA_UPDATED                = 'MapManager.KarmaUpdated';
	const SETTING_PERMISSION_ADD_MAP      = 'Add Maps';
	const SETTING_PERMISSION_REMOVE_MAP   = 'Remove Maps';
	const SETTING_PERMISSION_ERASE_MAP    = 'Erase Maps';
	const SETTING_PERMISSION_SHUFFLE_MAPS = 'Shuffle Maps';
	const SETTING_PERMISSION_CHECK_UPDATE = 'Check Map Update';
	const SETTING_PERMISSION_SKIP_MAP     = 'Skip Map';
	const SETTING_PERMISSION_RESTART_MAP  = 'Restart Map';
	const SETTING_AUTOSAVE_MAPLIST        = 'Autosave Maplist file';
	const SETTING_MAPLIST_FILE            = 'File to write Maplist in';
	const SETTING_WRITE_OWN_MAPLIST_FILE  = 'Write a own Maplist File for every Server called serverlogin.txt';

	/*
	 * Public properties
	 */
	/** @var MapQueue $mapQueue */
	/** @deprecated see getMapQueue() */
	public $mapQueue = null;
	/** @var MapCommands $mapCommands */
	/** @deprecated see getMapCommands() */
	public $mapCommands = null;
	/** @var MapActions $mapActions */
	/** @deprecated see getMapActions() */
	public $mapActions = null;
	/** @var MapList $mapList */
	/** @deprecated see getMapList() */
	public $mapList = null;
	/** @var matchSettingsFileName $mapList */
	/** @deprecated see getmatchSettingsFileName() */
	public $matchSettingsFileName = null;
	/** @var DirectoryBrowser $directoryBrowser */
	/** @deprecated see getDirectoryBrowser() */
	public $directoryBrowser = null;
	/** @var ManiaExchangeList $mxList */
	/** @deprecated see getMXList() */
	public $mxList = null;
	/** @var ManiaExchangeManager $mxManager */
	/** @deprecated see getMXManager() */
	public $mxManager = null;

	/*
	 * Private properties
	 */
	/** @var ManiaControl $maniaControl */
	private $maniaControl = null;
	/** @var Map[] $maps */
	private $maps = array();
	/** @var Map $currentMap */
	private $currentMap = null;
	private $mapEnded = false;
	private $mapBegan = false;

	/**
	 * Construct a new map manager instance
	 *
	 * @param ManiaControl $maniaControl
	 */
	public function __construct(ManiaControl $maniaControl) {
		$this->maniaControl = $maniaControl;
		$this->initTables();

		// Children
		$this->mxManager        = new ManiaExchangeManager($this->maniaControl);
		$this->mapList          = new MapList($this->maniaControl);
		$this->directoryBrowser = new DirectoryBrowser($this->maniaControl);
		$this->mxList           = new ManiaExchangeList($this->maniaControl);
		$this->mapCommands      = new MapCommands($maniaControl);
		$this->mapQueue         = new MapQueue($this->maniaControl);
		$this->mapActions       = new MapActions($maniaControl);

		// Callbacks
		$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::ONINIT, $this, 'handleOnInit');
		$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::AFTERINIT, $this, 'handleAfterInit');
		$this->maniaControl->getCallbackManager()->registerCallbackListener(CallbackManager::CB_MP_MAPLISTMODIFIED, $this, 'mapsModified');

		// Permissions
		$this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_ADD_MAP, AuthenticationManager::AUTH_LEVEL_ADMIN);
		$this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_REMOVE_MAP, AuthenticationManager::AUTH_LEVEL_ADMIN);
		$this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_ERASE_MAP, AuthenticationManager::AUTH_LEVEL_SUPERADMIN);
		$this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_SHUFFLE_MAPS, AuthenticationManager::AUTH_LEVEL_ADMIN);
		$this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_CHECK_UPDATE, AuthenticationManager::AUTH_LEVEL_MODERATOR);
		$this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_SKIP_MAP, AuthenticationManager::AUTH_LEVEL_MODERATOR);
		$this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_RESTART_MAP, AuthenticationManager::AUTH_LEVEL_MODERATOR);

		// Settings
		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_AUTOSAVE_MAPLIST, true);
		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MAPLIST_FILE, "MatchSettings/tracklist.txt");
		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WRITE_OWN_MAPLIST_FILE, false);
	}

	/**
	 * Initialize necessary database tables
	 *
	 * @return bool
	 */
	private function initTables() {
		$mysqli = $this->maniaControl->getDatabase()->getMysqli();
		$query  = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_MAPS . "` (
				`index` int(11) NOT NULL AUTO_INCREMENT,
				`mxid` int(11),
				`uid` varchar(50) NOT NULL,
				`name` varchar(150) NOT NULL,
				`authorLogin` varchar(100) NOT NULL,
				`fileName` varchar(100) NOT NULL,
				`environment` varchar(50) NOT NULL,
				`mapType` varchar(50) NOT NULL,
				`changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
				PRIMARY KEY (`index`),
				UNIQUE KEY `uid` (`uid`)
				) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Map Data' AUTO_INCREMENT=1;";
		$result = $mysqli->query($query);
		if ($mysqli->error) {
			trigger_error($mysqli->error, E_USER_ERROR);
			return false;
		}
		return $result;
	}

	/**
	 * Return the map commands
	 *
	 * @return MapCommands
	 */
	public function getMapCommands() {
		return $this->mapCommands;
	}

	/**
	 * Return the map actions
	 *
	 * @return MapActions
	 */
	public function getMapActions() {
		return $this->mapActions;
	}

	/**
	 * Return the map list
	 *
	 * @return MapList
	 */
	public function getMapList() {
		return $this->mapList;
	}
	
	/**
	 * Return the map list
	 *
	 * @return MapList
	 */
	public function getMatchSettingsFileName() {
		return $this->matchSettingsFileName;
	}	

	/**
	 * Return the directory browser
	 *
	 * @return DirectoryBrowser
	 */
	public function getDirectoryBrowser() {
		return $this->directoryBrowser;
	}

	/**
	 * Return the mx list
	 *
	 * @return ManiaExchangeList
	 */
	public function getMXList() {
		return $this->mxList;
	}

	/**
	 * Update a Map from Mania Exchange
	 *
	 * @param Player $admin
	 * @param string $uid
	 */
	public function updateMap(Player $admin, $uid) {
		$this->updateMapTimestamp($uid);

		if (!isset($uid) || !isset($this->maps[$uid])) {
			$this->maniaControl->getChat()->sendError("Error updating Map: Unknown UID '{$uid}'!", $admin);
			return;
		}

		/** @var Map $map */
		$map = $this->maps[$uid];

		$mxId = $map->mx->id;
		$this->removeMap($admin, $uid, true, false);
		$this->addMapFromMx($mxId, $admin->login, true);
	}

	/**
	 * Update the Timestamp of a Map
	 *
	 * @param string $uid
	 * @return bool
	 */
	private function updateMapTimestamp($uid) {
		$mysqli       = $this->maniaControl->getDatabase()->getMysqli();
		$mapQuery     = "UPDATE `" . self::TABLE_MAPS . "` SET
				mxid = 0,
				changed = NOW()
				WHERE 'uid' = ?";
		$mapStatement = $mysqli->prepare($mapQuery);
		if ($mysqli->error) {
			trigger_error($mysqli->error);
			return false;
		}
		$mapStatement->bind_param('s', $uid);
		$mapStatement->execute();
		if ($mapStatement->error) {
			trigger_error($mapStatement->error);
			$mapStatement->close();
			return false;
		}
		$mapStatement->close();
		return true;
	}

	/**
	 * Remove a Map
	 *
	 * @param Player $admin
	 * @param string $uid
	 * @param bool   $eraseFile
	 * @param bool   $message
	 */
	public function removeMap(Player $admin, $uid, $eraseFile = false, $message = true) {
		if (!isset($this->maps[$uid])) {
			$this->maniaControl->getChat()->sendError('Map does not exist!', $admin);
			return;
		}

		/** @var Map $map */
		$map = $this->maps[$uid];

		// Unset the Map everywhere
		$this->getMapQueue()->removeFromMapQueue($admin, $map->uid);

		if ($map->mx) {
			$this->getMXManager()->unsetMap($map->mx->id);
		}

		// Remove map
		try {
			$this->maniaControl->getClient()->removeMap($map->fileName);
		} catch (NotInListException $e) {
		} catch (FileException $e) {
		}

		unset($this->maps[$uid]);

		if ($eraseFile) {
			// Check if ManiaControl can even write to the maps dir
			$mapDir = $this->maniaControl->getClient()->getMapsDirectory();
			if ($this->maniaControl->getServer()->checkAccess($mapDir)
			) {
				// Delete map file
				if (!@unlink($mapDir . $map->fileName)) {
					$this->maniaControl->getChat()->sendError("Couldn't erase the map file.", $admin);
					$eraseFile = false;
				}
			} else {
				$this->maniaControl->getChat()->sendError("Couldn't erase the map file (no access).", $admin);
				$eraseFile = false;
			}
		}

		// Show Message
		if ($message) {
			$action  = ($eraseFile ? 'erased' : 'removed');
			$message = $admin->getEscapedNickname() . ' ' . $action . ' ' . $map->getEscapedName() . '!';
			$this->maniaControl->getChat()->sendSuccess($message);
			Logger::logInfo($message, true);
		}
	}

	/**
	 * Return the map queue
	 *
	 * @return MapQueue
	 */
	public function getMapQueue() {
		return $this->mapQueue;
	}

	/**
	 * Return the mx manager
	 *
	 * @return ManiaExchangeManager
	 */
	public function getMXManager() {
		return $this->mxManager;
	}

	/**
	 * Adds a Map from Mania Exchange
	 *
	 * @param int    $mapId
	 * @param string $login
	 * @param bool   $update
	 */
	public function addMapFromMx($mapId, $login, $update = false) {
		if (is_numeric($mapId)) {
			// Check if map exists
			$this->maniaControl->getMapManager()->getMXManager()->fetchMapInfo($mapId, function (MXMapInfo $mapInfo = null) use (
				&$login, &$update
			) {
				if (!$mapInfo || !isset($mapInfo->uploaded)) {
					// Invalid id
					$this->maniaControl->getChat()->sendError('Invalid MX-Id!', $login);
					return;
				}

				// Download the file
				$this->maniaControl->getFileReader()->loadFile($mapInfo->downloadurl, function ($file, $error) use (
					&$login, &$mapInfo, &$update
				) {
					if (!$file || $error) {
						// Download error
						$this->maniaControl->getChat()->sendError("Download failed: '{$error}'!", $login);
						return;
					}
					$this->processMapFile($file, $mapInfo, $login, $update);
				});
			});
		}
	}

	/**
	 * Process the MapFile
	 *
	 * @param string    $file
	 * @param MXMapInfo $mapInfo
	 * @param string    $login
	 * @param bool      $update
	 * @throws InvalidArgumentException
	 */
	private function processMapFile($file, MXMapInfo $mapInfo, $login, $update) {
		// Check if map is already on the server
		if ($this->getMapByUid($mapInfo->uid)) {
			$this->maniaControl->getChat()->sendError('Map is already on the server!', $login);
			return;
		}

		// Save map
		$fileName = $mapInfo->id . '_' . $mapInfo->name . '.Map.Gbx';
		$fileName = FileUtil::getClearedFileName($fileName);

		$downloadFolderName  = $this->maniaControl->getSettingManager()->getSettingValue($this, 'MapDownloadDirectory', 'MX');
		$relativeMapFileName = $downloadFolderName . DIRECTORY_SEPARATOR . $fileName;
		$mapDir              = $this->maniaControl->getServer()->getDirectory()->getMapsFolder();
		$downloadDirectory   = $mapDir . $downloadFolderName . DIRECTORY_SEPARATOR;
		$fullMapFileName     = $downloadDirectory . $fileName;

		// Check if it can get written locally
		if ($this->maniaControl->getServer()->checkAccess($mapDir)) {
			// Create download directory if necessary
			if (!is_dir($downloadDirectory) && !mkdir($downloadDirectory) || !is_writable($downloadDirectory)) {
				$this->maniaControl->getChat()->sendError("ManiaControl doesn't have to rights to save maps in '{$downloadDirectory}'.", $login);
				return;
			}

			if (!file_put_contents($fullMapFileName, $file)) {
				// Save error
				$this->maniaControl->getChat()->sendError('Saving map failed!', $login);
				return;
			}
		} else {
			// Write map via write file method
			try {
				$this->maniaControl->getClient()->writeFile($relativeMapFileName, $file);
			} catch (InvalidArgumentException $e) {
				if ($e->getMessage() === 'data are too big') {
					$this->maniaControl->getChat()->sendError("Map is too big for a remote save.", $login);
					return;
				}
				throw $e;
			}
		}

		// Check for valid map
		try {
			$this->maniaControl->getClient()->checkMapForCurrentServerParams($relativeMapFileName);
		} catch (InvalidMapException $exception) {
			$this->maniaControl->getChat()->sendException($exception, $login);
			return;
		} catch (FileException $exception) {
			$this->maniaControl->getChat()->sendException($exception, $login);
			return;
		}

		// Add map to map list
		try {
			$this->maniaControl->getClient()->insertMap($relativeMapFileName);
		} catch (AlreadyInListException $exception) {
			$this->maniaControl->getChat()->sendException($exception, $login);
			return;
		}
		$this->updateFullMapList();

		// Update Mx MapInfo
		$this->maniaControl->getMapManager()->getMXManager()->updateMapObjectsWithManiaExchangeIds(array($mapInfo));

		// Update last updated time
		$map = $this->getMapByUid($mapInfo->uid);
		if (!$map) {
			// TODO: improve this - error reports about not existing maps
			$this->maniaControl->getErrorHandler()->triggerDebugNotice('Map not in List after Insert!');
			$this->maniaControl->getChat()->sendError('Server Error!', $login);
			return;
		}
		$map->lastUpdate = time();

		$player = $this->maniaControl->getPlayerManager()->getPlayer($login);

		if (!$update) {
			// Message
			$message = $player->getEscapedNickname() . ' added $<' . $mapInfo->name . '$>!';
			$this->maniaControl->getChat()->sendSuccess($message);
			Logger::logInfo($message, true);
			// Queue requested Map
			$this->maniaControl->getMapManager()->getMapQueue()->addMapToMapQueue($login, $mapInfo->uid);
		} else {
			$message = $player->getEscapedNickname() . ' updated $<' . $mapInfo->name . '$>!';
			$this->maniaControl->getChat()->sendSuccess($message);
			Logger::logInfo($message, true);
		}
	}

	/**
	 * Get Map by UID
	 *
	 * @param string $uid
	 * @return Map
	 */
	public function getMapByUid($uid) {
		if (isset($this->maps[$uid])) {
			return $this->maps[$uid];
		}
		return null;
	}

	/**
	 * Updates the full Map list, needed on Init, addMap and on ShuffleMaps
	 */
	private function updateFullMapList() {
		$tempList = array();

		try {
			$offset = 0;
			while ($this->maniaControl->getClient()) {
				$maps = $this->maniaControl->getClient()->getMapList(150, $offset);

				foreach ($maps as $rpcMap) {
					if (array_key_exists($rpcMap->uId, $this->maps)) {
						// Map already exists, only update index
						$tempList[$rpcMap->uId] = $this->maps[$rpcMap->uId];
					} else {
						// Insert Map Object
						$map                 = $this->initializeMap($rpcMap);
						$tempList[$map->uid] = $map;
					}
				}

				$offset += 150;
			}
		} catch (IndexOutOfBoundException $e) {
		}

		// restore Sorted MapList
		$this->maps = $tempList;

		// Trigger own callback
		$this->maniaControl->getCallbackManager()->triggerCallback(self::CB_MAPS_UPDATED);

		// Write MapList
		if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_AUTOSAVE_MAPLIST)
		) {
			$serverLogin           = $this->maniaControl->getServer()->login;
			
			$this->matchSettingsFileName = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MAPLIST_FILE);
			$this->matchSettingsFileName = str_replace('{serverlogin}',$serverLogin,$this->matchSettingsFileName);//Dynamically Replace {serverlogin} by Server Login in the string

			try {
				$this->maniaControl->getClient()->saveMatchSettings($this->matchSettingsFileName);
			} catch (FileException $e) {
				Logger::logError("Unable to write the playlist file, please checkout your MX-Folders File permissions!");
			}
		}
	}

	/**
	 * Initializes a Map
	 *
	 * @param mixed $rpcMap
	 * @return Map
	 */
	public function initializeMap($rpcMap) {
		$map = new Map($rpcMap);
		$this->saveMap($map);
		return $map;
	}

	/**
	 * Save a Map in the Database
	 *
	 * @param Map $map
	 * @return bool
	 */
	private function saveMap(Map &$map) {
		//TODO saveMaps for whole maplist at once (usage of prepared statements)
		$mysqli   = $this->maniaControl->getDatabase()->getMysqli();
		$mapQuery = "INSERT INTO `" . self::TABLE_MAPS . "` (
				`uid`,
				`name`,
				`authorLogin`,
				`fileName`,
				`environment`,
				`mapType`
				) VALUES (
				?, ?, ?, ?, ?, ?
				) ON DUPLICATE KEY UPDATE
				`index` = LAST_INSERT_ID(`index`),
				`fileName` = VALUES(`fileName`),
				`environment` = VALUES(`environment`),
				`mapType` = VALUES(`mapType`);";

		$mapStatement = $mysqli->prepare($mapQuery);
		if ($mysqli->error) {
			trigger_error($mysqli->error);
			return false;
		}
		$mapStatement->bind_param('ssssss', $map->uid, $map->rawName, $map->authorLogin, $map->fileName, $map->environment, $map->mapType);
		$mapStatement->execute();
		if ($mapStatement->error) {
			trigger_error($mapStatement->error);
			$mapStatement->close();
			return false;
		}
		$map->index = $mapStatement->insert_id;
		$mapStatement->close();
		return true;
	}

	/**
	 * Get's a Map by it's Mania-Exchange Id
	 *
	 * @param int $mxId
	 * @return Map
	 */
	public function getMapByMxId($mxId) {
		foreach ($this->maps as $map) {
			if ($map->mx && $map->mx->id == $mxId) {
				return $map;
			}
		}
		return null;
	}

	/**
	 * Shuffles the MapList
	 *
	 * @param Player $admin
	 * @return bool
	 */
	public function shuffleMapList($admin = null) {
		$shuffledMaps = $this->maps;
		shuffle($shuffledMaps);

		$mapArray = array();

		foreach ($shuffledMaps as $map) {
			/** @var Map $map */
			$mapArray[] = $map->fileName;
		}

		try {
			$this->maniaControl->getClient()->chooseNextMapList($mapArray);
		} catch (Exception $e) {
			//TODO temp added 19.04.2014
			$this->maniaControl->getErrorHandler()->triggerDebugNotice("Exception line 331 MapManager" . $e->getMessage());
			trigger_error("Couldn't shuffle mapList. " . $e->getMessage());
			return false;
		}

		$this->fetchCurrentMap();

		if ($admin) {
			$message = $admin->getEscapedNickname() . ' shuffled the Maplist!';
			$this->maniaControl->getChat()->sendSuccess($message);
			Logger::logInfo($message, true);
		}

		// Restructure if needed
		$this->restructureMapList();
		return true;
	}

	/**
	 * Freshly fetch current Map
	 *
	 * @return Map
	 */
	private function fetchCurrentMap() {
		try {
			$rpcMap = $this->maniaControl->getClient()->getCurrentMapInfo();
		} catch (UnavailableFeatureException $exception) {
			return null;
		}

		if (array_key_exists($rpcMap->uId, $this->maps)) {
			$this->currentMap                = $this->maps[$rpcMap->uId];
			$this->currentMap->nbCheckpoints = $rpcMap->nbCheckpoints;
			$this->currentMap->nbLaps        = $rpcMap->nbLaps;
			return $this->currentMap;
		}

		$this->currentMap                   = $this->initializeMap($rpcMap);
		$this->maps[$this->currentMap->uid] = $this->currentMap;
		return $this->currentMap;
	}

	/**
	 * Restructures the Maplist
	 */
	public function restructureMapList() {
		$currentIndex = $this->getMapIndex($this->getCurrentMap());

		// No RestructureNeeded
		if ($currentIndex < Maplist::MAX_MAPS_PER_PAGE - 1) {
			return true;
		}

		$lowerMapArray  = array();
		$higherMapArray = array();

		$index = 0;
		foreach ($this->maps as $map) {
			if ($index < $currentIndex) {
				$lowerMapArray[] = $map->fileName;
			} else {
				$higherMapArray[] = $map->fileName;
			}
			$index++;
		}

		$mapArray = array_merge($higherMapArray, $lowerMapArray);
		array_shift($mapArray);

		try {
			$this->maniaControl->getClient()->chooseNextMapList($mapArray);
		} catch (Exception $e) {
			trigger_error("Error restructuring the Maplist. " . $e->getMessage());
			return false;
		}
		return true;
	}

	/**
	 * Returns the MapIndex of a given map
	 *
	 * @param Map $map
	 * @return int
	 */
	public function getMapIndex(Map $map) {
		$maps = $this->getMaps();
		return array_search($map, $maps);
	}

	/**
	 * Get all Maps
	 *
	 * @param int $offset
	 * @param int $length
	 * @return Map[]
	 */
	public function getMaps($offset = null, $length = null) {
		if ($offset === null) {
			return array_values($this->maps);
		}
		if ($length === null) {
			return array_slice($this->maps, $offset);
		}
		return array_slice($this->maps, $offset, $length);
	}

	/**
	 * Get Current Map
	 *
	 * @return Map
	 */
	public function getCurrentMap() {
		if (!$this->currentMap) {
			return $this->fetchCurrentMap();
		}
		return $this->currentMap;
	}

	/**
	 * Handle OnInit callback
	 */
	public function handleOnInit() {
		$this->updateFullMapList();
		$this->fetchCurrentMap();

		// Restructure Maplist
		$this->restructureMapList();
	}

	/**
	 * Handle AfterInit callback
	 */
	public function handleAfterInit() {
		// Fetch MX infos
		$this->getMXManager()->fetchManiaExchangeMapInformation();
	}

	/**
	 * Handle Script BeginMap callback
	 *
	 * @param string $mapUid
	 * @param string $restart
	 */
	public function handleScriptBeginMap($mapUid, $restart) {
		$this->beginMap($mapUid, Formatter::parseBoolean($restart));
	}

	/**
	 * Manage the Begin of a Map
	 *
	 * @param string $uid
	 * @param bool   $restart
	 */
	private function beginMap($uid, $restart = false) {
		//If a restart occurred, first call the endMap to set variables back
		if ($restart) {
			$this->endMap();
		}

		if ($this->mapBegan) {
			return;
		}
		$this->mapBegan = true;
		$this->mapEnded = false;

		if (array_key_exists($uid, $this->maps)) {
			// Map already exists, only update index
			$this->currentMap = $this->maps[$uid];
			if (!$this->currentMap->nbCheckpoints || !$this->currentMap->nbLaps) {
				$rpcMap                          = $this->maniaControl->getClient()->getCurrentMapInfo();
				$this->currentMap->nbLaps        = $rpcMap->nbLaps;
				$this->currentMap->nbCheckpoints = $rpcMap->nbCheckpoints;
			}
		}

		// Restructure MapList if id is over 15
		$this->restructureMapList();

		// Update the mx of the map (for update checks, etc.)
		$this->getMXManager()->fetchManiaExchangeMapInformation($this->currentMap);

		// Trigger own BeginMap callback
		$this->maniaControl->getCallbackManager()->triggerCallback(Callbacks::BEGINMAP, $this->currentMap);
	}

	/**
	 * Manage the End of a Map
	 */
	private function endMap() {
		if ($this->mapEnded) {
			return;
		}
		$this->mapEnded = true;
		$this->mapBegan = false;

		// Trigger own EndMap callback
		$this->maniaControl->getCallbackManager()->triggerCallback(Callbacks::ENDMAP, $this->currentMap);
	}

	/**
	 * Fetch a map by its file path
	 *
	 * @param string $relativeFileName
	 * @return Map
	 */
	public function fetchMapByFileName($relativeFileName) {
		$mapInfo = $this->maniaControl->getClient()->getMapInfo($relativeFileName);
		if (!$mapInfo) {
			return null;
		}
		return $this->initializeMap($mapInfo);
	}

	/**
	 * Handle BeginMap callback
	 *
	 * @param array $callback
	 */
	public function handleBeginMap(array $callback) {
		$this->beginMap($callback[1][0]["UId"]);
	}

	/**
	 * Handle Script EndMap Callback
	 */
	public function handleScriptEndMap() {
		$this->endMap();
	}

	/**
	 * Handle EndMap Callback
	 *
	 * @param array $callback
	 */
	public function handleEndMap(array $callback) {
		$this->endMap();
	}

	/**
	 * Handle Maps Modified Callback
	 *
	 * @param array $callback
	 */
	public function mapsModified(array $callback) {
		$this->updateFullMapList();
	}

	/**
	 * Get the Number of Maps
	 *
	 * @return int
	 */
	public function getMapsCount() {
		return count($this->maps);
	}
}
core/Maps/MapCommands.php (replacing strange $maplist name where $matchSettingsFileName seems more appropriate):

Code: Select all

<?php

namespace ManiaControl\Maps;

use FML\Controls\Quad;
use FML\Controls\Quads\Quad_Icons64x64_1;
use FML\Controls\Quads\Quad_UIConstruction_Buttons;
use ManiaControl\Admin\AuthenticationManager;
use ManiaControl\Callbacks\CallbackListener;
use ManiaControl\Callbacks\CallbackManager;
use ManiaControl\Commands\CommandListener;
use ManiaControl\Logger;
use ManiaControl\ManiaControl;
use ManiaControl\Manialinks\IconManager;
use ManiaControl\Manialinks\ManialinkPageAnswerListener;
use ManiaControl\Players\Player;
use Maniaplanet\DedicatedServer\Xmlrpc\ChangeInProgressException;
use Maniaplanet\DedicatedServer\Xmlrpc\FaultException;

/**
 * Class offering Commands to manage Maps
 *
 * @author    ManiaControl Team <mail@maniacontrol.com>
 * @copyright 2014 ManiaControl Team
 * @license   http://www.gnu.org/licenses/ GNU General Public License, Version 3
 */
class MapCommands implements CommandListener, ManialinkPageAnswerListener, CallbackListener {
	/*
	 * Constants
	 */
	const ACTION_OPEN_MAPLIST = 'MapCommands.OpenMapList';
	const ACTION_OPEN_XLIST   = 'MapCommands.OpenMXList';
	const ACTION_RESTART_MAP  = 'MapCommands.RestartMap';
	const ACTION_SKIP_MAP     = 'MapCommands.NextMap';
	const ACTION_SHOW_AUTHOR  = 'MapList.ShowAuthorList.';

	/*
	 * Private properties
	 */
	/** @var ManiaControl $maniaControl */
	private $maniaControl = null;

	/**
	 * Construct a new map commands instance
	 *
	 * @param ManiaControl $maniaControl
	 */
	public function __construct(ManiaControl $maniaControl) {
		$this->maniaControl = $maniaControl;
		$this->initActionsMenuButtons();

		// Admin commands
		$this->maniaControl->getCommandManager()->registerCommandListener(array('nextmap', 'next', 'skip'), $this, 'command_NextMap', true, 'Skips to the next map.');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('restartmap', 'resmap', 'res'), $this, 'command_RestartMap', true, 'Restarts the current map.');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('replaymap', 'replay'), $this, 'command_ReplayMap', true, 'Replays the current map (after the end of the map).');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('addmap', 'add'), $this, 'command_AddMap', true, 'Adds map from ManiaExchange.');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('removemap', 'removethis'), $this, 'command_RemoveMap', true, 'Removes the current map.');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('erasemap', 'erasethis'), $this, 'command_EraseMap', true, 'Erases the current map.');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('shufflemaps', 'shuffle'), $this, 'command_ShuffleMaps', true, 'Shuffles the maplist.');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('writemaplist', 'wml'), $this, 'command_WriteMapList', true, 'Writes the current maplist to a file.');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('readmaplist', 'rml'), $this, 'command_ReadMapList', true, 'Loads a maplist into the server.');

		// Player commands
		$this->maniaControl->getCommandManager()->registerCommandListener('nextmap', $this, 'command_showNextMap', false, 'Shows which map is next.');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('maps', 'list'), $this, 'command_List', false, 'Shows the current maplist (or variations).');
		$this->maniaControl->getCommandManager()->registerCommandListener(array('xmaps', 'xlist'), $this, 'command_xList', false, 'Shows maps from ManiaExchange.');

		// Callbacks
		$this->maniaControl->getCallbackManager()->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer');
		$this->maniaControl->getManialinkManager()->registerManialinkPageAnswerListener(self::ACTION_OPEN_XLIST, $this, 'command_xList');
		$this->maniaControl->getManialinkManager()->registerManialinkPageAnswerListener(self::ACTION_OPEN_MAPLIST, $this, 'command_List');
		$this->maniaControl->getManialinkManager()->registerManialinkPageAnswerListener(self::ACTION_RESTART_MAP, $this, 'command_RestartMap');
		$this->maniaControl->getManialinkManager()->registerManialinkPageAnswerListener(self::ACTION_SKIP_MAP, $this, 'command_NextMap');
	}

	/**
	 * Add all Actions Menu Buttons
	 */
	private function initActionsMenuButtons() {
		// Menu Open xList
		$itemQuad = new Quad();
		$itemQuad->setImage($this->maniaControl->getManialinkManager()->getIconManager()->getIcon(IconManager::MX_ICON));
		$itemQuad->setImageFocus($this->maniaControl->getManialinkManager()->getIconManager()->getIcon(IconManager::MX_ICON_MOVER));
		$itemQuad->setAction(self::ACTION_OPEN_XLIST);
		$this->maniaControl->getActionsMenu()->addPlayerMenuItem($itemQuad, 5, 'Open MX List');

		// Menu Open List
		$itemQuad = new Quad_Icons64x64_1();
		$itemQuad->setSubStyle($itemQuad::SUBSTYLE_ToolRoot);
		$itemQuad->setAction(self::ACTION_OPEN_MAPLIST);
		$this->maniaControl->getActionsMenu()->addPlayerMenuItem($itemQuad, 10, 'Open MapList');

		// Menu RestartMap
		$itemQuad = new Quad_UIConstruction_Buttons();
		$itemQuad->setSubStyle($itemQuad::SUBSTYLE_Reload);
		$itemQuad->setAction(self::ACTION_RESTART_MAP);
		$this->maniaControl->getActionsMenu()->addAdminMenuItem($itemQuad, 10, 'Restart Map');

		// Menu NextMap
		$itemQuad = new Quad_Icons64x64_1();
		$itemQuad->setSubStyle($itemQuad::SUBSTYLE_ArrowFastNext);
		$itemQuad->setAction(self::ACTION_SKIP_MAP);
		$this->maniaControl->getActionsMenu()->addAdminMenuItem($itemQuad, 20, 'Skip Map');
	}

	/**
	 * Show which map is the next
	 *
	 * @param array  $chatCallback
	 * @param Player $player
	 */
	public function command_ShowNextMap(array $chatCallback, Player $player) {
		$nextQueued = $this->maniaControl->getMapManager()->getMapQueue()->getNextQueuedMap();
		if ($nextQueued) {
			/** @var Player $requester */
			$requester = $nextQueued[0];
			/** @var Map $map */
			$map = $nextQueued[1];
			$this->maniaControl->getChat()->sendInformation("Next Map is $<{$map->name}$> from $<{$map->authorNick}$> requested by $<{$requester->nickname}$>.", $player);
		} else {
			$mapIndex = $this->maniaControl->getClient()->getNextMapIndex();
			$maps     = $this->maniaControl->getMapManager()->getMaps();
			$map      = $maps[$mapIndex];
			$this->maniaControl->getChat()->sendInformation("Next Map is $<{$map->name}$> from $<{$map->authorNick}$>.", $player);
		}
	}

	/**
	 * Handle //removemap command
	 *
	 * @param array  $chatCallback
	 * @param Player $player
	 */
	public function command_RemoveMap(array $chatCallback, Player $player) {
		if (!$this->maniaControl->getAuthenticationManager()->checkPermission($player, MapManager::SETTING_PERMISSION_REMOVE_MAP)
		) {
			$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
			return;
		}
		// Get map
		$map = $this->maniaControl->getMapManager()->getCurrentMap();
		if (!$map) {
			$this->maniaControl->getChat()->sendError("Couldn't remove map.", $player);
			return;
		}

		// Remove map
		$this->maniaControl->getMapManager()->removeMap($player, $map->uid);
	}

	/**
	 * Handle //erasemap command
	 *
	 * @param array  $chatCallback
	 * @param Player $player
	 */
	public function command_EraseMap(array $chatCallback, Player $player) {
		if (!$this->maniaControl->getAuthenticationManager()->checkPermission($player, MapManager::SETTING_PERMISSION_ERASE_MAP)
		) {
			$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
			return;
		}
		// Get map
		$map = $this->maniaControl->getMapManager()->getCurrentMap();
		if (!$map) {
			$this->maniaControl->getChat()->sendError("Couldn't erase map.", $player);
			return;
		}

		// Erase map
		$this->maniaControl->getMapManager()->removeMap($player, $map->uid, true);
	}

	/**
	 * Handle shufflemaps command
	 *
	 * @param array                        $chatCallback
	 * @param \ManiaControl\Players\Player $player
	 */
	public function command_ShuffleMaps(array $chatCallback, Player $player) {
		if (!$this->maniaControl->getAuthenticationManager()->checkPermission($player, MapManager::SETTING_PERMISSION_SHUFFLE_MAPS)
		) {
			$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
			return;
		}

		// Shuffles the maps
		$this->maniaControl->getMapManager()->shuffleMapList($player);
	}

	/**
	 * Handle addmap command
	 *
	 * @param array                        $chatCallback
	 * @param \ManiaControl\Players\Player $player
	 */
	public function command_AddMap(array $chatCallback, Player $player) {
		if (!$this->maniaControl->getAuthenticationManager()->checkPermission($player, MapManager::SETTING_PERMISSION_ADD_MAP)
		) {
			$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
			return;
		}
		$params = explode(' ', $chatCallback[1][2], 2);
		if (count($params) < 2) {
			$this->maniaControl->getChat()->sendUsageInfo('Usage example: //addmap 1234', $player);
			return;
		}

		// add Map from Mania Exchange
		$this->maniaControl->getMapManager()->addMapFromMx($params[1], $player->login);
	}

	/**
	 * Handle /nextmap Command
	 *
	 * @param array                        $chat
	 * @param \ManiaControl\Players\Player $player
	 */
	public function command_NextMap(array $chat, Player $player) {
		if (!$this->maniaControl->getAuthenticationManager()->checkPermission($player, MapManager::SETTING_PERMISSION_SKIP_MAP)
		) {
			$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
			return;
		}

		$this->maniaControl->getMapManager()->getMapActions()->skipMap();

		$message = $player->getEscapedNickname() . ' skipped the current Map!';
		$this->maniaControl->getChat()->sendSuccess($message);
		Logger::logInfo($message, true);
	}

	/**
	 * Handle restartmap command
	 *
	 * @param array                        $chat
	 * @param \ManiaControl\Players\Player $player
	 */
	public function command_RestartMap(array $chat, Player $player) {
		if (!$this->maniaControl->getAuthenticationManager()->checkPermission($player, MapManager::SETTING_PERMISSION_RESTART_MAP)
		) {
			$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
			return;
		}
		$message = $player->getEscapedNickname() . ' restarted the current Map!';
		$this->maniaControl->getChat()->sendSuccess($message);
		Logger::logInfo($message, true);

		try {
			$this->maniaControl->getClient()->restartMap();
		} catch (ChangeInProgressException $e) {
		}
	}

	////$this->maniaControl->mapManager->mapQueue->addFirstMapToMapQueue($this->currentVote->voter, $this->maniaControl->mapManager->getCurrentMap());
	/**
	 * Handle replaymap command
	 *
	 * @param array                        $chat
	 * @param \ManiaControl\Players\Player $player
	 */
	public function command_ReplayMap(array $chat, Player $player) {
		if (!$this->maniaControl->getAuthenticationManager()->checkPermission($player, MapManager::SETTING_PERMISSION_RESTART_MAP)
		) {
			$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
			return;
		}
		$message = $player->getEscapedNickname() . ' replays the current Map!';
		$this->maniaControl->getChat()->sendSuccess($message);
		Logger::logInfo($message, true);

		$this->maniaControl->getMapManager()->getMapQueue()->addFirstMapToMapQueue($player, $this->maniaControl->getMapManager()->getCurrentMap());
	}

	/**
	 * Handle writemaplist command
	 *
	 * @param array                        $chat
	 * @param \ManiaControl\Players\Player $player
	 */
	public function command_WriteMapList(array $chat, Player $player) {
		if (!$this->maniaControl->getAuthenticationManager()->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)
		) {
			$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
			return;
		}

		$chatCommand = explode(' ', $chat[1][2]);

		if (isset($chatCommand[1]) && $chatCommand[1] <> '') {
			if (strstr($chatCommand[1], '.txt')) {
				$matchSettingsFileName = $chatCommand[1];
			} else {
				$matchSettingsFileName = $chatCommand[1] . '.txt';
			}
			$matchSettingsFileName = 'MatchSettings' . DIRECTORY_SEPARATOR . $matchSettingsFileName;
		} else {
			$matchSettingsFileName    = $this->maniaControl->getMapManager()->getmatchSettingsFileName();
		}
				
		try {
			$this->maniaControl->getClient()->saveMatchSettings($matchSettingsFileName);

			$message = 'Maplist $<$fff' . $matchSettingsFileName . '$> written.';
			$this->maniaControl->getChat()->sendSuccess($message, $player);
			Logger::logInfo($message, true);
		} catch (FaultException $e) {
			$this->maniaControl->getChat()->sendError('Cannot write maplist $<$fff' . $matchSettingsFileName . '$>!', $player);
		}
	}

	/**
	 * Handle readmaplist command
	 *
	 * @param array                        $chat
	 * @param \ManiaControl\Players\Player $player
	 */
	public function command_ReadMapList(array $chat, Player $player) {
		if (!$this->maniaControl->getAuthenticationManager()->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)
		) {
			$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
			return;
		}

		$chatCommand = explode(' ', $chat[1][2]);
		if (isset($chatCommand[1]) && $chatCommand[1] <> '') {
			if (strstr($chatCommand[1], '.txt')) {
				$matchSettingsFileName = $chatCommand[1];
			} else {
				$matchSettingsFileName = $chatCommand[1] . '.txt';
			}
			$matchSettingsFileName = 'MatchSettings' . DIRECTORY_SEPARATOR . $matchSettingsFileName;
		} else {
			$matchSettingsFileName    = $this->maniaControl->getMapManager()->getmatchSettingsFileName();
		}

		
		try {
			$this->maniaControl->getClient()->loadMatchSettings($matchSettingsFileName);

			$message = 'Maplist $<$fff' . $matchSettingsFileName . '$> loaded.';
			$this->maniaControl->getMapManager()->restructureMapList();
			$this->maniaControl->getChat()->sendSuccess($message, $player);
			Logger::logInfo($message, true);
		} catch (FaultException $e) {
			$this->maniaControl->getChat()->sendError('Cannot load maplist $<$fff' . $matchSettingsFileName . '$>!', $player);
		}
	}

	/**
	 * Handle ManialinkPageAnswer Callback
	 *
	 * @param array $callback
	 */
	public function handleManialinkPageAnswer(array $callback) {
		$actionId = $callback[1][2];

		$login  = $callback[1][1];
		$player = $this->maniaControl->getPlayerManager()->getPlayer($login);

		if (strstr($actionId, self::ACTION_SHOW_AUTHOR)) {
			$login = str_replace(self::ACTION_SHOW_AUTHOR, '', $actionId);
			$this->maniaControl->getMapManager()->getMapList()->playerCloseWidget($player);
			$this->showMapListAuthor($login, $player);
		}
	}

	/**
	 * Show the Player a List of Maps from the given Author
	 *
	 * @param string $author
	 * @param Player $player
	 */
	private function showMapListAuthor($author, Player $player) {
		$maps    = $this->maniaControl->getMapManager()->getMaps();
		$mapList = array();
		/** @var Map $map */
		foreach ($maps as $map) {
			if ($map->authorLogin == $author) {
				array_push($mapList, $map);
			}
		}

		if (empty($mapList)) {
			$this->maniaControl->getChat()->sendError('There are no maps to show!', $player->login);
			return;
		}

		$this->maniaControl->getMapManager()->getMapList()->showMapList($player, $mapList);
	}

	/**
	 * Handle /maps command
	 *
	 * @param array  $chatCallback
	 * @param Player $player
	 */
	public function command_List(array $chatCallback, Player $player) {
		$chatCommands = explode(' ', $chatCallback[1][2]);
		$this->maniaControl->getMapManager()->getMapList()->playerCloseWidget($player);

		if (isset($chatCommands[1])) {
			$listParam = strtolower($chatCommands[1]);
			switch ($listParam) {
				case 'best':
					$this->showMapListKarma(true, $player);
					break;
				case 'worst':
					$this->showMapListKarma(false, $player);
					break;
				case 'newest':
					$this->showMapListDate(true, $player);
					break;
				case 'oldest':
					$this->showMapListDate(false, $player);
					break;
				case 'author':
					if (isset($chatCommands[2])) {
						$this->showMaplistAuthor($chatCommands[2], $player);
					} else {
						$this->maniaControl->getChat()->sendError('Missing Author Login!', $player);
					}
					break;
				default:
					$this->maniaControl->getMapManager()->getMapList()->showMapList($player);
					break;
			}
		} else {
			$this->maniaControl->getMapManager()->getMapList()->showMapList($player);
		}
	}

	/**
	 * Show a Karma based MapList
	 *
	 * @param bool   $best
	 * @param Player $player
	 */
	private function showMapListKarma($best, Player $player) {
		/** @var \MCTeam\KarmaPlugin $karmaPlugin */
		$karmaPlugin = $this->maniaControl->getPluginManager()->getPlugin(MapList::DEFAULT_KARMA_PLUGIN);
		if ($karmaPlugin) {
			$maps    = $this->maniaControl->getMapManager()->getMaps();
			$mapList = array();
			foreach ($maps as $map) {
				if ($map instanceof Map) {
					if ($this->maniaControl->getSettingManager()->getSettingValue($karmaPlugin, $karmaPlugin::SETTING_NEWKARMA) === true
					) {
						$karma      = $karmaPlugin->getMapKarma($map);
						$map->karma = round($karma * 100.);
					} else {
						$votes = $karmaPlugin->getMapVotes($map);
						$min   = 0;
						$plus  = 0;
						foreach ($votes as $vote) {
							if (isset($vote->vote)) {
								if ($vote->vote !== 0.5) {
									if ($vote->vote < 0.5) {
										$min = $min + $vote->count;
									} else {
										$plus = $plus + $vote->count;
									}
								}
							}
						}
						$map->karma = $plus - $min;
					}
					$mapList[] = $map;
				}
			}

			usort($mapList, function (Map $mapA, Map $mapB) {
				return ($mapA->karma - $mapB->karma);
			});
			if ($best) {
				$mapList = array_reverse($mapList);
			}

			$this->maniaControl->getMapManager()->getMapList()->showMapList($player, $mapList);
		} else {
			$this->maniaControl->getChat()->sendError('KarmaPlugin is not enabled!', $player->login);
		}
	}

	/**
	 * Show a Date based MapList
	 *
	 * @param bool   $newest
	 * @param Player $player
	 */
	private function showMapListDate($newest, Player $player) {
		$maps = $this->maniaControl->getMapManager()->getMaps();

		usort($maps, function (Map $mapA, Map $mapB) {
			return ($mapA->index - $mapB->index);
		});
		if ($newest) {
			$maps = array_reverse($maps);
		}

		$this->maniaControl->getMapManager()->getMapList()->showMapList($player, $maps);
	}

	/**
	 * Handle ManiaExchange list command
	 *
	 * @param array  $chatCallback
	 * @param Player $player
	 */
	public function command_xList(array $chatCallback, Player $player) {
		$this->maniaControl->getMapManager()->getMXList()->showList($chatCallback, $player);
	}
}
Image
Ľѷҳ Choupa Oups! ツ

kremsy
Posts: 1723
Joined: 21 Jul 2011, 09:51

Re: own MatchSettings management suggestion

Post by kremsy » 18 Oct 2014, 15:41

I think exactly what you did, is already implemented into ManiaControl, can provide you more information later.

At least it is already implemented that you can set per setting that each server writes his matchsettings like this: MatchSettings/{serverlogin}.txt
Lukas alias Kremsy, Developer of:
ManiaControl: http://www.maniacontrol.com
ParagonLeague: http://league.paragon-esports.com
MPAseco: http://mpaseco.org
ManiaViewer: http://www.maniaviewer.com

User avatar
niarfman
Posts: 306
Joined: 07 Dec 2012, 10:46

Re: own MatchSettings management suggestion

Post by niarfman » 19 Oct 2014, 13:16

kremsy wrote:At least it is already implemented that you can set per setting that each server writes his matchsettings like this: MatchSettings/{serverlogin}.txt
I know, but static one, no possibility to set it according to a specific organisation.

Was just a suggestion. It done it for me and it's usefull for my configuration, so I share it :)
Image
Ľѷҳ Choupa Oups! ツ

Post Reply

Return to “ManiaControl”

Who is online

Users browsing this forum: No registered users and 1 guest