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

De Hackmeeting

(Diferencias entre revisiones)
(añadido codigo final)
Revisión actual (12:19 12 oct 2009) (ver código fuente)
(Código inicial: cambiado por el real)
 
Línea 3: Línea 3:
<pre>
<pre>
#!/usr/bin/perl
#!/usr/bin/perl
-
# Este es un Bot de IRC preparado para hacer de moderador en asambleas
+
# este es un bot de irc preparado para hacer de moderador en asambleas
use warnings;
use warnings;
use strict;
use strict;
-
use POE;
+
package Bot;
-
use POE::Component::IRC;
+
use base 'Bot::BasicBot';
-
use Getopt::Long;
+
-
# Información de conexión
+
# Recibir mensages enviados en publico a un canal
-
my $nickname = 'moderador';
+
sub said {
-
my $username = 'moderador';
+
    my ($self, $msg) = @_;
-
my $ircname  = 'El sumo moderador';
+
-
my $server  = 'irc.freenode.net';
+
-
my $port    = '6667';
+
-
my $channel  = '#hackmeeting';
+
-
# Parsear los parámetros
+
    $self->say(channel => $msg->{channel}, body => "Poco me importa que " . $msg->{body});
-
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
+
# Recibir mensages enviados con /me
-
my ($irc) = POE::Component::IRC->spawn();
+
sub emoted {
 +
    my ($self, $msg) = @_;
-
# Crea la sesión, indicandole los eventos que queremos que atienda
+
    $self->emote(channel => $msg->{channel}, body => "le importa un carajo que " . $msg->{body});
-
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
+
package main;
-
sub on_public {
+
-
    my ($kernel, $who, $where, $msg) = @_[KERNEL, ARG0, ARG1, ARG2];
+
-
    my $nick = (split /!/, $who)[0];
+
-
}
+
-
# Envia texto a un canal o usuario
+
# información de conexion
-
sub send_text {
+
my $nickname = 'moderador';
-
    my ($who, $txt) = @_[0, 1];
+
my $server  = 'irc.freenode.net';
 +
my $port    = '6667';
 +
my $channel  = '#hackmeeting';
-
    foreach (split("\n", $txt)) {
+
my $bot = Bot->new(
-
        $irc->yield(privmsg => $who, $_);
+
    server    => $server,
-
     }
+
    port      => $port,
-
}
+
     channels  => [$channel],
-
 
+
    nick      => $nickname,
-
# Ejecutar el bot hasta que termine
+
);
-
$poe_kernel->run();
+
$bot->run();
-
exit 0;
+
</pre>
</pre>

Revisión actual

Código inicial

#!/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';

# Recibir mensages enviados en publico a un canal
sub said {
    my ($self, $msg) = @_;

    $self->say(channel => $msg->{channel}, body => "Poco me importa que " . $msg->{body});
}

# Recibir mensages enviados con /me
sub emoted {
    my ($self, $msg) = @_;

    $self->emote(channel => $msg->{channel}, body => "le importa un carajo que " . $msg->{body});
}


package main;

# información de conexion
my $nickname = 'moderador';
my $server   = 'irc.freenode.net';
my $port     = '6667';
my $channel  = '#hackmeeting';

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

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