* @version 0.0.0
* @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team
* @license GNU GPL 3.0 or any newer version
* @link http://www.shipsimu.org
* @todo Out-dated since 0.6-BETA
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
class WernisApi extends BaseFrameworkSystem {
/**
* Static base API URL
*/
private static $apiUrl = 'https://www.wds66.com/api/';
/**
* API Wernis amount
*/
private $wernis_amount = 0;
/**
* API username
*/
private $w_id = 0;
/**
* API Wernis password (not account password!)
*/
private $w_md5 = '';
/**
* Nickname of the user
*/
private $w_nick = '';
/**
* Wernis amount of the user
*/
private $w_amount = 0;
/**
* Array with status informations
*/
private $statusArray = array();
/**
* Status for 'okay'
*/
private $statusOkay = 'OK';
/**
* Protected constructor
*
* @return void
*/
protected function __construct () {
// Call parent constructor
parent::__construct(__CLASS__);
}
/**
* Creates an instance of this API class
*
* @param $cfg Configuration array
* @return $apiInstance An instance of this API class
*/
public static final function createWernisApi (array $cfg) {
// Create a new instance
$apiInstance = new WernisApi();
// Fix missing
if (!isset($cfg['api_url'])) $cfg['api_url'] = self::$apiUrl;
// Konfiguration uebertragen
$apiInstance->setCoonfigArray($cfg);
// Return the instance
return $apiInstance;
}
/**
* Setter for gamer data
*
* @param $w_id Username (id) of the gamer
* @param $w_pwd Clear password of the gamer
* @return void
*/
public function setUser ($w_id, $w_pwd) {
// Set username (id)
$this->w_id = $w_id;
// Hash clear password and set it
$this->w_md5 = md5($w_pwd);
}
/************************************************
* The following methods are not yet rewritten! *
************************************************/
public function einziehen ($amount) {
// amount auf Gueltigkeit pruefen
$amount = isset($amount) ? $amount+0 : 0;
if ($amount < $this->config['mineinsatz']) {
$this->setStatusMessage('low_stakes', sprintf('Dein Einsatz muss mindestens %d Wernis betragen.', $this->config['mineinsatz']));
return false;
}
// Abfrage senden
return $this->executeWithdraw($amount);
}
public function verschicken ($amount) {
// amount auf Gueltigkeit pruefen
$amount = isset($amount) ? $amount+0 : 0;
if ($amount < $this->config['mineinsatz']) {
$this->setStatusMessage('low_stakes', sprintf('Dein Einsatz muss mindestens %d Wernis betragen.', $this->config['mineinsatz']));
return false;
}
// Abfrage senden
return $this->executePayout($amount);
}
// Script abbrechen mit Zurueck-Buttom
public function ende () {
global $_CONFIG;
include 'templates/zurueck.html';
include 'templates/fuss.html';
exit();
}
// Fehlermeldung ausgeben und beenden
public function error () {
print "
Fehler im Spiel: ".$this->getErrorMessage()."
\n";
$this->ende();
}
// Sets a status message and code
public function setStatusMessage ($msg, $status) {
$this->statusArray['message'] = $msg;
$this->statusArray['status'] = $status;
}
// Get the status message
public function getErrorMessage () {
if (isset($this->statusArray['message'])) {
// Use raw message
return $this->statusArray['message'];
} else {
// Fall-back to status
return sprintf('Fehler-Code %s ist keiner Nachricht zugewiesen.', $this->getErrorCode());
}
}
// Get the status code
public function getErrorCode () {
if (isset($this->statusArray['status'])) {
// Use raw message
return $this->statusArray['status'];
} else {
// Something bad happend
return 'unknown';
}
}
// Sends out a request to the API and returns it's result
private function sendRequest ($scriptName, array $requestData = array()) {
// Is the requestData an array?
if (!is_array($requestData)) {
// Then abort here!
return array(
'status' => 'failed_general',
'message' => 'API-Daten in config sind ungültig!'
);
}
// Is the API id and MD5 hash there?
if ((empty($this->config['wernis_api_id'])) || (empty($this->config['wernis_api_key']))) {
// Abort here...
return array(
'status' => 'failed_general',
'message' => 'API-Daten in config.php sind leer!'
);
}
// Construct the request string
$requestString = $this->config['api_url'] . $scriptName . '?api_id=' . $this->config['wernis_api_id'] . '&api_key='.$this->config['wernis_api_key'];
foreach ($requestData as $key => $value) {
$requestString .= '&' . $key . '=' . $value;
}
// Get the raw response from the lower function
$response = $this->sendRawRequest($requestString);
// Check the response header if all is fine
if (strpos($response[0], '200') === false) {
// Something bad happend... :(
return array(
'status' => 'request_error',
'message' => sprintf('Servermeldung %s von WDS66-API erhalten.', $response[0])
);
}
// All (maybe) fine so remove the response header from server
for ($idx = (count($response) - 1); $idx > 1; $idx--) {
$line = trim($response[$idx]);
if (!empty($line)) {
$response = $line;
break;
}
}
// Prepare the returning result for higher functions
if (substr($response, 0, 1) == '&') {
// Remove the leading & (which can be used in Flash)
$response = substr($response, 1);
}
// Bring back the response
$data = explode('=', $response);
// Default return array (should not stay empty)
$return = array();
// We use only the first two entries (which shall be fine)
if ($data[0] === 'error') {
// The request has failed... :(
switch ($data[1]) {
case '404': // Invalid API ID
case 'AUTH': // Authorization has failed
$return = array(
'status' => 'auth_failed',
'message' => 'API-Daten scheinen nicht zu stimmen! (Access Denied)'
);
break;
case 'LOCKED': // User account is locked!
case 'PASS': // Bad passphrase entered
case 'USER': // Missing account or invalid password
$return = array(
'status' => 'user_failed',
'message' => 'Dein eingegebener WDS66-Username stimmt nicht, ist gesperrt oder du hast ein falsches Passwort eingegeben.'
);
break;
case 'OWN': // Transfer to own account
$return = array(
'status' => 'own_failed',
'message' => 'Du darfst dein eigenes Spiel leider nicht spielen.'
);
break;
case 'AMOUNT': // Amount is depleted
$return = array(
'status' => 'amount_failed',
'message' => 'Dein Guthaben reicht nicht aus, um das Spiel zu spielen.'
);
break;
case 'AMOUNT-SEND': // API amount is depleted
$return = array(
'status' => 'api_amount_failed',
'message' => 'Nicht genügend Guthaben auf dem API-Account.'
);
break;
default: // Unknown error (maybe new?)
$return = array(
'status' => 'request_failed',
'message' => sprintf('Unbekannter Fehler %s von API erhalten.', $data[1])
);
break;
}
} else {
// All fine here
$return = array(
'status' => $this->statusOkay,
'response' => $response
);
}
// Return the result
return $return;
}
// Widthdraw this amount
private function executeWithdraw ($amount) {
// First all fails...
$result = false;
// Prepare the purpose
$purpose = "\"Bube oder Dame\"-Einsatz gesetzt.";
// Prepare the request data
$requestData = array(
'sub_request' => 'receive',
't_uid' => $this->w_id,
't_md5' => $this->w_md5,
'r_uid' => (int) $this->config['wernis_refid'],
'amount' => (int) $amount,
'purpose' => urlencode(base64_encode($purpose))
);
// Return the result from the lower functions
$return = $this->sendRequest('book.php', $requestData);
if ($return['status'] == $this->statusOkay) {
// All fine!
$result = true;
} else {
// Status failture text
$this->setStatusMessage($return['message'], $return['status']);
}
// Return result
return $result;
}
// Payout this amount
private function executePayout ($amount) {
// First all fails...
$result = false;
// Prepare the purpose
$purpose = "\"Bube oder Dame\"-Gewinn erhalten.";
// Prepare the request data
$requestData = array(
'sub_request' => 'send',
't_uid' => $this->w_id,
't_md5' => $this->w_md5,
'r_uid' => (int) $this->config['wernis_refid'],
'amount' => (int) $amount,
'purpose' => urlencode(base64_encode($purpose))
);
// Return the result from the lower functions
$return = $this->sendRequest("book.php", $requestData);
if ($return['status'] == $this->statusOkay) {
// All fine!
$result = true;
} else {
// Status failture text
$this->setStatusMessage($return['message'], $return['status']);
}
// Return result
return $result;
}
// Send raw GET request
private function sendRawRequest ($script) {
// Use the hostname from script URL as new hostname
$url = substr($script, 7);
$extract = explode('/', $url);
// Done extracting the URL :)
$url = $extract[0];
// Extract host name
$host = str_replace('http://', '', $url);
if (ereg('/', $host)) $host = substr($host, 0, strpos($host, '/'));
// Generate relative URL
$script = substr($script, (strlen($url) + 7));
if (substr($script, 0, 1) == '/') $script = substr($script, 1);
// Open connection
$fp = @fsockopen($host, 80, $errno, $errdesc, 30);
if (!$fp) {
// Failed!
return array('', '', '');
}
// Generate request header
$request = "GET /" . trim($script) . " HTTP/1.0\r\n";
$request .= "Host: " . $host . "\r\n";
$request .= sprintf("User-Agent: WernisApi/1.0 by Quix0r [Spieler: %d]\r\n\r\n", $this->w_id);
// Initialize array
$response = array();
// Write request
fputs($fp, $request);
// Read response
while(!feof($fp)) {
array_push($response, trim(fgets($fp, 1024)));
} // END - while
// Close socket
fclose($fp);
// Was the request successfull?
if ((!ereg('200 OK', $response[0])) && (empty($response[0]))) {
// Not found / access forbidden
$response = array('', '', '');
} // END - if
// Return response
return $response;
}
}