<?php
/**
 * Module qui permet d'empêcher certaine personne de parler.
 * 
 * Attention : Dépandance au service AdminServ 
 * 
 * @author Olivier Arteau
 */
 
define('FLAG_MUTE', 'm');

class Mute implements Module {
	
    public function executerCommande(array $param, StatusObject $status) {
    	switch ($param['cmd']) {
			case 'mute' :
				return $this->commandeMute($param, $status);
			case 'unmute' :
				return $this->commandeUnMute($param, $status);
			case 'msg' : 
				return $this->commandeMsg($param, $status);
		}
		
		return PAFServer::$NO_ACTION_TAKEN;
    }
    
    private function commandeMute(array $param, StatusObject $status) {
    	if (!isset($param['username'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Paramètre manquant ou invalide.'
    		);
    		
			if (get_class($status) != 'CommandStatus')
				$status = new CommandStatus();
			$status->addMessage('Paramètre manquant ou invalide.');
			$status->cancel();
			
			return $status;
    	}
    	
    	$utilisateur = Session::getUtilisateurCourrant();
		
		// Vérifie si l'utilisateur est connecté //
		if ($utilisateur == null) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Utilisateur non connecté'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Utilisateur non connecté');
    		$status->cancel();
    		
    		return $status;
		}
		
		if (!$utilisateur->hasFlags(FLAG_ADMINISTRATEUR) && !$utilisateur->hasFlags(FLAG_OPERATEUR)) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Vous devez être administrateur ou modérateur pour faire cette commande.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Vous devez être administrateur ou modérateur  pour faire cette commande.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$userToModify = null;
		try {
			$userToModify = new Utilisateur($param['username']);
			$userToModify->getID();
		} catch(Exception $e) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'L\'utilisateur spécifié n\'existe pas.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('L\'utilisateur spécifié n\'existe pas.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$userToModify->ajouterFlag(FLAG_MUTE);
		
		$this->resultat = array(
    		'resultat' => 'true',
    		'message' => 'L\'utilisateur ne peut plus parler maintenant.'
    	);
    	
    	return PAFServer::$NO_ACTION_TAKEN;
    }
    
    private function commandeUnMute(array $param, StatusObject $status) {
    	if (!isset($param['username'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Paramètre manquant ou invalide.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Paramètre manquant ou invalide.');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	$utilisateur = Session::getUtilisateurCourrant();
		
		// Vérifie si l'utilisateur est connecté //
		if ($utilisateur == null) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Utilisateur non connecté'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Utilisateur non connecté');
    		$status->cancel();
    		
    		return $status;
		}
		
		if (!$utilisateur->hasFlags(FLAG_ADMINISTRATEUR) && !$utilisateur->hasFlags(FLAG_OPERATEUR)) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Vous devez être administrateur ou modérateur pour faire cette commande.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Vous devez être administrateur ou modérateur  pour faire cette commande.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$userToModify = null;
		try {
			$userToModify = new Utilisateur($param['username']);
			$userToModify->getID();
		} catch(Exception $e) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'L\'utilisateur spécifié n\'existe pas.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('L\'utilisateur spécifié n\'existe pas.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$userToModify->enleverFlag(FLAG_MUTE);
		
		$this->resultat = array(
    		'resultat' => 'true',
    		'message' => 'L\'utilisateur peut parler maintenant.'
    	);
    	
    	return PAFServer::$NO_ACTION_TAKEN;
    }
    
    private function commandeMsg(array $param, StatusObject $status) {
    	$utilisateur = Session::getUtilisateurCourrant();
		
		if ($utilisateur != null && $utilisateur->hasFlags(FLAG_MUTE)) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Vous avez été muté par un modérateur/administrateur.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Vous avez été muté par un modérateur/administrateur.');
    		$status->cancel();
    		
    		return $status;
		}
		
		return PAFServer::$NO_ACTION_TAKEN;
    }
    
    public function onStatusChange(array $param, StatusObject $status) {
    	
    }
    
    public function getCommandesEnregistre() {
    	return array('mute', 'unmute', 'msg');
    }
    
    public function finalize(array $param, StatusObject $status) {
		
   	}
}

PAFServer::getInstance()->enregistrerModule(new Mute());
?>