Deblan blog

Développement

Aptana, mon nouvel IDE pour le web

J'ai découvert ce matin un IDE dédié au web. C'est ni plus ni moins qu'Aptana, un logiciel open source, basé sur Eclipse.

J'ai longtemps travaillé sur Dreamweaver car il offrait des outils d'aide à la rédaction du code. Aptana offre ces mêmes outils, mais nettement plus développés et contrairement à Dreamweaver, javascript se voit lui aussi doter d'un "menu contextuel".

Php, comme Ruby on rails, Python ou encore les systèmes GIT et SVN sont des modules complémentaires à installer sur la plateforme (il en existe d'autres), ce qui permet d'avoir un outil adapté à nos besoins.

Aussi, il permet l'intégration de librairies telles que jquery et permet à l'utilisateur d'utiliser leurs fonctions et leurs méthodes facilement.

Étant muti-plateforme, cet outil est vraiment idéal.

Deblan Aptana
Au fait....200ème billet ^^

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

Hello ^^

Je suis sans doute lourd avec ça, mais je suis certain que comme il y a une époque, des gens chercheront un bot en php pour irc.

Une grosse refonte du code du bot vient d'être effectuée ce soir.

Le script se découpe en 5 parties :

  • Une class de gestion des exceptions.
  • Une class qui gère la connexion vers le serveur.
  • Une class qui gère le bot, ses actions...Sachant que ce n'est plus un bot qui génère automatiquement des stats. C'est avant tout un bot de services.
  • Une class de gestion des stats, qui est extends de celle du bot. C'est quand on appelle le bot et qu'on définie si oui ou non ou veut une génération de stats et que cet objet est appelé.
  • Enfin, le script qui fait joujou avec tout ça.

Chez moi, c'est pour l'instant sur la même page : http://wall.deblan.fr/1224693787/php/1/

Les paramètres sont les même que pour la version précédente, à l'exception de -chans qui devient -channels et -enable_stats qui a été ajouté et qui peut être à on ou off.

Il y a des trucs à faire dessus, surtout coté optimisation. Je vous invite à participer

Script full open source bien sûr...

Code corrigé !


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

    }

}