<?php
// Spouštěcí soubor
// BOT 3 IRIDIUM
// V 3.2

/////////////////////////////////////////////////////////
// Licenční ujednání
/////////////////////////////////////////////////////////
/*
Stažením a jakýmkoliv využitím tohoto skriptu souhlasí uživatel s následujícími podmínkami:
- zdrojový kód je možné jakkoliv modifikovat a využívat pro provoz na portálu xchat.cz společnosti Centrum Holding pro osobní potřebu a vsouladu s podmínkami využívání portálu Centrum Holding
- tento skript není dovoleno využívat k jakýmkoliv komerčním účelům
- zdrojový kód a kód z tohoto vycházející ani jakoukoliv jeho část není dovoleno šířit bez písemného souhlasu autora skriptu
- tento skript není dovoleno využívat mimo portál xchat.cz
- autor skriptu nenese žádnou odpovědnost za jakékoliv škody vzniklé jeho používáním

Uživatel využiváním tohoto skriptu dává souhlas s těmito podmínkami a je si vědom případných právních důsledků při jejich hrubém porušení.

© Medabeedaa, medabeedaa@beedoo.net, h00ked, h00ked@xchat.cz
*/

$modver[1] = 32;

/////////////////////////////////////////////////////////
// Inicializace modulu a hlavnich promennych
/////////////////////////////////////////////////////////
include("corevar.php");
if($forcexpath) $xpath = ".";
else {
    $filename = explode("/",$_SERVER['PHP_SELF']);
    $xpath = str_replace($filename[count($filename)-1],"",$_SERVER["SCRIPT_FILENAME"]);
}
include($xpath."/cfgs/const_cfg.php");

if(isset($_GET["browser"])){
	function display($what,$force=false){
		if($force) echo $what;
		else echo "&gt;&gt; BOT: ".$what."<br />";
		flush();
	}
}
else{
	function display($what,$force=false){
		;
	}
}

// $DEBUGMODE = true;

if(isset($DEBUGMODE)){
    function displaydebug($what){
		echo "&gt;&gt; DBG".$what."<br />";
		flush();
    }
}
else{
    function displaydebug($what){
	;
    }
}

include($xpath."/modules/core.php");

$time_start = time();
$environ = new EnvironManager;
$environ->EnvironInit();

set_error_handler("my_warning_handler",2);

if($modver[1] <> $modver[3]){
    $environ->AddError("C_E106");
    display("Varování - Core.php a run.php jsou na jiné verzi - možná nekompatibilita");
}

include($xpath."/modules/base.php");
include($xpath."/cfgs/users.php");
include($xpath."/cfgs/lists.php");

$finaldata["masterlines"] = 0;

display("Toto je ".$environ->GetVar("hits").". běh bota, úroveň běhu ".$environ->GetVar("runlevel")." při aktivitě ".round($environ->GetVar("oldmasterlines")/10,1)." řádek za běh !");

foreach($modules as $module => $minlevel){
    if($minlevel > $environ->GetVar("runlevel")) continue;
    include($environ->GetBaseVar("xpath")."/modules/".$module.".php");
}

if(!isset($modules_pre)) $modules_pre[] = "defmodul_pre";
if(!isset($modules_preglass)) $modules_preglass[] = "defmodul_pre";
if(!isset($modules_glass)) $modules_glass[] = "defmodul_lines";
if(!isset($modules_whisper)) $modules_whisper[] = "defmodul_lines";
if(!isset($modules_system)) $modules_system[] = "defmodul_lines";
if(!isset($modules_postglass)) $modules_postglass[] = "defmodul_pre";
if(!isset($modules_post)) $modules_post[] = "defmodul_pre";

/////////////////////////////////////////////////////////
// Beh bota
/////////////////////////////////////////////////////////

// Moduly před vstupem do mísntosti

foreach($modules_pre as $modul){
	$return = $modul($environ);
	if($return) break;
}

