Deblan blog

Développement

MAJ Bot IRC - Générer Stats - Php

Les modifs en version rapide
  • Correction du bug « on ne peut pas joindre un salon » (j'avais un auto-join sur unrealirc qui amenait le bot sur le #general)
  • On peut passer des paramètres au script sans modifier le code
  • Vous avez la source pour les différentes commandes kikoulol
A faire :
  • Séparer la connexion du reste
  • Faire une gestion des exceptions personnelle
  • Faire des stats sur plusieurs salons avec le même bot
  • Passer l'url du fichier de stats généré par pisg au bot (pour la commandes !stats)

MAJ

A faire :
  • Séparer la connexion du reste
  • Faire une gestion des exceptions personnelle
Source :

http://irc.deblan.fr/source.txt

Comment l'utiliser ?

Avoir la liste des paramètres:

$ ./monbot.php -help

Remplir un formulaire pour ne pas passer les paramètres sois-même:

$ ./monbot.php -form

Exemple d'utilisation :

$ ./monbot.php -serveur deblan.fr -port 6667 -chans "#general,#php" -log_file_dir /home/softs/ircstats/ -max_log_line 1000000 -nick DebStats -host localhost -mail "simon@deblan.fr" -pisg_html_page_dir /var/www/web/public/irc.deblan.fr/public_html/stats/

Il est "combiné" à pisg dans le sens ou je génère le rendu html des stats avec. Vous pouvez biensûr en utiliser un autre.

http://irc.deblan.fr/pisg.cfg.txt

Pour lancer le bot en tâche de fond (et si vous êtes logé en ssh depuis une autre machine par exemple) :
nohup ./bot.php -ensemble des paramètres 1> _bot.log 2>_bot.err &
  • _bot.log = le fichier où seront stockées les lignes écrites par le bot, 1 étant la sortie logiciel
  • _bot.err = le fichier où seront stockées les lignes écrites en cas d'erreur, 2 étant la sortie erreur logiciel

open source


Enfin les stats irc...

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.php 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 ?!

!/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()."rn");
    }
  }
  
  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']."rn");
        fwrite($this->connexion, 'NICK '.$this->irc_log_cfg['nick']."rn");
        fwrite($this->connexion, 'JOIN '.$this->irc_log_cfg['salon']."rn");
        
        while (!feof($this->connexion)) {
          $line = fgets($this->connexion, 1024);
          echo $line;
          $this->ananlyseLine($line);
        }
        
      } catch (Exception $e) {
         die('Connexion au serveur impossible ! '.$errstr()."rn");
      }
    } else {
      die('Irc_log ne peut pas se lancer !'."rn");
    }
  }
  
  
  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)."rn";
  }
  
  private function userMessage($user, $message) {
    return $this->getTime().' <'.$user.'> '.$message."rn";
  }
  
  private function pong($ping) {
    fwrite($this->connexion, 'PONG '.$ping);
  }
  
  private function sendNotice($nick) {
    fwrite($this->connexion, 'NOTICE '.$nick.' Pas de notice pour les bots...'."rn");
  }
  
  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();
?>


Config de pisg
<channel="#general">
   Logfile="/var/www/web/public/irc.deblan.fr/public_html/log_irc.txt"
   Format="mIRC"
   Network="deblan.fr"
   OutputFile="/var/www/web/public/irc.deblan.fr/public_html/stats.html"
   Lang = "FR"
   Maintainer= "DebStats de Simon"
   ShowActiveTimes = "1"
   ShowWords = "0"
   ShowWpl = "1"
   ShowCpl = "1"
   ShowBigNumbers = "1"
   ShowLastSeen = "1"
   ShowTime = "1"
   ShowLineTime = "1"
   ShowRandQuote = "1"
   ShowLegend = "1"
   ShowActionLine = "1"
   ShowShoutLine = "1"
   ShowMuw="0"
   ShowMru="0"
   ShowMostNicks = "1"
   ShowOps= "1"
   ShowMrn= "1"
   ShowMostNicks= "1"
   MostNicksHistory = "5"
   ShowMostActiveByHour= "1"
   ShowMostActiveByHourGraph= "1"
   MinQuote = "2"
   ActiveNicks = "20"
   ActiveNicks2= "20"
   ActiveNicksByHour= "10"
   MostNicksVerbose = "150"
   TopicHistory= "4"
   UrlHistory= "5"
   ShowKarma="1"
   ShowSmileys="1"
   SmileyHistory="15"
   ShowActiveGenders="1"
   ShowVoices = "1"
