Discussion utilisateur:Denis Dordoigne/Modifications récentes

Le contenu de la page n’est pas pris en charge dans d’autres langues.
Une page de Wikipédia, l'encyclopédie libre.
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;