Manuel:Robot IRC RC
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.phpreactor.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.