* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * * 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 = 'http://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; } } // [EOF] ?>