Jacek Kowalski
2012-08-29 48c64f6d6fcc3c32669d0ad556dd1777b3077c08
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();
10         
11         
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                 
40                 if(empty($arg)) {
41                     $arg = 'Warszawa';
42                     $forced = TRUE;
43                 }
44                 
45                 $out->a('<p>Nie ustawiono miasta (pomoc - wpisz: help miasto) - '.(!$forced ? 'na podstawie danych z katalogu publicznego ' : '').'wybieram miasto '.$arg.'</p>'."\n\n");
46                 
47                 $loc = new api_geonames();
48                 $loc = $loc->search($arg);
49                 
50                 if($loc === FALSE) {
51                     return new BotMsg('Nie udało się pobrać danych o podanym miejscu - spróbuj ponownie za około 10 minut.');
52                 }
53                 elseif($loc === NULL) {
54                     return new BotMsg('Dla podanego miejsca nie udało się uzyskać współrzędnych geograficznych - spróbuj wpisać inną nazwę.');
55                 }
56             }
57             else
58             {
59                 $loc = array(
60                     'name' => $msg->session->miasto,
61                     'countryName' => $msg->session->kraj,
62                     'coutryCode' => $msg->session->cc,
63                     'lat' => $msg->session->geo['lat'],
64                     'lng' => $msg->session->geo['lon']
65                 );
66             }
67         }
68         
69         $api = yrno_weather($loc['lat'], $loc['lng']);
70         if($api == FALSE) {
71             return new BotMsg('Nie udało się pobrać danych o pogodzie - spróbuj ponownie za około 10 minut.');
72         }
73         
74         $out->a('<p>Pogoda dla '.htmlspecialchars($loc->name).', '.htmlspecialchars($loc->countryName).'.</p>'."\n\n");
75         
76         $icon = $api->symbols[$api->getCurrentIcon()];
77         $weather = $api->getCurrentWeather();
78         
79         $out->a('<p><b>Teraz</b><br />'."\n"
80             . $icon.'<br />'."\n"
81             . 'Temp.: '.htmlspecialchars($weather['temp']).'°C<br />'."\n"
82             . 'Wiatr: '.htmlspecialchars($weather['wind']).' km/h, '.$api->wind($weather['wind']).'<br />'."\n"
83             . 'Ciśnienie: '.htmlspecialchars($weather['pressure']).' hPa</p>'."\n\n");
84         
85         $when = time();
86         if($when < strtotime('19:00')) {
87             $out->a($this->getHTMLforWeather('Dziś', $api->getDaypartIcon($when), $api->getDaypartWeather($when)));
88         }
89         
90         $when = strtotime('+1 day', $when);
91         $out->a($this->getHTMLforWeather('Jutro', $api->getDaypartIcon($when), $api->getDaypartWeather($when)));
92         $when = strtotime('+1 day', $when);
93         $out->a($this->getHTMLforWeather('Pojutrze', $api->getDaypartIcon($when), $api->getDaypartWeather($when)));
94         
95         $out->a('<p>Dane lokalizacyjne pochodzą z serwisu GeoNames.<br />'."\n"
96             . 'Dane pogodowe pochodzą z Norweskiego Instytutu Meteorologicznego.</p>');
97         
98         return $out;
99     }
100     
101     function getHTMLforWeather($name, $icons, $weather) {
102         $html = '<p><b>'.$name.'</b><br />'."\n";
103         foreach($icons as $icon) {
104             if(is_file('./data/pogoda/'.htmlspecialchars($icon).'.png')) {
105                 $html .= '<img src="./data/pogoda/'.htmlspecialchars($icon).'.png" alt="" /> ';
106             }
107         }
108         $html .= '<br />'."\n"
109             . 'Temp.: '.$weather['temp']['from'].($weather['temp']['from'] != $weather['temp']['to'] ? '-'.$weather['temp']['to'] : '').'°C<br />'."\n"
110             . 'Wiatr: '.$weather['wind']['from'].($weather['wind']['from'] != $weather['wind']['to'] ? '-'.$weather['wind']['to'] : '').' km/h</p>'."\n\n";
111         
112         return $html;
113     }
114     
115     function miasto($msg, $params) {
116         $msg->session->setClass('pogoda');
117         
118         if(strlen($params) > 0) {
119             $arg = trim($params);
120         }
121         else
122         {
123             $arg = trim($msg->args);
124         }
125         
126         if(empty($arg)) {
127             if(isset($this->session->miasto)) {
128                 return new BotMsg('Aktualnie ustawione miejsce to: '.htmlspecialchars($this->session->miasto).', '.htmlspecialchars($this->session->countryName));
129             }
130             
131             try {
132                 $api = new BotAPIGG();
133                 $dane = $api->getPublicData($msg->user);
134                 if(!isset($arg['city']) || empty($arg['city'])) {
135                     throw new Exception('Brak miasta w danych w katalogu publicznym.');
136                 }
137                 
138                 $arg = trim($arg['city']);
139             }
140             catch(Exception $e) {
141                 return new BotMsg('Nie podano wymaganego argumentu <i>miasto</i>.');
142             }
143             
144             $out->a('<p>Na podstawie danych z katalogu publicznego wybieram miasto: '.htmlspecialchars($arg).'</p>'."\n\n");
145         }
146         else
147         {
148             $out = new BotMsg();
149         }
150         
151         $api = new api_geonames();
152         $dane = $api->search($arg);
153         
154         if($dane === FALSE) {
155             return new BotMsg('Wystąpił błąd przy wyszukiwaniu miasta. Spróbuj ponownie później.');
156         }
157         elseif($dane === NULL) {
158             return new BotMsg('Nie udało się zlokalizować podanego miejsca. Spróbuj wpisać inną nazwę.');
159         }
160         
161         $msg->session->miasto = $dane['name'];
162         $msg->session->kraj = $dane['countryName'];
163         $msg->session->cc = $dane['countryCode'];
164         $msg->session->geo = array('lat' => $dane['lat'], 'lon' => $dane['lng']);
165         
166         $out->a('<p>Ustawiono miejsce: '.htmlspecialchars($this->session->miasto).', '.htmlspecialchars($this->session->countryName).'</p>');
167         
168         return $out;
169     }
170 }
171 ?>