Irc Bot POE::Component::IRC::Service::P10

Résolu
Loveurs Messages postés 6 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 23 décembre 2008 - 2 déc. 2008 à 01:30
Loveurs Messages postés 6 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 23 décembre 2008 - 6 déc. 2008 à 03:00
Bonjour,


J'ai actuellement un service irc comme ci dessous :

 

Code :
 
#!/usr/bin/perl -w
 
use POE;
use POE::Component::IRC::Service;
use Getopt::Long;
use Data::Dumper;
 
my($servername) = "Services.******.net";
my($servernumeric) = "50";
my($serverdesc) = "Gestion Service";
my($password) = "*****************";
my($remoteserver) = "*********";
my($serverport) = "4400";
my($nickname) = "M";
my($help) = 0;
my($version) = "**************";
my($his_servername);
my($his_serverinfo);
 
GetOptions("servername=s" => \$servername,
"numeric=s" => \$servernumeric,
"description=s" => \$serverdesc,
"password=s" => \$password,
"remote=s" => \$remoteserver,
"port=s" => \$serverport,
"nickname=s" => \$nickname,
"hisservername=s" => \$his_servername,
"hisserverinfo=s" => \$his_serverinfo,
"help" => \$help);
 
open (LOGFILE,">>service.log")or die;
select LOGFILE;
$|=1;
 my($object) POE::Component::IRC::Service->new('Service','P10', { ServerNumeric> $servernumeric, ServerName => $servername, ServerDesc => $serverdesc, Password => $password, RemoteServer => $remoteserver, ServerPort => $serverport, Version => $version, Debug => 1, HIS_SERVERNAME => $his_servername, HIS_SERVERINFO => $his_serverinfo})or die "OOps: $!\n";
 
POE::Session->create
(
inline_states =>
{
_start => \&client_start,
_default => \&default,
 
irc_p10_invite => \&on_invite,
irc_p10_nick => \&on_nick,
irc_p10_join => \&on_join,
irc_p10_connected => \&on_connected,
irc_p10_disconnected => \&on_disconnected,
irc_p10_server_link => \&on_server_link,
irc_p10_squit => \&on_squit,
irc_p10_create => \&on_create,
irc_p10_eob_ack => \&on_ack,
},
heap =>
{
Object => $object,
NickName => $nickname,
ServerNumeric => $servernumeric,
ServerName => $servername,
ServerDescription => $serverdesc,
ServerPassword => $password,
RemoteServer => $remoteserver,
ServerPort => $serverport
},
 
);
 
$poe_kernel->run();
exit 0;
 
sub client_start {
 
foreach($_[HEAP]->{Object}->_dump_state()){
print STDERR"$_\n";
}
$_[HEAP]->{start_time} = time();
print LOGFILE "Registering events\n";
$_[KERNEL]->post( Service => register => "all");
print LOGFILE "Adding Service client\n";
$_[KERNEL]->post( Service => addnick =>
{
NickName => $_[HEAP]->{NickName},
Umode => "odkr"
});
$_[HEAP]->{connected} = 0;
}
 
sub on_ack {
my($heap) = $_[HEAP];
 
print LOGFILE Dumper($heap->{Object});
}
 
sub on_server_link {
$_[HEAP]->{linkserver} = $_[ARG0];
}
 
sub on_squit {
my($kernel,$heap,$what) = @_[KERNEL,HEAP,ARG1];
 
my($server) = ( split / /, $what)[0];
 
print STDERR"$server\n";
print STDERR$heap->{linkserver} . "\n";
}
 
sub on_connected {
 
print LOGFILE "Connected\n";
$_[HEAP]->{connected} = 1;
}
 
sub on_disconnected {
 
print LOGFILE "Disconnected\n";
print LOGFILE "Reconnecting\n";
$_[HEAP]->{connected} = 0;
$_[KERNEL]->post( Service => 'connect');
}
 
sub default {
my($state, $event, $args, $heap) = @_[ STATE, ARG0, ARG1, HEAP ];
$args ||= [];
print LOGFILE "$state = $event (@$args)\n";
return 0;
}
 
sub on_invite {
my($kernel, $channel) = @_[KERNEL,ARG2];
 
$kernel->post( Service => join => $_[HEAP]->{BotNumeric} => $channel);
}
 
sub on_join {
my($kernel, $who, $where) = @_[KERNEL,ARG0,ARG1];
 
 
if($who eq $_[HEAP]->{BotNumeric}){
$kernel->post(Service => opmode => $where => "+o" => $who);
}
}
 
