Jacek Kowalski
2016-02-12 4aa6278f7fd40fdcbbde2be5c7e0e68c3117b44e
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         $miasto_num = $miasto_nazw = '';
139         
140         if(!$miasta) {
141             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy miejscowości.');
142         }
143         
144         foreach($miasta as $miasto => $numer) {
145             $szukaj = funcs::utfToAscii($miasto);
146             if(($pos = strpos($arg, $szukaj)) !== FALSE) {
147                 $miasto_nazw = htmlspecialchars($miasto);
148                 $miasto_num = $numer;
149                 
150                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($szukaj))));
151                 break;
152             }
153         }
154         
618783 155         if($miasto_num === '' && !empty($arg2)) {
3be0e4 156             foreach($miasta as $miasto => $numer) {
JK 157                 $szukaj = funcs::utfToAscii($miasto);
158                 if(($pos = strpos($arg2, $szukaj)) !== FALSE) {
159                     $miasto_nazw = htmlspecialchars($miasto);
160                     $miasto_num = $numer;
161                     
162                     $arg2 = trim(str_replace('  ', ' ', substr($arg2, 0, $pos).substr($arg2, $pos+strlen($szukaj))));
163                     break;
164                 }
165             }
166         }
167         
618783 168         if($miasto_num === '') {
3be0e4 169             $txt = 'Wybrane miasto nie został odnalezione. Obsługiwane miejscowości:';
618783 170             $miasto = 'Warszawa';
3be0e4 171             foreach($miasta as $miasto => $num) {
JK 172                 $txt .= '<br />'."\n".htmlspecialchars($miasto);
173             }
174             $txt .= '<br />'."\n"
175                 . '<br />'."\n"
176                 . '<u>Przykład:</u><br />'."\n"
177                 . 'kino '.htmlspecialchars($miasto);
178             return new BotMsg($txt);
179         }
180         
181         
182         /*
183             KIEDY
184         */
185         $tydzien = array('niedziela', 'poniedzialek', 'wtorek', 'sroda', 'czwartek', 'piatek', 'sobota');
186         $data = array(
187             'dzis' => '',
188             'teraz' => '',
189             'jutro' => '1',
190             'pojutrze' => '2',
191             'po jutrze' => '2',
192         );
193         for($i=0; $i<3; $i++) {
194             $data[date('d.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
195             $data[date('j.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
196         }
197         
198         $czas = '';
199         foreach($data as $known => $d) {
200             if(($pos = strpos($arg, $known))!==FALSE) {
201                 $czas = $d;
202                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($known))));
203                 break;
204             }
205         }
206         
207         /*
208             KINO
209         */
210         $kina = self::getKina($miasto_num, $czas);
211         $kino_num = $kino_nazw = '';
212         
213         if(!$kina) {
214             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy kin.');
215         }
216         
217         if(empty($kina)) {
218             return new BotMsg(($czas == '1' ? 'Jutro' : ($czas == '2' ? 'Pojutrze' : 'Dziś')).' żadne filmy nie są wyświetlane w podanym mieście.<br />'."\n"
219                 . '<br />'."\n"
220                 . '<u>Spróbuj też:</u><br />'."\n"
221                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != '1' ? 'jutro' : ($czas != '2' ? 'pojutrze' : 'dziś')).'<br />'."\n"
222                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != '' ? 'dziś' : ($czas != '2' ? 'pojutrze' : 'dziś')));
223         }
224         
225         if(!empty($arg)) {
226             foreach($kina as $kino => $kino_id) {
227                 if(levenshtein(funcs::utfToAscii($kino), $arg, 1, 1, 0) < 2) {
228                     $kino_num = $kino_id;
229                     $kino_nazw = htmlspecialchars($kino);
230                     break;
231                 }
232             }
233         }
234         
618783 235         if($kino_num === '' && !empty($arg2)) {
3be0e4 236             foreach($kina as $kino => $kino_id) {
JK 237                 if(levenshtein(funcs::utfToAscii($kino), $arg2, 1, 1, 0) < 2) {
238                     $kino_num = $kino_id;
239                     $kino_nazw = htmlspecialchars($kino);
240                     break;
241                 }
242             }
243         }
244         
618783 245         if($kino_num === '') {
3be0e4 246             $txt = (!empty($arg) ? 'Podany obiekt nie został znaleziony. ' : '').'Dostępne kina w pasujących miastach:';
618783 247             $kino = '';
3be0e4 248             foreach($kina as $kino => $num) {
JK 249                 $txt .= '<br />'."\n".$miasto_nazw.' '.htmlspecialchars($kino);
250             }
251             
252             return new BotMsg($txt.'<br />'."\n"
253                 . '<br />'."\n"
254                 . '<u>Przykład:</u><br />'."\n"
255                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($kino).' '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')));
256         }
257         
258         /*
259             REPERTUAR
260         */
618783 261         $filmy = self::getKino($miasto_num, $kino_num, $czas);
3be0e4 262         
JK 263         if(!$filmy) {
264             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy wyświelanych filmów.');
265         }
266         
267         $txt = '<b>Repertuar dla kina '.$kino_nazw.' ('.$miasto_nazw.') na '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')).':</b>';
268         if(empty($filmy)) {
269             $txt .= '<br />'."\n".'Brak projekcji.';
270         }
271         else
272         {
273             foreach($filmy as $film) {
274                 $txt .= '<br />'."\n".htmlspecialchars($film[0]).' '.htmlspecialchars($film[1]).($film[2]!='' ? ' ('.htmlspecialchars($film[2]).')' : '');
275             }
276         }
277         
278         return new BotMsg($txt);
279     }
280 }
281 ?>