2014-02-25 18:34:35 +01:00
< ? php
2014-04-12 12:14:37 +02:00
namespace ManiaControl\Bills ;
2014-02-25 18:34:35 +01:00
use ManiaControl\Callbacks\CallbackListener ;
use ManiaControl\Callbacks\CallbackManager ;
use ManiaControl\ManiaControl ;
use ManiaControl\Players\Player ;
use Maniaplanet\DedicatedServer\Structures\Bill ;
use Maniaplanet\DedicatedServer\Xmlrpc\Exception ;
2014-04-12 12:14:37 +02:00
/**
* ManiaControl Bill - Manager
*
* @ author kremsy
* @ copyright ManiaControl Copyright © 2014 ManiaControl Team
* @ license http :// www . gnu . org / licenses / GNU General Public License , Version 3
*/
2014-02-25 18:34:35 +01:00
class BillManager implements CallbackListener {
2014-04-12 12:14:37 +02:00
/*
2014-02-25 18:34:35 +01:00
* Constants
*/
const DONATED_TO_SERVER = 1 ;
const DONATED_TO_RECEIVER = 2 ;
const PAYED_FROM_SERVER = 3 ;
const PLAYER_REFUSED_DONATION = 4 ;
const ERROR_WHILE_TRANSACTION = 5 ;
2014-04-12 12:14:37 +02:00
/*
2014-02-25 18:34:35 +01:00
* Private Properties
*/
private $maniaControl = null ;
private $openBills = array ();
/**
* Construct a new Bill Manager
*
* @ param \ManiaControl\ManiaControl $maniaControl
*/
public function __construct ( ManiaControl $maniaControl ) {
$this -> maniaControl = $maniaControl ;
$this -> maniaControl -> callbackManager -> registerCallbackListener ( CallbackManager :: CB_MP_BILLUPDATED , $this , 'handleBillUpdated' );
}
/**
* send a Bill to a Player
*
* @ param $function
* @ param Player $player
* @ param $amount
* @ param $message
* @ param bool $receiver
* @ return bool
*/
public function sendBill ( $function , Player $player , $amount , $message , $receiver = false ) {
if ( ! is_callable ( $function )) {
trigger_error ( " Function is not callable " );
return false ;
}
try {
if ( ! $receiver ) {
$bill = $this -> maniaControl -> client -> sendBill ( $player -> login , $amount , $message );
} else {
$bill = $this -> maniaControl -> client -> sendBill ( $player -> login , $amount , $message , $receiver );
}
} catch ( Exception $e ) {
// TODO: handle errors like 'too few server planets' - throw other like connection errors
$this -> maniaControl -> errorHandler -> triggerDebugNotice ( " Couldn't create donation of { $amount } planets from ' { $player -> login } ' for ' { $receiver } '. " . $e -> getMessage ());
return false ;
}
$this -> openBills [ $bill ] = new BillData ( $function , $player , $amount );
return true ;
}
/**
* Send Planets from the server to a Player
*
* @ param $function
* @ param $receiverLogin
* @ param $amount
* @ param $message
* @ return bool
*/
public function sendPlanets ( $function , $receiverLogin , $amount , $message ) {
if ( ! is_callable ( $function )) {
trigger_error ( " Function is not callable " );
return false ;
}
try {
$bill = $this -> maniaControl -> client -> pay ( $receiverLogin , $amount , $message );
} catch ( Exception $e ) {
// TODO: handle errors like 'too few server planets' - throw other like connection errors
//trigger_error("Couldn't create payout of {$amount} planets by '{$player->login}' for '{$receiver}'. " . $e->getMessage());
$this -> maniaControl -> errorHandler -> triggerDebugNotice ( " Couldn't create payout of { $amount } planets to ' { $receiverLogin } ' " . $e -> getMessage ());
return false ;
}
$this -> openBills [ $bill ] = new BillData ( $function , $receiverLogin , $amount , true );
return true ;
}
/**
* Handle bill updated callback
*
* @ param array $callback
* @ return bool
*/
public function handleBillUpdated ( array $callback ) {
$billId = $callback [ 1 ][ 0 ];
if ( ! array_key_exists ( $billId , $this -> openBills )) {
return ;
}
$billData = $this -> openBills [ $billId ];
/** @var BillData $billData */
switch ( $callback [ 1 ][ 1 ]) {
case Bill :: STATE_PAYED :
if ( $billData -> pay ) {
call_user_func ( $billData -> function , $billData , self :: PAYED_FROM_SERVER );
} else {
if ( $billData -> receiverLogin ) {
call_user_func ( $billData -> function , $billData , self :: DONATED_TO_RECEIVER );
} else {
call_user_func ( $billData -> function , $billData , self :: DONATED_TO_SERVER );
}
}
unset ( $this -> openBills [ $billId ]);
break ;
case Bill :: STATE_REFUSED :
call_user_func ( $billData -> function , $billData , self :: PLAYER_REFUSED_DONATION );
unset ( $this -> openBills [ $billId ]);
break ;
case Bill :: STATE_ERROR :
call_user_func ( $billData -> function , $callback [ 1 ][ 2 ], self :: ERROR_WHILE_TRANSACTION );
unset ( $this -> openBills [ $billId ]);
break ;
}
}
2014-04-12 12:14:37 +02:00
}