<?php 
 | 
class BotAPIGGHTTPException extends Exception { 
 | 
    private $httpcode; 
 | 
    private $content; 
 | 
     
 | 
    function __construct($msg, $httpcode, $content) { 
 | 
        $this->httpcode = $httpcode; 
 | 
        $this->content = $content; 
 | 
        parent::__construct($msg.' Błąd '.$httpcode); 
 | 
    } 
 | 
     
 | 
    function __get($name) { 
 | 
        return $this->$name; 
 | 
    } 
 | 
} 
 | 
class BotAPIGGXMLException extends Exception { 
 | 
    private $content; 
 | 
     
 | 
    function __construct($msg, $content) { 
 | 
        $this->content = $content; 
 | 
        parent::__construct($msg); 
 | 
    } 
 | 
     
 | 
    function __get($name) { 
 | 
        return $this->$name; 
 | 
    } 
 | 
} 
 | 
  
 | 
class BotAPIGGReplyException extends Exception { 
 | 
    private $xml; 
 | 
     
 | 
    function __construct($msg, SimpleXMLElement $xml) { 
 | 
        $this->xml = $xml; 
 | 
        parent::__construct($msg); 
 | 
    } 
 | 
     
 | 
    function __get($name) { 
 | 
        return $this->$name; 
 | 
    } 
 | 
     
 | 
    function __toString() { 
 | 
        return $this->getMessage().' Błąd '.((string)$this->xml->status).': '.((string)$this->xml->errorMsg); 
 | 
    } 
 | 
} 
 | 
  
 | 
class BotAPIGG extends config { 
 | 
    private static $token; 
 | 
     
 | 
    const STATUS_DOSTEPNY = 2; 
 | 
    const STATUS_DOSTEPNY_DESC = 4; 
 | 
    const STATUS_ONLINE = 2; 
 | 
    const STATUS_ONLINE_DESC = 4; 
 | 
     
 | 
    const STATUS_ZAJETY = 3; 
 | 
    const STATUS_ZAJETY_DESC = 5; 
 | 
    const STATUS_AWAY = 3; 
 | 
    const STATUS_AWAY_DESC = 5; 
 | 
     
 | 
    const STATUS_NIE_PRZESZKADZAC = 33; 
 | 
    const STATUS_NIE_PRZESZKADZAC_DESC = 34; 
 | 
    const STATUS_DND = 33; 
 | 
    const STATUS_DND_DESC = 34; 
 | 
     
 | 
    const STATUS_POROZMAWIAJ = 23; 
 | 
    const STATUS_POROZMAWIAJ_DESC = 24; 
 | 
    const STATUS_CHAT = 23; 
 | 
    const STATUS_CHAT_DESC = 24; 
 | 
     
 | 
    const STATUS_NIEWIDOCZNY = 20; 
 | 
    const STATUS_NIEWIDOCZNY_DESC = 22; 
 | 
    const STATUS_INVISIBLE = 20; 
 | 
    const STATUS_INVISIBLE_DESC = 22; 
 | 
     
