<?php 
 | 
class api_yrno_parse { 
 | 
    protected $xml; 
 | 
    protected $dane; 
 | 
     
 | 
    public static $symbols = array( 
 | 
        1 => 'Słonecznie', 
 | 
        2 => 'Lekkie zachmurzenie', 
 | 
        3 => 'Częściowe zachmurzenie', 
 | 
        4 => 'Zachmurzenie', 
 | 
        5 => 'Lekki deszcz z przejaśnieniami', 
 | 
        6 => 'Lekki deszcz i burze', 
 | 
        7 => 'Lekki deszcz ze śniegiem', 
 | 
        8 => 'Śnieg', 
 | 
        9 => 'Lekki deszcz', 
 | 
        10 => 'Deszcz', 
 | 
        11 => 'Burze z deszczem', 
 | 
        12 => 'Deszcz ze śniegiem', 
 | 
        13 => 'Śnieg', 
 | 
        14 => 'Burze ze śniegiem', 
 | 
        15 => 'Mgły', 
 | 
        16 => 1, 
 | 
        17 => 2, 
 | 
        18 => 5, 
 | 
        19 => 8, 
 | 
        20 => 'Deszcz ze śniegiem, burze, możliwe przejaśnienia', 
 | 
        21 => 'Burze ze śniegiem, możliwe przejaśnienia', 
 | 
        22 => 'Lekki deszcz i burze', 
 | 
        23 => 'Deszcz ze śniegiem, burze' 
 | 
    ); 
 | 
     
 | 
    public static $wind = array( 
 | 
        'N' => 'północny', 
 | 
        'NW' => 'północno-zachodni', 
 | 
        'W' => 'zachodni', 
 | 
        'SW' => 'południowo-zachodni', 
 | 
        'S' => 'południowy', 
 | 
        'SE' => 'południowo-wschodni', 
 | 
        'E' => 'wschodni', 
 | 
        'NE' => 'północno-wschodni', 
 | 
    ); 
 | 
     
 | 
    public static function wind($dir) { 
 | 
        if(isset(self::$wind[$dir])) { 
 | 
            return self::$wind[$dir]; 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            return ''; 
 | 
        } 
 | 
    } 
 | 
     
 | 
    public function __construct($xml) { 
 | 
        libxml_use_internal_errors(); 
 | 
        $this->xml = simplexml_load_string($xml); 
 | 
        libxml_clear_errors(); 
 | 
         
 | 
        if(!$this->xml) { 
 | 
            throw new Exception('Niepoprawny format danych meteorologicznych!'); 
 | 
        } 
 | 
    } 
 | 
     
 | 
    public function mktime($time) { 
 | 
        return strtotime(substr($time, 0, -1)); 
 | 
    } 
 | 
     
