From 9f47c0fd4f94f45ce02c8c67ae59f5fc74f8ad9e Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Sat, 13 Feb 2016 01:05:20 +0000
Subject: [PATCH] [mod_pogoda] Poprawka błędnego wyświetlania danych w komendzie miasto

---
 modules/70_kino/handler.php |  134 +++++++++++++++++++++++---------------------
 1 files changed, 71 insertions(+), 63 deletions(-)

diff --git a/modules/70_kino/handler.php b/modules/70_kino/handler.php
index 93b5304..af9e6eb 100644
--- a/modules/70_kino/handler.php
+++ b/modules/70_kino/handler.php
@@ -1,94 +1,88 @@
 <?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);
-		}
+		$down = new DownloadHelper($url);
+		$dane = $down->exec();
 		
 		libxml_use_internal_errors(TRUE);
 		
 		$dom = new DOMDocument();
 		if(!$dom->loadHTML($dane)) {
 			libxml_use_internal_errors(FALSE);
+			$down->cacheFor(1800);
 			return FALSE;
 		}
+		
+		$down->cacheUntil(strtotime('tomorrow midnight'));
 		
 		return $dom;
 	}
 	
 	function getMiasta() {
-		$xml = $this->cache('http://film.interia.pl/kino/repertuar');
+		$xml = $this->cache('http://film.interia.pl/repertuar-kin');
 		if(!$xml) return FALSE;
 		
 		$xpath = new DOMXPath($xml);
-		$dane = $xpath->query('//div[@id=\'cities\']//a');
+		$dane = $xpath->query('//a[contains(@class, "showtimes-city")]');
 		$return = array();
 		
 		foreach($dane as $miasto) {
 			$href = $miasto->getAttribute('href');
 			$data = trim($miasto->textContent);
-			$return[$data] = substr($href, strpos($href, ',')+1);
+			$return[$data] = substr($href, strrpos($href, ',')+1);
 		}
 		
 		return $return;
 	}
 	
 	function getKina($miasto, $kiedy='') {
-		$xml = $this->cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : ''));
+		$xml = $this->cache('http://film.interia.pl/repertuar-kin/miasto-a,cId,'.$miasto.($kiedy ? ',when,'.$kiedy : ''));
 		if(!$xml) return FALSE;
 		
 		$xpath = new DOMXPath($xml);
-		$dane = $xpath->query('//div[@id=\'mainContent\']/table//th[@class=\'theatre\']/a[1]');
+		$dane = $xpath->query('//div[@id="content"]//div[@class="showtimes-accordion-heading"]//p[@class="showtimes-cinema-name"]');
 		$return = array();
 		
