Jacek Kowalski
2016-02-15 eac90243793cf8ba3da2117ac2d76efbcec24e53
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();
eac902 10         if(!$dom->loadHTML('<?xml encoding="utf-8" ?>' . $dane)) {
3be0e4 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() {
e80d67 22         $xml = $this->cache('http://film.interia.pl/repertuar-kin');
3be0e4 23         if(!$xml) return FALSE;
JK 24         
25         $xpath = new DOMXPath($xml);
e80d67 26         $dane = $xpath->query('//a[contains(@class, "showtimes-city")]');
3be0e4 27         $return = array();
JK 28         
29         foreach($dane as $miasto) {
30             $href = $miasto->getAttribute('href');
31             $data = trim($miasto->textContent);
e80d67 32             $return[$data] = substr($href, strrpos($href, ',')+1);
3be0e4 33         }
JK 34         
35         return $return;
36     }
37     
38     function getKina($miasto, $kiedy='') {
e80d67 39         $xml = $this->cache('http://film.interia.pl/repertuar-kin/miasto-a,cId,'.$miasto.($kiedy ? ',when,'.$kiedy : ''));
3be0e4 40         if(!$xml) return FALSE;
JK 41         
42         $xpath = new DOMXPath($xml);
e80d67 43         $dane = $xpath->query('//div[@id="content"]//div[@class="showtimes-accordion-heading"]//p[@class="showtimes-cinema-name"]');
3be0e4 44         $return = array();
JK 45         
e80d67 46         foreach($dane as $id => $kino) {
3be0e4 47             $name = trim($kino->textContent);
e80d67 48             $return[$name] = $id;
3be0e4 49         }
JK 50         
51         return $return;
52     }
53     
54     function getKino($miasto, $kino, $kiedy='') {
e80d67 55         $xml = $this->cache('http://film.interia.pl/repertuar-kin/miasto-a,cId,'.$miasto.($kiedy ? ',when,'.$kiedy : ''));
3be0e4 56         if(!$xml) return FALSE;
JK 57         
58         $xpath = new DOMXPath($xml);
e80d67 59         $dane = $xpath->query('//div[@id=\'content\']//div[@class=\'showtimes-accordion-body\']');
3be0e4 60         $return = array();
JK 61         
e80d67 62         $dane = $xpath->query('.//div[@class=\'showtimes-cinema-movie\']', $dane[$kino]);
JK 63         
3be0e4 64         foreach($dane as $film) {
e80d67 65             $title = $xpath->query('.//span[@class=\'showtimes-cinema-movie-title\']', $film);
JK 66             $hours = $xpath->query('.//span[@data-time]', $film);
3be0e4 67             
e80d67 68             $hours_ret = array();
JK 69             foreach($hours as $hour) {
70                 $sub = array();
71                 if($xpath->query('.//span[@showtimes-cinema-movie-dubbing]', $hour)) {
72                     $sub[] = 'DUB';
ad6d4a 73                 }
e80d67 74                 if($xpath->query('.//span[@showtimes-cinema-movie-3d]', $hour)) {
JK 75                     $sub[] = '3D';
76                 }
77                 
78                 $hour = $hour->getAttribute('data-time');
79                 
80                 $hours_ret[] = array(substr($hour, 0, -2).':'.substr($hour, -2), $sub);
3be0e4 81             }
JK 82             
83             $return[] = array(
e80d67 84                 trim($title->item(0)->textContent),
JK 85                 $hours_ret
3be0e4 86             );
JK 87         }
88         
89         return $return;
90     }
91     
92     function ustaw($msg, $params) {
93         $arg = funcs::utfToAscii($msg->args);
915475 94         $msg->session->setClass('kino');
3be0e4 95         
JK 96         if(empty($arg)) {
97             unset($msg->session->kino);
98             return new BotMsg('Ustawienie domyślnego kino zostało usunięte. Aby ponownie je ustawić, wpisz:<br />'."\n"
99                 . 'ustaw <i>miasto kino</i>');
100         }
101         else
102         {
103             $msg->session->kino = $arg;
104             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.');
105         }
106     }
107     
108     function handle($msg, $params) {
109         $arg = funcs::utfToAscii($msg->args);
915475 110         $msg->session->setClass('kino');
3be0e4 111         
JK 112         if(empty($arg)) {
113             $arg = $msg->session->kino;
114             if(empty($arg)) {
115                 return new BotMsg('Podaj nazwę miejscowości i kina.<br />'."\n"
116                     . '<br />'."\n"
117                     . '<u>Przykłady:</u><br />'."\n"
118                     . 'kino Kraków<br />'."\n"
119                     . 'kino Kraków Multikino');
120             }
121         }
122         else
123         {
124             $arg2 = $msg->session->kino;
125         }
126         
127         /*
128             MIASTO
129         */
130         $miasta = self::getMiasta();
131         $miasto_num = $miasto_nazw = '';
132         
133         if(!$miasta) {
134             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy miejscowości.');
135         }
136         
137         foreach($miasta as $miasto => $numer) {
138             $szukaj = funcs::utfToAscii($miasto);
139             if(($pos = strpos($arg, $szukaj)) !== FALSE) {
140                 $miasto_nazw = htmlspecialchars($miasto);
141                 $miasto_num = $numer;
142                 
143                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($szukaj))));
144                 break;
145             }
146         }
147         
618783 148         if($miasto_num === '' && !empty($arg2)) {
3be0e4 149             foreach($miasta as $miasto => $numer) {
JK 150                 $szukaj = funcs::utfToAscii($miasto);
151                 if(($pos = strpos($arg2, $szukaj)) !== FALSE) {
152                     $miasto_nazw = htmlspecialchars($miasto);
153                     $miasto_num = $numer;
154                     
155                     $arg2 = trim(str_replace('  ', ' ', substr($arg2, 0, $pos).substr($arg2, $pos+strlen($szukaj))));
156                     break;
157                 }
158             }
159         }
160         
618783 161         if($miasto_num === '') {
3be0e4 162             $txt = 'Wybrane miasto nie został odnalezione. Obsługiwane miejscowości:';
618783 163             $miasto = 'Warszawa';
3be0e4 164             foreach($miasta as $miasto => $num) {
JK 165                 $txt .= '<br />'."\n".htmlspecialchars($miasto);
166             }
167             $txt .= '<br />'."\n"
168                 . '<br />'."\n"
169                 . '<u>Przykład:</u><br />'."\n"
170                 . 'kino '.htmlspecialchars($miasto);
171             return new BotMsg($txt);
172         }
173         
174         
175         /*
176             KIEDY
177         */
178         $tydzien = array('niedziela', 'poniedzialek', 'wtorek', 'sroda', 'czwartek', 'piatek', 'sobota');
179         $data = array(
180             'dzis' => '',
181             'teraz' => '',
e80d67 182             'jutro' => 'jutro',
JK 183             'pojutrze' => 'pojutrze',
184             'po jutrze' => 'pojutrze',
3be0e4 185         );
e80d67 186         $data[date('d.m')] = '';
JK 187         $data[date('j.m')] = '';
188         $data[$tydzien[date('w')]] = '';
189         $data[date('d.m', strtotime('+1 day'))] = 'jutro';
190         $data[date('j.m', strtotime('+1 day'))] = 'jutro';
191         $data[$tydzien[date('w', strtotime('+1 day'))]] = 'jutro';
192         $data[date('d.m', strtotime('+2 day'))] = 'pojutrze';
193         $data[date('j.m', strtotime('+2 day'))] = 'pojutrze';
194         $data[$tydzien[date('w', strtotime('+2 day'))]] = 'pojutrze';
3be0e4 195         
JK 196         $czas = '';
197         foreach($data as $known => $d) {
198             if(($pos = strpos($arg, $known))!==FALSE) {
199                 $czas = $d;
200                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($known))));
201                 break;
202             }
203         }
204         
205         /*
206             KINO
207         */
208         $kina = self::getKina($miasto_num, $czas);
209         $kino_num = $kino_nazw = '';
210         
211         if(!$kina) {
e80d67 212             $txt = 'Brak seansów w tym mieście w wybranym dniu.';
JK 213             $txt .= '<br />'."\n"
214                 . '<br />'."\n"
215                 . '<u>Spróbuj też:</u><br />'."\n"
216                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != 'dzis' ? 'jutro' : ($czas != '2' ? 'pojutrze' : 'dziś')).'<br />'."\n"
217                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != '' ? 'dziś' : ($czas != '2' ? 'pojutrze' : 'dziś'));
218             return new BotMsg($txt);
3be0e4 219         }
JK 220         
221         if(empty($kina)) {
e80d67 222             return new BotMsg(($czas == '' ? 'Dziś' : ucfirst($czas)).' żadne filmy nie są wyświetlane w podanym mieście.<br />'."\n"
3be0e4 223                 . '<br />'."\n"
JK 224                 . '<u>Spróbuj też:</u><br />'."\n"
e80d67 225                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != 'dzis' ? 'jutro' : ($czas != '2' ? 'pojutrze' : 'dziś')).'<br />'."\n"
3be0e4 226                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != '' ? 'dziś' : ($czas != '2' ? 'pojutrze' : 'dziś')));
JK 227         }
228         
229         if(!empty($arg)) {
230             foreach($kina as $kino => $kino_id) {
231                 if(levenshtein(funcs::utfToAscii($kino), $arg, 1, 1, 0) < 2) {
232                     $kino_num = $kino_id;
233                     $kino_nazw = htmlspecialchars($kino);
234                     break;
235                 }
236             }
237         }
238         
618783 239         if($kino_num === '' && !empty($arg2)) {
3be0e4 240             foreach($kina as $kino => $kino_id) {
JK 241                 if(levenshtein(funcs::utfToAscii($kino), $arg2, 1, 1, 0) < 2) {
242                     $kino_num = $kino_id;
243                     $kino_nazw = htmlspecialchars($kino);
244                     break;
245                 }
246             }
247         }
248         
618783 249         if($kino_num === '') {
3be0e4 250             $txt = (!empty($arg) ? 'Podany obiekt nie został znaleziony. ' : '').'Dostępne kina w pasujących miastach:';
618783 251             $kino = '';
3be0e4 252             foreach($kina as $kino => $num) {
JK 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"
e80d67 259                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($kino).' '.($czas == '' ? 'dziś' : $czas));
3be0e4 260         }
JK 261         
262         /*
263             REPERTUAR
264         */
618783 265         $filmy = self::getKino($miasto_num, $kino_num, $czas);
3be0e4 266         
JK 267         if(!$filmy) {
268             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy wyświelanych filmów.');
269         }
270         
e80d67 271         $txt = '<b>Repertuar dla kina '.$kino_nazw.' ('.$miasto_nazw.') na '.($czas == '' ? 'dziś' : $czas).':</b><br />'."\n";
3be0e4 272         if(empty($filmy)) {
JK 273             $txt .= '<br />'."\n".'Brak projekcji.';
274         }
275         else
276         {
277             foreach($filmy as $film) {
e80d67 278                 $txt .= '<br />'."\n".htmlspecialchars($film[0]).'<br />'."\n";
JK 279                 $info = array();
280                 foreach($film[1] as $dane) {
281                     $info[] = '<b>'.$dane[0].'</b>'.($dane[1] ? ' ('.implode(', ', $dane[1]).')' : '');
282                 }
283                 $txt .= implode(', ', $info)."\n".'<br />';
3be0e4 284             }
JK 285         }
286         
287         return new BotMsg($txt);
288     }
289 }