 | 
    public function parseForecast() { 
 | 
        $this->dane = array( 
 | 
            '0h' => array(), 
 | 
            '3h' => array(), 
 | 
            '6h' => array(), 
 | 
        ); 
 | 
         
 | 
        foreach($this->xml->product->time as $time) { 
 | 
            $to = $this->mktime((string)$time->attributes()->to); 
 | 
            $from = $this->mktime((string)$time->attributes()->from); 
 | 
             
 | 
            $time = $time->location; 
 | 
             
 | 
            if($to == $from) { 
 | 
                $this->dane['0h'][$to] = array( 
 | 
                    'temp' => (string)$time->temperature->attributes()->value, 
 | 
                    'wind_speed' => (string)$time->windSpeed->attributes()->mps, 
 | 
                    'wind_dir' => (string)$time->windDirection->attributes()->name, 
 | 
                    'humidity' => (string)$time->humidity->attributes()->value, 
 | 
                    'pressure' => (string)$time->pressure->attributes()->value, 
 | 
                ); 
 | 
            } 
 | 
            elseif($to-$from > 0) { 
 | 
                if($to-$from > 14400) { 
 | 
                    $put = '6h'; 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    $put = '3h'; 
 | 
                } 
 | 
                 
 | 
                $icon = (int)$time->symbol->attributes()->number; 
 | 
                if(is_int(self::$symbols[$icon])) { 
 | 
                    $icon = self::$symbols[$icon]; 
 | 
                } 
 | 
                 
 | 
                $this->dane[$put][$to] = array( 
 | 
                    'from' => $from, 
 | 
                    'to' => $to, 
 | 
                    'icon' => $icon 
 | 
                ); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
     
 | 
    public function getCurrentIcon() { 
 | 
        $now = time(); 
 | 
        foreach($this->dane['3h'] as $value) { 
 | 
            if($value['from'] <= $now && $now < $value['to']) { 
 | 
                return $value['icon']; 
 | 
            } 
 | 
        } 
 | 
         
 | 
        return NULL; 
 | 
    } 
 | 
     
 | 
    public function getCurrentWeather() { 
 | 
        $dist = PHP_INT_MAX; 
 | 
        $current = NULL; 
 | 
        foreach($this->dane['0h'] as $time => $value) { 
 | 
            if(abs($time - time()) < $dist) { 
 | 
                $dist = abs($time - time()); 
 | 
                $current = $value; 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                break; 
 | 
            } 
 | 
        } 
 | 
         
 | 
        return $current; 
 | 
    } 
 | 
     
 | 
    public function getDaypartWeather($timestamp) { 
 | 
        $start = strtotime('6:00', $timestamp); 
 | 
        $dayend = strtotime('19:30', $timestamp); 
 | 
        $end = $start + 22*3600; 
 | 
         
 | 
        $wind = $temp = array( 
 | 
            'day' => array(), 
 | 
            'night' => array(), 
 | 
        ); 
 | 
         
 | 
        foreach($this->dane['0h'] as $time => $value) { 
 | 
            $part = NULL; 
 | 
            if($start <= $time && $time < $dayend) { 
 | 
                $part = 'day'; 
 | 
            } 
 | 
            elseif($dayend < $time && $time <= $end) { 
 | 
                $part = 'night'; 
 | 
            } 
 | 
            elseif($end <= $time) { 
 | 
                break; 
 | 
            } 
 | 
             
 | 
            if($part !== NULL) { 
 | 
                if(!isset($temp[$part]['from']) || $value['temp'] < $temp[$part]['from']) { 
 | 
                    $temp[$part]['from'] = $value['temp']; 
 | 
                } 
 | 
                if(!isset($temp[$part]['to']) || $value['temp'] > $temp[$part]['to']) { 
 | 
                    $temp[$part]['to'] = $value['temp']; 
 | 
                } 
 | 
                 
 | 
                if(!isset($wind[$part]['from']) || $value['wind_speed'] < $wind[$part]['from']) { 
 | 
                    $wind[$part]['from'] = $value['wind_speed']; 
 | 
                } 
 | 
                if(!isset($wind[$part]['to']) || $value['wind_speed'] > $wind[$part]['to']) { 
 | 
                    $wind[$part]['to'] = $value['wind_speed']; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
         
 | 
        if($temp['day'] == array() || $wind['day'] == array()) { 
 | 
            unset($temp['day']); 
 | 
            unset($wind['day']); 
 | 
        } 
 | 
         
 | 
        return array('temp' => $temp, 'wind' => $wind); 
 | 
    } 
 | 
     
 | 
    public function getDaypartIcon($timestamp) { 
 | 
        $start = strtotime('6:00', $timestamp); 
 | 
        $end = strtotime('24:00', $timestamp); 
 | 
         
 | 
        $return = array(); 
 | 
        foreach($this->dane['3h'] as $time => $value) { 
 | 
            if($start <= $value['from'] && $value['to'] <= $end) { 
 | 
                $return[] = $value['icon']; 
 | 
            } 
 | 
            elseif($end <= $value['from']) { 
 | 
                break; 
 | 
            } 
 | 
        } 
 | 
         
 | 
        return $return; 
 | 
    } 
 | 
} 
 | 
  
 | 
function yrno_weather($lat, $lon) { 
 | 
    $down = new DownloadHelper('http://api.yr.no/weatherapi/locationforecastlts/1.1/?lat='.urlencode($lat).';lon='.urlencode($lon)); 
 | 
    $down->setopt(CURLOPT_USERAGENT, 'BotGG/'.main::VERSION_NUM.' WeatherModule/1.0 (http://bot.jacekk.net/weather.html)'); 
 | 
    try { 
 | 
        $data = $down->exec(); 
 | 
        $data = new api_yrno_parse($data); 
 | 
        $data->parseForecast(); 
 | 
    } 
 | 
    catch(Exception $e) { 
 | 
        $down->cacheFor(600); 
 | 
        return FALSE; 
 | 
    } 
 | 
     
 | 
    $down->cacheFor(7200); 
 | 
    return $data; 
 | 
} 
 | 
?> 
 |