Jump to content

Manuel:Robot IRC RC

From mediawiki.org
This page is a translated version of the page Manual:IRC RC Bot and the translation is 100% complete.

Cette page contient les informations permettant de créer un robot IRC qui affiche les modifications récentes (RC - Recent Changes) de votre wiki.

LocalSettings.php

Ajoutez ce qui suit à votre fichier de paramètres locaux (voir $wgRCFeeds ) :

// IRC # port: 1338
$wgRCFeeds['ircfeed'] = array(
    'formatter' => 'IRCColourfulRCFeedFormatter',
    'uri' => 'udp://127.0.0.1:1338',
    'add_interwiki_prefix' => false,
    'omit_bots' => true,
);

SOCAT et ircII (ou autre client cli irc similaire)

Utiliser socat au lieu de netcat. Certaines versions de netcat (sur Debian au moins) cessent d'écouter après avoir reçu la première entrée RC, parce que le wiki change de port pour envoyer le paquet UDP.

socat -T5 - udp4-listen:1338,reuseaddr,fork | ircII -d -c \#<channel> <nick> <irc_server>

Utiliser -T5 pour spécifier un délai (5 secondes ici) après quoi chaque connexion UDP sera fermée pour cause d'inactivité. Sinon, l'option fork créera de plus en plus de processus pour chaque connexion, jusqu'à atteindre potentiellement la limite de déclaration de fichiers ouverts ou épuisant les ressources de votre serveur.

Habituellement il est déclaré dans un script qui s'exécute en tâche de fond, ou dans une fenêtre de commande telle que GNU Screen ou tmux que vous pouvez détacher et laisser s'exécuter en arrière plan.

Si vous voyez que les entrées des changements récents s'impriment sur la console irc mais pas sur le canal, vous devrez peut-être configurer un fichier ~/.ircrc avec des commandes pour basculer l'entrée sur la vue du canal. Par exemple :

WAIT -CMD JOIN #<channel>
WAIT -CMD WINDOW CHANNEL #<channel>

Perl et ircII

Prérequis

Nécessite ircII que vous pouvez télécharger depuis eterna.com.au. Il se trouve dans presque tous les packages des distributions Linux prête à être l'installation.

Ce script Perl nécessiste également POE que vous pouvez éventuellement ne pas trouver installé sur votre système.

POE peut être installé via le shell CPAN qui doit être présent sur votre système.

  % perl -MCPAN -e shell
  cpan> install POE

Lorsque le CPAN est lancé pour la première fois, il vous posera une série de questions, mais les valeurs par défaut semblent bien fonctionner. Cependant j'ai eu un problème avec certains sites FTP qui n'ont pas le fichier POE, alors j'ai cherché ceux aux États-Unis et ils l'avaient.

Vous constaterez peut-être que POE ne s'installe pas avec un message indiquant qu'il ne peut pas être installé à moins que le forcer car un certain nombre de tests ont échoué. Vous voudrez peut-être vérifier la gravité de ces erreurs, mais il est possible de passer outre avec la syntaxe suivante.

 cpan> force install POE

Utilisation

Exécutez cette commande sur l'ordinateur qui reçoit :

./UDPserver.pl <port> | ircII -d -c \#<channel> <nick> <irc_server>

Dans les entrées ci-dessus utilisées dans votre fichier LocalSettings.php ‎<port> vaudrait 1338.

UDPserver.pl

#!/usr/bin/perl

use warnings;
use strict;

use POE;
use IO::Socket::INET;

use constant DATAGRAM_MAXLEN => 1024;

if (!$ARGV[0]) {
  print "Usage: $0 <port>\n";
  exit;
}

select((select(STDOUT), $|=1)[0]);

POE::Session->create(
    inline_states => {
        _start       => \&server_start,
        get_datagram => \&server_read,
      }
);

POE::Kernel->run();
exit;

sub server_start {
    my $kernel = $_[KERNEL];

    my $socket = IO::Socket::INET->new(
        Proto     => 'udp',
        LocalPort => $ARGV[0],
    );

    die "Couldn't create server socket: $!" unless $socket;
    $kernel->select_read( $socket, "get_datagram" );
}

sub server_read {
    my ( $kernel, $socket ) = @_[ KERNEL, ARG0 ];
    recv( $socket, my $message = "", DATAGRAM_MAXLEN, 0 );
    print STDOUT "$message";
}

Python

Prérequis

  • Tordu

Le script est entièrement contenu et ne nécessite donc pas IRCII.

Exécution

Après l'avoir configuré vous pouvez l'exécuter en utilisant python udpserver.py.

udpserver.py

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
from twisted.words.protocols import irc
from twisted.internet import protocol
import sys

recver = None

class RCBot(irc.IRCClient):
    nickname = "rc"
    channel = "#wikirc"
    def signedOn(self):
        global recver
        self.join(self.channel)
        print "Signed on as %s." % (self.nickname,)
        recver = self

    def joined(self, channel):
        print "Joined %s." % (channel,)

    def gotUDP(self, broadcast):
        self.msg(self.channel, broadcast)

class RCFactory(protocol.ClientFactory):
    protocol = RCBot

    def clientConnectionLost(self, connector, reason):
        print "Lost connection (%s), reconnecting." % (reason,)
        connector.connect()

    def clientConnectionFailed(self, connector, reason):
        print "Could not connect: %s" % (reason,)

class Echo(DatagramProtocol):

    def datagramReceived(self, data, (host, port)):
        global recver
        recver.gotUDP(data)

reactor.listenUDP(33333, Echo())
reactor.connectTCP("localhost", 6667, RCFactory())
reactor.run()

Configuration

  • reactor.listenUDP(33333, Echo()) : remplacez le 33333 par votre port UDP dans LocalSettings.php
  • reactor.connectTCP("localhost", 6667, RCFactory()): modifiez le serveur IRC ici
  • Vous pouvez changer le pseudo et le canal dans la classe RCBot

Mises en garde

Actuellement, n'importe qui peut prendre la main sur votre robot en envoyant des paquets au port que vous avez spécifié. On peut réparer cela avec les tables des adresses IP.

Cependant, à long terme, un robot plus complexe devrait être écrit pour permettre des restrictions et peut-être plus de choses encore.

Voir aussi