* Added who() to API::IRC.

* Added hook on_whoreply.
* PRIVMSGs and NOTICEs that would cause a >512 bytes resulting message are now divided into multiple messages.
* Renamed botnick to botinfo.
This commit is contained in:
Elijah Perrault committed 2011-02-25 20:14:19 -07:00
1 parent 9c8200fb78
commit 8512ea129a
5 files changed
+114 -73

No files matched your search

+2 -3
View File
@@ -509,12 +509,11 @@ while (1) {
############### ###############
# Send data to socket. # Send data to socket.
sub socksnd sub socksnd {
{
my ($svr, $data) = @_; my ($svr, $data) = @_;
if (defined $SOCKET{$svr}) { if (defined $SOCKET{$svr}) {
syswrite $SOCKET{$svr}, $data."\n", POSIX::BUFSIZ, 0; syswrite $SOCKET{$svr}, $data."\r\n", POSIX::BUFSIZ, 0;
dbug "$svr << $data"; dbug "$svr << $data";
return 1; return 1;
} }
+5
View File
@@ -3,6 +3,11 @@ Auto IRC Bot 3.0: Change Log
3.0 Indev 3.0 Indev
=============================================================================== ===============================================================================
* Added who() to API::IRC.
* Added hook on_whoreply.
* PRIVMSGs and NOTICEs that would cause a >512 bytes resulting message are
now divided into multiple messages.
* Renamed botnick to botinfo.
* Renamed Parser::IRC to Proto::IRC. * Renamed Parser::IRC to Proto::IRC.
* Added an Eval module. * Added an Eval module.
* Added an UNO module. * Added an UNO module.
+31 -8
View File
@@ -9,7 +9,7 @@ use Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
our @EXPORT_OK = qw(ban cjoin cpart cmode umode kick privmsg notice quit nick names our @EXPORT_OK = qw(ban cjoin cpart cmode umode kick privmsg notice quit nick names
topic usrc match_mask); topic who usrc match_mask);
# Set a ban, based on config bantype value. # Set a ban, based on config bantype value.
@@ -87,7 +87,7 @@ sub umode
{ {
my ($svr, $modes) = @_; my ($svr, $modes) = @_;
Auto::socksnd($svr, "MODE ".$Proto::IRC::botnick{$svr}{nick}." $modes"); Auto::socksnd($svr, "MODE ".$Proto::IRC::botinfo{$svr}{nick}." $modes");
return 1; return 1;
} }
@@ -97,7 +97,15 @@ sub privmsg
{ {
my ($svr, $target, $message) = @_; my ($svr, $target, $message) = @_;
Auto::socksnd($svr, "PRIVMSG $target :$message"); # Get maximum length.
my $maxlen = 510 - length q{:}.$Proto::IRC::botinfo{$svr}{nick}.q{!}.$Proto::IRC::botinfo{$svr}{user}.q{@}.$Proto::IRC::botinfo{$svr}{mask}." PRIVMSG $target :";
# Divide message if it surpasses the maximum length.
while (length $message >= $maxlen) {
my $submsg = substr $message, 0, $maxlen, q{};
Auto::socksnd($svr, "PRIVMSG $target :$submsg");
}
if (length $message) { Auto::socksnd($svr, "PRIVMSG $target :$message") }
return 1; return 1;
} }
@@ -107,7 +115,15 @@ sub notice
{ {
my ($svr, $target, $message) = @_; my ($svr, $target, $message) = @_;
Auto::socksnd($svr, "NOTICE $target :$message"); # Get maximum length.
my $maxlen = 510 - length q{:}.$Proto::IRC::botinfo{$svr}{nick}.q{!}.$Proto::IRC::botinfo{$svr}{user}.q{@}.$Proto::IRC::botinfo{$svr}{mask}." NOTICE $target :";
# Divide message if it surpasses the maximum length.
while (length $message >= $maxlen) {
my $submsg = substr $message, 0, $maxlen, q{};
Auto::socksnd($svr, "NOTICE $target :$submsg");
}
if (length $message) { Auto::socksnd($svr, "NOTICE $target :$message") }
return 1; return 1;
} }
@@ -129,7 +145,7 @@ sub nick
Auto::socksnd($svr, "NICK $newnick"); Auto::socksnd($svr, "NICK $newnick");
$Proto::IRC::botnick{$svr}{newnick} = $newnick; $Proto::IRC::botinfo{$svr}{newnick} = $newnick;
return 1; return 1;
} }
@@ -165,8 +181,7 @@ sub kick
} }
# Quit IRC. # Quit IRC.
sub quit sub quit {
{
my ($svr, $reason) = @_; my ($svr, $reason) = @_;
if (defined $reason) { if (defined $reason) {
@@ -177,11 +192,19 @@ sub quit
} }
delete $Proto::IRC::got_001{$svr} if (defined $Proto::IRC::got_001{$svr}); delete $Proto::IRC::got_001{$svr} if (defined $Proto::IRC::got_001{$svr});
delete $Proto::IRC::botnick{$svr} if (defined $Proto::IRC::botnick{$svr}); delete $Proto::IRC::botinfo{$svr} if (defined $Proto::IRC::botinfo{$svr});
return 1; return 1;
} }
# Send a WHO.
sub who {
my ($svr, $nick) = @_;
Auto::socksnd($svr, "WHO $nick");
return 1;
}
# Get nick, ident and host from a <nick>!<ident>@<host> # Get nick, ident and host from a <nick>!<ident>@<host>
sub usrc sub usrc
+23
View File
@@ -51,6 +51,15 @@ hook_add("on_connect", "on_connect_modes", sub {
return 1; return 1;
}); });
# Self-WHO on connect.
hook_add('on_connect', 'on_connect_selfwho', sub {
my ($svr) = @_;
API::IRC::who($svr, $Proto::IRC::botinfo{$svr}{nick});
return 1;
});
# Plaintext auth. # Plaintext auth.
hook_add("on_connect", "plaintext_auth", sub { hook_add("on_connect", "plaintext_auth", sub {
my ($svr) = @_; my ($svr) = @_;
@@ -114,6 +123,20 @@ hook_add("on_connect", "autojoin", sub {
return 1; return 1;
}); });
# WHO reply.
hook_add('on_whoreply', 'selfwho.getdata', sub {
my (($svr, $nick, undef, $user, $mask, undef, undef, undef, undef, undef)) = @_;
# Check if it's for us.
if ($nick eq $Proto::IRC::botinfo{$svr}{nick}) {
# It is. Set data.
$Proto::IRC::botinfo{$svr}{user} = $user;
$Proto::IRC::botinfo{$svr}{mask} = $mask;
}
return 1;
});
sub clear_usercmd_timer sub clear_usercmd_timer
{ {
# If ratelimit is set to 1 in config, add this timer. # If ratelimit is set to 1 in config, add this timer.
+53 -62
View File
@@ -11,6 +11,7 @@ use API::IRC;
our %RAWC = ( our %RAWC = (
'001' => \&num001, '001' => \&num001,
'005' => \&num005, '005' => \&num005,
'352' => \&num352,
'353' => \&num353, '353' => \&num353,
'432' => \&num432, '432' => \&num432,
'433' => \&num433, '433' => \&num433,
@@ -33,7 +34,7 @@ our %RAWC = (
); );
# Variables for various functions. # Variables for various functions.
our (%got_001, %botnick, %botchans, %csprefix, %chanusers, %chanmodes); our (%got_001, %botinfo, %botchans, %csprefix, %chanusers, %chanmodes);
# Events. # Events.
API::Std::event_add("on_connect"); API::Std::event_add("on_connect");
@@ -47,6 +48,7 @@ API::Std::event_add("on_cprivmsg");
API::Std::event_add("on_uprivmsg"); API::Std::event_add("on_uprivmsg");
API::Std::event_add("on_quit"); API::Std::event_add("on_quit");
API::Std::event_add("on_topic"); API::Std::event_add("on_topic");
API::Std::event_add('on_whoreply');
# Parse raw data. # Parse raw data.
sub ircparse sub ircparse
@@ -86,16 +88,15 @@ sub ircparse
# Parse: Numeric:001 # Parse: Numeric:001
# Successful connection. # Successful connection.
sub num001 sub num001 {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
$got_001{$svr} = 1; $got_001{$svr} = 1;
# In case we don't get NICK from the server. # In case we don't get NICK from the server.
if (defined $botnick{$svr}{newnick}) { if (!defined $botinfo{$svr}{nick}) {
$botnick{$svr}{nick} = $botnick{$svr}{newnick}; $botinfo{$svr}{nick} = $botinfo{$svr}{newnick};
delete $botnick{$svr}{newnick}; delete $botinfo{$svr}{newnick};
} }
# Trigger on_connect. # Trigger on_connect.
@@ -106,8 +107,7 @@ sub num001
# Parse: Numeric:005 # Parse: Numeric:005
# Prefixes and channel modes. # Prefixes and channel modes.
sub num005 sub num005 {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
# Find PREFIX and CHANMODES. # Find PREFIX and CHANMODES.
@@ -140,10 +140,20 @@ sub num005
return 1; return 1;
} }
# Parse: Numeric:352
# WHO reply.
sub num352 {
my ($svr, @ex) = @_;
# Trigger on_whoreply.
API::Std::event_run('on_whoreply', ($svr, $ex[2], $ex[3], $ex[4], $ex[5], $ex[6], @ex[7..$#ex]));
return 1;
}
# Parse: Numeric:353 # Parse: Numeric:353
# NAMES reply. # NAMES reply.
sub num353 sub num353 {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
# Get rid of the colon. # Get rid of the colon.
@@ -181,8 +191,7 @@ sub num353
# Parse: Numeric:432 # Parse: Numeric:432
# Erroneous nickname. # Erroneous nickname.
sub num432 sub num432 {
{
my ($svr, undef) = @_; my ($svr, undef) = @_;
if ($got_001{$svr}) { if ($got_001{$svr}) {
@@ -193,20 +202,18 @@ sub num432
API::IRC::quit($svr, "An error occurred."); API::IRC::quit($svr, "An error occurred.");
} }
delete $botnick{$svr}{newnick} if (defined $botnick{$svr}{newnick}); delete $botinfo{$svr}{newnick} if (defined $botinfo{$svr}{newnick});
return 1; return 1;
} }
# Parse: Numeric:433 # Parse: Numeric:433
# Nickname is already in use. # Nickname is already in use.
sub num433 sub num433 {
{
my ($svr, undef) = @_; my ($svr, undef) = @_;
if (defined $botnick{$svr}{newnick}) { if (defined $botinfo{$svr}{newnick}) {
API::IRC::nick($svr, $botnick{$svr}{newnick}."_"); API::IRC::nick($svr, $botinfo{$svr}{newnick}."_");
delete $botnick{$svr}{newnick} if (defined $botnick{$svr}{newnick});
} }
return 1; return 1;
@@ -214,14 +221,13 @@ sub num433
# Parse: Numeric:438 # Parse: Numeric:438
# Nick change too fast. # Nick change too fast.
sub num438 sub num438 {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
if (defined $botnick{$svr}{newnick}) { if (defined $botinfo{$svr}{newnick}) {
API::Std::timer_add("num438_".$botnick{$svr}{newnick}, 1, $ex[11], sub { API::Std::timer_add("num438_".$botinfo{$svr}{newnick}, 1, $ex[11], sub {
API::IRC::nick($Proto::IRC::botnick{$svr}{newnick}); API::IRC::nick($Proto::IRC::botinfo{$svr}{newnick});
delete $botnick{$svr}{newnick} if (defined $botnick{$svr}{newnick}); delete $botinfo{$svr}{newnick} if (defined $botinfo{$svr}{newnick});
}); });
} }
@@ -230,8 +236,7 @@ sub num438
# Parse: Numeric:465 # Parse: Numeric:465
# You're banned creep! # You're banned creep!
sub num465 sub num465 {
{
my ($svr, undef) = @_; my ($svr, undef) = @_;
err(3, "Banned from ".$svr."! Closing link...", 0); err(3, "Banned from ".$svr."! Closing link...", 0);
@@ -241,8 +246,7 @@ sub num465
# Parse: Numeric:471 # Parse: Numeric:471
# Cannot join channel: Channel is full. # Cannot join channel: Channel is full.
sub num471 sub num471 {
{
my ($svr, (undef, undef, undef, $chan)) = @_; my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Channel is full.", 0); err(3, "Cannot join channel ".$chan." on ".$svr.": Channel is full.", 0);
@@ -252,8 +256,7 @@ sub num471
# Parse: Numeric:473 # Parse: Numeric:473
# Cannot join channel: Channel is invite-only. # Cannot join channel: Channel is invite-only.
sub num473 sub num473 {
{
my ($svr, (undef, undef, undef, $chan)) = @_; my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Channel is invite-only.", 0); err(3, "Cannot join channel ".$chan." on ".$svr.": Channel is invite-only.", 0);
@@ -263,8 +266,7 @@ sub num473
# Parse: Numeric:474 # Parse: Numeric:474
# Cannot join channel: Banned from channel. # Cannot join channel: Banned from channel.
sub num474 sub num474 {
{
my ($svr, (undef, undef, undef, $chan)) = @_; my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Banned from channel.", 0); err(3, "Cannot join channel ".$chan." on ".$svr.": Banned from channel.", 0);
@@ -274,8 +276,7 @@ sub num474
# Parse: Numeric:475 # Parse: Numeric:475
# Cannot join channel: Bad key. # Cannot join channel: Bad key.
sub num475 sub num475 {
{
my ($svr, (undef, undef, undef, $chan)) = @_; my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Bad key.", 0); err(3, "Cannot join channel ".$chan." on ".$svr.": Bad key.", 0);
@@ -285,8 +286,7 @@ sub num475
# Parse: Numeric:477 # Parse: Numeric:477
# Cannot join channel: Need registered nickname. # Cannot join channel: Need registered nickname.
sub num477 sub num477 {
{
my ($svr, (undef, undef, undef, $chan)) = @_; my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Need registered nickname.", 0); err(3, "Cannot join channel ".$chan." on ".$svr.": Need registered nickname.", 0);
@@ -295,15 +295,14 @@ sub num477
} }
# Parse: JOIN # Parse: JOIN
sub cjoin sub cjoin {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1)); my %src = API::IRC::usrc(substr($ex[0], 1));
my $chan = $ex[2]; my $chan = $ex[2];
$chan =~ s/^://gxsm; $chan =~ s/^://gxsm;
# Check if this is coming from ourselves. # Check if this is coming from ourselves.
if ($src{nick} eq $botnick{$svr}{nick}) { if ($src{nick} eq $botinfo{$svr}{nick}) {
$botchans{$svr}{lc $chan} = 1; $botchans{$svr}{lc $chan} = 1;
API::Std::event_run("on_ucjoin", ($svr, $chan)); API::Std::event_run("on_ucjoin", ($svr, $chan));
} }
@@ -318,8 +317,7 @@ sub cjoin
} }
# Parse: KICK # Parse: KICK
sub kick sub kick {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1)); my %src = API::IRC::usrc(substr($ex[0], 1));
@@ -338,7 +336,7 @@ sub kick
} }
# Check if we were the ones kicked. # Check if we were the ones kicked.
if (lc($ex[3]) eq lc($botnick{$svr}{nick})) { if (lc($ex[3]) eq lc($botinfo{$svr}{nick})) {
# We were kicked! # We were kicked!
# Delete channel from botchans. # Delete channel from botchans.
@@ -364,11 +362,10 @@ sub kick
} }
# Parse: MODE # Parse: MODE
sub mode sub mode {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
if ($ex[2] ne $botnick{$svr}{nick}) { if ($ex[2] ne $botinfo{$svr}{nick}) {
# Set data we'll need later. # Set data we'll need later.
my $chan = $ex[2]; my $chan = $ex[2];
my $modes = $ex[3]; my $modes = $ex[3];
@@ -454,18 +451,17 @@ sub mode
} }
# Parse: NICK # Parse: NICK
sub nick sub nick {
{
my ($svr, ($uex, undef, $nex)) = @_; my ($svr, ($uex, undef, $nex)) = @_;
$nex =~ s/^://gxsm; $nex =~ s/^://gxsm;
my %src = API::IRC::usrc(substr($uex, 1)); my %src = API::IRC::usrc(substr($uex, 1));
# Check if this is coming from ourselves. # Check if this is coming from ourselves.
if ($src{nick} eq $botnick{$svr}{nick}) { if ($src{nick} eq $botinfo{$svr}{nick}) {
# It is. Update bot nick hash. # It is. Update bot nick hash.
$botnick{$svr}{nick} = $nex; $botinfo{$svr}{nick} = $nex;
delete $botnick{$svr}{newnick} if (defined $botnick{$svr}{newnick}); delete $botinfo{$svr}{newnick} if (defined $botinfo{$svr}{newnick});
} }
else { else {
# It isn't. Update chanusers and trigger on_nick. # It isn't. Update chanusers and trigger on_nick.
@@ -482,8 +478,7 @@ sub nick
} }
# Parse: NOTICE # Parse: NOTICE
sub notice sub notice {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
# Ensure this is coming from a user rather than a server. # Ensure this is coming from a user rather than a server.
@@ -503,8 +498,7 @@ sub notice
} }
# Parse: PART # Parse: PART
sub part sub part {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1)); my %src = API::IRC::usrc(substr($ex[0], 1));
@@ -529,8 +523,7 @@ sub part
} }
# Parse: PRIVMSG # Parse: PRIVMSG
sub privmsg sub privmsg {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
my %data = API::IRC::usrc(substr($ex[0], 1)); my %data = API::IRC::usrc(substr($ex[0], 1));
@@ -545,7 +538,7 @@ sub privmsg
my ($cmd, $cprefix, $rprefix); my ($cmd, $cprefix, $rprefix);
# Check if it's to a channel or to us. # Check if it's to a channel or to us.
if (lc($ex[2]) eq lc($botnick{$svr}{nick})) { if (lc($ex[2]) eq lc($botinfo{$svr}{nick})) {
# It is coming to us in a private message. # It is coming to us in a private message.
# Ensure it's a valid length. # Ensure it's a valid length.
@@ -657,8 +650,7 @@ sub privmsg
} }
# Parse: QUIT # Parse: QUIT
sub quit sub quit {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1)); my %src = API::IRC::usrc(substr($ex[0], 1));
@@ -680,13 +672,12 @@ sub quit
} }
# Parse: TOPIC # Parse: TOPIC
sub topic sub topic {
{
my ($svr, @ex) = @_; my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1)); my %src = API::IRC::usrc(substr($ex[0], 1));
# Ignore it if it's coming from us. # Ignore it if it's coming from us.
if (lc($src{nick}) ne lc($botnick{$svr}{nick})) { if (lc($src{nick}) ne lc($botinfo{$svr}{nick})) {
$src{chan} = $ex[2]; $src{chan} = $ex[2];
my (@argv); my (@argv);
$argv[0] = substr($ex[3], 1); $argv[0] = substr($ex[3], 1);