From fb87e02c9868427de4a97427f9190de4d2d93163 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Sun, 12 Aug 2012 12:26:10 +0000
Subject: [PATCH] Dodanie pełnej obsługi obrazków, zgodnie z ostatnimi zmianami w BotAPI.

---
 class/BotAPIGG.php     |  119 ++++++++++++++++++++++++++++++---------
 class/BotMessage.php   |    6 ++
 class/BotMsgGG.php     |   25 ++++++--
 class/BotMessageGG.php |    9 +++
 4 files changed, 125 insertions(+), 34 deletions(-)

diff --git a/class/BotAPIGG.php b/class/BotAPIGG.php
index 0801ac6..c8108e1 100644
--- a/class/BotAPIGG.php
+++ b/class/BotAPIGG.php
@@ -71,7 +71,7 @@
 	const STATUS_INVISIBLE = 20;
 	const STATUS_INVISIBLE_DESC = 22;
 	
-	private function httpQuery($address, $useToken = TRUE, $curlopts = array()) {
+	private function httpQuery($address, $curlopts = array(), $useToken = TRUE, $parseXML = TRUE) {
 		if(!is_array($curlopts)) {
 			$curlopts = array();
 		}
@@ -97,21 +97,29 @@
 		$tok2 = $tok = curl_exec($dane);
 		$info = curl_getinfo($dane);
 		
-		try {
-			libxml_use_internal_errors(TRUE);
-			$tok = new SimpleXMLElement($tok);
+		if($parseXML) {
+			try {
+				libxml_use_internal_errors(TRUE);
+				$tok = new SimpleXMLElement($tok);
+			}
+			catch(Exception $e) {
+				throw new BotAPIGGXMLException('Otrzymano błędny XML od botmastera.', $tok2);
+			}
+			
+			if(!$tok) {
+				if($info['http_code'] != 200) {
+					throw new BotAPIGGHTTPException('Nie udało się wykonać zapytania HTTP.', $info['http_code'], $tok2);
+				}
+				else
+				{
+					throw new BotAPIGGXMLException('Otrzymano błędny XML od botmastera.', $tok2);
+				}
+			}
 		}
-		catch(Exception $e) {
-			throw new BotAPIGGXMLException('Otrzymano błędny XML od botmastera.', $tok2);
-		}
-		
-		if(!$tok) {
+		else
+		{
 			if($info['http_code'] != 200) {
 				throw new BotAPIGGHTTPException('Nie udało się wykonać zapytania HTTP.', $info['http_code'], $tok2);
-			}
-			else
-			{
-				throw new BotAPIGGXMLException('Otrzymano błędny XML od botmastera.', $tok2);
 			}
 		}
 		
@@ -119,32 +127,34 @@
 	}
 	
 	function getToken($force = FALSE) {
-		if($force || !$this->token) {
+		if($force || self::$token === NULL) {
 			$auth = $this->APIs['Gadu-Gadu'];
 			
-			$tok = $this->httpQuery('https://botapi.gadu-gadu.pl/botmaster/getToken/'.$auth['numer'], FALSE, array(
+			$tok = $this->httpQuery('https://botapi.gadu-gadu.pl/botmaster/getToken/'.$auth['numer'],  array(
 				CURLOPT_USERPWD => $auth['login'].':'.$auth['haslo'],
 				CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
-			));
+			), FALSE);
 			
 			if($tok->errorMsg) {
 				throw new BotAPIGGReplyException('Pobieranie tokena nie powiodło się.', $tok);
 			}
 			
-			$this->token = array('token' => (string)$tok->token, 'host' => (string)$tok->server, 'port' => (int)$tok->port);
+			self::$token = array('token' => (string)$tok->token, 'host' => (string)$tok->server, 'port' => (int)$tok->port);
 		}
 		
-		return $this->token;
+		return self::$token;
 	}
 	
 	function setStatus($status, $desc = '') {
 		$auth = $this->APIs['Gadu-Gadu'];
 		$token = $this->getToken();
 		
-		$tok = $this->httpQuery('https://'.$token['host'].'/setStatus/'.$auth['numer'], FALSE, array(
-			CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded'),
+		$tok = $this->httpQuery('https://'.$token['host'].'/setStatus/'.$auth['numer'], array(
 			CURLOPT_POST => TRUE,
-			CURLOPT_POSTFIELDS => 'token='.urlencode($token['token']).'&status='.urlencode($status).'&desc='.urlencode($desc),
+			CURLOPT_POSTFIELDS => array(
+				'status' => $status,
+				'desc' => $desc,
+			),
 		));
 		
 		if( (string)$tok->status != '0') {
@@ -155,7 +165,7 @@
 	function setUrl($url) {
 		$auth = $this->APIs['Gadu-Gadu'];
 		
-		$tok = $this->httpQuery('https://botapi.gadu-gadu.pl/botmaster/setUrl/'.$auth['numer'], TRUE, array(
+		$tok = $this->httpQuery('https://botapi.gadu-gadu.pl/botmaster/setUrl/'.$auth['numer'], array(
 			CURLOPT_POST => TRUE,
 			CURLOPT_POSTFIELDS => $url,
 		));
@@ -167,6 +177,56 @@
 		return $tok;
 	}
 	
+	function getImage($hash) {
+		$auth = $this->APIs['Gadu-Gadu'];
+		$token = $this->getToken();
+		
+		$tok = $this->httpQuery('https://'.$token['host'].'/botmaster/setUrl/'.$auth['numer'], array(
+			CURLOPT_POST => TRUE,
+			CURLOPT_POSTFIELDS => array('hash' => $hash),
+		), TRUE, FALSE);
+		
+		return $tok;
+	}
+	
+	function existsImage() {
+		$auth = $this->APIs['Gadu-Gadu'];
+		$token = $this->getToken();
+		
+		$tok = $this->httpQuery('https://'.$token['host'].'/botmaster/setUrl/'.$auth['numer'], array(
+			CURLOPT_POST => TRUE,
+			CURLOPT_POSTFIELDS => array('hash' => $hash),
+		), TRUE, FALSE);
+		
+		if( (string)$tok->status != '0') {
+			return FALSE;
+		}
+		
+		return TRUE;
+	}
+	
+	function putImage($path) {
+		$fp = fopen($path, 'r');
+		if(!$fp) {
+			return FALSE;
+		}
+		
+		$auth = $this->APIs['Gadu-Gadu'];
+		$token = $this->getToken();
+		
+		$tok = $this->httpQuery('https://'.$token['host'].'/botmaster/setUrl/'.$auth['numer'], array(
+			CURLOPT_HTTPHEADER => array('Content-Type: image/x-any'),
+			CURLOPT_POST => TRUE,
+			CURLOPT_INFILE => $fp,
+		), TRUE, FALSE);
+		
+		if( (string)$tok->status != '0') {
+			throw new BotAPIGGReplyException('Przesyłanie obrazka do botmastera nie powiodło się.', $tok);
+		}
+		
+		return (string)$tok->hash;
+	}
+	
 	/**
 	 * Wysyła wiadomość do podanych użytkowników
 	 * @param array $toURL Lista adresatów wiadomości w postaci: array('Gadu-Gadu://NUMER@gadu-gadu.pl', ...)
@@ -174,7 +234,6 @@
 	 * @param array $params Parametry przekazywane funkcji. Aktualnie dostępne:
 	 * array( 'SendToOffline' => (bool)TRUE/FALSE )
 	 */
-	
 	function sendMessage($toURL, BotMsg $msg, $params = array()) {
 		$to = array();
 		foreach($toURL as $url) {
@@ -183,7 +242,7 @@
 				continue;
 			}
 			
-			if($url['user']=='' || !ctype_digit($url['user'])) {
+			if($url['user'] == '' || !ctype_digit($url['user'])) {
 				throw new Exception('Nieznany użytkownik sieci Gadu-Gadu, któremu należy dostarczyć wiadomość.');
 			}
 			
@@ -208,17 +267,23 @@
 		while(!empty($to)) {
 			$to_part = implode(',', array_splice($to, -5000));
 			
-			$tok = $this->httpQuery('https://'.$token['host'].'/sendMessage/'.$auth['numer'], FALSE, array(
+			$tok = $this->httpQuery('https://'.$token['host'].'/sendMessage/'.$auth['numer'], array(
 				CURLOPT_HTTPHEADER => $headers,
 				CURLOPT_POST => TRUE,
-				CURLOPT_POSTFIELDS => 'token='.urlencode($token['token']).'&to='.urlencode($to_part).'&msg='.urlencode($msg->getGG(FALSE)),
+				CURLOPT_POSTFIELDS => array(
+					'to' => $to_part,
+					'msg' => $msg->getGG(FALSE),
+				),
 			));
 			
 			if((string)$tok->status == '18') {
 				$tok = $this->httpQuery('https://'.$token['host'].'/sendMessage/'.$auth['numer'], FALSE, array(
 					CURLOPT_HTTPHEADER => $headers,
 					CURLOPT_POST => TRUE,
-					CURLOPT_POSTFIELDS => 'token='.urlencode($token['token']).'&to='.urlencode($to_part).'&msg='.urlencode($msg->getGG(FALSE)),
+					CURLOPT_POSTFIELDS => array(
+						'to' => $to_part,
+						'msg' => $msg->getGG(TRUE),
+					),
 				));
 			}
 			
diff --git a/class/BotMessage.php b/class/BotMessage.php
index 4b446bf..a958902 100644
--- a/class/BotMessage.php
+++ b/class/BotMessage.php
@@ -31,6 +31,12 @@
 	protected $text;
 	
 	/**
+	 * Tablica obrazków (zobacz klasę BotImage) przesłanych do bota przez użytkownika.
+	 * @var array
+	 */
+	protected $images = array();
+	
+	/**
 	 * Komenda, tylko znaki ASCII, małe litery
 	 * @var string
 	 */
diff --git a/class/BotMessageGG.php b/class/BotMessageGG.php
index fd5ee9d..aa07ac8 100644
--- a/class/BotMessageGG.php
+++ b/class/BotMessageGG.php
@@ -15,6 +15,15 @@
 		$this->user = new BotUser($uid.'/'.$_GET['to']);
 		$this->session = new BotSession($uid);
 		$this->setText(file_get_contents('php://input'));
+		
+		if(isset($_GET['images'])) {
+			$images = explode(',', $_GET['images']);
+			foreach($images as $image) {
+				if(strlen($image) == 16 && ctype_xdigit($image)) {
+					$this->images[] = new BotImageGG($image);
+				}
+			}
+		}
 	}
 }
 ?>
\ No newline at end of file
diff --git a/class/BotMsgGG.php b/class/BotMsgGG.php
index 4f5638e..6b0ff53 100644
--- a/class/BotMsgGG.php
+++ b/class/BotMsgGG.php
@@ -6,7 +6,6 @@
 	private $parser;
 	private $html = '';
 	private $old = '';
-	private $img = '';
 	private $format = '';
 	
 	private $images = array();
@@ -49,12 +48,25 @@
 	
 	/**
 	 * Zwraca wiadomość zgodną z BotAPI Gadu-Gadu, którą można przekazać bezpośrednio do BotMastera
-	 * @param bool $img Czy dołączać obrazki?
+	 * @param NULL|bool $img Czy dołączać obrazki?
 	 * @return string
 	 */
-	function getGG($image = TRUE) {
-		if($image) {
-			$image = $this->img;
+	function getGG($image = NULL) {
+		if($image === FALSE) {
+			$image = '';
+		}
+		elseif($image === TRUE) {
+			$last = array_pop($this->images);
+			if(count($this->images) > 0) {
+				$push = new BotAPIGG();
+				foreach($this->images as $data) {
+					$push->putImage($image[3]);
+				}
+				
+				$image = $last;
+			}
+			
+			$image = $last[2].file_get_contents($last[3]);
 		}
 		else
 		{
@@ -309,11 +321,10 @@
 				$crc = hash_file('crc32b', $src);
 				$name = sprintf('%08s%08x', $crc, $size);
 				
-				$this->images[$src] = array($crc, $size, $name);
+				$this->images[$src] = array($crc, $size, $name, $src);
 			}
 			
 			$node->setAttribute('name', $name);
-			$this->img = $name.file_get_contents($src);
 			
 			$this->format .= pack('vC', mb_strlen($this->old), self::FORMAT_IMAGE)
 					.pack('CCVV', 0x09, 0x01, $size, hexdec($crc));

--
Gitblit v1.9.1