sub on_nick {
my($heap,$state,$who,$args) = @_[HEAP,STATE,ARG0,ARG1];
 
if($who =~ /^.{2}$/ andnot defined ($heap->{BotNumeric})){
my($oper,$authname);
my($first,$second) = split(/ :/,$args,2);
my(@args) = split(/ /,$first);
if($#args > 1 and $args[0] eq $heap->{NickName}) {
$heap->{BotNumeric} = $args[$#args];
$_[KERNEL]->post( Service => join => $heap->{BotNumeric} => "#security");
}
}
print LOGFILE "$state = $who : $args\n";
}
 
sub on_create {
my($kernel,$heap,$who) = @_[KERNEL,HEAP,ARG0];
 
if($who eq $heap->{BotNumeric}andnot$heap->{connected}){
print LOGFILE Dumper($heap->{Object});
print LOGFILE "Connecting to IRC Network (Hopefully)\n";
$kernel->post( Service => 'connect');
}
}
 
 


1: Voila je voudrez savoir comment faire pour envoyer un message sur un salon quand une personne rejoint un salon ?


2: Je voudrez savoir comment faire la commande !help uniquement sur le salon #test et ça répond sur le salon ok ?


Pouvez vous m'aider ?

Merci.

4 réponses

cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
2 déc. 2008 à 08:20
J'imagine que ce code n'est pas de toi ? Et que tu n'as pas consulté l'aide de POE::Component::IRC ?
Qu'est-ce qui te bloque exactement ? Qu'as-tu essayé qui n'a pas marché ? Quelles sont les erreurs que tu rencontres ?
3
litelkiki Messages postés 1 Date d'inscription mardi 26 août 2003 Statut Membre Dernière intervention 2 décembre 2008
2 déc. 2008 à 16:19
Désolé j'ai demander a un amie de poster a ma place !

J'ai ajouter : irc_p10_public => \&on_public,
POE::Session->create
(
inline_states =>
{
_start => \&client_start,
_default => \&default,
 
irc_p10_invite => \&on_invite,
irc_p10_nick => \&on_nick,
irc_p10_join => \&on_join,
irc_p10_connected => \&on_connected,
irc_p10_disconnected => \&on_disconnected,
irc_p10_server_link => \&on_server_link,
irc_p10_squit => \&on_squit,
irc_p10_create => \&on_create,
irc_p10_eob_ack => \&on_ack,
irc_p10_public => \&on_public,
},

Et voici mon bout de code que j'ai crée :

sub on_public {
my ( $kernel, $who, $where, $msg ) = @_[ KERNEL, ARG0, ARG1, ARG2 ];
my $channel = $where->[0];

if ( $msg =~ /^!help (.+)/ ) {
# Send a response back to the server.
$kernel->post( Service => privmsg => $channel, "ok" );
}
}

Voila mais rien ce fait sur le salon !!!!
3
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
5 déc. 2008 à 07:40
C'est du debugging de base, mais tu as essayé de mettre un "echo" ou un "print" (je sais plus ce qu'on utilise en Perl) au dessus de chaque ligne pour voir où ça bloque dans ton "sub" ? (le hook doit fonctionner j'imagine).

Je viens de regarder l'aide de POE::Component::IRC::Service::P10, et il me semble que ta syntaxe n'est pas OK pour ton "privmsg" :-)
Regarde les exemples qu'ils donnent ici : http://search.cpan.org/dist/POE-Component-IRC-Service/lib/POE/Component/IRC/Service/P10.pm

* : privmsgSends a public or private message to the nick(s) or channel(s) which
you specify. Takes 3 arguments: the numeric of the issuing client, the
numeric or channel to send a message to (use an array reference here to
specify multiple recipients), and the text of the message to send.

<dt>Et là tu n'en as que deux, $channel et ton message. Par contre je ne sais pas comment est initialisée "$botnumeric" dans leur exemple en haut ; est-ce une variable accessible partout ou juste un exemple, je ne sais pas.
Bon courage,
3
Loveurs Messages postés 6 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 23 décembre 2008
6 déc. 2008 à 03:00
Salut pada,

merci de ta réponse, malheureusement nous avons préférer change de système d'ircd, Nous somme passer sous inspircd, mais je pense que ton site va nous aider quand même celons ce que j'ai plus voir.

Quand notre réseaux sera fini je te contacterez par MP si tu souhaite venir voir !

Bonne fin de soirée à toi & à plus tard
3
Rejoignez-nous