2009/Nodos/Dojo de programación/Documentación

De Hackmeeting

Código inicial

#!/usr/bin/perl
# Este es un Bot de IRC preparado para hacer de moderador en asambleas

use warnings;
use strict;

use POE;
use POE::Component::IRC;
use Getopt::Long;

# Información de conexión
my $nickname = 'moderador';
my $username = 'moderador';
my $ircname  = 'El sumo moderador';
my $server   = 'irc.freenode.net';
my $port     = '6667';
my $channel  = '#hackmeeting';

# Parsear los parámetros
my $help;
usage() if ( ! GetOptions('help|h'      => \$help,
                          'nick|n=s'    => \$nickname,
                          'user|u=s'    => \$username,
                          'irc|i=s'     => \$ircname,
                          'server|s=s'  => \$server,
                          'port|p=s'    => \$port,
                          'channel|c=s' => \$channel)
             or defined $help );
sub usage {
    print "usage: moderador [--nick|-n nickname] [--user|-u username]
                            [--irc|-i ircname] [--server|-s server]
                            [--port|-p port] [--channel|-c channel]
                            [--help|-h]\n";
    exit 1;
}

# Crea el componente de IRC
my ($irc) = POE::Component::IRC->spawn();

# Crea la sesión, indicandole los eventos que queremos que atienda
POE::Session->create(
    inline_states => {
        _start            => \&bot_start,
        irc_001           => \&on_connect,
        irc_public        => \&on_public,
        irc_join          => \&on_join,
        irc_nick          => \&on_nick,
        irc_part          => \&on_part,
        irc_quit          => \&on_part,
        irc_ctcp_action   => \&on_me,
    },
);

# Al iniciar la sesion, conectarse al servidor
sub bot_start {
    $irc->yield(register => "all");
    $irc->yield(
        connect => {
            Nick     => $nickname,
            Username => $username,
            Ircname  => $ircname,
            Server   => $server,
            Port     => $port,
        }
    );
}

# Una vez este conectado al servidor conectarse al canal
sub on_connect {
    $irc->yield(join => $channel);
}

# Recibir mensages enviados en publico a un canal
sub on_public {
    my ($kernel, $who, $where, $msg) = @_[KERNEL, ARG0, ARG1, ARG2];
    my $nick = (split /!/, $who)[0];
}

# Envia texto a un canal o usuario
sub send_text {
    my ($who, $txt) = @_[0, 1];

    foreach (split("\n", $txt)) {
        $irc->yield(privmsg => $who, $_);
    }
}

# Ejecutar el bot hasta que termine
$poe_kernel->run();
exit 0;

Codigo final

#!/usr/bin/perl
# este es un bot de irc preparado para hacer de moderador en asambleas

use warnings;
use strict;

package Bot;
use base 'Bot::BasicBot';
my @turnos;
my $currentUser='';

# Evento que se lanza cuando alguien escribe en el canal.                                   
sub said {
    my ($self, $msg) = @_;

    if ($msg->{body} eq "." && $msg->{who} eq $currentUser)  {
    	if (@turnos) {
	     $currentUser = shift(@turnos);
       	     $self->say(channel => $msg->{channel}, body => "Cambio de turno. Ahora le toca a $currentUser");
	} else {
	     $self->say(channel => $msg->{channel}, body => "No hay mas palabras pedidas.");
	}
	    
    }
    else{
    	if ($msg->{body} eq "."){
		$self->say(channel => $msg->{channel}, body => "No hackees el bot");
    	}
    }

    # El bot responde.
    $self->say(channel => $msg->{channel}, body => "Poco me importa que $msg->{who} diga $msg->{body}");
}

# Rutina para añadir un usuario a la lista de turnos
sub adduser {
    my ($self, $user, $channel) = @_;
    #Si nadie tiene la palabra, se le da la palabra directamente 
    if ($currentUser eq "") {
    	$self->say(channel => $channel, body => "$currentUser");
    	$currentUser = $user;
	$self->say(channel => $channel, body => "Tiene la palabra $currentUser");
	return;
    }
    
    foreach (@turnos) {
       if ($_ eq $user) {
       	   $self->say(channel => $channel, body => "No seas pesado");
	   return;
       }
    }
    push(@turnos, $user);
    $self->say(channel => $channel, body => "Turnos: @turnos");
}

# Evento que se lanza cuando alguien escribe con /me en el canal.
sub emoted {
    my ($self, $msg) = @_;

    # El bot escribe un /me.
    if ($msg->{body} eq 'pide palabra') {
        $self->say(channel => $msg->{channel}, body => "$msg->{who} ha pedido palabra");
	$self->adduser($msg->{who}, $msg->{channel});
        # push(@turnos, $msg->{who});        	
    } else {
        $self->emote(channel => $msg->{channel}, body => "se rasca la tripa cuando $msg->{who} $msg->{body}");
    }
}



package main;

# informacion de conexion
my $nickname = 'moderador';
my $server   = 'irc.localhost';
my $port     = '6667';
my $channel  = '#hackmeeting';

my $bot = Bot->new(
    server    => $server,
    port      => $port, 
    channels  => [$channel],			
    nick      => $nickname,
);

$bot->run();
Herramientas personales
wiki-navigation
project-navigation