* @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; } }