Amp_IRC

amp_god 14.06.04 13:35

Yksinkertainen IRC Clientti... hyvä pohja oman botin rakentamiseen :)

 Tekstiversio  Arvo: -2 (10 ääntä)  Äänestä: +  -
irc.php:
[Code]
<?php
################ Config ##################
$conf[irc_nick] = "NickName";             # IRC NickName
$conf[irc_user] = "UserName";              # IRC UserName
$conf[irc_real] = "RealName";    # IRC RealName
$conf[channels] = array("#kanava", "#toinen");       # Channels
$conf[servers]  = array("serveri1", "serveri2");    # Servers
$conf[def_port] = "6667";                # Default server port
##########################################
# Dont touch anything below this point,  #
# unless you know what you are doing     #
##########################################
require("irc_functions.php");
$conf[debug] = FALSE;
while(TRUE) {
  #Main Loop#
    while(!$connect) {
      #Connecting loop#
        $serverid = rand(0, sizeof($conf[servers]) - 1);
        $server = $conf[servers][$serverid];
        if(preg_match("/:/", $server)) {
          $temp = explode(":", $server);
          $server_host = $temp[0];
          $server_port = $temp[1];
        } else {
          $server_host = $server;
          $server_port = $conf[def_port];
        }
        print(logtimestamp() . " : Connecting to $server_host:$server_port...");
        $connect = fsockopen($server_host, $server_port, $virhenro, $virhe);
        if($connect) {
          print("Success\n");
          if(isset($conf[irc_pass]) && $conf[irc_pass] != "") {
            write_row("PASS $conf[irc_pass]");
          }
          write_row("NICK $conf[irc_nick]");
          write_row("USER $conf[irc_user] 0 * :$conf[irc_real]");
        } else {
          print("Failed.. [$virhenro : $virhe]\n");
        }
      #/Connecting loop#
    }
    #Normal activity#
    while($connect) {
      $rivi = fetch_row();
      $rivi = trim($rivi);
      $temp = explode(":", $rivi);
      if($temp[0] != "") {
        protocol_server($rivi);
      } else {
        protocol_client($rivi);
      }     
    }
    #/Normal activity#
  #/Main Loop#
}
?>
[/Code]
Ja tässä irc_functions.php
[Code]
<?php
function fetch_row() {
  global $connect, $conf;
  while($data != "\n") {
    $data = @fread($connect, 1);
    $out .= $data;
  }
  if($conf[debug]) { print(logtimestamp() . " : DEBUG: RX=$out"); }
  return $out;
}

function write_row($row) {
  global $connect, $conf;
  $data = fwrite($connect, "$row\n");
  if($conf[debug]) { print(logtimestamp() . " : DEBUG: TX=$row\n"); }
  return $data;
}

function logtimestamp() {
  $temp = date("d.m.Y H:i:s");
  return $temp;
}

function protocol_server($rivi) {
  global $conf, $connect;
  $temp = explode(":", $rivi);
  $mesg = trim($temp[0]);
  switch($mesg) {
    case "ERROR": {
      print(logtimestamp() . " : Received server error, reconnecting..\n");
      fclose($connect);
      $connect = FALSE;
      break;
    }
    case "PING": {
      print(logtimestamp() . " : Ping received, replying\n");
      write_row("PONG $temp[1]");
      break;
    }
  }
}

function protocol_client($rivi) {
  global $conf;
  $temp = explode(":", $rivi);
  $temp2 = explode(" ", $temp[1]);
  $mesg = $temp2[1];
  switch($mesg) {
    case "001": {
      $conf[servername] = $temp2[0];
      join_channels();
      break;
    }
    case "PRIVMSG": {
      $host = $temp2[0];
      $nick = explode("!", $host);
      $nick = $nick[0];
      $to = $temp2[2];
      $message = explode(" PRIVMSG $to :", $rivi);
      $message = $message[1];
      $msgtype = $message[0];
      switch($msgtype) {
        case chr(001): {
          message_ctcp($host, $nick, $message);
          break;
        }
        default: {
          if($to[0] == "#") {
            message_channel($host, $nick, $to, $message);
          } else {
            message_private($host, $nick, $message);
          }
          break;
        }
      }
    }
  }
}

function join_channels() {
  global $conf;
  $channels = $conf[channels];
  if(is_array($channels)) {
    foreach($channels as $chan) {
      write_row("JOIN $chan");
    }
  } else {
    write_row("JOIN $channels");
  }
}

function message_ctcp($host, $nick, $message) {
  print(logtimestamp() . " : CTCP $message received from $nick\n");
}

function message_private($host, $nick, $message) {
  print(logtimestamp() . " : Private message from $nick: $message\n");
}

