Jacek Kowalski
2014-06-11 1128f2ee2379a8473a36631c51b7c2dfb39c0651
commit | author | age
2fb07e 1 <?php
JK 2 require_once(dirname(__FILE__).'/api_geonames.php');
3 require_once(dirname(__FILE__).'/api_yrno.php');
4
48c64f 5 class bot_pogoda_module implements BotModule {
2fb07e 6     function pogoda($msg, $params) {
JK 7         $arg = trim($msg->args);
8         
9         $out = new BotMsg();
d8681e 10         $loc = FALSE;
2fb07e 11         
JK 12         if(empty($arg)) {
13             $msg->session->setClass('pogoda');
14             
15             if(isset($msg->session->miasto) && !isset($msg->session->geo)) {
16                 if(strlen($msg->session->miasto) > 0) {
17                     $out->a('<p>Wymagane przekonwertowanie danych... Wywoływanie komendy <i>miasto '.htmlspecialchars($msg->session->miasto).'</i>...</p>');
18                     
19                     $out->a($this->miasto($msg, $msg->session->miasto));
20                     $out->a('<p></p>');
21                 }
22                 else
23                 {
24                     unset($msg->session->miasto);
25                 }
26             }
27             
28             if(!isset($msg->session->miasto)) {
29                 try {
30                     $api = new BotAPIGG();
31                     $data = $api->getPublicData($msg->user);
32                     if(is_array($data) && isset($data['city'])) {
33                         $arg = trim($data['city']);
34                     }
35                     unset($data, $api);
36                 }
37                 catch(Exception $e) {
38                 }
39                 
b217b9 40                 $forced = FALSE;
2fb07e 41                 if(empty($arg)) {
JK 42                     $arg = 'Warszawa';
43                     $forced = TRUE;
44                 }
45                 
46                 $out->a('<p>Nie ustawiono miasta (pomoc - wpisz: help miasto) - '.(!$forced ? 'na podstawie danych z katalogu publicznego ' : '').'wybieram miasto '.$arg.'</p>'."\n\n");
47             }
48             else
49             {
50                 $loc = array(
51                     'name' => $msg->session->miasto,
52                     'countryName' => $msg->session->kraj,
53                     'coutryCode' => $msg->session->cc,
54                     'lat' => $msg->session->geo['lat'],
55                     'lng' => $msg->session->geo['lon']
56                 );
57             }
58         }
59         
d8681e 60         if($loc === FALSE) {
JK 61             $loc = new api_geonames();
62             $loc = $loc->search($arg);
63             
64             if($loc === FALSE) {
65                 return new BotMsg('Nie udało się pobrać danych o podanym miejscu - spróbuj ponownie za około 10 minut.');
66             }
67             elseif($loc === NULL) {
68                 return new BotMsg('Dla podanego miejsca nie udało się uzyskać współrzędnych geograficznych - spróbuj wpisać inną nazwę.');
69             }
70         }
71         
2fb07e 72         $api = yrno_weather($loc['lat'], $loc['lng']);
JK 73         if($api == FALSE) {
74             return new BotMsg('Nie udało się pobrać danych o pogodzie - spróbuj ponownie za około 10 minut.');
75         }
76         
9b2b4a 77         $out->a('<p>Pogoda dla '.htmlspecialchars($loc['name']).', '.htmlspecialchars($loc['countryName']).'.</p>'."\n\n");
2fb07e 78         
6d0060 79         $icon = (int)$api->getCurrentIcon();
2fb07e 80         $weather = $api->getCurrentWeather();
JK 81         
82         $out->a('<p><b>Teraz</b><br />'."\n"
befc46 83             . '<img src="./data/pogoda/'.$icon.'.png" /><br />'."\n"
6d0060 84             . api_yrno_parse::$symbols[$icon].'<br />'."\n"
2fb07e 85             . 'Temp.: '.htmlspecialchars($weather['temp']).'°C<br />'."\n"
befc46 86             . 'Wiatr: '.htmlspecialchars($weather['wind_speed']).' km/h, '.api_yrno_parse::wind($weather['wind_dir']).'<br />'."\n"
2fb07e 87             . 'Ciśnienie: '.htmlspecialchars($weather['pressure']).' hPa</p>'."\n\n");
JK 88         
89         $when = time();
90         if($when < strtotime('19:00')) {
91             $out->a($this->getHTMLforWeather('Dziś', $api->getDaypartIcon($when), $api->getDaypartWeather($when)));
92         }
93         
94         $when = strtotime('+1 day', $when);
95         $out->a($this->getHTMLforWeather('Jutro', $api->getDaypartIcon($when), $api->getDaypartWeather($when)));
96         $when = strtotime('+1 day', $when);
97         $out->a($this->getHTMLforWeather('Pojutrze', $api->getDaypartIcon($when), $api->getDaypartWeather($when)));
98         
99         $out->a('<p>Dane lokalizacyjne pochodzą z serwisu GeoNames.<br />'."\n"
100             . 'Dane pogodowe pochodzą z Norweskiego Instytutu Meteorologicznego.</p>');
101         
102         return $out;
103     }
104     
9b2b4a 105     function getHTMLforRange($data) {
JK 106         return htmlspecialchars($data['from'].($data['from'] != $data['to'] ? '-'.$data['to'] : ''));
107     }
108     
2fb07e 109     function getHTMLforWeather($name, $icons, $weather) {
JK 110         $html = '<p><b>'.$name.'</b><br />'."\n";
6d0060 111         $desc = array();
JK 112         $curr = 0;
2fb07e 113         foreach($icons as $icon) {
6d0060 114             $icon = (int)$icon;
JK 115             if(is_file('./data/pogoda/'.$icon.'.png')) {
116                 $html .= '<img src="./data/pogoda/'.$icon.'.png" alt="" /> ';
117                 if($icon != $curr) {
118                     $desc[] = api_yrno_parse::$symbols[$icon];
119                     $curr = $icon;
120                 }
2fb07e 121             }
JK 122         }
123         $html .= '<br />'."\n"
6d0060 124             . implode(' / ', $desc).'<br />'."\n"
9b2b4a 125             . 'Temp.: '.$this->getHTMLforRange($weather['temp']['day']).'°C (w nocy: '.$this->getHTMLforRange($weather['temp']['night']).'°C)<br />'."\n"
JK 126             . 'Wiatr: '.$this->getHTMLforRange($weather['wind']['day']).' km/h (w nocy: '.$this->getHTMLforRange($weather['wind']['night']).' km/h)</p>'."\n\n";
2fb07e 127         
JK 128         return $html;
129     }
130     
131     function miasto($msg, $params) {
132         $msg->session->setClass('pogoda');
133         
134         if(strlen($params) > 0) {
135             $arg = trim($params);
136         }
137         else
138         {
139             $arg = trim($msg->args);
140         }
141         
1128f2 142         $out = new BotMsg();
JK 143         
2fb07e 144         if(empty($arg)) {
1128f2 145             if(isset($msg->session->miasto)) {
2fb07e 146                 return new BotMsg('Aktualnie ustawione miejsce to: '.htmlspecialchars($this->session->miasto).', '.htmlspecialchars($this->session->countryName));
JK 147             }
148             
149             try {
150                 $api = new BotAPIGG();
151                 $dane = $api->getPublicData($msg->user);
152                 if(!isset($arg['city']) || empty($arg['city'])) {
153                     throw new Exception('Brak miasta w danych w katalogu publicznym.');
154                 }
155                 
156                 $arg = trim($arg['city']);
157             }
158             catch(Exception $e) {
159                 return new BotMsg('Nie podano wymaganego argumentu <i>miasto</i>.');
160             }
161             
162             $out->a('<p>Na podstawie danych z katalogu publicznego wybieram miasto: '.htmlspecialchars($arg).'</p>'."\n\n");
163         }
164         else
165         {
1128f2 166             
2fb07e 167         }
JK 168         
169         $api = new api_geonames();
170         $dane = $api->search($arg);
171         
172         if($dane === FALSE) {
173             return new BotMsg('Wystąpił błąd przy wyszukiwaniu miasta. Spróbuj ponownie później.');
174         }
175         elseif($dane === NULL) {
176             return new BotMsg('Nie udało się zlokalizować podanego miejsca. Spróbuj wpisać inną nazwę.');
177         }
178         
179         $msg->session->miasto = $dane['name'];
180         $msg->session->kraj = $dane['countryName'];
181         $msg->session->cc = $dane['countryCode'];
182         $msg->session->geo = array('lat' => $dane['lat'], 'lon' => $dane['lng']);
183         
184         $out->a('<p>Ustawiono miejsce: '.htmlspecialchars($this->session->miasto).', '.htmlspecialchars($this->session->countryName).'</p>');
185         
186         return $out;
187     }
188 }
189 ?>