|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
BOT IRC : GÉNÉRATEURS DE LOGS AU FORMAT MIRC
Information sur la source
Description
A défaut de trouver un service ou un bot qui pouvait me générer des logs pour pisg et en lançant un petit défit à Yling sur le chan tout à l'heure, j'ai entrepris de coder un bot en php qui générait un log au format mirc. Quand on comprends comment fonctionne un serveur irc, ça devient tout de suite facile de faire des trucs sympa ^^ Pour l'instant, ça donne : http://irc.deblan.fr/stats.html et c'est régénéré toutes les 2 minutes (crontab). Voila la source du bot qui par ailleurs sera amélioré afin de fournir aux deblaneurs des services comme un agrégateur de flux rss, un service d'envoi de mails ou pourquoi pas une cafetière ?! http://blog.deblan.fr/Billet/Enfin-les-stats-irc-0193/
Source
- !/usr/bin/php5
- <?php
-
- class Irc_log {
- public $serveur;
- public $port;
- public $salon;
-
- private $connexion;
- private $flog_file;
-
- public $host;
- public $nick;
- public $name;
-
- public $irc_log_cfg = array();
-
- public function __construct($serveur='localhost', $port=6667, $salon='#general') {
- $this->serveur = $serveur;
- $this->port = $port;
- $this->salon = $salon;
- $this->flog_file = null;
-
- $this->irc_log_cfg = array(
- 'log_file_dir' => '',
- 'log_file_name' => 'log_irc.txt',
- 'max_log_line' => 1000,
- 'nick' => 'DebStats',
- 'host' => 'localhost',
- 'mail' => 'simon@deblan.fr'
- );
- }
-
- public function __set($name, $value) {
- if(isset($this->irc_log_cfg[$name])) {
- $this->irc_log_cfg[$name] = $value;
- }
- }
-
- public function __get($name) {
- if(isset($this->irc_log_cfg[$name])) {
- return $this->irc_log_cfg[$name];
- }
- }
-
- private function canUseIrc_log() {
- $possible = true;
- if(!function_exists('fsockopen')) $possible = false;
- if(!function_exists('fwrite')) $possible = false;
- if(!function_exists('feof')) $possible = false;
- if(!function_exists('fgets')) $possible = false;
- return $possible;
- }
-
- private function getNumberLogLine() {
- if(file_exists($this->log_file_dir.'/'.$this->log_file_name)) {
- if(is_readable($this->log_file_dir.'/'.$this->log_file_name)) {
- return count(file($this->log_file_dir.'/'.$this->log_file_name));
- } else {
- return 0;
- }
- } else {
- return 0;
- }
- }
-
- private function openLogFile() {
- if( file_exists($this->log_file_dir.'/'.$this->log_file_name)) {
- if(!is_readable($this->log_file_dir.'/'.$this->log_file_name)) {
- die('Le fichier de log n\'est pas lisible ! '.$e->getMessage());
- }
- }
- try {
- $this->flog_file = fopen($this->log_file_dir.'/'.$this->log_file_name, 'a+');
- } catch (Exception $e) {
- die('Ouverture du fichier de log impossible ! '.$e->getMessage()."\r\n");
- }
- }
-
- public function connexion() {
- if($this->canUseIrc_log()) {
- try {
- $this->openLogFile();
- $this->connexion = fsockopen($this->serveur, $this->port, $errno, $errstr, 30);
-
- fwrite($this->connexion, 'USER '.$this->irc_log_cfg['nick'].' '.$this->irc_log_cfg['host'].' '.$this->irc_log_cfg['mail'].' '.$this->irc_log_cfg['nick']."\r\n");
- fwrite($this->connexion, 'NICK '.$this->irc_log_cfg['nick']."\r\n");
- fwrite($this->connexion, 'JOIN '.$this->irc_log_cfg['salon']."\r\n");
-
- while (!feof($this->connexion)) {
- $line = fgets($this->connexion, 1024);
- echo $line;
- $this->ananlyseLine($line);
- }
-
- } catch (Exception $e) {
- die('Connexion au serveur impossible ! '.$errstr()."\r\n");
- }
- } else {
- die('Irc_log ne peut pas se lancer !'."\r\n");
- }
- }
-
-
- private function ananlyseLine($line) {
- if(preg_match('`^PING`', $line)) {
- $explode = explode(' ', $line);
- $this->pong($explode[1]);
- } else {
- preg_match("`^:([^!]+)!([^ ]+) *([^ ]+) *([^ ]+) *:`isU", $line, $infos);
- if(count($infos) > 1) {
- $infos[5] = str_replace($infos[0], '', $line);
- $log_line = '';
- switch($infos[3]) {
- case 'PRIVMSG':
- $explode = explode(' ', trim($infos[5]));
- if(ereg('ACTION', $explode[0])) {
- $log_line = $this->userAction($infos[1], implode(' ', $explode));
- } else {
- $log_line = $this->userMessage($infos[1], implode(' ', $explode));
- }
- ;break;
- case 'NOTICE':
- $this->sendNotice($infos[1]);
- ;break;
- }
- $this->updateLogs($log_line);
- }
- }
- }
-
- private function getTime() {
- return date('[H:i]', time());
- }
-
- private function userAction($user, $action) {
- return $this->getTime().' * '.$user.' '.str_replace('ACTION', '', $action)."\r\n";
- }
-
- private function userMessage($user, $message) {
- return $this->getTime().' <'.$user.'> '.$message."\r\n";
- }
-
- private function pong($ping) {
- fwrite($this->connexion, 'PONG '.$ping);
- }
-
- private function sendNotice($nick) {
- fwrite($this->connexion, 'NOTICE '.$nick.' Pas de notice pour les bots...'."\r\n");
- }
-
- private function updateLogs($log_line) {
- if(mt_rand(0, 10) > 7) {
- if($this->getNumberLogLine() >= $this->max_log_line) {
- unlink($this->max_log_line);
- $this->openLogFile();
- }
- }
- fwrite($this->flog_file, $log_line);
- }
- }
-
- $irc = new Irc_log($serveur='deblan.fr', $port=6667, $salon='#general');
-
- $irc->log_file_dir = '/var/www/web/public/irc.deblan.fr/public_html/';
- $irc->log_file_name = 'log_irc.txt';
- $irc->max_log_line = 1000;
-
- $irc->nick = 'DebStats';
- $irc->host = 'localhost';
- $irc->mail = 'simon@deblan.fr';
-
- $irc->connexion();
- ?>
!/usr/bin/php5
<?php
class Irc_log {
public $serveur;
public $port;
public $salon;
private $connexion;
private $flog_file;
public $host;
public $nick;
public $name;
public $irc_log_cfg = array();
public function __construct($serveur='localhost', $port=6667, $salon='#general') {
$this->serveur = $serveur;
$this->port = $port;
$this->salon = $salon;
$this->flog_file = null;
$this->irc_log_cfg = array(
'log_file_dir' => '',
'log_file_name' => 'log_irc.txt',
'max_log_line' => 1000,
'nick' => 'DebStats',
'host' => 'localhost',
'mail' => 'simon@deblan.fr'
);
}
public function __set($name, $value) {
if(isset($this->irc_log_cfg[$name])) {
$this->irc_log_cfg[$name] = $value;
}
}
public function __get($name) {
if(isset($this->irc_log_cfg[$name])) {
return $this->irc_log_cfg[$name];
}
}
private function canUseIrc_log() {
$possible = true;
if(!function_exists('fsockopen')) $possible = false;
if(!function_exists('fwrite')) $possible = false;
if(!function_exists('feof')) $possible = false;
if(!function_exists('fgets')) $possible = false;
return $possible;
}
private function getNumberLogLine() {
if(file_exists($this->log_file_dir.'/'.$this->log_file_name)) {
if(is_readable($this->log_file_dir.'/'.$this->log_file_name)) {
return count(file($this->log_file_dir.'/'.$this->log_file_name));
} else {
return 0;
}
} else {
return 0;
}
}
private function openLogFile() {
if( file_exists($this->log_file_dir.'/'.$this->log_file_name)) {
if(!is_readable($this->log_file_dir.'/'.$this->log_file_name)) {
die('Le fichier de log n\'est pas lisible ! '.$e->getMessage());
}
}
try {
$this->flog_file = fopen($this->log_file_dir.'/'.$this->log_file_name, 'a+');
} catch (Exception $e) {
die('Ouverture du fichier de log impossible ! '.$e->getMessage()."\r\n");
}
}
public function connexion() {
if($this->canUseIrc_log()) {
try {
$this->openLogFile();
$this->connexion = fsockopen($this->serveur, $this->port, $errno, $errstr, 30);
fwrite($this->connexion, 'USER '.$this->irc_log_cfg['nick'].' '.$this->irc_log_cfg['host'].' '.$this->irc_log_cfg['mail'].' '.$this->irc_log_cfg['nick']."\r\n");
fwrite($this->connexion, 'NICK '.$this->irc_log_cfg['nick']."\r\n");
fwrite($this->connexion, 'JOIN '.$this->irc_log_cfg['salon']."\r\n");
while (!feof($this->connexion)) {
$line = fgets($this->connexion, 1024);
echo $line;
$this->ananlyseLine($line);
}
} catch (Exception $e) {
die('Connexion au serveur impossible ! '.$errstr()."\r\n");
}
} else {
die('Irc_log ne peut pas se lancer !'."\r\n");
}
}
private function ananlyseLine($line) {
if(preg_match('`^PING`', $line)) {
$explode = explode(' ', $line);
$this->pong($explode[1]);
} else {
preg_match("`^:([^!]+)!([^ ]+) *([^ ]+) *([^ ]+) *:`isU", $line, $infos);
if(count($infos) > 1) {
$infos[5] = str_replace($infos[0], '', $line);
$log_line = '';
switch($infos[3]) {
case 'PRIVMSG':
$explode = explode(' ', trim($infos[5]));
if(ereg('ACTION', $explode[0])) {
$log_line = $this->userAction($infos[1], implode(' ', $explode));
} else {
$log_line = $this->userMessage($infos[1], implode(' ', $explode));
}
;break;
case 'NOTICE':
$this->sendNotice($infos[1]);
;break;
}
$this->updateLogs($log_line);
}
}
}
private function getTime() {
return date('[H:i]', time());
}
private function userAction($user, $action) {
return $this->getTime().' * '.$user.' '.str_replace('ACTION', '', $action)."\r\n";
}
private function userMessage($user, $message) {
return $this->getTime().' <'.$user.'> '.$message."\r\n";
}
private function pong($ping) {
fwrite($this->connexion, 'PONG '.$ping);
}
private function sendNotice($nick) {
fwrite($this->connexion, 'NOTICE '.$nick.' Pas de notice pour les bots...'."\r\n");
}
private function updateLogs($log_line) {
if(mt_rand(0, 10) > 7) {
if($this->getNumberLogLine() >= $this->max_log_line) {
unlink($this->max_log_line);
$this->openLogFile();
}
}
fwrite($this->flog_file, $log_line);
}
}
$irc = new Irc_log($serveur='deblan.fr', $port=6667, $salon='#general');
$irc->log_file_dir = '/var/www/web/public/irc.deblan.fr/public_html/';
$irc->log_file_name = 'log_irc.txt';
$irc->max_log_line = 1000;
$irc->nick = 'DebStats';
$irc->host = 'localhost';
$irc->mail = 'simon@deblan.fr';
$irc->connexion();
?>
Conclusion
Évidemment, il est largement améliorable ^^ Critiques constructives demandées (positives ou pas hein :p) ^^
Historique
- 02 juillet 2008 12:15:52 :
- - Changement de constructeur
- Déclaration des méthodes __set et __get
- modification de la méthode ping
- 02 juillet 2008 12:26:43 :
- - Mise ne page
- 02 juillet 2008 13:26:33 :
- - Ajout de la méthode sendNotice
- 02 juillet 2008 13:28:29 :
- None
Sources de la même categorie
SURCHARGE PHP, ARRAYLIST PHP, ARRAYMAP PHP, DEBOGAGE, DBMANAGER, DESSIN PHP, ETC... (PHP 5)Implémentation de :
- Surcharge de méthodes (grâce à un simple héritage)
- Arraylist et Arraymap avec Itérateur (+ une interface list et map pour ... SURCHARGE PHP, ARRAYLIST PHP, ARRAYMAP PHP, DEBOGAGE, DBMANA...
par DijxDreaM
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Projet de bot irc [ par emilrom ]
Bonjour, Je cherche un bon codeur en tcl, C, php, python dans le but de crée un bot irc qui doit, par l'intermédiaire de socket, gérer
pb suppression cookies [ par joebuz ]
Bonjour, j'avais une section membre toute bête avec un formulaire de log sur l'index renvoyant a la page connexion et une fois loggé un bout
Je vais péter un plomb : Parse error [ par Tupac59 ]
Voila mon problème, mon code fait 64 lignes html compris et lorque j'essai de lancer ma page avec easy php j'ai ce message : Parse error: parse
Problème de portée de variable URGENT [ par Tupac59 ]
Voila le problème: depuis la page précédente je POST ['log2'], dans la page suivante je récupère ce log2 dans la variable $log et cela fonctionne puis
irc : recuperation des user sur un chan [ par eragon77 ]
bonjour, voila tout est en dans le titre je cherche un script php en socket ou autre qui permet de recuperer les users d'un chan irc qui le marque su
Chat en php [ par Ramboul ]
Salut,Je cherche un tchat en php pour mon site car j'ai déja un tchat mais il requiert d'avoir l'applet java.J'aimerai qu'il redeirige vers irc.quaken
IRC ou Jabber ? [ par PIEDPIED13 ]
Bonjour Bonjour !Si j'ai bien compris :- Pour esperer avoir un chat qui tourne vraiment sur un site, il faut faire un client IRC et réserver un canal.
Verification de fichier [ par godofgames ]
Bonjour j'ai une question j'ai un site a realiser pour quelqu'un et cette personne veux pouvoir faire les modification elle meme mais elle ne veux rie
Erreur: parse error unexpected $end [ par rouliendelavegas ]
BonjourParse error: syntax error, unexpected $end in Voila l'erreur que j'ai en executant ma page licence.php , qui inclut le fichier function_licence
Tchat IRC en php [ par Ramboul ]
Salut a tous!J'aurais voulu savoir si vous conaissiez un script php comme cgi:irc pour se connecter a un réseau irc mais je voudrais comme cgi:irc mai
|
Téléchargements
Logiciels à télécharger sur le même thème :
|