<?php
/**************************************************
 *              Wyniki losowań Lotto              *
 **************************************************
 * Ostatnia modyfikacja: 02.11.2014 (wersja 3.2)  *
 * Autor: Jacek Kowalski (http://jacekk.info)     *
 *                                                *
 * Strona WWW: http://jacekk.info/scripts/lotto   *
 *                                                *
 * Utwór udostępniany na licencji                 *
 * http://creativecommons.org/licenses/by-nc/2.5/ *
 **************************************************/

/* Kodowanie znaków UTF-8 */

class lotto {
	// Zawartość strony http://lotto.pl/wyniki-gier
	// jako obiekt DOMDocument
	protected $strona = NULL;
	// Powiązany DOMXPath
	protected $xpath = NULL;
	
	// Specjalne zachowania dla gier
	const NONE = 0;
	const PLUS = 1;
	const LOTTOPLUS = 2;
	const EKSTRA = 3;
	
	// Lista gier.
	protected $gry = array(
		// nazwa
		'lotto', 'mini-lotto',
		'kaskada', 'multi-multi',
		'joker', 'ekstra-pensja'
	);
	
	// Spróbuj pobrać stronę http://lotto.pl/wyniki-gier
	// do zmiennej $this->strona z użyciem pliku cache.
	function __construct() {
		$cache = 'lotto_cache.txt';
		
		// Sprawdź, czy da się skorzystać z pliku cache.
		if( ( !file_exists($cache) AND !is_writable(dirname($cache)) )
			OR ( file_exists($cache) AND !(is_writable($cache)) ) ) {
			// Nie, nie da się.
			$cache = '';
		}
		else
		{
			// Tak, da się.
			// Sprawdź, czy dane są aktualne.
			if(@filemtime($cache)<strtotime('yesterday 22:45') && time()<=strtotime('14:30')) {
				$recent = FALSE;
			}
			elseif( ( time()>=strtotime('14:30') && @filemtime($cache)<strtotime('14:30') )
				OR ( time()>=strtotime('22:45') && @filemtime($cache)<strtotime('22:45') ) ) {
				$recent = FALSE;
			}
			else
			{
				$recent = TRUE;
			}
		}
		
		$strona = '';
		$this->strona = new DOMDocument();
		
		if($cache == '' OR !$recent) {
			// Dane są nieaktualne, więc pobieramy je ponownie
			$strona = @file_get_contents('http://lotto.pl/wyniki-gier');
			if(!$strona) {
				throw new Exception('Nie udało się pobrać wyników.');
			}
			
			// Można zapisać do cache'a...
			if($cache != '') {
				// ...więc zapamiętujemy arkusz.
				file_put_contents($cache, $strona);
			}
			
			@$this->strona->loadHtml($strona);
		}
		else
		{
			// Dane w cache są aktualne, więc załaduj je.
			@$this->strona->loadHtmlFile($cache);
		}
		
		$this->xpath = new DOMXPath($this->strona);
	}
	
	// Znajduje odpowiedni element w pliku HTML lub zwraca błąd.
	protected function wytnij($zapytanie, $gdzie = NULL, $blad = 'Brak danych') {
		$rezultat = $this->xpath->query($zapytanie, $gdzie);
		if(!$rezultat OR $rezultat->length <= 0) {
			throw new Exception($blad);
		}
		return $rezultat;
	}
	
	// Zwraca wynik gry (domyślnie lotto).
	function wynik($gra = 'lotto') {
		$wyniki = $this->wyniki($gra, 1);
		if(!isset($wyniki[0])) {
			throw new Exception('Brak wyników dla gry.');
		}
		return $wyniki[0];
	}
	