 | 
    private function httpQuery($address, $curlopts = array(), $useToken = TRUE, $parseXML = TRUE) { 
 | 
        if(!is_array($curlopts)) { 
 | 
            $curlopts = array(); 
 | 
        } 
 | 
         
 | 
        if($useToken) { 
 | 
            if(!isset($curlopts[CURLOPT_HTTPHEADER]) || !is_array($curlopts[CURLOPT_HTTPHEADER])) { 
 | 
                $curlopts[CURLOPT_HTTPHEADER] = array(); 
 | 
            } 
 | 
             
 | 
            $token = $this->getToken(); 
 | 
             
 | 
            $curlopts[CURLOPT_HTTPHEADER][] = 'Token: '.$token['token']; 
 | 
        } 
 | 
         
 | 
        $dane = curl_init($address); 
 | 
        $curlopts[CURLOPT_RETURNTRANSFER] = TRUE; 
 | 
        $curlopts[CURLOPT_USERAGENT] = 'Bot Gadu-Gadu/'.main::VERSION.' (http://jacekk.info/botgg)'; 
 | 
        $curlopts[CURLOPT_SSL_CIPHER_LIST] = 'HIGH:-MD5:-aNULL:-DES'; 
 | 
        $curlopts[CURLOPT_SSL_VERIFYPEER] = TRUE; 
 | 
        $curlopts[CURLOPT_SSL_VERIFYHOST] = 2; 
 | 
        $curlopts[CURLOPT_CAPATH] = BOT_TOPDIR.'/data/ca-certificates/'; 
 | 
        curl_setopt_array($dane, $curlopts); 
 | 
        $tok2 = $tok = curl_exec($dane); 
 | 
        $info = curl_getinfo($dane); 
 | 
         
 | 
        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); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            if($info['http_code'] != 200) { 
 | 
                throw new BotAPIGGHTTPException('Nie udało się wykonać zapytania HTTP.', $info['http_code'], $tok2); 
 | 
            } 
 | 
        } 
 | 
         
 | 
        return $tok; 
 | 
    } 
 | 
     
 | 
    function getToken($force = FALSE) { 
 | 
        if($force || self::$token === NULL) { 
 | 
            $auth = $this->APIs['Gadu-Gadu']; 
 | 
             
 | 
            $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); 
 | 
            } 
 | 
             
 | 
            self::$token = array('token' => (string)$tok->token, 'host' => (string)$tok->server, 'port' => (int)$tok->port); 
 | 
        } 
 | 
         
 | 
        return self::$token; 
 | 
    } 
 | 
     
 | 
    function setStatus($status, $desc = '') { 
 | 
        $auth = $this->APIs['Gadu-Gadu']; 
 | 
        $token = $this->getToken(); 
 | 
         
 | 
        $tok = $this->httpQuery('https://'.$token['host'].'/setStatus/'.$auth['numer'], array( 
 | 
            CURLOPT_POST => TRUE, 
 | 
            CURLOPT_POSTFIELDS => http_build_query(array( 
 | 
                'status' => $status, 
 | 
                'desc' => $desc, 
 | 
            ), '', '&'), 
 | 
        )); 
 | 
         
 | 
        if( (string)$tok->status != '0') { 
 | 
            throw new BotAPIGGReplyException('Ustawianie statusu nie powiodło się.', $tok); 
 | 
        } 
 | 
    } 
 | 
     
 | 
    function setUrl($url) { 
 | 
        $auth = $this->APIs['Gadu-Gadu']; 
 | 
         
 | 
        $tok = $this->httpQuery('https://botapi.gadu-gadu.pl/botmaster/setUrl/'.$auth['numer'], array( 
 | 
            CURLOPT_POST => TRUE, 
 | 
            CURLOPT_POSTFIELDS => $url, 
 | 
        )); 
 | 
         
 | 
        if( (string)$tok->status != '0') { 
 | 
            throw new BotAPIGGReplyException('Ustawianie adresu URL bota nie powiodło się.', $tok); 
 | 
        } 
 | 
         
 | 
        return $tok; 
 | 
    } 
 | 
     
 | 
    function getImage($hash) { 
 | 
        $auth = $this->APIs['Gadu-Gadu']; 
 | 
        $token = $this->getToken(); 
 | 
         
 | 
        $tok = $this->httpQuery('https://botapi.gadu-gadu.pl/botmaster/getImage/'.$auth['numer'], array( 
 | 
            CURLOPT_POST => TRUE, 
 | 
            CURLOPT_POSTFIELDS => http_build_query(array('hash' => $hash), '', '&'), 
 | 
        ), TRUE, FALSE); 
 | 
         
 | 
        return $tok; 
 | 
    } 
 | 
     
 | 
    function existsImage($hash) { 
 | 
        $auth = $this->APIs['Gadu-Gadu']; 
 | 
        $token = $this->getToken(); 
 | 
         
 | 
        $tok = $this->httpQuery('https://botapi.gadu-gadu.pl/botmaster/existsImage/'.$auth['numer'], array( 
 | 
            CURLOPT_POST => TRUE, 
 | 
            CURLOPT_POSTFIELDS => http_build_query(array('hash' => $hash), '', '&'), 
 | 
        )); 
 | 
         
 | 
        if( (string)$tok->status != '0') { 
 | 
            return FALSE; 
 | 
        } 
 | 
         
 | 
        return TRUE; 
 | 
    } 
 | 
     
 | 
    function putImage($path) { 
 | 
        $auth = $this->APIs['Gadu-Gadu']; 
 | 
        $token = $this->getToken(); 
 | 
         
 | 
        $tok = $this->httpQuery('https://botapi.gadu-gadu.pl/botmaster/putImage/'.$auth['numer'], array( 
 | 
            CURLOPT_HTTPHEADER => array( 
 | 
                'Content-Type: image/x-any', 
 | 
                'Expect: ', 
 | 
            ), 
 | 
            CURLOPT_POST => TRUE, 
 | 
            CURLOPT_POSTFIELDS => file_get_contents($path), 
 | 
        )); 
 | 
         
 | 
        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', ...) 
 | 
     * @param BotMsg $msg Wiadomość do wysłania 
 | 
     * @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) { 
 | 
            $url = parse_url($url); 
 | 
            if($url['scheme'] != 'Gadu-Gadu') { 
 | 
                continue; 
 | 
            } 
 | 
             
 | 
            if($url['user'] == '' || !ctype_digit($url['user'])) { 
 | 
                throw new Exception('Nieznany użytkownik sieci Gadu-Gadu, któremu należy dostarczyć wiadomość.'); 
 | 
            } 
 | 
             
 | 
            $to[] = $url['user']; 
 | 
        } 
 | 
         
 | 
        if(empty($to)) { 
 | 
            return NULL; 
 | 
        } 
 | 
         
 | 
        $msg = new BotMsgGG($msg); 
 | 
         
 | 
        $auth = $this->APIs['Gadu-Gadu']; 
 | 
        $token = $this->getToken(); 
 | 
         
 | 
        $headers = array('Content-Type: application/x-www-form-urlencoded'); 
 | 
         
 | 
        if($params['SendToOffline'] == FALSE) { 
 | 
            $headers[] = 'Send-to-offline: 0'; 
 | 
        } 
 | 
         
 | 
        while(!empty($to)) { 
 | 
            $to_part = implode(',', array_splice($to, -5000)); 
 | 
             
 | 
            $tok = $this->httpQuery('https://'.$token['host'].'/sendMessage/'.$auth['numer'], array( 
 | 
                CURLOPT_HTTPHEADER => $headers, 
 | 
                CURLOPT_POST => TRUE, 
 | 
                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 => array( 
 | 
                        'to' => $to_part, 
 | 
                        'msg' => $msg->getGG(TRUE), 
 | 
                    ), 
 | 
                )); 
 | 
            } 
 | 
             
 | 
            if((string)$tok->status != '0') { 
 | 
                throw new BotAPIGGReplyException('Problemy przy wysyłaniu wiadomości do sieci Gadu-Gadu.', $tok); 
 | 
            } 
 | 
        } 
 | 
         
 | 
        return TRUE; 
 | 
    } 
 | 
} 
 | 
?> 
 |