Jacek Kowalski
2012-07-09 a7346444c17770fea34d6653011029c291070c4c
commit | author | age
8bd4d9 1 <?php
JK 2 class kino implements module {
3     static function register_cmd() {
4         return array(
5             'kino' => 'cmd_kino',
6             'kina' => 'cmd_kino',
7             'k' => 'cmd_kino',
8             'rep' => 'cmd_kino',
9             'repertuar' => 'cmd_kino',
10             'u' => 'cmd_ustaw',
11             'ustaw' => 'cmd_ustaw',
12         );
13     }
14     
15     static function help($cmd = NULL) {
16         if($cmd === NULL) {
17             GGapi::putRichText('kino ', TRUE);
18             GGapi::putRichText('miasto nazwa [kiedy]', FALSE, TRUE);
19             GGapi::putRichText("\n".'   Repertuar kina ');
20             GGapi::putRichText('nazwa', FALSE, TRUE);
21             GGapi::putRichText("\n");
22             GGapi::putRichText('ustaw ', TRUE);
23             GGapi::putRichText('miasto nazwa', FALSE, TRUE);
24             GGapi::putRichText("\n".'   Ustawia domyślne kino '."\n\n");
25         }
26         elseif(substr($cmd, 0, 1)=='u') {
27             GGapi::putRichText('ustaw ', TRUE);
28             GGapi::putRichText('miasto nazwa', FALSE, TRUE);
29             GGapi::putRichText("\n".'   Ustawia domyślną lokalizację dla komendy kino na ');
30             GGapi::putRichText('[nazwa]', FALSE, TRUE);
31             GGapi::putRichText(' w mieście ');
32             GGapi::putRichText('[miasto]', FALSE, TRUE);
33         }
34         else
35         {
36             GGapi::putRichText('kino ', TRUE);
37             GGapi::putRichText('miasto nazwa [kiedy]', FALSE, TRUE);
38             GGapi::putRichText("\n".'   Repertuar kina ');
39             GGapi::putRichText('nazwa', FALSE, TRUE);
40             GGapi::putRichText(' w mieście ');
41             GGapi::putRichText('miasto', FALSE, TRUE);
42             GGapi::putRichText(' na ');
43             GGapi::putRichText('[kiedy]', FALSE, TRUE);
44             GGapi::putRichText(' (dziś, jutro, pojutrze)');
45         }
46     }
47     
48     static function cmd_ustaw($cmd, $arg) {
49         $arg = funcs::utfToAscii($arg);
50         
51         database::add($_GET['from'], 'kino', 'kino', $arg);
52         
53         if(empty($arg)) {
54             GGapi::putText('Usunięto domyślne kino. Aby otrzymać listę dostępnych obiektów wpisz:'."\n");
55             GGapi::putRichText('kino', TRUE);
56             GGapi::putRichText(' Miasto', FALSE, TRUE);
57         }
58         else
59         {
60             GGapi::putText('Podane kino zostało zapisane jako domyślne. Sprawdź, czy jest poprawne wpisując:'."\n");
61             GGapi::putRichText('kino', TRUE);
62         }
63     }
64     
65     static function cmd_kino($cmd, $arg) {
66         $arg = funcs::utfToAscii($arg);
67         if(empty($arg)) {
68             $arg = database::get($_GET['from'], 'kino', 'kino');
69             if(empty($arg)) {
70                 GGapi::putText('Podaj nazwę miejscowości i kina.'."\n\n");
71                 GGapi::putRichText('Przykłady', FALSE, FALSE, TRUE);
72                 GGapi::putRichText("\n".'kino Kraków'."\n".'kino Kraków Multikino');
73                 return FALSE;
74             }
75         }
76         else
77         {
78             $arg2 = database::get($_GET['from'], 'kino', 'kino');
79         }
80         
81         /*
82             MIASTO
83         */
84         $miasta = self::getMiasta(); $found = FALSE;
85         
86         if(!$miasta) {
87             GGapi::putText('Przepraszamy, wystąpił bład przy pobieraniu listy miejscowości.');
88             return FALSE;
89         }
90         
91         foreach($miasta as $miasto => $miasto_num) {
92             if(($pos = strpos($arg, funcs::utfToAscii($miasto))) !== FALSE) {
93                 $found = $miasto_num;
94                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen(funcs::utfToAscii($miasto)))));
95                 break;
96             }
97         }
98         
99         if($found===FALSE && !empty($arg2)) {
100             foreach($miasta as $miasto => $miasto_num) {
101                 if(($pos = strpos($arg2, funcs::utfToAscii($miasto))) !== FALSE) {
102                     $found = $miasto_num;
103                     $arg2 = trim(str_replace('  ', ' ', substr($arg2, 0, $pos).substr($arg2, $pos+strlen(funcs::utfToAscii($miasto)))));
104                     break;
105                 }
106             }
107         }
108         
109         if($found === FALSE) {
110             $txt = 'Wybrane miasto nie został odnalezione. Dostępne miejscowości:';
111             foreach($miasta as $miasto => $num) {
112                 $txt .= "\n".$miasto;
113             }
114             GGapi::putText($txt);
115             return FALSE;
116         }
117         
118         
119         /*
120             KIEDY
121         */
122         $tydzien = array('niedziela', 'poniedzialek', 'wtorek', 'sroda', 'czwartek', 'piatek', 'sobota');
123         $data = array(
124             'dzis' => '',
125             'teraz' => '',
126             'jutro' => '1',
127             'pojutrze' => '2',
128             'po jutrze' => '2',
129         );
130         for($i=0; $i<3; $i++) {
131             $data[date('d.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
132             $data[date('j.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
133         }
134         
135         $czas = '';
136         foreach($data as $known => $d) {
137             if(($pos = strpos($arg, $known))!==FALSE) {
138                 $czas = $d;
139                 $arg = trim(str_replace('  ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($known))));
140                 break;
141             }
142         }
143         
144         /*
145             KINO
146         */
147         $kina = self::getKina($miasto_num, $czas); $found = FALSE;
148         
149         if(!$kina) {
150             GGapi::putText('Przepraszamy, wystąpił bład przy pobieraniu listy kin.');
151             return FALSE;
152         }
153         
154         if(empty($kina)) {
155             GGapi::putText(($czas == '1' ? 'Jutro' : ($czas == '2' ? 'Pojutrze' : 'Dziś')).' żadne filmy nie są wyświetlane w podanym mieście.'."\n\n");
156             GGapi::putRichText('Spróbuj też:', FALSE, FALSE, TRUE);
157             GGapi::putRichText("\n".'kino '.$miasto.' '.$kino.' '.($czas != '1' ? 'jutro' : ($czas != '2' ? 'pojutrze' : 'dziś')).
158                     "\n".'kino '.$miasto.' '.$kino.' '.($czas != '' ? 'dziś' : ($czas != '2' ? 'pojutrze' : 'dziś')));
159             return FALSE;
160         }
161         
162         if(!empty($arg)) {
163             foreach($kina as $kino => $kino_id) {
164                 if(levenshtein(funcs::utfToAscii($kino), $arg, 1, 1, 0) < 2) {
165                     $found = $kino_id;
166                     break;
167                 }
168             }
169         }
170         
171         if($found===FALSE && !empty($arg2)) {
172             foreach($kina as $kino => $kino_id) {
173                 if(levenshtein(funcs::utfToAscii($kino), $arg2, 1, 1, 0) < 2) {
174                     $found = $kino_id;
175                     break;
176                 }
177             }
178         }
179         
180         if($found === FALSE) {
181             $txt = (!empty($arg) ? 'Podany obiekt nie został znaleziony. ' : '').'Dostępne kina w pasujących miastach:';
182             foreach($kina as $kino => $num) {
183                 $txt .= "\n".$miasto.' '.$kino;
184             }
185             GGapi::putText($txt."\n\n");
186             GGapi::putRichText('Przykład:', FALSE, FALSE, TRUE);
187             GGapi::putRichText("\n".'kino '.$miasto.' '.$kino.' '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')));
188             return FALSE;
189         }
190         
191         /*
192             REPERTUAR
193         */
194         $filmy = self::getKino($miasto_num, $kino_id, $czas);
195         
196         if(!$filmy) {
197             GGapi::putText('Przepraszamy, wystąpił bład przy pobieraniu listy wyświelanych filmów.');
198             return FALSE;
199         }
200         
201         GGapi::putRichText('Repertuar dla kina '.$kino.' ('.$miasto.') na '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')).':', TRUE);
202         if(empty($filmy)) {
203             GGapi::putRichText("\n".'Brak repertuaru');
204         }
205         else
206         {
207             foreach($filmy as $film) {
208                 $txt .= "\n".$film[0].' '.$film[1];
209             }
210         }
211         GGapi::putRichText($txt);
212     }
213     
214     static function tidy($code) {
215         $tidy = new tidy;
216         $tidy->parseString($code, array(
217             'add-xml-decl'    => true,
218             'output-xml'    => true,
219         ), 'raw');
220         $tidy->CleanRepair();
221         return str_replace(array('&nbsp;', 'margin:="'), array(' ', 'margin="'), (string)$tidy);
222     }
223     
224     static function cache($url) {
225         $time = '+2 hour'; $dir = './data/kino/cache/';
226         
227         if(file_exists($dir.md5($url))) {
228             $mtime = @filemtime($dir.md5($url));
229         }
230         if($mtime && $mtime > strtotime('today '.$time) && $mtime < strtotime('tomorrow '.$time)) {
231             return file_get_contents($dir.md5($url));
232         }
233         else
234         {
235             $dane = @file_get_contents($url);
236             if(!$dane) {
237                 trigger_error('Nie udało się pobrać repertuaru kina, przepraszamy.', E_USER_ERROR);
238             }
239             $dane = self::tidy($dane);
240             file_put_contents($dir.md5($url), $dane);
241             return $dane;
242         }
243     }
244     
245     static function getMiasta() {
246         $return = array();
247         $dane = @simplexml_load_string(self::cache('http://film.interia.pl/kino/repertuar'));
248         if(!$dane) return FALSE;
249         $dane = $dane->xpath('//div[@id=\'cities\']//a');
250         foreach($dane as $miasto) {
251             $miasto['href'] = (string)$miasto['href'];
252             $return[str_replace(array("\r\n", "\r", "\n"), array(' ', ' ', ' '), (string)$miasto)] = substr($miasto['href'], strpos($miasto['href'], ',')+1);
253         }
254         
255         return $return;
256     }
257     
258     static function getKina($miasto, $kiedy='') {
259         $return = array();
260         $dane = @simplexml_load_string(self::cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : '')));
261         if(!$dane) return FALSE;
262         $dane = $dane->xpath('//div[@id=\'mainContent\']/table//th[@class=\'theatre\']/a[1]');
263         if(!empty($dane)) {
264             foreach($dane as $kino) {
265                 $return[str_replace(array("\r\n", "\r", "\n"), array(' ', ' ', ' '), (string)$kino)] = (string)$kino['name'];
266             }
267         }
268         return $return;
269     }
270     
271     static function getKino($miasto, $kino, $kiedy='') {
272         $return = array();
273         $dane = @simplexml_load_string(self::cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : '')));
274         if(!$dane) return FALSE;
275         $dane = $dane->xpath('//div[@id=\'mainContent\']/table//a[@name=\''.$kino.'\']/../../following-sibling::tr');
276         if(!empty($dane)) {
277             foreach($dane as $film) {
278                 if($film->th) break;
279                 $return[] = array((string)$film->td[1], str_replace(array("\r\n", "\r", "\n"), array(' ', ' ', ' '), (string)$film->td[0]->a));
280             }
281         }
282         return $return;
283     }
284 }
285 ?>