* 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
+116 -75

No files matched your search

+2 -3
View File
@@ -509,12 +509,11 @@ while (1) {
###############
# Send data to socket.
sub socksnd
{
sub socksnd {
my ($svr, $data) = @_;
if (defined $SOCKET{$svr}) {
syswrite $SOCKET{$svr}, $data."\n", POSIX::BUFSIZ, 0;
syswrite $SOCKET{$svr}, $data."\r\n", POSIX::BUFSIZ, 0;
dbug "$svr << $data";
return 1;
}
+5
View File
@@ -3,6 +3,11 @@ Auto IRC Bot 3.0: Change Log
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.
* Added an Eval module.
* Added an UNO module.
+32 -9
View File
@@ -9,7 +9,7 @@ use Exporter;
our @ISA = qw(Exporter);
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.
@@ -87,7 +87,7 @@ sub umode
{
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;
}
@@ -97,7 +97,15 @@ sub privmsg
{
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;
}
@@ -107,7 +115,15 @@ sub notice
{
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;
}
@@ -129,8 +145,8 @@ sub nick
Auto::socksnd($svr, "NICK $newnick");
$Proto::IRC::botnick{$svr}{newnick} = $newnick;
$Proto::IRC::botinfo{$svr}{newnick} = $newnick;
return 1;
}
@@ -165,8 +181,7 @@ sub kick
}
# Quit IRC.
sub quit
{
sub quit {
my ($svr, $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::botnick{$svr} if (defined $Proto::IRC::botnick{$svr});
delete $Proto::IRC::botinfo{$svr} if (defined $Proto::IRC::botinfo{$svr});
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>
sub usrc
+23
View File
@@ -51,6 +51,15 @@ hook_add("on_connect", "on_connect_modes", sub {
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.
hook_add("on_connect", "plaintext_auth", sub {
my ($svr) = @_;
@@ -114,6 +123,20 @@ hook_add("on_connect", "autojoin", sub {
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
{
# If ratelimit is set to 1 in config, add this timer.
+54 -63
View File
@@ -11,6 +11,7 @@ use API::IRC;
our %RAWC = (
'001' => \&num001,
'005' => \&num005,
'352' => \&num352,
'353' => \&num353,
'432' => \&num432,
'433' => \&num433,
@@ -33,7 +34,7 @@ our %RAWC = (
);
# Variables for various functions.
our (%got_001, %botnick, %botchans, %csprefix, %chanusers, %chanmodes);
our (%got_001, %botinfo, %botchans, %csprefix, %chanusers, %chanmodes);
# Events.
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_quit");
API::Std::event_add("on_topic");
API::Std::event_add('on_whoreply');
# Parse raw data.
sub ircparse
@@ -86,16 +88,15 @@ sub ircparse
# Parse: Numeric:001
# Successful connection.
sub num001
{
sub num001 {
my ($svr, @ex) = @_;
$got_001{$svr} = 1;
# In case we don't get NICK from the server.
if (defined $botnick{$svr}{newnick}) {
$botnick{$svr}{nick} = $botnick{$svr}{newnick};
delete $botnick{$svr}{newnick};
if (!defined $botinfo{$svr}{nick}) {
$botinfo{$svr}{nick} = $botinfo{$svr}{newnick};
delete $botinfo{$svr}{newnick};
}
# Trigger on_connect.
@@ -106,8 +107,7 @@ sub num001
# Parse: Numeric:005
# Prefixes and channel modes.
sub num005
{
sub num005 {
my ($svr, @ex) = @_;
# Find PREFIX and CHANMODES.
@@ -140,10 +140,20 @@ sub num005
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
# NAMES reply.
sub num353
{
sub num353 {
my ($svr, @ex) = @_;
# Get rid of the colon.
@@ -181,8 +191,7 @@ sub num353
# Parse: Numeric:432
# Erroneous nickname.
sub num432
{
sub num432 {
my ($svr, undef) = @_;
if ($got_001{$svr}) {
@@ -193,20 +202,18 @@ sub num432
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;
}
# Parse: Numeric:433
# Nickname is already in use.
sub num433
{
sub num433 {
my ($svr, undef) = @_;
if (defined $botnick{$svr}{newnick}) {
API::IRC::nick($svr, $botnick{$svr}{newnick}."_");
delete $botnick{$svr}{newnick} if (defined $botnick{$svr}{newnick});
if (defined $botinfo{$svr}{newnick}) {
API::IRC::nick($svr, $botinfo{$svr}{newnick}."_");
}
return 1;
@@ -214,14 +221,13 @@ sub num433
# Parse: Numeric:438
# Nick change too fast.
sub num438
{
sub num438 {
my ($svr, @ex) = @_;
if (defined $botnick{$svr}{newnick}) {
API::Std::timer_add("num438_".$botnick{$svr}{newnick}, 1, $ex[11], sub {
API::IRC::nick($Proto::IRC::botnick{$svr}{newnick});
delete $botnick{$svr}{newnick} if (defined $botnick{$svr}{newnick});
if (defined $botinfo{$svr}{newnick}) {
API::Std::timer_add("num438_".$botinfo{$svr}{newnick}, 1, $ex[11], sub {
API::IRC::nick($Proto::IRC::botinfo{$svr}{newnick});
delete $botinfo{$svr}{newnick} if (defined $botinfo{$svr}{newnick});
});
}
@@ -230,8 +236,7 @@ sub num438
# Parse: Numeric:465
# You're banned creep!
sub num465
{
sub num465 {
my ($svr, undef) = @_;
err(3, "Banned from ".$svr."! Closing link...", 0);
@@ -241,8 +246,7 @@ sub num465
# Parse: Numeric:471
# Cannot join channel: Channel is full.
sub num471
{
sub num471 {
my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Channel is full.", 0);
@@ -252,8 +256,7 @@ sub num471
# Parse: Numeric:473
# Cannot join channel: Channel is invite-only.
sub num473
{
sub num473 {
my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Channel is invite-only.", 0);
@@ -263,8 +266,7 @@ sub num473
# Parse: Numeric:474
# Cannot join channel: Banned from channel.
sub num474
{
sub num474 {
my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Banned from channel.", 0);
@@ -274,8 +276,7 @@ sub num474
# Parse: Numeric:475
# Cannot join channel: Bad key.
sub num475
{
sub num475 {
my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Bad key.", 0);
@@ -285,8 +286,7 @@ sub num475
# Parse: Numeric:477
# Cannot join channel: Need registered nickname.
sub num477
{
sub num477 {
my ($svr, (undef, undef, undef, $chan)) = @_;
err(3, "Cannot join channel ".$chan." on ".$svr.": Need registered nickname.", 0);
@@ -295,15 +295,14 @@ sub num477
}
# Parse: JOIN
sub cjoin
{
sub cjoin {
my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1));
my $chan = $ex[2];
$chan =~ s/^://gxsm;
# 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;
API::Std::event_run("on_ucjoin", ($svr, $chan));
}
@@ -318,8 +317,7 @@ sub cjoin
}
# Parse: KICK
sub kick
{
sub kick {
my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1));
@@ -338,7 +336,7 @@ sub kick
}
# 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!
# Delete channel from botchans.
@@ -364,11 +362,10 @@ sub kick
}
# Parse: MODE
sub mode
{
sub mode {
my ($svr, @ex) = @_;
if ($ex[2] ne $botnick{$svr}{nick}) {
if ($ex[2] ne $botinfo{$svr}{nick}) {
# Set data we'll need later.
my $chan = $ex[2];
my $modes = $ex[3];
@@ -454,18 +451,17 @@ sub mode
}
# Parse: NICK
sub nick
{
sub nick {
my ($svr, ($uex, undef, $nex)) = @_;
$nex =~ s/^://gxsm;
my %src = API::IRC::usrc(substr($uex, 1));
# 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.
$botnick{$svr}{nick} = $nex;
delete $botnick{$svr}{newnick} if (defined $botnick{$svr}{newnick});
$botinfo{$svr}{nick} = $nex;
delete $botinfo{$svr}{newnick} if (defined $botinfo{$svr}{newnick});
}
else {
# It isn't. Update chanusers and trigger on_nick.
@@ -482,8 +478,7 @@ sub nick
}
# Parse: NOTICE
sub notice
{
sub notice {
my ($svr, @ex) = @_;
# Ensure this is coming from a user rather than a server.
@@ -503,8 +498,7 @@ sub notice
}
# Parse: PART
sub part
{
sub part {
my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1));
@@ -529,8 +523,7 @@ sub part
}
# Parse: PRIVMSG
sub privmsg
{
sub privmsg {
my ($svr, @ex) = @_;
my %data = API::IRC::usrc(substr($ex[0], 1));
@@ -545,7 +538,7 @@ sub privmsg
my ($cmd, $cprefix, $rprefix);
# 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.
# Ensure it's a valid length.
@@ -657,8 +650,7 @@ sub privmsg
}
# Parse: QUIT
sub quit
{
sub quit {
my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1));
@@ -680,13 +672,12 @@ sub quit
}
# Parse: TOPIC
sub topic
{
sub topic {
my ($svr, @ex) = @_;
my %src = API::IRC::usrc(substr($ex[0], 1));
# 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];
my (@argv);
$argv[0] = substr($ex[3], 1);