-		foreach($dane as $kino) {
+		foreach($dane as $id => $kino) {
 			$name = trim($kino->textContent);
-			$return[$name] = $kino->getAttribute('name');
+			$return[$name] = $id;
 		}
 		
 		return $return;
 	}
 	
 	function getKino($miasto, $kino, $kiedy='') {
-		$xml = $this->cache('http://film.interia.pl/kino/repertuar//kina,'.$miasto.($kiedy ? ','.$kiedy : ''));
+		$xml = $this->cache('http://film.interia.pl/repertuar-kin/miasto-a,cId,'.$miasto.($kiedy ? ',when,'.$kiedy : ''));
 		if(!$xml) return FALSE;
 		
 		$xpath = new DOMXPath($xml);
-		$dane = $xpath->query('//div[@id=\'mainContent\']/table//a[@name=\''.$kino.'\']/../../following-sibling::tr');
+		$dane = $xpath->query('//div[@id=\'content\']//div[@class=\'showtimes-accordion-body\']');
 		$return = array();
 		
+		$dane = $xpath->query('.//div[@class=\'showtimes-cinema-movie\']', $dane[$kino]);
+		
 		foreach($dane as $film) {
-			if($film->firstChild && $film->firstChild->nodeName == 'th') break;
+			$title = $xpath->query('.//span[@class=\'showtimes-cinema-movie-title\']', $film);
+			$hours = $xpath->query('.//span[@data-time]', $film);
 			
-			$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;
+			$hours_ret = array();
+			foreach($hours as $hour) {
+				$sub = array();
+				if($xpath->query('.//span[@showtimes-cinema-movie-dubbing]', $hour)) {
+					$sub[] = 'DUB';
+				}
+				if($xpath->query('.//span[@showtimes-cinema-movie-3d]', $hour)) {
+					$sub[] = '3D';
+				}
+				
+				$hour = $hour->getAttribute('data-time');
+				
+				$hours_ret[] = array(substr($hour, 0, -2).':'.substr($hour, -2), $sub);
 			}
 			
 			$return[] = array(
-				trim($tds->item(1)->textContent),
-				trim($name->item(0)->textContent),
-				implode(', ', $more),
+				trim($title->item(0)->textContent),
+				$hours_ret
 			);
 		}
 		
@@ -97,6 +91,7 @@
 	
 	function ustaw($msg, $params) {
 		$arg = funcs::utfToAscii($msg->args);
+		$msg->session->setClass('kino');
 		
 		if(empty($arg)) {
 			unset($msg->session->kino);
@@ -112,6 +107,7 @@
 	
 	function handle($msg, $params) {
 		$arg = funcs::utfToAscii($msg->args);
+		$msg->session->setClass('kino');
 		
 		if(empty($arg)) {
 			$arg = $msg->session->kino;
@@ -132,7 +128,6 @@
 			MIASTO
 		*/
 		$miasta = self::getMiasta();
-		$found = FALSE;
 		$miasto_num = $miasto_nazw = '';
 		
 		if(!$miasta) {
@@ -142,7 +137,6 @@
 		foreach($miasta as $miasto => $numer) {
 			$szukaj = funcs::utfToAscii($miasto);
 			if(($pos = strpos($arg, $szukaj)) !== FALSE) {
-				$found = TRUE;
 				$miasto_nazw = htmlspecialchars($miasto);
 				$miasto_num = $numer;
 				
@@ -151,11 +145,10 @@
 			}
 		}
 		
-		if($found===FALSE && !empty($arg2)) {
+		if($miasto_num === '' && !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;
 					
@@ -165,8 +158,9 @@
 			}
 		}
 		
-		if($found === FALSE) {
+		if($miasto_num === '') {
 			$txt = 'Wybrane miasto nie został odnalezione. Obsługiwane miejscowości:';
+			$miasto = 'Warszawa';
 			foreach($miasta as $miasto => $num) {
 				$txt .= '<br />'."\n".htmlspecialchars($miasto);
 			}
@@ -185,14 +179,19 @@
 		$data = array(
 			'dzis' => '',
 			'teraz' => '',
-			'jutro' => '1',
-			'pojutrze' => '2',
-			'po jutrze' => '2',
+			'jutro' => 'jutro',
+			'pojutrze' => 'pojutrze',
+			'po jutrze' => 'pojutrze',
 		);
-		for($i=0; $i<3; $i++) {
-			$data[date('d.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
-			$data[date('j.m', strtotime('+'.$i.' day'))] = ($i ? $i : '');
-		}
+		$data[date('d.m')] = '';
+		$data[date('j.m')] = '';
+		$data[$tydzien[date('w')]] = '';
+		$data[date('d.m', strtotime('+1 day'))] = 'jutro';
+		$data[date('j.m', strtotime('+1 day'))] = 'jutro';
+		$data[$tydzien[date('w', strtotime('+1 day'))]] = 'jutro';
+		$data[date('d.m', strtotime('+2 day'))] = 'pojutrze';
+		$data[date('j.m', strtotime('+2 day'))] = 'pojutrze';
+		$data[$tydzien[date('w', strtotime('+2 day'))]] = 'pojutrze';
 		
 		$czas = '';
 		foreach($data as $known => $d) {
@@ -207,25 +206,29 @@
 			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.');
+			$txt = 'Brak seansów w tym mieście w wybranym dniu.';
+			$txt .= '<br />'."\n"
+				. '<br />'."\n"
+				. '<u>Spróbuj też:</u><br />'."\n"
+				. 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != 'dzis' ? 'jutro' : ($czas != '2' ? 'pojutrze' : 'dziś')).'<br />'."\n"
+				. 'kino '.$miasto_nazw.' '.htmlspecialchars($arg).' '.($czas != '' ? 'dziś' : ($czas != '2' ? 'pojutrze' : 'dziś'));
+			return new BotMsg($txt);
 		}
 		
 		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"
+			return new BotMsg(($czas == '' ? 'Dziś' : ucfirst($czas)).' ż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 != 'dzis' ? '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;
@@ -233,10 +236,9 @@
 			}
 		}
 		
-		if($found===FALSE && !empty($arg2)) {
+		if($kino_num === '' && !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;
@@ -244,8 +246,9 @@
 			}
 		}
 		
-		if($found === FALSE) {
+		if($kino_num === '') {
 			$txt = (!empty($arg) ? 'Podany obiekt nie został znaleziony. ' : '').'Dostępne kina w pasujących miastach:';
+			$kino = '';
 			foreach($kina as $kino => $num) {
 				$txt .= '<br />'."\n".$miasto_nazw.' '.htmlspecialchars($kino);
 			}
@@ -253,26 +256,31 @@
 			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ś')));
+				. 'kino '.$miasto_nazw.' '.htmlspecialchars($kino).' '.($czas == '' ? 'dziś' : $czas));
 		}
 		
 		/*
 			REPERTUAR
 		*/
-		$filmy = self::getKino($miasto_num, $kino_id, $czas);
+		$filmy = self::getKino($miasto_num, $kino_num, $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>';
+		$txt = '<b>Repertuar dla kina '.$kino_nazw.' ('.$miasto_nazw.') na '.($czas == '' ? 'dziś' : $czas).':</b><br />'."\n";
 		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]).')' : '');
+				$txt .= '<br />'."\n".htmlspecialchars($film[0]).'<br />'."\n";
+				$info = array();
+				foreach($film[1] as $dane) {
+					$info[] = '<b>'.$dane[0].'</b>'.($dane[1] ? ' ('.implode(', ', $dane[1]).')' : '');
+				}
+				$txt .= implode(', ', $info)."\n".'<br />';
 			}
 		}
 		

--
Gitblit v1.9.1