Uusin versio ja lisätietoja osoitteessa:
http://www.trolli.fi/dev/pirc/
Luokka sisältää perustoiminnot IRC yhteyksien luomiseen ja muutaman yksinkertaisen IRC komennon.
Huom! Vaatii PHP5:n toimiakseen.
25.11.2005 - Lisättiin komento, jolla voi muuttaa käyttäjien oikeuksia, eli siis esim. +o, +v jne. Esim. $irc->setMode("Gascal","+o");
<?php // class.irc.php class IRC{ // Common variables public $server; public $port; public $nick; public $name; public $channel; public $socket; public $buffer; private $firsttime; // Class constructor public function __construct($p_server,$p_port,$p_nick,$p_name,$p_channel){ $this->server = $p_server; $this->port = $p_port; $this->nick = $p_nick; $this->name = $p_name; $this->channel = $p_channel; $this->firsttime = true; } // This function connects to server, bool public function connect(){ if(isset($this->server, $this->port)){ if($this->socket = fsockopen($this->server,$this->port)){ fwrite($this->socket,"USER ".$this->nick." gascal.dyndns.org gascal.dyndns.org :".$this->name."\r\n"); fwrite($this->socket,"NICK ".$this->nick." gascal.dyndns.org\r\n"); set_time_limit(0); return true; } else{ return false; } } else{ return false; } } // This function disconnects from the server, void public function disconnect(){ fwrite($this->socket,"QUIT\r\n"); fclose($this->socket); } // Joins the channel and replies to PING/PONG events public function initialize($buffy){ if(substr($buffy,0,6) == "PING :"){ fwrite($this->socket,"PONG :".substr($buffy,6)."\r\n"); if($this->firsttime == true){ fwrite($this->socket,"JOIN ".$this->channel."\r\n"); $this->firsttime = false; } return false; } else{ return true; } } // IRC Functions [BEGIN] // Joins channel public function join($channel){ fwrite($this->socket,"JOIN ". $channel ."\r\n"); } // Leaves the channel public function part($channel){ fwrite($this->socket,"PART ". $channel ."\r\n"); } // send message to channel/user public function say($to,$msg){ fwrite($this->socket,"PRIVMSG $to :$msg\r\n"); } // modes: +o, -o, +v, -v, etc. public function setMode($user,$mode){ fwrite($this->socket,"MODE ".$this->channel." $mode $user\r\n"); } // kicks user from the channel public function kick($user,$from,$reason = ""){ fwrite($this->socket,"KICK $from $user :$reason\r\n"); } // changes the channel topic public function topic($channel,$topic){ fwrite($this->socket,"TOPIC $channel :$topic\r\n"); } // Read stream from the server public function read(){ $this->buffer = trim(fgets($this->socket, 4096)); return $this->buffer; } // get nick of msg sender public function get_nick(){ return substr($this->buffer,strpos($this->buffer,":")+1,strpos($this->buffer,"!")-1); } // get msg of msg sender public function get_msg(){ return str_replace($this->channel." :","",substr($this->buffer,strrpos($this->buffer,$this->channel." :"))); } // Console functions [BEGIN] // Prints nick's msg to console public function echo2console($nick,$msg){ if(trim($nick) != ""){ echo(date("(H:i:s)")." ($nick) $msg\n"); } } } ?>
Tämä esimerkki lukee ircistä dataa ja jos löytää viestistä ($msg) sanat !topic tai !kick, niin suoritetaan vastaavat toimenpiteet. Voi soveltaa suht helposti omaan bottiin (tosin !topic ja !kick ei oo kovinkaan järkeviä, ainakaan ilman komennon lähettäjän tunnistamista)
<?php // ircbot.php // Esimerkki include("class.irc.php"); $irc = new IRC("fi.quakenet.org",6667,"gabot","Gascalin PHP Botti","#tillikatu"); if($irc->connect()){ echo("Connected succesfully!\n"); while(!feof($irc->socket)){ $data = $irc->read(); if($irc->initialize($data) == true){ $nick = $irc->get_nick(); $msg = $irc->get_msg(); $irc->echo2console($nick,$msg); // muotoa "!kick <käyttäjä>" if(strstr($msg,"!kick")){ $kickedone = trim(substr($msg,strpos("!kick")+6)); $irc->kick($kickedone,"#tillikatu","menes nyt siitä!"); } // muotoa "!topic <aihe>" if(strstr($msg,"!topic")){ $topic = trim(substr($msg,7)); $irc->topic("#tillikatu",$topic); } } } $irc->disconnect(); echo("Disconnected Succesfully!\n"); } else{ echo("Connection to the server failed!\n"); } ?>
Tämä hyvä! Täytyy laittaa korvan taakse.
Ircbotteja yms. ei kyl kannata ajaa phplla ku syö niin paljo koneen tehoja ;/
ehkäpä... Jos ei nyt muuta käyttöä scriptille keksi, niin ainakin tuota voi helposti soveltaa muille kielille :P
Vähä siisti! Ja jopa toimii. Kick ja topic toimii. Mutta koska tulee, että bottia komennetaan privassa ja tarttee salasanan, että voi komentaa. Ja tuossa olis kova jos olis vielä oppaus ja voicet. Niin muuta se ei paskosti tartte.
No itse botti ei ollu tämän koodivinkin tarkoitus, mutta tuosta on melko helppo lähteä rakentamaan omaa bottia omiin tarpeisiin. OP ja voice komennot voisin vaikka lisätä tässä jossain vaiheessa, tosin ne nyt on melko yksinkertaista lisätä itse scriptin käyttäjänkin... saa nähä mitä hubaa tohon vielä tulee lisättyä :P
Ehdottakaa ihmessä lisää jos puuttuu jotain, lisään sitten niitä sitä mukaa.
PS. tottakai se toimii :P
No minä en osaa ite nitää siihen lisätä! Kun en osaa php oikeestaan yhtään. Niin ja disconnect olis kova sana ja joinaaminen ja poistuminen kanavalta.
Noniin sais toimimaan siinä Oppauksen ja voicettaminen. Vielä jos sen sais disconnecttaamaan. Ja sitte että pitää antaa salasana privassa että voi komentaa sitä.
disconnect ja join/part on kyllä tuossa mukana...
Ja jos on taidoista puute, niin siitä vaan opettelemaan. Eikä scriptin tarkoitus ollut suoranaisesti itse botti, vaan IRC luokka, jolla botin pystyy helposti rakentamaan.
Hitto, iha jeesin näköista jälkeä. Good for you.
En saanut tuota toimimaan omalle kanavalleni. :(
Todella hyvä koodi. Olen tästä tehnyt botin jossa on läjäpäin hallinnoivia ominaisuuksia. Potkii käyttäjän kanavalta jos viestissä on tiettyjä sanoja/linkkejä, estää spämmimisen ja sitä pystyy hallinnoimaan kun lähettää ensin yksityisellä (koska salasanaa ei kannata postaa kanavalle) !pass Salasana ja tämän jälkeen komentoja. Tästä oli todella helppo soveltaa todella toimiva botti ja kaikenlisäksi kun muokkasin koodin tälläiseksi:
Pystyn lisäämään käskyjä actions.php tiedostoon ja bottia ei tarvitse uudelleenkäynnistää jotta muutokset alkaisivat toimimaan. Jos jotakin kiinnostaa niin voin postata valmiiksi koodatun botin lähdekoodin jonnekkin.
Paratiisin poika jaa ihmeessä.
Palaan asiaan nyt näin 5 ja puoli vuotta myöhemmin. Alkuperäinen säätämiseni on kadottu bittiavaruuteen (ehkä ihan hyvä niin) mutta pari kuukautta sitten otin tämän uudelleen editoriin ja nyt se on muuttanut täysin muotoaan.
Poistin oliomuodon tästä koska en enää pitänyt siitä, laitoin kaikkialle sanitoinnit, tein tietokantapohjaisen logituksen, tulosten printtaukseen laitoin terminaalimuotoilut (ei näitä selaimessa kannata ajaa) ja väänsin ison kasan erilaisia toimintoja. Mukana on myös oma sovellus (php:lla luonnollisesti) jolla voi selailla logeja. Ei täysin valmis, sisältää joitain ongelmia eikä ihan kaikkea ole testattu, mutta itse ainakin uskallan ajella tätä vapaasti.
Tuo while.php on se tiedosto josta löytyy kaikki komennot ja toiminnot joihin irc:n kautta voi vaikuttaa. Se on erillinen tiedosto jotta sitä voi muokata botin ollessa käynnissä.
setting.php kannattaa vähintään lukea läpi, youtube-api ei ole käytössä mutta weather-api kannattaa ottaa käyttöön api-avaimella tai sitten poistaa se while.php:sta käytöstä. Sääpalveluna on openweathermap.
Ja tämä on sitten suunniteltu Linuxille.
Linkki suoraan gittiin koska jotain 500 riviä tavaraa ja 5 tiedostoa
MrDarkHooD - PHP IRC bot - GitLab
Taisit poistaa luokkarakenteen koska et osannut tehdä koodia, joka toimisi ilman superglobaaleja... Ja tuossa, että silmukassa includetat joka kerta samaa filua, ei ole mitään järkeä. Se on myös erittäin tehotonta.
Komennot on kovakoodattu lähdekoodiin ja handlerit on ripoteltu ympäriinsä, jolloin yleensäkin edes tuettujen komentojen listaaminen on vaikeaa ja sitten vielä niiden muuttaminen ja lisääminen on vaivalloista.
En nähnyt äkkiseltään koodissa mitään flood-suojausta. Kaikista alkeellisin ja yleisin ddos-hyökkäys on laittaa botti floodaamaan ja hankkia sille bannit sitä kautta.
The Alchemist kirjoitti:
(30.12.2019 02:49:53): Taisit poistaa luokkarakenteen koska et...
Poistin luokkarakenteen koska en pitänyt siitä (yleisesti oop tyylistä) ja nuo pari globaalia muuttujaa olisi saanut muillakin tavoin toteutettua taidoillani mutta päädyin tuohon ratkaisuun koska se oli lyhyin tapa jonka keksin. includetus on aika huono tapa mutta itseäni se ei ole haitannut, mikäli tiedät jonkun muun tavan jolla tuota voi muokata käynnissä ollessaan niin olen kiinnostunut kuulemaan.
En tiedä mihin nuo komennot pitäisi koodata jos ei lähdekoodiin, olen yrittänyt tehdä tuosta mahdollisimman "skaalautuvaa" jakamalla while.php suhteellisen alussa komennon ja argumentit erilleen. Handlereista tiedänkin että ne on huonot, eivät oikeastaan edes toimi. Ne korjaan joskus kun jaksan paneutua. Mielestäni komentojen lisääminen on helppoa kuten myös muokkaaminen kunhan tietää mitä hakee, vaikka jälkimmäinen tosin kyllä vaatii koodin tuntemista.
Flood suojaus myös tulee, olen vain ollut sen osalta laiska. Tosin mikäli joku sitä abuseaa kanavalla niin luultavammin abuseaja saa bännit koska vaatii häneltä jokaista botin lähettämää viestiä vastaan yhden viestin. Ylläpito-oikeuksilla saattaa olla enemmän mahdollista laittaa floodaus päälle mutta en näe tätä ongelmana, miksi omistaja sille bännit hankkisi :D
Sain viimein tehtyä tuosta uuden version. Nyt se on rakennettu niin että lähes kaikki komennot saa listattua yksinkertaisella tavalla ja koko systeemin hallitseminen koodaajana on huomattavasti helpompaa. while.php on poistettu ja jokainen komento on nyt yksittäinen tiedosto jota kutsutaan ainoastaan tarvittaessa. Olen myös korjannut tuosta useita aukkoja jotka mahdollistivat botin kaatamisen. Päätiedosto on myös kommentoitu osittain vaikkakaan ei vieläkään ole mitenkään kovin mahtava. Myös ylläpitäjän salasanan nuuskimismahdollisuuksia on rajoitettu ja !admin komentoon on lisätty nimimerkkikohtainen rajoitin. Komennoissa on myös nyt help toiminto joka aktivoituu kun ensimmäisenä argumenttina on -h (joka myös estää itse komennon ajamisen) Gitissä on jo uusin versio.
Aihe on jo aika vanha, joten et voi enää vastata siihen.