https://www.mediawiki.org/wiki/Special:Code/MediaWiki/106385

Revision: 106385
Author:   overlordq
Date:     2011-12-15 22:15:33 +0000 (Thu, 15 Dec 2011)
Log Message:
-----------
Commit combined udp server/irc client forwarder to repo

Added Paths:
-----------
    trunk/tools/rcbot/
    trunk/tools/rcbot/rcbot.pl

Added: trunk/tools/rcbot/rcbot.pl
===================================================================
--- trunk/tools/rcbot/rcbot.pl                          (rev 0)
+++ trunk/tools/rcbot/rcbot.pl  2011-12-15 22:15:33 UTC (rev 106385)
@@ -0,0 +1,136 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use POE qw(Component::IRC Component::IRC::Plugin::Connector);
+use IO::Socket::INET;
+
+use constant DATAGRAM_MAXLEN => 1024;
+
+my $nickname = 'rcbot' . $$;
+my $ircname  = 'RCBot for a Wiki';
+my $UDPport  = 8675;                 #UDP Port to listen on
+my $debug    = 0;                    #Only set if you really really mean it
+my $spam     = 0;                    #For High-Volume wikis, to keep up with 
RC Feed, set to 1.
+                                     #NOTE: May require special ircd 
configuration or bot may
+                                     #be disconnected for flooding.
+
+my $settings = {
+    'irc.yourserver.com'  => { port => 6667, channels => ['#WPFeed'], },
+    'irc.otherserver.com' => { port => 6667, channels => ['#OtherChan'], },
+};
+
+foreach my $server ( keys %{$settings} ) {
+    POE::Component::IRC->spawn(
+        alias   => $server,
+        nick    => $nickname,
+        ircname => $ircname,
+        Flood   => $spam,
+    );
+}
+
+POE::Session->create(
+    package_states => [
+        'main' => [
+            qw(
+                irc_start
+                irc_registered
+                irc_001
+                _default )
+        ],
+    ],
+    inline_states => {
+        _start       => \&server_start,
+        get_datagram => \&server_read,
+    },
+    heap => { config => $settings },
+);
+
+POE::Kernel->run();
+exit;
+
+sub irc_start {
+    my ( $kernel, $session ) = @_[ KERNEL, SESSION ];
+    $kernel->signal( $kernel, 'POCOIRC_REGISTER', $session->ID(), 'all' );
+    undef;
+}
+
+sub server_start {
+    my ( $kernel, $session ) = $_[KERNEL];
+
+    my $socket = IO::Socket::INET->new(
+        Proto     => 'udp',
+        LocalPort => $UDPport,
+    );
+
+    die "Couldn't create server socket: $!" unless $socket;
+    $kernel->select_read( $socket, "get_datagram" );
+    $kernel->yield('irc_start');
+    undef;
+}
+
+sub server_read {
+    my ( $kernel, $heap, $socket ) = @_[ KERNEL, HEAP, ARG0 ];
+
+    my $remote_address = recv( $socket, my $message = "", DATAGRAM_MAXLEN, 0 );
+    return unless defined $remote_address;
+
+    my ( $peer_port, $peer_addr ) = unpack_sockaddr_in($remote_address);
+    my $human_addr = inet_ntoa($peer_addr);
+    print "(server) $human_addr : $peer_port sent us $message\n" if $debug;
+
+    my $servers = $heap->{senders};
+    foreach my $alias ( keys %{$servers} ) {
+        my @channels = @{ $heap->{config}->{$alias}->{channels} };
+        $kernel->post( $alias => privmsg => $_ => $message ) for @channels;
+    }
+}
+
+sub irc_registered {
+    my ( $kernel, $heap, $sender, $irc_object ) = @_[ KERNEL, HEAP, SENDER, 
ARG0 ];
+    my $alias = $irc_object->session_alias();
+
+    print "PoCo registered\n" if $debug;
+    $heap->{senders}->{$alias} = $sender;
+
+    $heap->{connectors}->{$alias} = 
POE::Component::IRC::Plugin::Connector->new();
+    $irc_object->plugin_add( 'Connector' => $heap->{connectors}->{$alias} );
+
+    my %conn_hash = (
+        server => $alias,
+        port   => $heap->{config}->{$alias}->{port},
+    );
+
+    $kernel->post( $sender, 'connect', \%conn_hash );
+    undef;
+}
+
+sub irc_001 {
+    my ( $kernel, $heap, $sender ) = @_[ KERNEL, HEAP, SENDER ];
+
+    my $poco_object = $sender->get_heap();
+    print "Connected to ", $poco_object->server_name(), "\n" if $debug;
+
+    my $alias    = $poco_object->session_alias();
+    my @channels = @{ $heap->{config}->{$alias}->{channels} };
+    $kernel->post( $sender => join => $_ ) for @channels;
+
+    undef;
+}
+
+sub _default {
+    my ( $event, $args ) = @_[ ARG0 .. $#_ ];
+    my @output = ("$event: ");
+
+    return unless $debug;
+    foreach my $arg (@$args) {
+        if ( ref($arg) eq 'ARRAY' ) {
+            push( @output, "[" . join( " ,", @$arg ) . "]" );
+        } else {
+            push( @output, "'$arg'" );
+        }
+    }
+    print STDOUT join ' ', @output, "\n";
+    return 0;
+}
+


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to