	// Zwraca $liczba ostatnich wyników gry (domyślnie lotto),
	// jednak nie więcej niż 5 (tyle jest na stronie Totalizatora).
	function wyniki($gra = 'lotto', $zwroc = 1000) {
		if(!in_array($gra, $this->gry)) {
			throw new Exception('Podana gra liczbowa nie jest obsługiwana.');
		}
		
		$rezultaty = array();
		
		$dane = $this->wytnij('//div[@class="start-wyniki_'.$gra.'"]', NULL,
			'Nie znaleziono na stronie wyników dla gry '.$gra);
		$dane = $dane->item(0);
		
		
		$daty = $this->wytnij('div[contains(concat(" ", @class, " "), " wyniki_data ")]', $dane,
			'Nie znaleziono informacji o losowanu gry '.$gra);
		$wyniki = $this->wytnij('div[contains(concat(" ", @class, " "), " glowna_wyniki_'.$gra.' ")]', $dane,
			'Nie znaleziono wyników losowania gry '.$gra);
		
		$plusy = NULL;
		try {
			$plusy = $this->wytnij('div[@class="wynik_'.$gra.'_plus"]', $dane);
		} catch(Exception $e) {}
		
		$lottoplusy = NULL;
		try {
			$lottoplusy = $this->wytnij('//div[@class="glowna_wyniki_'.$gra.'plus"]', $dane);
		} catch(Exception $e) {}
		
		for($l = 0; $l < $daty->length && $l < $wyniki->length && $l < $zwroc; $l++) {
			$rezultat = array();
			
			// Znajdź $l-tą datę losowania i jego wynik
			$data = $daty->item($l);
			$wynik = $wyniki->item($l);
			
			try {
				// Znajdź datę i godzinę
				$data = $this->wytnij('strong', $data, 'Nie znaleziono '.$l.' daty losowania gry '.$gra);
				$rezultat['data'] = trim($data->item(0)->textContent);
				if($data->length > 1) {
					$rezultat['godzina'] = trim($data->item(1)->textContent);
				}
				
				// Znajdź poszczególne liczby w wyniku
				$liczby = $this->wytnij('div[@class="wynik_'.$gra.'"]', $wynik,
					'Nie znaleziono liczb w '.$l.' losowaniu gry '.$gra);
				$rezultat['liczby'] = array();
				foreach($liczby as $liczba) {
					$rezultat['liczby'][] = trim($liczba->textContent);
				}
			} catch(Exception $e) {
				break;
			}
			
			try {
				// Szukamy plusa
				if($plusy && $plusy->length > $l) {
					$rezultat['plus'] = trim($plusy->item($l)->textContent);
				}
			} catch(Exception $e) {}
			
			try {
				// Szukamy ekstra liczby
				$ekstra = $this->wytnij('div[@class="wynik_'.strtr($gra, '-', '_').'"]', $wynik,
					'Nie znaleziono ekstra w '.$l.' losowaniu gry '.$gra);
				$rezultat['ekstra'] = trim($ekstra->item(0)->textContent);
			} catch(Exception $e) {}
			
			try {
				// Szukamy lottoplusa
				if($lottoplusy && $lottoplusy->length > $l) {
					$liczby = $this->wytnij('div[@class="wynik_'.$gra.'plus"]', $lottoplusy->item($l),
						'Nie znaleziono liczb w '.$l.' losowaniu gry '.$gra.'plus');
					$rezultat['plus'] = array();
					foreach($liczby as $liczba) {
						$rezultat['plus'][] = trim($liczba->textContent);
					}
				}
			} catch(Exception $e) {}
			
			$rezultaty[] = $rezultat;
		}
		
		return $rezultaty;
	}
}

try {
	$lotto = new lotto();
	
	echo '<h3>Wyniki gier liczbowych</h3>'."\n\n";
	
	$mm = $lotto->wyniki('multi-multi', 2); // Wyniki co najwyżej dwóch ostatnich losowań
	
	if(isset($mm[0])) {
		// $mm[0] - wyniki pierwszego losowania (jeśli istnieją)
		echo '<p>Wyniki losowania Multi Multi z <strong>'.$mm[0]['data'].' '.$mm[0]['godzina'].'</strong><br />'."\n"
			.'<strong>'.implode(', ', $mm[0]['liczby']).'</strong><br />'."\n"
			.'Plus: <strong>'.$mm[0]['plus'].'</strong></p>'."\n\n";
	}
	
	if(isset($mm[1])) {
		// $mm[1] - wyniki drugiego losowania (jeśli istnieją)
		echo '<p>Wyniki losowania Multi Multi z <strong>'.$mm[1]['data'].' '.$mm[1]['godzina'].'</strong><br />'."\n"
			.'<strong>'.implode(', ', $mm[1]['liczby']).'</strong><br />'."\n"
			.'Plus: <strong>'.$mm[1]['plus'].'</strong></p>'."\n\n";
	}
	
	// Wyniki Lotto (wcześniej Duży Lotek)
	$dl = $lotto->wynik('lotto');
	
	echo '<p>Wyniki losowania Lotto z dnia <strong>'.$dl['data'].'</strong><br />'."\n"
		.'<strong>'.implode(', ', $dl['liczby']).'</strong></p>'."\n\n";
	
	if(isset($dl['plus']) && is_array($dl['plus'])) {
		echo '<p>Wyniki losowania Lotto Plus z dnia <strong>'.$dl['data'].'</strong><br />'."\n"
			.'<strong>'.implode(', ', $dl['plus']).'</strong></p>'."\n\n";
	}
	
	echo '<hr />'."\n\n".'<p>Skrypt wyników z <a href="http://jacekk.info/">http://jacekk.info</a></p>';
}
catch(Exception $e) {
	// Coś się nie powiodło - pokaż błąd.
	echo $e->getMessage();
}
