Gå til innhold

Lage backbone til IRC chat


Anbefalte innlegg

Helluen

Prøver å lage en backend i php til en IRC chat.

Har klart å lage en simpel bot (den mottar og evt svarer på mld fra server)

Men jeg vil kunne sende kommandoer (RFC 1459) via feks en vanlig input boks, mens loopen som holder tilkoblingen oppe kjører.

 

Jeg har tenkt ut det at en løsning er å kjøre 2 script, et hovedscript som holder tilkoblingen oppe, og et script som kjøres når det skal skrives noe.

 

Her er det jeg har nå

<?php
//Sende
function sendmeld($tekst, $sck){
$bufer = fputs($sck, $tekst . "\r\n");
echo "[".date("H:i:s")."]"."<" . $tekst . "\r\n";
}

//Info
$server = '192.168.1.180';
$port = 8005;
$nick = 'nick';
$pass = 'pass';
$shutdown = 'shutdown';
$logg = 'log.txt';

//Koble til irc
set_time_limit(0);
$forbind = pfsockopen($server, $port);
if(!$forbind) {
die('Feil under tilkobling');
}
//Koble til log
$fp = fopen($logg,'w');
//Sende innlogging
echo sendmeld("PASS " .$pass, $forbind);
echo sendmeld("NICK " .$nick, $forbind);
echo sendmeld("USER " .$nick.' - - :Testmaster', $forbind);

//Holde tilkoblingen åpen
$i = 0; //TEST
$feof = feof($forbind); //TEST
while(!$feof) {
$dato = "[".date("H:i:s")."]";
$bufer = fgets($forbind, 512);
echo "[".date("H:i:s")."]".">" . $bufer . "\r\n";
$replace = array("\r", "\n", ":");
$bufer = str_replace($replace, "", $bufer);
$delt = explode(" ", $bufer, 4);
$from = explode("!", $delt[0]);
print_r($delt); //TEST
////System
//Brukernavn
if($delt[1] == 433) {
	$feof = true;
}
//PING
if($delt[0] == 'PING'){
	sendmeld('PONG ' . $delt[1], $forbind);
}
//Shutdown command
if($delt[1] == 'PRIVMSG' && $delt[3] == $shutdown) {
	echo sendmeld('QUIT :Killed by '.$delt[0], $forbind);
	$feof = true;
}
if($delt[1] == 'JOIN') {
	$out .= '-- '.$nick.' kommer inn i '.$delt[2] . "\r\n";
}
////Meldinger
//Hallo i nytt rom
if($delt[1] == 366) {
	$out .= $dato.' '.$nick.' -> Hei på dere' . "\r\n";
	sendmeld('PRIVMSG #Main :Hei på dere', $forbind);
}
//Svar test
if($delt[1] == 'PRIVMSG' && $delt[3] == 'svar') {
	if($delt[2] == $nick) {
		$to = $from[0];
	} else {
		$to = $delt[2];
	}
	sendmeld('PRIVMSG '.$to.' Hei', $forbind);
}
//Samtale listing
if($delt[1] == 'PRIVMSG' && $delt[2] == '#Main') {
	$out .= $dato.' '.$from[0].' -> '.$delt[3] . "\r\n";


}
if(!empty($out)) {
	fputs($fp, $out);
	unset($out);
}
  echo $i++."\n"; //TEST
  if($i == 50) {
  	$feof = true; //Hindre loop, stoppe på 50
  }
}
sendmeld('QUIT :End of script', $forbind);
fclose ($forbind);
fclose ($fp);
unlink($logg);
echo 'Closed';
?>

 

Som dere ser så bruker jeg pfsockopen() til streamen.

Det jeg har tenkt på er å bruke samme stream i script nr. 2.

Er dette overhode mulig?

 

Takker for all hjelp

Endret av AlecTBM
Lenke til kommentar
Videoannonse
Annonse

PHPs minnebehandling består i hovedsak av å frigjøre alt minne når skriptet er ferdig gjør det ubrukelig til noe som skal kjøre over lengre tid. (Tenk C/C++/etc, men uten å ha peiling på hva som må frigjøres, hva som automatisk blir frigjort, og når).

Lenke til kommentar
PHPs minnebehandling består i hovedsak av å frigjøre alt minne når skriptet er ferdig gjør det ubrukelig til noe som skal kjøre over lengre tid. (Tenk C/C++/etc, men uten å ha peiling på hva som må frigjøres, hva som automatisk blir frigjort, og når).

I PHP5.3 kommer circular GC.

 

Men med enkle funksjoner og bra programmering så burde dette scriptet kunne kjøre veldig lenge. Men det ville kanskje vært enklere i Java, eller et annet programmeringsspråk.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...