PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IRC-Bot - Whitespaces


z-shell
09.11.2008, 23:56
Hallo,
ich bin am verzweifeln.
Ich habe mir einen IRC-Bot geschrieben, und der tut auch soweit. Nur bei der Ausgabe im Channel bricht er den String nach einem Leerzeichen ab. Wo liegt der Fehler?
Der Code:
#!/usr/bin/perl -w
use strict;
use IO::Socket;

### settings ###
my $srv="irc.server.net";
my $port=6667;
my $nick='Himbeertoni';
my $user='tester';
my $chan='#mychan';

### create socket ###
my $sock=IO::Socket::INET->new(
PeerAddr=>$srv,
PeerPort=>$port,
Proto=>'tcp'
) or die "Connection failed: $!\n";

### connect ###
print $sock "NICK $nick\r\n";
print $sock "USER $user 8 * :$user\r\n";
print $sock "JOIN $chan\r\n";

### keep connection ###
while (my $line = <$sock>) {
# print $line;

if ( $line =~ /^PING \:(.*)/i ) {
print "PONG :$1";
print $sock "PONG :$1";
}



### the stuff... ###
if ($line =~ /366/) { # greet on join
print "$nick has joined $chan.\n";
my $hi_msg = "Hi, there!\n";
&speak("$hi_msg");
}

if ($line =~ /!HELP/i) { # print help
&help;
}

#if ($line =~ /!LEARN/i) { # learn some stuff
# my $string;
# $line = $string; # TODO
# &learn;
# }

if ($line =~ /!DIE/i) { # kill the bot
&_die;
}

}

### subs ###
sub speak() {
$sock->autoflush(1);
print $sock "PRIVMSG $chan @_\n";
}

sub help() {
my @help_out = (
"Available_Commands: ",
"!SYSTEM",
"!LEARN",
"!DIE"
);
foreach my $elements(@help_out) {
&speak($elements);
}
}

#sub learn() {
# &speak(scalar $string); # TODO
# }

sub _die() {
$sock->close;
}


Wenn er jetzt z.B. die Begrüssungsmessage oder einen String im Array (rot) ausgeben soll, der whitespaces enthält, bricht die Ausgabe danach ab.
Ich hab keine Erklärung dafür. Hat jemand einen Tip?


Alamar
10.11.2008, 00:51
Ohne weiter auf deinen Stil einzugehen die Antwort liegt im IRC Protokoll selbst(RFC 1459).
Die Nachrichten Syntax im konkreten Fall hier PRIVMSG Syntax.

The BNF representation for this is:

<message> ::= [':' <prefix> <SPACE> ] <command> <params> <crlf>
<prefix> ::= <servername> | <nick> [ '!' <user> ] [ '@' <host> ]
<command> ::= <letter> { <letter> } | <number> <number> <number>
<SPACE> ::= ' ' { ' ' }
<params> ::= <SPACE> [ ':' <trailing> | <middle> <params> ]

<middle> ::= <Any *non-empty* sequence of octets not including SPACE
or NUL or CR or LF, the first of which may not be ':'>
<trailing> ::= <Any, possibly *empty*, sequence of octets not including
NUL or CR or LF>

<crlf> ::= CR LF



=> PRIVMSG empfänger :textnachricht
Der ":" ist das entscheidende Kriterium

z-shell
10.11.2008, 10:17
Der ":" ist das entscheidende Kriterium
Genau das war`s.
Vielen Dank! :)