Avatar billede hr_kenneth Nybegynder
22. september 2001 - 17:27 Der er 12 kommentarer og
1 løsning

NET::IRC

jeg har et problem. jeg er ved at skrive en bot til irc, men den vil ikke starte op. jeg bruger modulet NET::IRC, og har lavet en while løkke som sørger for at $irc->do_one_loop kører hele tiden. Der er bare det problem, at den ikke vil starte op. HVis jeg så et eller andet sted i koden skriver \"print \"\\n\"; \" så virker det indtil jeg retter et andet sted i koden. Hvad kan der være galt?
Avatar billede jakobandersen Nybegynder
22. september 2001 - 18:32 #1
Hvorfor ikke gøre det eventdriven, as in:

use Net::IRC;
use strict;
use constant  (IRCNAME => \'Perl Net::IRC bot\',
              PORT => 6667 );

my botname = shift( ) or \'PerlWh0re\';
my server = shift( ) or \'irc.pushers.net\';

my $irc = new Net::IRC;
$irc->newconn( Nick => $botname,
              Server => $server,
              Port => PORT,
              Ircname => IRCNAME );

$irc->add_handler( \'376\', \\&on_connect( ) );

sub on_connect
{
    my $self = shift( );
    $self->join( \'#digitalunderground\' );
    $self->privmsg( \'#digitalunderground\', \'Hi - please kill me!\' );
}

$irc->start( );

Iøvrigt kan jeg anbefale, hvis du har nok panodiler til at klare at dit hoved bliver ørt det første stykke tid, at benytte POE til den slags her ( poe.perl.org ), de har det glimrende modul POE::Component::IRC, som kan findes på CPAN.
Avatar billede hr_kenneth Nybegynder
22. september 2001 - 19:07 #2
det virker fint med $irc->start, men den skal samtidig have input fra nogle andre sockets, og det kan den vel ikke med irc-> start. derfor har jeg lavet en while løkke der kører $irc->start, og derefter henter hvad der skal hentes fra de forskellige sockets
Avatar billede jakobandersen Nybegynder
22. september 2001 - 19:19 #3
Hvilke andre sockets ?

Er det en daemon der skal outputte noget fra andre daemons som den snakker med over TCP/UDP på IRC ?
Avatar billede hr_kenneth Nybegynder
22. september 2001 - 19:23 #4
prorgammet lytter på nogle sockets efter en counterstricke log der blvier sent fra nogle games servere. disse logs kigger den så igennem og skriver noget af det ud på irc. det sjove er, at det virker fint, men hvis jeg så et eller andet sted f.eks fjerner et print statement så virker det ligepludselig ikke
Avatar billede jakobandersen Nybegynder
22. september 2001 - 19:26 #5
Okay - mit forslag ville så være at du kunne lave et mellemled, fx en database, som du samtidig kunne bruge til at lave webstats udfra, hvilket jeg antager er en del af din fremtidige TODO liste. :-)

Men spørgsmålet er - skal reaktionen komme fordi at der kommer nye data, eller fordi at en bruger beder om det fra IRC ?
Avatar billede hr_kenneth Nybegynder
22. september 2001 - 19:30 #6
det skal skrive ud når der er en der slår en teammate ihjel, og når der er nogen der skriver admin inde i spillet. det virker fint det med admin. Det skal også vise en spillerliste og kicke eller banne dem fra irc. alt dette virker, men jeg forstår ikke hvorfor den ikke vil connecte ordentligt til irc serveren hvis man retter et eller andet ligegyldigt i koden
det kan være hvis man bare fjerner \\n i slutningen af et print statement
Avatar billede jakobandersen Nybegynder
22. september 2001 - 19:32 #7
Kan jeg få den sub at se der indeholder do_one_loop( ) ?
Avatar billede hr_kenneth Nybegynder
22. september 2001 - 19:34 #8
while (1)
{
    &readline(\'server 1\', $log1);
    &readline(\'server 2\', $log2);
    &readline(\'server 3\', $log3);
    &readline(\'server 4\', $log4);
    &readline(\'server 5\', $log5);
    &readline(\'server 6\', $log6);
    &readline(\'server 7\', $log7);
    $irc->do_one_loop;
}

sub sortlog
{
    my ($server, $logline) = @_;
    my $line = substr($logline, 34); #DETTE VIRKER
    my $pos = rindex($line, \'say \"admin\');
    if ($pos > 0)
    {
        my $msg = substr($line, ($pos + 4)); #til at finde admin beskeden VIRKER
        $pos = rindex($line, \'<\');
        $line = substr($line, 0, $pos);
        $pos = rindex($line, \'<\');
        my $wonid = substr($line, $pos, (length($line)-$pos));
        $line = substr($line, 0, $pos);
        $pos = rindex($line, \'<\');
        my $nick = substr($line, 0, $pos);
        $conn->privmsg($chan, \"$server $nick $wonid $msg\");
        return;
    } else
    {
        return;
    }
}

sub readline
{
    ($server, $log) = @_;
    my $rv = sysread($log, my $logline, 1024);
    if (defined($rv))
    {
        &sortlog($server, $logline);
        return;
    }
    else
    {
        if ($! == EAGAIN)
        {
            return 0;
        }
    }
}

Avatar billede jakobandersen Nybegynder
22. september 2001 - 20:10 #9
Hvor var det du pillede den print STDOUT \"\\n\"; ud ?
Avatar billede hr_kenneth Nybegynder
22. september 2001 - 20:18 #10
jeg ændrede
print \"starting...\";
til
print \"starting...\\n\";
så virkede det ikke
Avatar billede jakobandersen Nybegynder
22. september 2001 - 20:44 #11
Hvorhenne i dit script kan jeg så spørge igen. ;-P
Avatar billede hr_kenneth Nybegynder
22. september 2001 - 20:46 #12
du kan lige få hele scriptet. har du en email?

Avatar billede jakobandersen Nybegynder
22. september 2001 - 20:48 #13
info@effectus.dk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester