Jacek Kowalski
2012-08-12 bcbe9c0739eb64459a95807ec30b442b3d04edf9
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);
100         
101         if(empty($arg)) {
102             unset($msg->session->kino);
103             return new BotMsg('Ustawienie domyślnego kino zostało usunięte. Aby ponownie je ustawić, wpisz:<br />'."\n"
104                 . 'ustaw <i>miasto kino</i>');
105         }
106         else
107         {
108             $msg->session->kino = $arg;
109             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.');
110         }
111     }
112     
113     function handle($msg, $params) {
114         $arg = funcs::utfToAscii($msg->args);
115         
116         if(empty($arg)) {
117             $arg = $msg->session->kino;
118             if(empty($arg)) {
119                 return new BotMsg('Podaj nazwę miejscowości i kina.<br />'."\n"
120                     . '<br />'."\n"
121                     . '<u>Przykłady:</u><br />'."\n"
122                     . 'kino Kraków<br />'."\n"
123                     . 'kino Kraków Multikino');
124             }
125         }
126         else
127         {
128             $arg2 = $msg->session->kino;
129         }
130         
131         /*
132             MIASTO
133         */
134         $miasta = self::getMiasta();
135         $found = FALSE;
136         $miasto_num = $miasto_nazw = '';
137         
138         if(!$miasta) {
139             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy miejscowości.');
140         }
141         
142         foreach($miasta as $miasto => $numer) {
143             $szukaj = funcs::utfToAscii($miasto);
144             if(($pos = strpos($arg, $szukaj)) !== FALSE) {
145                 $found = TRUE;
146                 $miasto_nazw = htmlspecialchars($miasto);
147                 $miasto_num = $numer;
148                 
149                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($szukaj))));
150                 break;
151             }
152         }
153         
154         if($found===FALSE && !empty($arg2)) {
155             foreach($miasta as $miasto => $numer) {
156                 $szukaj = funcs::utfToAscii($miasto);
157                 if(($pos = strpos($arg2, $szukaj)) !== FALSE) {
158                     $found = TRUE;
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         
168         if($found === FALSE) {
169             $txt = 'Wybrane miasto nie został odnalezione. Obsługiwane miejscowości:';
170             foreach($miasta as $miasto => $num) {
171                 $txt .= '<br />'."\n".htmlspecialchars($miasto);
172             }
173             $txt .= '<br />'."\n"
174                 . '<br />'."\n"
175                 . '<u>Przykład:</u><br />'."\n"
176                 . 'kino '.htmlspecialchars($miasto);
177             return new BotMsg($txt);
178         }
179         
180         
181         /*
182             KIEDY
183         */
184         $tydzien = array('niedziela', 'poniedzialek', 'wtorek', 'sroda', 'czwartek', 'piatek', 'sobota');
185         $data = array(
186             'dzis' => '',
187             'teraz' => '',
188             'jutro' => '1',
189             'pojutrze' => '2',
190             'po jutrze' => '2',
191         );
192         for($i=0; $i<3; $i++) {
193             $data[date('d.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
194             $data[date('j.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
195         }
196         
197         $czas = '';
198         foreach($data as $known => $d) {
199             if(($pos = strpos($arg, $known))!==FALSE) {
200                 $czas = $d;
201                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($known))));
202                 break;
203             }
204         }
205         
206         /*
207             KINO
208         */
209         $kina = self::getKina($miasto_num, $czas);
210         $found = FALSE;
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                     $found = TRUE;
229                     $kino_num = $kino_id;
230                     $kino_nazw = htmlspecialchars($kino);
231                     break;
232                 }
233             }
234         }
235         
236         if($found===FALSE && !empty($arg2)) {
237             foreach($kina as $kino => $kino_id) {
238                 if(levenshtein(funcs::utfToAscii($kino), $arg2, 1, 1, 0) < 2) {
239                     $found = TRUE;
240                     $kino_num = $kino_id;
241                     $kino_nazw = htmlspecialchars($kino);
242                     break;
243                 }
244             }
245         }
246         
247         if($found === FALSE) {
248             $txt = (!empty($arg) ? 'Podany obiekt nie został znaleziony. ' : '').'Dostępne kina w pasujących miastach:';
249             foreach($kina as $kino => $num) {
250                 $txt .= '<br />'."\n".$miasto_nazw.' '.htmlspecialchars($kino);
251             }
252             
253             return new BotMsg($txt.'<br />'."\n"
254                 . '<br />'."\n"
255                 . '<u>Przykład:</u><br />'."\n"
256                 . 'kino '.$miasto_nazw.' '.htmlspecialchars($kino).' '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')));
257         }
258         
259         /*
260             REPERTUAR
261         */
262         $filmy = self::getKino($miasto_num, $kino_id, $czas);
263         
264         if(!$filmy) {
265             return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy wyświelanych filmów.');
266         }
267         
268         $txt = '<b>Repertuar dla kina '.$kino_nazw.' ('.$miasto_nazw.') na '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')).':</b>';
269         if(empty($filmy)) {
270             $txt .= '<br />'."\n".'Brak projekcji.';
271         }
272         else
273         {
274             foreach($filmy as $film) {
275                 $txt .= '<br />'."\n".htmlspecialchars($film[0]).' '.htmlspecialchars($film[1]).($film[2]!='' ? ' ('.htmlspecialchars($film[2]).')' : '');
276             }
277         }
278         
279         return new BotMsg($txt);
280     }
281 }
282 ?>