$timeleft = $environ->GetBaseVar("refreshrate") - time() +  $time_start;
$shouldsleep = 0;

$roundtrips = 0;
while($timeleft > 10){
	// Čekání na další refresh
	sleeper($shouldsleep,true);
	$roundtrips ++;

	// Hlavní proměnné pro práci se sklem
	$lines[0] = "";
	$n_messages = -1;
	$tospeak[0]="";
	$n_tospeak = -1;
	$last_tospeak = -1;
	$addspeak = 0;
	$time_cyclestart = time();
	$firstrun = 0;

	// MOduly před načtením skla
	foreach($modules_preglass as $modul){
		$return = $modul($environ);
		if($return) break;
	}

	// Vstup do místnosti / login

	$room = "";
	$logged = false;
	for($i=1;$i <= 3;$i++){
		if(enter_room($environ,$room,0) === true){
		    $firstrun = 1;
		    login($environ);
		    continue;
		}
		displaydebug("ENTER");
		if(strpos($room,'xchat.centrum.cz/'.$environ->GetVar("xhash").'/modchat?op=roomtopng&rid='.$environ->GetBaseVar("loginroom")) === false) {
			if(preg_match('/kicking_nick=%20([a-zA-Z._0-9\-]{3,20})/',$room,$kicker)){	
				$firstrun = -1;
				if((strpos($room,'key=419') !== false) && (strpos($room,'key=419') < strpos($room,'text='))){
				    $logged = false;
				    $environ->AddError("C_E112 ".$kicker[1]);
				    break;
				}
				sleeper(2,false);
				enter_room($environ,$room,1);
				$oldkicker = $environ->GetVar("kicker");
				$environ->GetVar("kicker",$kicker[1]);
				if($kicker[1] == "45") continue;
				if(strtolower($kicker[1]) == $GLOBALS["cfg"]["hyperadmin"]) continue;
				if(($kick_report > 0) && ($kicker[1] <> $oldkicker)){
					foreach($admins as $admin){
						if(is_online($admin)){
							$GLOBALS["tospeak"][$GLOBALS["addspeak"]++] = "/";
							$GLOBALS["n_tospeak"]++;
							$GLOBALS["tospeak"][$GLOBALS["addspeak"]++] = "/m ".$admin." "."Ahoj, byl jsem vyhozen uživatelem ".$kicker[1]." z místnosti ".$environ->GetBaseVar("room_name")." - ".$environ->GetBaseVar("loginroom")." Prosím pomoc, infoBOT !";
							$GLOBALS["n_tospeak"]++;
							display("Upozorňuji ".$admin);
							if($kick_report < 3){
								break;
							}
						}
					}
					if($kick_report % 2 == 0){
							report("Byl jsem vyhozen uživatelem ".$kicker[1]." z místnosti ".$environ->GetBaseVar("room_name")." - ".$environ->GetBaseVar("loginroom"));
					}
				}
				$logged = true;
				break;
			}
			else{
				$firstrun = 1;
				login($environ);
				enter_room($environ,$room,1);
			}
		}
		else{
			$logged = true;
			break;
		}
		sleep(2);
	}
	
	if(!$logged){
		$environ->AddError("C_E107");
		$environ->GetVar("suspendtime",time()+600);
		$environ->SaveAndQuit($finaldata);
		die();
	}

	// Parsování skla 

	$room = explode('<body onLoad="doLoad();"',$room,2);
	$room = explode('>',$room[1],4);
	
	$room = preg_replace("/<img src=\"http:\/\/img.xchat.centrum.cz\/images\/x.{1,4}\/sm\/(.{1,4})\//","*",$room[3]);
	$room = preg_replace("/.gif\" alt=\"\*[0-9]{1,4}\*\" title=\"\*[0-9]{1,4}\*\" \/>/","*",$room);

	//preg_match_all('/([0-9]{1,2}:[0-9]{2,2}:[0-9]{2,2}) (<font color="#([0-9A-Fa-f]{6,6})"><span class=".{8,20}"><b>((.{3,20})|<a href=".{32,52}" style=".{30,40}"><span class="umsg_whisper">(.{3,20})</span><\/a>-&gt;.{3,20}):<\/b>|<\/font><font size="-2" class="systemtext"\>&quot;.{9,11}<b class=\".{5,16}\"\>(.{3,20})<\/b\> )(.{0,200})<\/font>/',$room,$lines);
	
	$linestoparse = explode('</font><br />',$room);

	foreach($linestoparse as $lineindex => $oneline){
	      if(strpos($oneline, 'class="systemtext"') !== false){
		    $n_messages++;
		    $linesplit = explode('</font>',$oneline);
		    $linesplit_time = explode(">",$linesplit[0],2);
		    $lines[1][$n_messages] = trim($linesplit_time[1]);
		    $lines[3][$n_messages] = "101010";
		    $linesplit_content = explode('class="systemtext">&quot;',$linesplit[1],2);
		    $lines[8][$n_messages] = strip_tags($linesplit_content[1]);
		    $linesplit_content = explode('</b>',$linesplit_content[1]);
		    $linesplit_content = explode('>',$linesplit_content[0]);
		    $lines[7][$n_messages] = $linesplit_content[1];
		    displaydebug("SYS: ".$lines[1][$n_messages]." ".$lines[3][$n_messages]." ".$lines[8][$n_messages]." ".$lines[7][$n_messages]);
		    unset($linesplit, $linesplit_time, $linesplit_content);
	      }
	      elseif(strpos($oneline, '<span class="umsg_room">') !== false){
		    $n_messages++;
		    $linesplit = explode(' ',$oneline,2);
		    $lines[1][$n_messages] = trim($linesplit[0]);
		    $linesplit_content = explode('color="#',$linesplit[1],2);
		    $linesplit_font = explode('"',$linesplit_content[1],2);
		    $lines[3][$n_messages] = $linesplit_font[0];
		    $linesplit_nick = explode('<b>',$linesplit_font[1],2);
		    $linesplit_nick = explode(":",$linesplit_nick[1],2);
		    $lines[4][$n_messages] = $linesplit_nick[0];
		    $lines[8][$n_messages] = strip_tags($linesplit_nick[1]);
		    displaydebug("ROOM: ".$lines[1][$n_messages]." ".$lines[3][$n_messages]." ".$lines[8][$n_messages]." ".$lines[4][$n_messages]);
		    unset($linesplit, $linesplit_font, $linesplit_content, $linesplit_nick);
	      }
	      elseif(strpos($oneline, '<span class="umsg_whisper">') !== false){
		    $n_messages++;
		    $linesplit = explode(' ',$oneline,2);
		    $lines[1][$n_messages] = trim($linesplit[0]);
		    $linesplit_content = explode('style="color: #',$linesplit[1],2);
		    $linesplit_font = explode(";",$linesplit_content[1],2);
		    $lines[3][$n_messages] = $linesplit_font[0];
		    $linesplit_nick = explode('<span class="umsg_whisper">',$linesplit_content[1],2);
		    $linesplit_nick = explode("</span>",$linesplit_nick[1],2);
		    $lines[6][$n_messages] = $linesplit_nick[0];
		    $linesplit_content = explode(":",$linesplit_nick[1],2);
		    $lines[8][$n_messages] = strip_tags($linesplit_content[1]);
		    displaydebug("SEPT: ".$lines[1][$n_messages]." ".$lines[3][$n_messages]." ".$lines[8][$n_messages]." ".$lines[6][$n_messages]);
		    unset($linesplit, $linesplit_font, $linesplit_content, $linesplit_nick);
	      }
	      else continue;
	}

	// Smaž sklo
	enter_room($environ,$room,-1);

	// Úprava skla
	
	if($firstrun == 1) {
		display("Vstup do místnosti - ignoruji sklo");
		$n_messages = -1;
	}
	elseif(($firstrun == 0) && ($environ->GetVar("kicker") <> -1)){
		$firstrun = -1;
		$kicker[1] = $environ->GetVar("kicker");
		$environ->GetVar("kicker",true);
	}
	elseif($firstrun == -1) display("Byl jsem vyhozen uživatelem ".$kicker[1]);
	else ;

	if(($firstrun == 0) && ($runlevel <= 2) && ($n_messages == max($n_messages,30,round(3*$environ->GetVar("oldmasterlines"))))){
		$n_messages = -1;
		display("Příliš mnoho načtených řádků ".($n_messages + 1)." - SKIP");
		$sureclear = true;
	}
	elseif(($firstrun == 0) && ($runlevel <= 2) && (($n_messages + 1)  < min(3*$environ->GetVar("oldmasterlines"),50))){
		$sureclear = true;
	}
	elseif($firstrun == -1){
		$bordermessindex = $n_messages;
		for($ibrowse = 0;$ibrowse <= $n_messages;$ibrowse++){
			if(($lines[7][$ibrowse] <> "")&&(strpos(strtolower($lines[7][$ibrowse]),strtolower($environ->GetBaseVar("loginnick"))) !== FALSE)&&(strpos(strtolower($lines[8][$ibrowse]),strtolower($kicker[1])) !== FALSE)){
				$bordermessindex = $ibrowse;
				break;
			}
		}
		$sureclear = true;
	}
	else $sureclear = false;

	if((($n_messages) <> -1) && ($sureclear == false)){
		$procindex = getindex($environ->GetVar("last_proceed"),str_replace("'","\"",$lines[1]));
		if($procindex !== false) {
			$environ->GetVar("last_proceed",$lines[1][$procindex]);
			$n_messages = -1;
			display("Nalezena opakující se hláška ".$lines[1][$procindex]." - SKIP");
		}
	}

	if($environ->GetBaseVar("in_browser")){
		if($n_messages == -1) display("Nic na práci");
		elseif($sureclear) display("Vstup OK (CLEAR) - na práci ".($n_messages + 1)." zpráv.");
		else display("Vstup OK - na práci ".($n_messages + 1)." zpráv.");
		flush();
	}

	// Zpracování skla

	if($roundtrips == 1) $environ->TimerHandler();

	while($n_messages >= 0){
		$lines[8][$n_messages] = trim($lines[8][$n_messages]);
		if($firstrun == 1) {
			$environ->GetVar("last_proceed","");
			break;
		}
		elseif($firstrun == -1){
			if($bordermessindex == $n_messages){
				$firstrun = 0;
				$environ->GetVar("last_proceed",str_replace("'","\"",$lines[1][$n_messages]));
				display("Přeskakuju hlášky před vyhozením (ověření příchodů po kicku)");
			}
			else {
				$n_messages--;
				continue;
			}
		}
		else{
			;
		}
		if($lines[6][$n_messages] <> ""){
			$whooriginal = $lines[6][$n_messages];
			$lines[6][$n_messages] = strtolower($lines[6][$n_messages]);
			$lines[8][$n_messages] = strip_tags($lines[8][$n_messages]);
			if($environ->GetBaseVar("in_browser")){
				$to_display = "SEPT ".$lines[1][$n_messages]." ".$lines[3][$n_messages]." ".$lines[6][$n_messages]." ".$lines[8][$n_messages];
				echo $to_display."<br />";
			}
			foreach($modules_whisper as $modul){
				$return = $modul($environ,$lines[1][$n_messages],$lines[3][$n_messages],$lines[6][$n_messages],$lines[8][$n_messages],2);
				if($return) break;
			}
			unset($lines[6][$n_messages], $lines[1][$n_messages], $lines[3][$n_messages], $lines[8][$n_messages]);
		}
		elseif($lines[7][$n_messages] <> ""){
			$whooriginal = $lines[7][$n_messages];
			$lines[7][$n_messages] = strtolower($lines[7][$n_messages]);
			$environ->GetVar("last_proceed",str_replace("'","\"",$lines[1][$n_messages]));
			if($environ->GetBaseVar("in_browser")){
				$to_display = "SYSTEM ".$lines[1][$n_messages]." ".$lines[3][$n_messages]." ".$lines[7][$n_messages]." ".$lines[8][$n_messages];
				echo $to_display."<br />";
			}
			foreach($modules_system as $modul){
				$return = $modul($environ,$lines[1][$n_messages],$lines[3][$n_messages],$lines[7][$n_messages],$lines[8][$n_messages],3);
				if($return) break;
			}
			unset($lines[7][$n_messages], $lines[1][$n_messages], $lines[3][$n_messages], $lines[8][$n_messages]);
		}
		elseif($lines[4][$n_messages] <> ""){
			$whooriginal = $lines[4][$n_messages];
			$lines[4][$n_messages] = strtolower($lines[4][$n_messages]);
			$lines[8][$n_messages] = strip_tags($lines[8][$n_messages]);
			$environ->GetVar("last_proceed",str_replace("'","\"",$lines[1][$n_messages]));
			if($environ->GetBaseVar("in_browser")){
				$to_display = "SKLO ".$lines[1][$n_messages]." ".$lines[3][$n_messages]." ".$lines[4][$n_messages]." ".$lines[8][$n_messages];
				echo $to_display."<br />";
			}
			foreach($modules_glass as $modul){
				$return = $modul($environ,$lines[1][$n_messages],$lines[3][$n_messages],$lines[4][$n_messages],$lines[8][$n_messages],1);
				if($return) break;
			}
			unset($lines[4][$n_messages], $lines[1][$n_messages], $lines[3][$n_messages], $lines[8][$n_messages]);
		}
		else {;}
		$finaldata["masterlines"]+=10;
		$n_messages--;
		if((time() - $environ->GetVar("lastspeaktime") >= 3) && ($n_tospeak >= 0)) speak($environ);
	}

	// Dodatečné moduly
	if(time() - $environ->GetVar("lastspeaktime") > 720){
		$tospeak[$addspeak++] = "/lomitko";
		$n_tospeak++;
	}

	foreach($modules_postglass as $modul){
		$return = $modul($environ);
		if($return) break;
	}

	// Dodatečné mluvení

	while($n_tospeak >= 0){
		if((time() - $environ->GetVar("lastspeaktime")) >=3) speak($environ);
		if(($environ->GetVar("lastspeaktime") - $time_start) > ($environ->GetBaseVar("refreshrate") - 4)) break;
		sleeper(3,false);
	}
	flush();

	$shouldsleep = max(0,constant("RUNL_".$environ->GetVar("runlevel")."_INT")/$boost - time() +  $time_cyclestart);
	$timeleft = $environ->GetBaseVar("refreshrate") - time() +  $time_start - $shouldsleep;
	display("Měl bych čekat ".$shouldsleep." sekund do refreshe bude zbývat ".$timeleft." !");
}

// Operace po zpracování
display("///////// Konec běhu bota //////////<br />");

foreach($modules_post as $modul){
	$return = $modul($environ);
	if($return) break;
}

if($environ->GetBaseVar("in_browser")){
	$longrun = time() - $time_start;
	if($longrun < $environ->GetBaseVar("refreshrate")) $resttime = $environ->GetBaseVar("refreshrate") - $longrun;
	else $resttime = 1;
	$reloadtime = 1000*$resttime;
}

$environ->SaveAndQuit($finaldata);

if($environ->GetBaseVar("in_browser")){
	echo "<br />Průběh trval ".$longrun." sekund, refresh za ".($reloadtime/1000)." sekund !<br />";
	echo "<script language=\"javascript\" type=\"text/javascript\">setTimeout(\"location.reload()\",".$reloadtime.")</script></body></html>";
}

?> 