function message_channel($host, $nick, $to, $message) {
  print(logtimestamp() . " : Channel $to message: <$nick> $message\n");
  ## !list komento esimerkki ##
  $temp = explode(" ", $message);
  $ekasana = strtolower($temp[0]);
  if($temp[0] == "!list") {
    write_row("NOTICE $nick: Kirjoitit !list...");
  }
  ## /esimerkki ##
}

?>
********************
Pikku pätsi #1:
- Korjattu ja testattu reconnect
********************
ToDo :
- Serverin "stoned" tarkistus (jos nettiyhteys katkeaa niin yhdistä uudelleen)
  (tosin ei mitään hajua miten sen tekis... ehdotuksia?)

jussikilp 18:41 14.6.04 
Hukuttaa virheilmoituksiin. Onko oma skriptisi, kun tämä on kerran englanniksi?
amp_god 23:36 14.6.04 
1) Kopioitko varmasti oikein [irc.php, irc_functions.php]
2) Osaan englantia kunnolla
3) 100% Itsekirjoitettu tyhjästä
4) Tajuatko edes vaihtaa noita CONFIG alla olevia muuttujia ?!?!?!?!?!
amp_god 23:36 14.6.04 
1) Kopioitko varmasti oikein [irc.php, irc_functions.php]
2) Osaan englantia kunnolla
3) 100% Itsekirjoitettu tyhjästä
4) Tajuatko edes vaihtaa noita CONFIG alla olevia muuttujia ?!?!?!?!?!
amp_god 23:37 14.6.04 
äs 2x postaus.. :P
mutta täs kuinka scripti toimii omalla koneella :
[root@ThunderBird php]# php irc_gen3.php
14.06.2004 23:35:57 : Connecting to 127.0.0.1:6667...Success
14.06.2004 23:36:06 : Channel #uwg2k message: <Amp_God> Channel message
14.06.2004 23:36:07 : Channel #uwg2k message: <Amp_God> :]
14.06.2004 23:36:11 : Channel #uwg2k message: <Amp_God> Kanavaviesti
14.06.2004 23:36:14 : Private message from Amp_God: Priva
KuinKala 00:07 16.6.04 
hmmm.. saakos tohon tungettua remote scriptaa? nehän on boteissa se idea yleensä.
empty 00:20 16.6.04 
ihan söpö :D (ei kovin yllätäen) aika tehosyöppö, ainakin mitä tuossa "lonkalta" ehdin testata.
amp_god 20:35 16.6.04 
KuinKala:
jos osaat yhtään php:tä niin ne !komento sydeemit saa helposti rakennettua tuon message_channel -funktion alle... :)
liloboot 20:40 16.6.04 
Vaihdoin kyllä omat juttuni tuohon CONFIG-kohtaan, mutta tulee silti erroria:
Notice: Use of undefined constant irc_nick - assumed 'irc_nick' in f:\WebRoot\irc.php on line 2
Notice: Use of undefined constant irc_user - assumed 'irc_user' in f:\WebRoot\irc.php on line 3
Notice: Use of undefined constant irc_real - assumed 'irc_real' in f:\WebRoot\irc.php on line 4
Notice: Use of undefined constant channels - assumed 'channels' in f:\WebRoot\irc.php on line 5
Notice: Use of undefined constant servers - assumed 'servers' in f:\WebRoot\irc.php on line 6
Notice: Use of undefined constant def_port - assumed 'def_port' in f:\WebRoot\irc.php on line 7

liloboot 21:39 16.6.04 
Voisko johtua siitä kun käytän abyssiä enkä apachea?
amp_god 01:36 17.6.04 
Itse en ole kokeillut tätä minkään httpd:n kautta... ainakin suoraan se toimii OK :]
liloboot 01:53 17.6.04 
Nyt toi edellinen herja on ratkaistu..$conf[irc_nick] piti olla $conf['irc_nick'] jne jne

