AlecTBM Skrevet 8. februar 2009 Del Skrevet 8. februar 2009 (endret) 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 8. februar 2009 av AlecTBM Lenke til kommentar
itsmebth Skrevet 9. februar 2009 Del Skrevet 9. februar 2009 Jeg vil ikke anbefale å bruke PHP til dette, men hvis du likevel gjør det, kan du se på en gammel IRC-bot jeg har laget. Denne bruker ikke-blokkerende sockets og sleep, men jeg vil anbefale socket_select. http://code.google.com/p/itsbot/ Lenke til kommentar
AlecTBM Skrevet 9. februar 2009 Forfatter Del Skrevet 9. februar 2009 Hvorfor er ikke PHP egnet? Greit at det ikke er det kjappeste i verden, men det er php jeg kan. Men for all del, bare gi meg tips til hva jeg kan bytte det til Lenke til kommentar
itsmebth Skrevet 9. februar 2009 Del Skrevet 9. februar 2009 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
OIS Skrevet 9. februar 2009 Del Skrevet 9. februar 2009 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
itsmebth Skrevet 9. februar 2009 Del Skrevet 9. februar 2009 "Veldig lenge" er strengt tatt ikke lenge nok. Hvis man skal lage en daemon bør den ikke ha noen memory-leaks, selv om det bare er et par KB/dagen. Lenke til kommentar
AlecTBM Skrevet 9. februar 2009 Forfatter Del Skrevet 9. februar 2009 Når jeg tenker over så kommer dette neppe til å gå, la meg gjenta at dette IKKE er til en bot, men til en chat. Det jeg har tenkt er å kjøre dette scriptet for hver bruker som bruker chatten. Lenke til kommentar
itsmebth Skrevet 9. februar 2009 Del Skrevet 9. februar 2009 Jeg vil anbefale Python med Twisted til dette. Python er bedre egnet, og Twisted tar seg flere tilkoblinger samtidig osv. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå