Jacek Kowalski
2012-08-12 fb87e02c9868427de4a97427f9190de4d2d93163
Dodanie pełnej obsługi obrazków, zgodnie z ostatnimi zmianami w BotAPI.
4 files modified
159 ■■■■ changed files
class/BotAPIGG.php 119 ●●●● patch | view | raw | blame | history
class/BotMessage.php 6 ●●●●● patch | view | raw | blame | history
class/BotMessageGG.php 9 ●●●●● patch | view | raw | blame | history
class/BotMsgGG.php 25 ●●●● patch | view | raw | blame | history
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),
                    ),
                ));
            }
            
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
     */
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);
                }
            }
        }
    }
}
?>
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));