Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: IRC-luokka

Sivun loppuun

Gascal [01.11.2005 18:31:43]

#

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");
}
?>

ajv [22.11.2005 07:19:35]

#

Tämä hyvä! Täytyy laittaa korvan taakse.

jrantala [22.11.2005 07:58:52]

#

Ircbotteja yms. ei kyl kannata ajaa phplla ku syö niin paljo koneen tehoja ;/

Gascal [22.11.2005 18:17:56]

#

ehkäpä... Jos ei nyt muuta käyttöä scriptille keksi, niin ainakin tuota voi helposti soveltaa muille kielille :P

maratti [24.11.2005 20:38:32]

#

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.

Gascal [25.11.2005 12:15:25]

#

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

maratti [26.11.2005 17:39:33]

#

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.

maratti [26.11.2005 18:35:17]

#

Noniin sais toimimaan siinä Oppauksen ja voicettaminen. Vielä jos sen sais disconnecttaamaan. Ja sitte että pitää antaa salasana privassa että voi komentaa sitä.

Gascal [26.11.2005 22:31:14]

#

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.

Sguali [23.10.2006 22:32:51]

#

Hitto, iha jeesin näköista jälkeä. Good for you.

DooB [16.01.2008 18:42:44]

#

En saanut tuota toimimaan omalle kanavalleni. :(

Paratiisin poika [03.04.2014 12:13:32]

#

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:

if($irc->initialize($data) == true){
    include("settings.php");
    include("actions.php");
}

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.

juudas [06.05.2014 08:44:16]

#

Paratiisin poika jaa ihmeessä.

Paratiisin poika [29.12.2019 14:30:24]

#

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

The Alchemist [30.12.2019 02:49:53]

#

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.

Paratiisin poika [04.01.2020 12:12:40]

#

The Alchemist kirjoitti:

(30.12.2019 02:49:53): Taisit poistaa luok­ka­ra­kenteen 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

Paratiisin poika [08.02.2020 04:20:56]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta