Jacek Kowalski
2014-06-08 46ae6028378da89c0b20156e8645e6272fda35ab
commit | author | age
3be0e4 1 <?php
JK 2 class bot_kino_module implements BotModule {
3     function cache($url) {
ad6d4a 4         $down = new DownloadHelper($url);
JK 5         $dane = $down->exec();
3be0e4 6         
JK 7         libxml_use_internal_errors(TRUE);
8         
9         $dom = new DOMDocument();
10         if(!$dom->loadHTML($dane)) {
11             libxml_use_internal_errors(FALSE);
ad6d4a 12             $down->cacheFor(1800);
3be0e4 13             return FALSE;
JK 14         }
ad6d4a 15         
JK 16         $down->cacheUntil(strtotime('tomorrow midnight'));
3be0e4 17         
JK 18         return $dom;
19     }
20     
21     function getMiasta() {
22         $xml = $this->cache('http://film.interia.pl/kino/repertuar');
23         if(!$xml) return FALSE;
24         
25         $xpath = new DOMXPath($xml);
26         $dane = $xpath->query('//div[@id=\'cities\']//a');
27         $return = array();
28         
29         foreach($dane as $miasto) {
30             $href = $miasto->getAttribute('href');
31             $data = trim($miasto->textContent);
32             $return[$data] = substr($href, strpos($href, ',')+1);
33         }
34         
35         return $return;
36     }
37     
38     function getKina($miasto, $kiedy='') {
39         $xml = $this->cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : ''));
40         if(!$xml) return FALSE;
41         
42         $xpath = new DOMXPath($xml);
43         $dane = $xpath->query('//div[@id=\'mainContent\']/table//th[@class=\'theatre\']/a[1]');
44         $return = array();
45         
46         foreach($dane as $kino) {
47             $name = trim($kino->textContent);
ad6d4a 48             $return[$name] = $kino->getAttribute('href');
3be0e4 49         }
JK 50         
51         return $return;
52     }
53     
54     function getKino($miasto, $kino, $kiedy='') {
55         $xml = $this->cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : ''));
56         if(!$xml) return FALSE;
57         
58         $xpath = new DOMXPath($xml);
ad6d4a 59         $dane = $xpath->query('//div[@id=\'mainContent\']/table//a[@href=\''.$kino.'\']/../../following-sibling::tr');
3be0e4 60         $return = array();
JK 61         
62         foreach($dane as $film) {
ad6d4a 63             if(!$film->firstChild) {
JK 64                 break;
65             }
66             if($film->firstChild->nodeName == 'th') {
67                 break;
68             }
69             if($film->firstChild->nodeName != 'td') {
70                 break;
71             }
3be0e4 72             
JK 73             $tds = $xpath->query('td', $film);
74             $name = $xpath->query('a[1]', $tds->item(0));
75             
76             $more = array();
ad6d4a 77             $more_desc = array(
JK 78                 's3d-movie' => '3D',
79                 'dubbing-movie' => 'dubbing',
80             );
81             $more_xml = $xpath->query('span[@class=\'reper\']/div', $tds->item(0));
3be0e4 82             foreach($more_xml as $more_x) {
ad6d4a 83                 $more_x = $more_x->getAttribute('class');
JK 84                 if(isset($more_desc[$more_x])) {
85                     $more[] = $more_desc[$more_x];
86                 }
3be0e4 87             }
JK 88             
89             $return[] = array(
90                 trim($tds->item(1)->textContent),
91                 trim($name->item(0)->textContent),
92                 implode(', ', $more),
93             );
94         }
95         
96         return $return;
97     }
98     
99     function ustaw($msg, $params) {
100         $arg = funcs::utfToAscii($msg->args);
915475 101         $msg->session->setClass('kino');
3be0e4 102         
JK 103         if(empty($arg)) {
104             unset($msg->session->kino);
105             return new BotMsg('Ustawienie domyślnego kino zostało usunięte. Aby ponownie je ustawić, wpisz:<br />'."\n"
106                 . 'ustaw <i>miasto kino</i>');
107         }
108         else
109         {
110             $msg->session->kino = $arg;
111             return new BotMsg('Podane miasto/kino zostało zapisane jako domyślne. Sprawdź, czy jest poprawne wysyłając komendę <b>kino</b> bez argumentów.');
112         }
113     }
114     
115     function handle($msg, $params) {
116         $arg = funcs::utfToAscii($msg->args);
915475 117         $msg->session->setClass('kino');
3be0e4 118         
JK 119         if(empty($arg)) {
120             $arg = $msg->session->kino;
121             if(empty($arg)) {
122                 return new BotMsg('Podaj nazwę miejscowości i kina.<br />'."\n"
123                     . '<br />'."\n"
124                     . '<u>Przykłady:</u><br />'."\n"
125                     . 'kino Kraków<br />'."\n"
126                     . 'kino Kraków Multikino');
127             }
128         }
129         else
130         {
131             $arg2 = $msg->session->kino;
132         }
133         
134         /*
135             MIASTO
136         */
137         $miasta = self::getMiasta();
138         $found = FALSE;
139         $miasto_num = $miasto_nazw = '';
140         
141         if(!$miasta) {
142             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy miejscowości.');
143         }
144         
145         foreach($miasta as $miasto => $numer) {
146             $szukaj = funcs::utfToAscii($miasto);
147             if(($pos = strpos($arg, $szukaj)) !== FALSE) {
148                 $found = TRUE;
149                 $miasto_nazw = htmlspecialchars($miasto);
150                 $miasto_num = $numer;
151                 
152                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($szukaj))));
153                 break;
154             }
155         }
156         
157         if($found===FALSE && !empty($arg2)) {
158             foreach($miasta as $miasto => $numer) {
159                 $szukaj = funcs::utfToAscii($miasto);
160                 if(($pos = strpos($arg2, $szukaj)) !== FALSE) {
161                     $found = TRUE;
162                     $miasto_nazw = htmlspecialchars($miasto);
163                     $miasto_num = $numer;
164                     
165                     $arg2 = trim(str_replace('  ', ' ', substr($arg2, 0, $pos).substr($arg2, $pos+strlen($szukaj))));
166                     break;
167                 }
168             }
169         }
170         
171         if($found === FALSE) {
172             $txt = 'Wybrane miasto nie został odnalezione. Obsługiwane miejscowości:';
173             foreach($miasta as $miasto => $num) {
174                 $txt .= '<br />'."\n".htmlspecialchars($miasto);
175             }
176             $txt .= '<br />'."\n"
177                 . '<br />'."\n"
178                 . '<u>Przykład:</u><br />'."\n"
179                 . 'kino '.htmlspecialchars($miasto);
180             return new BotMsg($txt);
181         }
182         
183         
184         /*
185             KIEDY
186         */
187         $tydzien = array('niedziela', 'poniedzialek', 'wtorek', 'sroda', 'czwartek', 'piatek', 'sobota');
188         $data = array(
189             'dzis' => '',
190             'teraz' => '',
191             'jutro' => '1',
192             'pojutrze' => '2',
193             'po jutrze' => '2',
194         );
195         for($i=0; $i<3; $i++) {
196             $data[date('d.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
197             $data[date('j.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
198         }
199         
200         $czas = '';
201         foreach($data as $known => $d) {
202             if(($pos = strpos($arg, $known))!==FALSE) {
203                 $czas = $d;
204                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($known))));
205                 break;
206             }
207         }
208         
209         /*
210             KINO
211         */
212         $kina = self::getKina($miasto_num, $czas);
213         $found = FALSE;
214         $kino_num = $kino_nazw = '';
215         
216         if(!$kina) {
217             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy kin.');
218         }
219         
220         if(empty($kina)) {
221             return new BotMsg(($czas == '1' ? 'Jutro' : ($czas == '2' ? 'Pojutrze' : 'Dziś')).' żadne filmy nie są wyświetlane w podanym mieście.<br />'."\n"
222                 . '<br />'."\n"
223                 . '<u>Spróbuj też:</u><br />'."\n"
224                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != '1' ? 'jutro' : ($czas != '2' ? 'pojutrze' : 'dziś')).'<br />'."\n"
225                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != '' ? 'dziś' : ($czas != '2' ? 'pojutrze' : 'dziś')));
226         }
227         
228         if(!empty($arg)) {
229             foreach($kina as $kino => $kino_id) {
230                 if(levenshtein(funcs::utfToAscii($kino), $arg, 1, 1, 0) < 2) {
231                     $found = TRUE;
232                     $kino_num = $kino_id;
233                     $kino_nazw = htmlspecialchars($kino);
234                     break;
235                 }
236             }
237         }
238         
239         if($found===FALSE && !empty($arg2)) {
240             foreach($kina as $kino => $kino_id) {
241                 if(levenshtein(funcs::utfToAscii($kino), $arg2, 1, 1, 0) < 2) {
242                     $found = TRUE;
243                     $kino_num = $kino_id;
244                     $kino_nazw = htmlspecialchars($kino);
245                     break;
246                 }
247             }
248         }
249         
250         if($found === FALSE) {
251             $txt = (!empty($arg) ? 'Podany obiekt nie został znaleziony. ' : '').'Dostępne kina w pasujących miastach:';
252             foreach($kina as $kino => $num) {
253                 $txt .= '<br />'."\n".$miasto_nazw.' '.htmlspecialchars($kino);
254             }
255             
256             return new BotMsg($txt.'<br />'."\n"
257                 . '<br />'."\n"
258                 . '<u>Przykład:</u><br />'."\n"
259                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($kino).' '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')));
260         }
261         
262         /*
263             REPERTUAR
264         */
265         $filmy = self::getKino($miasto_num, $kino_id, $czas);
266         
267         if(!$filmy) {
268             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy wyświelanych filmów.');
269         }
270         
271         $txt = '<b>Repertuar dla kina '.$kino_nazw.' ('.$miasto_nazw.') na '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')).':</b>';
272         if(empty($filmy)) {
273             $txt .= '<br />'."\n".'Brak projekcji.';
274         }
275         else
276         {
277             foreach($filmy as $film) {
278                 $txt .= '<br />'."\n".htmlspecialchars($film[0]).' '.htmlspecialchars($film[1]).($film[2]!='' ? ' ('.htmlspecialchars($film[2]).')' : '');
279             }
280         }
281         
282         return new BotMsg($txt);
283     }
284 }
285 ?>