Discussion utilisateur:Denis Dordoigne/Modifications récentes

Ce premier projet de suivi en direct des modifications récentes est obsolète et n'est plus maintenu (voir la page d'explication pour l'histoire)


© Denis Dordoigne, avril 2005 Modèle:GPL

#!/usr/bin/perl -w

use Net::IRC;
use strict;
use Encode;

my $irc = new Net::IRC;

# repertoire des logs
my $replog='/tmp';


# connexion vers le serveur a propager
my $irc_cx = $irc->newconn
    (
     Server   => 'irc.wikimedia.org',
     Nick     => 'passerelle'
     );

# canal a copier
my $chan = '#fr.wikipedia';


# connexion vers le serveur bitlbee
my $bitlbee_cx = $irc->newconn
    (
     Server   => 'localhost',
     Nick     => 'bitlebot'
     );

# mot de passe sur bitlbee
my $bitlbee_passwd = "tu me crois assez distrait pour le laisser ?";


# numero de compte des connexions
my %bitlbee_con = 
(
    JABBER => 2,
    YAHOO  => 0,
    MSN    => 1
 );

# liste des bots déclarés le 12/04/2006
my @bots = ('AlphaBot','Badmood','Chlewbot','Chobot','CyeZBot','DasBot','Diderobot','Eskimbot','Fabbot','FlaBot','Gpvosbot','HasharBot','Hexabot','KocjoBot','Koyuki','Loveless','MMBot','MagnetiK-BoT','MedBot','MisterMatt','MoriBot','Orthogaffe','PieRRoBoT','Probot','Robbot','RobotE','RobotQuistnix','SashatoBot','Solbot','StéBot','Ugur','YurikBot','Zwobot');


# listes d'utilisateurs de la passerelle
my @receivers_ip;  # recoivent les contributions d'ip
my @receivers_bot; # recoivent les contributions de bots
my @receivers_usr; # recoivent les contributions d'utilisateurs enregistres


# renvoie la position d'un element dans un tableau de chaines
sub array_find
{
    # arguments : ref de tableau, element a trouver
    my ($arrayref, $elt) = @_;

    # on parcourt le tableau jusqu'à que l'element soit trouve
    my $i = 0;
    for ( my $i = 0; $i < @$arrayref ; $i++)
    {
	return $i if ($$arrayref[$i] eq $elt)
    }

    # l'element n'etait pas dans le tableau, on renvoie -1
    return -1;
}


# ajoute un element dans un tableau de chaines en evitant les doublons
sub array_add
{
    # arguments : ref de tableau, element a ajouter
    my ($arrayref, $elt) = @_;
    
    # on sort si l'element est deja dans le tableau
    return 0 if (-1 != array_find($arrayref, $elt));
    
    # on ajoute l'element au tableau
    return push(@$arrayref, $elt);
}

# enleve un element d'un tableau de chaines
sub array_remove
{
    # arguments : ref de tableau, element a trouver
    my ($arrayref, $elt) = @_;
    
    # on recupere l'indice de l'element dans le tableau
    my $pos = array_find($arrayref, $elt);

    # on sort si l'element n'est pas dans le tableau
    return 0 if ($pos == -1);
    
    # on supprime l'element du tableau
    return splice(@$arrayref, $pos, 1);
}


sub loguer
{
    my $jour    = substr("0".(localtime)[3],-2);
    my $mois    = substr("0".((localtime)[4]+1),-2);
    my $heure   = substr("0".(localtime)[2],-2);
    my $minutes = substr("0".(localtime)[1],-2);
    
    open FICLOG,">>$replog/$_[0].log" or return;
    print FICLOG "[$jour/$mois $heure:$minutes] $_[1]\n";
    close FICLOG;
}

# Evenement: connexion reussie a bitlbee
sub on_bitlbee_connect
{
    my $self = shift;
    
    # on rejoint le canal bitlbee
    $self->join('&bitlbee');

    # on s'identifie
    $self->privmsg('&bitlbee', "identify $bitlbee_passwd");
        
    # on remplit le log de connexions
    &loguer("connexion","Session debut bitlbee");
}

# Evenement: connexion reussie a irc
sub on_irc_connect
{
    my $self = shift;
    
    # on rejoint le canal irc a copier
    $self->join($chan);
    
    # on remplit le log de connexions
    &loguer("connexion","Session debut irc");
}



