From 3be0e41cd6654c4929ecf192df368f19e8a9ad59 Mon Sep 17 00:00:00 2001 From: Jacek Kowalski <Jacek@jacekk.info> Date: Fri, 13 Jul 2012 18:36:51 +0000 Subject: [PATCH] Przeportowanie modułu kino do nowej wersji API. --- modules/70_kino/init.php | 60 +++++ /dev/null | 285 ------------------------- modules/70_kino/handler.php | 282 +++++++++++++++++++++++++ 3 files changed, 342 insertions(+), 285 deletions(-) diff --git a/modules/70_kino.php b/modules/70_kino.php deleted file mode 100644 index da30538..0000000 --- a/modules/70_kino.php +++ /dev/null @@ -1,285 +0,0 @@ -<?php -class kino implements module { - static function register_cmd() { - return array( - 'kino' => 'cmd_kino', - 'kina' => 'cmd_kino', - 'k' => 'cmd_kino', - 'rep' => 'cmd_kino', - 'repertuar' => 'cmd_kino', - 'u' => 'cmd_ustaw', - 'ustaw' => 'cmd_ustaw', - ); - } - - static function help($cmd = NULL) { - if($cmd === NULL) { - GGapi::putRichText('kino ', TRUE); - GGapi::putRichText('miasto nazwa [kiedy]', FALSE, TRUE); - GGapi::putRichText("\n".' Repertuar kina '); - GGapi::putRichText('nazwa', FALSE, TRUE); - GGapi::putRichText("\n"); - GGapi::putRichText('ustaw ', TRUE); - GGapi::putRichText('miasto nazwa', FALSE, TRUE); - GGapi::putRichText("\n".' Ustawia domyślne kino '."\n\n"); - } - elseif(substr($cmd, 0, 1)=='u') { - GGapi::putRichText('ustaw ', TRUE); - GGapi::putRichText('miasto nazwa', FALSE, TRUE); - GGapi::putRichText("\n".' Ustawia domyślną lokalizację dla komendy kino na '); - GGapi::putRichText('[nazwa]', FALSE, TRUE); - GGapi::putRichText(' w mieście '); - GGapi::putRichText('[miasto]', FALSE, TRUE); - } - else - { - GGapi::putRichText('kino ', TRUE); - GGapi::putRichText('miasto nazwa [kiedy]', FALSE, TRUE); - GGapi::putRichText("\n".' Repertuar kina '); - GGapi::putRichText('nazwa', FALSE, TRUE); - GGapi::putRichText(' w mieście '); - GGapi::putRichText('miasto', FALSE, TRUE); - GGapi::putRichText(' na '); - GGapi::putRichText('[kiedy]', FALSE, TRUE); - GGapi::putRichText(' (dziś, jutro, pojutrze)'); - } - } - - static function cmd_ustaw($cmd, $arg) { - $arg = funcs::utfToAscii($arg); - - database::add($_GET['from'], 'kino', 'kino', $arg); - - if(empty($arg)) { - GGapi::putText('Usunięto domyślne kino. Aby otrzymać listę dostępnych obiektów wpisz:'."\n"); - GGapi::putRichText('kino', TRUE); - GGapi::putRichText(' Miasto', FALSE, TRUE); - } - else - { - GGapi::putText('Podane kino zostało zapisane jako domyślne. Sprawdź, czy jest poprawne wpisując:'."\n"); - GGapi::putRichText('kino', TRUE); - } - } - - static function cmd_kino($cmd, $arg) { - $arg = funcs::utfToAscii($arg); - if(empty($arg)) { - $arg = database::get($_GET['from'], 'kino', 'kino'); - if(empty($arg)) { - GGapi::putText('Podaj nazwę miejscowości i kina.'."\n\n"); - GGapi::putRichText('Przykłady', FALSE, FALSE, TRUE); - GGapi::putRichText("\n".'kino Kraków'."\n".'kino Kraków Multikino'); - return FALSE; - } - } - else - { - $arg2 = database::get($_GET['from'], 'kino', 'kino'); - } - - /* - MIASTO - */ - $miasta = self::getMiasta(); $found = FALSE; - - if(!$miasta) { - GGapi::putText('Przepraszamy, wystąpił bład przy pobieraniu listy miejscowości.'); - return FALSE; - } - - foreach($miasta as $miasto => $miasto_num) { - if(($pos = strpos($arg, funcs::utfToAscii($miasto))) !== FALSE) { - $found = $miasto_num; - $arg = trim(str_replace(' ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen(funcs::utfToAscii($miasto))))); - break; - } - } - - if($found===FALSE && !empty($arg2)) { - foreach($miasta as $miasto => $miasto_num) { - if(($pos = strpos($arg2, funcs::utfToAscii($miasto))) !== FALSE) { - $found = $miasto_num; - $arg2 = trim(str_replace(' ', ' ', substr($arg2, 0, $pos).substr($arg2, $pos+strlen(funcs::utfToAscii($miasto))))); - break; - } - } - } - - if($found === FALSE) { - $txt = 'Wybrane miasto nie został odnalezione. Dostępne miejscowości:'; - foreach($miasta as $miasto => $num) { - $txt .= "\n".$miasto; - } - GGapi::putText($txt); - return FALSE; - } - - - /* - KIEDY - */ - $tydzien = array('niedziela', 'poniedzialek', 'wtorek', 'sroda', 'czwartek', 'piatek', 'sobota'); - $data = array( - 'dzis' => '', - 'teraz' => '', - 'jutro' => '1', - 'pojutrze' => '2', - 'po jutrze' => '2', - ); - for($i=0; $i<3; $i++) { - $data[date('d.m', strtotime('+'.$i.' day'))] = ($i ? $i : ''); - $data[date('j.m', strtotime('+'.$i.' day'))] = ($i ? $i : ''); - } - - $czas = ''; - foreach($data as $known => $d) { - if(($pos = strpos($arg, $known))!==FALSE) { - $czas = $d; - $arg = trim(str_replace(' ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($known)))); - break; - } - } - - /* - KINO - */ - $kina = self::getKina($miasto_num, $czas); $found = FALSE; - - if(!$kina) { - GGapi::putText('Przepraszamy, wystąpił bład przy pobieraniu listy kin.'); - return FALSE; - } - - if(empty($kina)) { - GGapi::putText(($czas == '1' ? 'Jutro' : ($czas == '2' ? 'Pojutrze' : 'Dziś')).' żadne filmy nie są wyświetlane w podanym mieście.'."\n\n"); - GGapi::putRichText('Spróbuj też:', FALSE, FALSE, TRUE); - GGapi::putRichText("\n".'kino '.$miasto.' '.$kino.' '.($czas != '1' ? 'jutro' : ($czas != '2' ? 'pojutrze' : 'dziś')). - "\n".'kino '.$miasto.' '.$kino.' '.($czas != '' ? 'dziś' : ($czas != '2' ? 'pojutrze' : 'dziś'))); - return FALSE; - } - - if(!empty($arg)) { - foreach($kina as $kino => $kino_id) { - if(levenshtein(funcs::utfToAscii($kino), $arg, 1, 1, 0) < 2) { - $found = $kino_id; - break; - } - } - } - - if($found===FALSE && !empty($arg2)) { - foreach($kina as $kino => $kino_id) { - if(levenshtein(funcs::utfToAscii($kino), $arg2, 1, 1, 0) < 2) { - $found = $kino_id; - break; - } - } - } - - if($found === FALSE) { - $txt = (!empty($arg) ? 'Podany obiekt nie został znaleziony. ' : '').'Dostępne kina w pasujących miastach:'; - foreach($kina as $kino => $num) { - $txt .= "\n".$miasto.' '.$kino; - } - GGapi::putText($txt."\n\n"); - GGapi::putRichText('Przykład:', FALSE, FALSE, TRUE); - GGapi::putRichText("\n".'kino '.$miasto.' '.$kino.' '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś'))); - return FALSE; - } - - /* - REPERTUAR - */ - $filmy = self::getKino($miasto_num, $kino_id, $czas); - - if(!$filmy) { - GGapi::putText('Przepraszamy, wystąpił bład przy pobieraniu listy wyświelanych filmów.'); - return FALSE; - } - - GGapi::putRichText('Repertuar dla kina '.$kino.' ('.$miasto.') na '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')).':', TRUE); - if(empty($filmy)) { - GGapi::putRichText("\n".'Brak repertuaru'); - } - else - { - foreach($filmy as $film) { - $txt .= "\n".$film[0].' '.$film[1]; - } - } - GGapi::putRichText($txt); - } - - static function tidy($code) { - $tidy = new tidy; - $tidy->parseString($code, array( - 'add-xml-decl' => true, - 'output-xml' => true, - ), 'raw'); - $tidy->CleanRepair(); - return str_replace(array(' ', 'margin:="'), array(' ', 'margin="'), (string)$tidy); - } - - static function cache($url) { - $time = '+2 hour'; $dir = './data/kino/cache/'; - - if(file_exists($dir.md5($url))) { - $mtime = @filemtime($dir.md5($url)); - } - if($mtime && $mtime > strtotime('today '.$time) && $mtime < strtotime('tomorrow '.$time)) { - return file_get_contents($dir.md5($url)); - } - else - { - $dane = @file_get_contents($url); - if(!$dane) { - trigger_error('Nie udało się pobrać repertuaru kina, przepraszamy.', E_USER_ERROR); - } - $dane = self::tidy($dane); - file_put_contents($dir.md5($url), $dane); - return $dane; - } - } - - static function getMiasta() { - $return = array(); - $dane = @simplexml_load_string(self::cache('http://film.interia.pl/kino/repertuar')); - if(!$dane) return FALSE; - $dane = $dane->xpath('//div[@id=\'cities\']//a'); - foreach($dane as $miasto) { - $miasto['href'] = (string)$miasto['href']; - $return[str_replace(array("\r\n", "\r", "\n"), array(' ', ' ', ' '), (string)$miasto)] = substr($miasto['href'], strpos($miasto['href'], ',')+1); - } - - return $return; - } - - static function getKina($miasto, $kiedy='') { - $return = array(); - $dane = @simplexml_load_string(self::cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : ''))); - if(!$dane) return FALSE; - $dane = $dane->xpath('//div[@id=\'mainContent\']/table//th[@class=\'theatre\']/a[1]'); - if(!empty($dane)) { - foreach($dane as $kino) { - $return[str_replace(array("\r\n", "\r", "\n"), array(' ', ' ', ' '), (string)$kino)] = (string)$kino['name']; - } - } - return $return; - } - - static function getKino($miasto, $kino, $kiedy='') { - $return = array(); - $dane = @simplexml_load_string(self::cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : ''))); - if(!$dane) return FALSE; - $dane = $dane->xpath('//div[@id=\'mainContent\']/table//a[@name=\''.$kino.'\']/../../following-sibling::tr'); - if(!empty($dane)) { - foreach($dane as $film) { - if($film->th) break; - $return[] = array((string)$film->td[1], str_replace(array("\r\n", "\r", "\n"), array(' ', ' ', ' '), (string)$film->td[0]->a)); - } - } - return $return; - } -} -?> \ No newline at end of file diff --git a/modules/70_kino/handler.php b/modules/70_kino/handler.php new file mode 100644 index 0000000..93b5304 --- /dev/null +++ b/modules/70_kino/handler.php @@ -0,0 +1,282 @@ +<?php +class bot_kino_module implements BotModule { + function cache($url) { + $time = '+2 hour'; + $dir = './data/kino/cache/'; + + if(file_exists($dir.md5($url))) { + $mtime = @filemtime($dir.md5($url)); + } + + if($mtime && $mtime > strtotime('today '.$time) && $mtime < strtotime('tomorrow '.$time)) { + $dane = file_get_contents($dir.md5($url)); + } + else + { + $dane = @file_get_contents($url); + if(!$dane) { + return FALSE; + } + + file_put_contents($dir.md5($url), $dane); + } + + libxml_use_internal_errors(TRUE); + + $dom = new DOMDocument(); + if(!$dom->loadHTML($dane)) { + libxml_use_internal_errors(FALSE); + return FALSE; + } + + return $dom; + } + + function getMiasta() { + $xml = $this->cache('http://film.interia.pl/kino/repertuar'); + if(!$xml) return FALSE; + + $xpath = new DOMXPath($xml); + $dane = $xpath->query('//div[@id=\'cities\']//a'); + $return = array(); + + foreach($dane as $miasto) { + $href = $miasto->getAttribute('href'); + $data = trim($miasto->textContent); + $return[$data] = substr($href, strpos($href, ',')+1); + } + + return $return; + } + + function getKina($miasto, $kiedy='') { + $xml = $this->cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : '')); + if(!$xml) return FALSE; + + $xpath = new DOMXPath($xml); + $dane = $xpath->query('//div[@id=\'mainContent\']/table//th[@class=\'theatre\']/a[1]'); + $return = array(); + + foreach($dane as $kino) { + $name = trim($kino->textContent); + $return[$name] = $kino->getAttribute('name'); + } + + return $return; + } + + function getKino($miasto, $kino, $kiedy='') { + $xml = $this->cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : '')); + if(!$xml) return FALSE; + + $xpath = new DOMXPath($xml); + $dane = $xpath->query('//div[@id=\'mainContent\']/table//a[@name=\''.$kino.'\']/../../following-sibling::tr'); + $return = array(); + + foreach($dane as $film) { + if($film->firstChild && $film->firstChild->nodeName == 'th') break; + + $tds = $xpath->query('td', $film); + $name = $xpath->query('a[1]', $tds->item(0)); + + $more = array(); + $more_xml = $xpath->query('span[@class=\'reper\']/span', $tds->item(0)); + foreach($more_xml as $more_x) { + $more[] = $more_x->textContent; + } + + $return[] = array( + trim($tds->item(1)->textContent), + trim($name->item(0)->textContent), + implode(', ', $more), + ); + } + + return $return; + } + + function ustaw($msg, $params) { + $arg = funcs::utfToAscii($msg->args); + + if(empty($arg)) { + unset($msg->session->kino); + return new BotMsg('Ustawienie domyślnego kino zostało usunięte. Aby ponownie je ustawić, wpisz:<br />'."\n" + . 'ustaw <i>miasto kino</i>'); + } + else + { + $msg->session->kino = $arg; + 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.'); + } + } + + function handle($msg, $params) { + $arg = funcs::utfToAscii($msg->args); + + if(empty($arg)) { + $arg = $msg->session->kino; + if(empty($arg)) { + return new BotMsg('Podaj nazwę miejscowości i kina.<br />'."\n" + . '<br />'."\n" + . '<u>Przykłady:</u><br />'."\n" + . 'kino Kraków<br />'."\n" + . 'kino Kraków Multikino'); + } + } + else + { + $arg2 = $msg->session->kino; + } + + /* + MIASTO + */ + $miasta = self::getMiasta(); + $found = FALSE; + $miasto_num = $miasto_nazw = ''; + + if(!$miasta) { + return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy miejscowości.'); + } + + foreach($miasta as $miasto => $numer) { + $szukaj = funcs::utfToAscii($miasto); + if(($pos = strpos($arg, $szukaj)) !== FALSE) { + $found = TRUE; + $miasto_nazw = htmlspecialchars($miasto); + $miasto_num = $numer; + + $arg = trim(str_replace(' ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($szukaj)))); + break; + } + } + + if($found===FALSE && !empty($arg2)) { + foreach($miasta as $miasto => $numer) { + $szukaj = funcs::utfToAscii($miasto); + if(($pos = strpos($arg2, $szukaj)) !== FALSE) { + $found = TRUE; + $miasto_nazw = htmlspecialchars($miasto); + $miasto_num = $numer; + + $arg2 = trim(str_replace(' ', ' ', substr($arg2, 0, $pos).substr($arg2, $pos+strlen($szukaj)))); + break; + } + } + } + + if($found === FALSE) { + $txt = 'Wybrane miasto nie został odnalezione. Obsługiwane miejscowości:'; + foreach($miasta as $miasto => $num) { + $txt .= '<br />'."\n".htmlspecialchars($miasto); + } + $txt .= '<br />'."\n" + . '<br />'."\n" + . '<u>Przykład:</u><br />'."\n" + . 'kino '.htmlspecialchars($miasto); + return new BotMsg($txt); + } + + + /* + KIEDY + */ + $tydzien = array('niedziela', 'poniedzialek', 'wtorek', 'sroda', 'czwartek', 'piatek', 'sobota'); + $data = array( + 'dzis' => '', + 'teraz' => '', + 'jutro' => '1', + 'pojutrze' => '2', + 'po jutrze' => '2', + ); + for($i=0; $i<3; $i++) { + $data[date('d.m', strtotime('+'.$i.' day'))] = ($i ? $i : ''); + $data[date('j.m', strtotime('+'.$i.' day'))] = ($i ? $i : ''); + } + + $czas = ''; + foreach($data as $known => $d) { + if(($pos = strpos($arg, $known))!==FALSE) { + $czas = $d; + $arg = trim(str_replace(' ', ' ', substr($arg, 0, $pos).substr($arg, $pos+strlen($known)))); + break; + } + } + + /* + KINO + */ + $kina = self::getKina($miasto_num, $czas); + $found = FALSE; + $kino_num = $kino_nazw = ''; + + if(!$kina) { + return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy kin.'); + } + + if(empty($kina)) { + return new BotMsg(($czas == '1' ? 'Jutro' : ($czas == '2' ? 'Pojutrze' : 'Dziś')).' żadne filmy nie są wyświetlane w podanym mieście.<br />'."\n" + . '<br />'."\n" + . '<u>Spróbuj też:</u><br />'."\n" + . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != '1' ? 'jutro' : ($czas != '2' ? 'pojutrze' : 'dziś')).'<br />'."\n" + . 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != '' ? 'dziś' : ($czas != '2' ? 'pojutrze' : 'dziś'))); + } + + if(!empty($arg)) { + foreach($kina as $kino => $kino_id) { + if(levenshtein(funcs::utfToAscii($kino), $arg, 1, 1, 0) < 2) { + $found = TRUE; + $kino_num = $kino_id; + $kino_nazw = htmlspecialchars($kino); + break; + } + } + } + + if($found===FALSE && !empty($arg2)) { + foreach($kina as $kino => $kino_id) { + if(levenshtein(funcs::utfToAscii($kino), $arg2, 1, 1, 0) < 2) { + $found = TRUE; + $kino_num = $kino_id; + $kino_nazw = htmlspecialchars($kino); + break; + } + } + } + + if($found === FALSE) { + $txt = (!empty($arg) ? 'Podany obiekt nie został znaleziony. ' : '').'Dostępne kina w pasujących miastach:'; + foreach($kina as $kino => $num) { + $txt .= '<br />'."\n".$miasto_nazw.' '.htmlspecialchars($kino); + } + + return new BotMsg($txt.'<br />'."\n" + . '<br />'."\n" + . '<u>Przykład:</u><br />'."\n" + . 'kino '.$miasto_nazw.' '.htmlspecialchars($kino).' '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś'))); + } + + /* + REPERTUAR + */ + $filmy = self::getKino($miasto_num, $kino_id, $czas); + + if(!$filmy) { + return new BotMsg('Przepraszamy, wystąpił bład przy pobieraniu listy wyświelanych filmów.'); + } + + $txt = '<b>Repertuar dla kina '.$kino_nazw.' ('.$miasto_nazw.') na '.($czas == '1' ? 'jutro' : ($czas == '2' ? 'pojutrze' : 'dziś')).':</b>'; + if(empty($filmy)) { + $txt .= '<br />'."\n".'Brak projekcji.'; + } + else + { + foreach($filmy as $film) { + $txt .= '<br />'."\n".htmlspecialchars($film[0]).' '.htmlspecialchars($film[1]).($film[2]!='' ? ' ('.htmlspecialchars($film[2]).')' : ''); + } + } + + return new BotMsg($txt); + } +} +?> \ No newline at end of file diff --git a/modules/70_kino/init.php b/modules/70_kino/init.php new file mode 100644 index 0000000..9920f4e --- /dev/null +++ b/modules/70_kino/init.php @@ -0,0 +1,60 @@ +<?php +class bot_kino_init implements BotModuleInit { + function register() { + $handler_ustaw = array( + array( + 'file' => 'handler.php', + 'class' => 'bot_kino_module', + 'method' => 'ustaw', + ) + ); + $handler_kino = array( + array( + 'file' => 'handler.php', + 'class' => 'bot_kino_module', + 'method' => 'handle', + ) + ); + + return array( + 'kino' => $handler_kino, + 'kina' => $handler_kino, + 'k' => $handler_kino, + 'rep' => $handler_kino, + 'repertuar' => $handler_kino, + 'u' => $handler_ustaw, + 'ustaw' => $handler_ustaw, + ); + } + + function help($params = NULL) { + if($params === NULL) { + return new BotMsg('<b>kino</b> <i>miasto nazwa [kiedy]</i><br />'."\n" + . ' Repertuar kina.<br />'."\n" + . '<b>ustaw</b> <i>miasto nazwa</i><br />'."\n" + . ' Ustawia domyślne kino<br />'."\n" + . '<br />'."\n"); + } + elseif(substr($params, 0, 1)=='u') { + return new BotMsg('<b>ustaw</b> <i>[miasto] [nazwa]</i> (alias: <b>u</b>)<br />'."\n" + . ' Ustawia domyślne kino/miasto dla komendy kino. W przypadku niepodania argumentów kasuje uprzednio ustawione informacje. Komenda nie sprawdza, czy dane miasto jest obsługiwane - po ustawieniu danych należy wykonać komendę kino.<br />'."\n" + . '<br />'."\n" + . '<u>Przykład:</u><br />'."\n" + . 'ustaw Kraków<br />'."\n" + . 'ustaw Kraków Multikino'); + } + else + { + return new BotMsg('<b>kino</b> <i>miasto nazwa [kiedy]</i> (aliasy: <b>k, repertuar, rep</b>)<br />'."\n" + . ' Podaje repertuar kina <i>nazwa</i> w mieście <i>miasto</i> na <i>kiedy</i> (dziś, jutro, pojutrze). W przypadku pominięcia wszystkich argumentów, podawana jest lista obsługiwanych miast. Pominięcie nazwy skutkuje wylistowaniem kin w danym mieście. Domyślnie podawany jest repertuar na dziś. Jeśli brakuje któregoś argumentu, podejmowana jest próba zastąpienia go danymi zapisanymi za pomocą komendy <b>ustaw</b>.<br />'."\n" + . '<br />'."\n" + . '<u>Przykład:</u><br />'."\n" + . 'kino<br />'."\n" + . 'kino Kraków<br />'."\n" + . 'kino Kraków Multikino'); + } + } +} + +return 'bot_kino_init'; +?> \ No newline at end of file -- Gitblit v1.9.1