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