# Evenement: Message recu par messagerie
sub on_msg
{
    my ($self, $event) = @_;
    my $nick = $event->nick;
    my ($requete) = ($event->args);

    # reponse type aux distraits
    my $reponse = 'demande incomprise ou inutile';
    
    # on ignore la casse
    $requete = lc($requete);

    
    ### "stop" -> arret du suivi
    if ($requete eq 'stop')
    {
	# retrait de toutes les listes
	array_remove(\@receivers_bot, $nick);
	array_remove(\@receivers_ip, $nick);
	array_remove(\@receivers_usr, $nick);

	$reponse = 'taper "bot+", "usr+" ou "ip+" pour reprendre';
    }


    ### "bot+" -> ajout du suivi des bots
    elsif ($requete eq 'bot+')
    {
	$reponse = 'les bots sont maintenant suivis'
	    if (array_add(\@receivers_bot, $nick))
    }

    ### "bot-" -> arret du suivi des bots
    elsif ($requete eq 'bot-')
    {
	$reponse = 'les bots ne sont plus suivis'
	    if (array_remove(\@receivers_bot, $nick));
    }

    ### "ip+" -> ajout du suivi des ip
    elsif ($requete eq 'ip+')
    {
	$reponse = 'les ip sont maintenant suivies'
	    if (array_add(\@receivers_ip, $nick))
    }

    ### "ip-" -> arret du suivi des ip
    elsif ($requete eq 'ip-')
    {
	$reponse = 'les ip ne sont plus suivies'
	    if (array_remove(\@receivers_ip, $nick));
    }


    ### "usr+" -> ajout du suivi des utilisateurs enregistres
    elsif ($requete eq 'usr+')
    {
	$reponse = 'les utilisateurs enregistres sont maintenant suivis'
	    if (array_add(\@receivers_usr, $nick))
    }

    ### "usr-" -> arret du suivi des utilisateurs enregistres
    elsif ($requete eq 'usr-')
    {
	$reponse = 'les utilisateurs enregistres ne sont plus suivis'
	    if (array_remove(\@receivers_usr, $nick));
    }

    # on logue le message et sa reponse
    &loguer("messages","$nick: $requete\n\t->$reponse");
    
    # on envoie la reponse
    $self->privmsg($nick, $reponse);
}



# Evenement: Message sur le canal surveille
sub on_irc_msg
{
    my ($self, $event) = @_;
    my ($text) = ($event->args);

    # reference vers le tableau des destinataires
    my $receivers;
    
    # on supprime les couleurs
    $text =~ s!\003\d{0,2}!!g;

    # on recode en latin1
    Encode::from_to($text, "UTF-8", 'iso-8859-1');

    # on recupere le nom du wikipedien ayant fait la modification
    my ($wikipedien) = ($text =~ / \* (.+?) \* /);

    # il s'agit d'un bot, on transmet aux interesses
    if (array_find(\@bots, $wikipedien) != -1)
    {
	$receivers = \@receivers_bot;
    }
    
    # il s'agit d'une ip (ou ressemblant)
    elsif ($wikipedien =~ /^[0-9.]+$/)
    {
	$receivers = \@receivers_ip;
    }

    # il s'agit d'un utilisateur enregistre
    else
    {
	$receivers = \@receivers_usr;
    }

    # on transmet le texte aux concernes
    foreach my $receiver (@$receivers)
    {
	$bitlbee_cx->privmsg($receiver, $text);
    }
}

# Evenement: Message sur le canal bitlbee
sub on_bitlbee_msg
{
    my ($self, $event) = @_;
    my ($text) = ($event->args);

    # si c'est une requete, on l'accepte
    if ($text =~ /New request/)
    {
	$self->privmsg('&bitlbee', 'yes');
    }

    # si c'est un message d'utilisateur inconnu, on ajoute celui-ci
    elsif ($text =~ /^([A-Z]+) - Message from unknown handle (.+?):$/)
    {
	my ($protocole, $user) = ($1, $2);

	# on recupere le numero de compte pour ce protocole
	my $account_number = $bitlbee_con{$protocole};

	# on ajoute l'utilisateur
	$self->privmsg('&bitlbee', "add $account_number $user");
	    

	# on remplit le log des utilisateurs
	&loguer('utilisateurs',"ajout de $user ($protocole)");
    }

    else
    {
	# on remplit le log de messages de bitlbee
	&loguer("bitlbee",$text);
    }
}


# Evenement: quelqu'un rejoint le canal bitlbee
sub on_bitlbee_join
{
    my ($self, $event) = @_;
    my $nick = $event->nick;

    # on ignore root et soi-meme
    return if ($nick eq 'root' || $nick eq $self->nick);

    # on l'ajoute aux recepteurs par defaut
    array_add(\@receivers_ip, $nick);
    array_add(\@receivers_usr, $nick);

    # on remplit le log des utilisateurs
    &loguer('utilisateurs',"arrivee de $nick");
}

# Evenement: quelqu'un quitte le canal bitlbee
sub on_bitlbee_part
{
    my ($self, $event) = @_;
    my $nick = $event->nick;

    # on l'enleve des listes de recepteurs
    array_remove(\@receivers_bot, $nick);
    array_remove(\@receivers_ip, $nick);
    array_remove(\@receivers_usr, $nick);
    

    # on remplit le log des utilisateurs
    &loguer('utilisateurs',"depart de $nick");
}


# Connexion irc morte
sub on_irc_disconnect
{
    &loguer('connexion', 'irc mort');
    # on tente un retour
    $irc_cx->connect();
}

# Connexion morte
sub on_bitlbee_disconnect
{
    &loguer('connexion', 'bitlbee mort');
}

$irc_cx->add_handler('public', \&on_irc_msg);
$bitlbee_cx->add_handler('public', \&on_bitlbee_msg);

$irc_cx->add_handler('disconnect', \&on_irc_disconnect);
$irc_cx->add_handler(376, \&on_irc_connect);

$bitlbee_cx->add_handler('disconnect', \&on_bitlbee_disconnect);
$bitlbee_cx->add_handler(376, \&on_bitlbee_connect);

$bitlbee_cx->add_handler('join', \&on_bitlbee_join);
$bitlbee_cx->add_handler('quit', \&on_bitlbee_part);
$bitlbee_cx->add_handler('msg', \&on_msg);

$irc->start;
Retour à la page de l’utilisateur « Denis Dordoigne/Modifications récentes ».