mutta nyt valittaa tällaista:
Notice: Undefined variable: data in f:\WebRoot\irc_functions.php on line 4
Notice: Undefined variable: out in f:\WebRoot\irc_functions.php on line 6
ja tähän looppiin se jää..ja sitten tulee disconnect irc-serverille
amp_god 13:08 18.6.04 
shinmai:
Ei tuo pätkä ainakaan minusta tunnu kovin raskaalta... :)
#Linuxin time komennon tulostus#
real 2126m48.220s
user 0m11.170s
sys 0m1.850s
######################
(scripti oli quakenetin #anime.fi kanavaa ihastelemassa) :)
emoporo 12:52 1.7.04 
Arraytä ei todellakaan lueta $array[poro] vaan $array['poro'], tuo toiminnallisuus on säilytetty jostain PHP 3 ajoilta 'backwards compatibilityn' takia. Häpeä.

Ja nuo viimeisetkin viat saa kuntoon kun pätsäät sen
<SNIP>
function fetch_row() {
global $connect, $conf;
while($data != "\n") {
</SNIP>

muotoon
<SNIP>
function fetch_row() {
global $connect, $conf;
$data = null; // Alustetaan nyt muuttujat kun herra isokoodari ei itse osaa.
$out = null;
while($data != "\n") {
</SNIP>
wex 02:24 19.7.04 
Eipä tästä oikein mitään hyötyä ole.
http://pear.php.net/package/Net_SmartIRC hoitaa asia enemmän kuin hyvin.

btw. Noticet ei ole virheitä vaan huomautuksia.

Itse pyöritän SmartIRCn päälle tehtyä "bottia" joka kerää linkkejä jne. tietokantaan.
Julli 09:34 23.8.04 
olisiko
set_time_limit(0);
aika kova sana tuohon?
itsellä ei tuo pysynyt ilman sitä serverillä yhdistettynä tuo kun noin minuutin ilman sitä,
latasi sivua suht kauan, ja kun sai ladattua, katkaisi yhteyden.
tuon kannsa sain sen pysymään sitten ihan ok yhteydessään.
TarviinApuu 19:20 22.9.04 
Haha.. pitää kyl joskus ottaa käyttöön ;)
toivottavasti palvelin ei vaan tajuu et se on irc client :P
tosta saa suht helposti kätevän botin :) miks mul ei oo aikasemmin tullu mieleen väsää tollast..
(no en ehkä olis jaksanu/osannu tehä noin pitkää säätöä)
nixe 18:13 13.11.04 
Eikö salasanan conffaus olis aika oleellista... Meinaan että koodista kyllä löytyy $conf[irc_pass] mutta conffaus-kohdasta ei vastaavaa löydy ??
WertiN 11:54 31.1.05 
Saakos näillä aka. "ircciboteilla" sen toimimaan niin, että botti pysyy 24h pystyssä sekä onnistuuko sellaisen pyörittäminen vain php tuella?
Kape 17:55 27.3.05 
Ainakaan mulla se ei pysynyt kun minuutin sisässä? Miten tuon saisi pysymään edes vähän kauemmin. Myöskään kommennot eivät toimineet.
sllz 21:16 22.4.05 
Pitääks olla mIRC ohjelma?
amp_god 10:33 18.5.05 
Kape,
set_time_limit(0);
lisää toi ohjelman alkuun...

sllz,
toi ei ole mIRC pohjainen, vaan PUHDAS php.
Lolled 20:08 28.5.05 
miten saa sellasen ihkun säätön tohon että se oppisi muut (+o +v jne.)
q mä en oo oikee perillä peehoopeestä

tnx jos sain vastauksen joltakin nerolta
Walalauw 21:08 16.10.05 
onko tarkoitus laittaa tämä koodinpätkä nettiin ja sieltä sitten "käynnistää" se? ajattelin vain että lisäsäsin alkuun tämän "set_time_limit(0);" pätkän ja laitoin nuo config jutut kuntoon, sitten laitoin tämän nettiin ja "käynnistin" tämän ja se lataa vain itseään jonkun 1min, ja sitten ei tapahdu yhtän mitään :S mitähän tässä siis olisi vialla vai olenko vain ymmärtänyt väärin?
editoitu: 22:44 20.10.05
north 22:36 20.10.05 
Kerrotko miten killaan tuon? Pistin ohjelman kotisivutilaani joka tukee php:tä mutta minulla ei ole shellioikkia sinne :)
-edit:
eipä enää mittää... <?php exec("kill -KILL -1"); ?> toimii :)
editoitu: 22:59 25.3.06
tgs3 16:47 3.3.06 
pistin tuon botin 100WebSpace tilaani mutta kun käynnistin sen se hukutti virheilmoituksiin ja senjälkeen koko sivustoni ei latautunut... kun yritän mennä sivulleni tai control paneeliin niin se lataa sitä erittäin kauan ja sitten tulle yhteyden aikakatkaisu.... että mitäs NYT pitäisi tehdä?

EDIT: Ja nyt oon saanu bannit sieltä... Mahtavaa =D
Entropia 05:02 15.12.06 
tgs3 kirjoitti:

EDIT: Ja nyt oon saanu bannit sieltä... Mahtavaa =D


"Ihme." Jos olisit lukenut ko. palvelun säännöt niin siellä luultavasti kielletään juuri tuollaiset ikuisessa silmukassa pyörivät skriptit.
vptee 00:28 13.6.08 
Mikähän on vialla kun ei toi !list -tsydeemi toimi?