</channel>


Config de crontab :
*/2  *  *  *  *     /chemin/vers/stats/pisg-X.XX/pisg

Les vraies vancances arrivent donc....

classVacances{

    publicfunction__construct(){

....il faut se trouver des projets pour les occuper (a)

Cet été débutera le codage du réseau de Séries-Sources.com, donc il y a aura déjà pas mal de boulot :)

    }

    publicfunctionpannel(){

Par ailleurs, je vais développer en parallèle un panel pour les gens qui sont hébergés sur Deblan. Je vais mettre un peu de temps à le faire car je veux une application très propre développée en full objet :)

    }

    protectedfunctionproposition(){

Aussi, une proposition m'a été faite pour un site (dont je donnerai pas l'url) afin d'aider le développeur.

Enfin, j'espère me trouver un site à coder pour me faire un peu d'argent :p

    }

}


Afficher une webcam sur son site

Voila un petit tuto pour afficher l'image de sa webcam sur son site internet.

On va diviser ça en 2 parties :

  • Configuration logiciel
  • Le coté web
Configuration logiciel

Pour l'acquisition de l'image de la webcam et l'upload sur un ftp de cette même image, on va utiliser un seul et même logiciel qui est WebcamFirst.

Tout est là : http://www.webcamfirst.com/web_distri_f.php

Une fois le logiciel installé, il faut bien évidement le lancer ^^

Il faut configurer la source de la vidéo : Options > Source ; Prenez votre webcam, dans la liste déroulante.

Allons ensuite configurer le format de l'image : Options > Format.

Ensuite, il faut faire joujou avec les configs ftp : Options > Paramètres FTP.


(C'est par exemple ce que j'ai chez moi)

Pour terminer, modifier les options de l'interface principale de WebcamFirst (bidouillez par vous-même, il n'y a rien de compliqué et c'est assez explicite à mon goût) :

Le coté web

Hypothèses :

  • Page où se trouve l'aperçu de la webcam : http://www.monsite.com/webcam.html
  • Endroit où se trouve l'image de la webcam : http://www.monsite.com/webcam/photo.jpg
Création du javascript

Créer un document javascript "webcam.js" dans "/webcam/", de telle sorte que ce document soit accessible via cette url : http://www.monsite.com/webcam/webcam.js

/* note fonction javascript qui va gêrer l'affichage de l'image avec rafraichissement */
var webcam_ = 0;
function webcam() {
  if( !document.getElementById('webcam')) {
	document.write( '<div id="webcam" style="display:none;"></div>' );
	document.write( '<div id="webcam2"></div>' );  
  }
  if(document.getElementById('webcam') && document.getElementById('webcam2')) {
	var date =  new Date();
	var url = '/webcam/photo.jpg?id='+date.getHours()+date.getMinutes()+date.getSeconds();
	if(webcam_++%2 == 0) {
	  document.getElementById('webcam2').innerHTML = '<img src="'+url+'" alt="Webcam" />';
	  document.getElementById('webcam2').style.display = 'none';
	  document.getElementById('webcam').style.display = 'block';
	} else {
	  document.getElementById('webcam').innerHTML = '<img src="'+url+'" alt="Webcam" />';
	  document.getElementById('webcam').style.display = 'none';
	  document.getElementById('webcam2').style.display = 'block';	
	}
	if(webcam_==1) {
	  document.getElementById('webcam2').style.display = 'block';
	  document.getElementById('webcam').style.display = 'none';
	}
	/* 5000 = 5 secondes : vitesse de rafraichissement de l'image */
	setTimeout("webcam()", 5000);
  }
}
webcam.html

A l'endroit où vous voulez mettre l'image de la webcam :

<script type="text/javascript" src="/webcam/webcam.js"></script>
<script type="text/javascript"><!--
webcam();
 --></script>

Voila c'est terminé ^^


Php - Geolocalisation avec google

[mise à jour de l'article] En navigant sur le web ce matin, je suis tombé sur un blog qui explique comme (à travers un service google) on peut connaitre le géopositionnement d'une ville.

Cette article expliquera tout mieux que moi ^^