our
$AUTHORITY
=
'cpan:HINRIK'
;
$POE::Component::IRC::Plugin::AutoJoin::VERSION
=
'6.93'
;
sub
new {
my
(
$package
) =
shift
;
croak
"$package requires an even number of arguments"
if
@_
& 1;
my
%self
=
@_
;
return
bless
\
%self
,
$package
;
}
sub
PCI_register {
my
(
$self
,
$irc
) =
@_
;
if
(!
$self
->{Channels}) {
if
(
$irc
->isa(
'POE::Component::IRC::State'
)) {
for
my
$chan
(
keys
%{
$irc
->channels() }) {
my
$lchan
= lc_irc(
$chan
,
$irc
->isupport(
'MAPPING'
));
my
$key
=
$irc
->is_channel_mode_set(
$chan
,
'k'
)
?
$irc
->channel_key(
$chan
)
:
''
;
$self
->{Channels}->{
$lchan
} =
$key
;
}
}
else
{
$self
->{Channels} = {};
}
}
elsif
(
ref
$self
->{Channels} eq
'ARRAY'
) {
my
%channels
;
$channels
{lc_irc(
$_
,
$irc
->isupport(
'MAPPING'
))} =
undef
for
@{
$self
->{Channels} };
$self
->{Channels} = \
%channels
;
}
$self
->{tried_keys} = { };
$self
->{Rejoin_delay} = 5
if
!
defined
$self
->{Rejoin_delay};
$self
->{NickServ_delay} = 5
if
!
defined
$self
->{NickServ_delay};
$irc
->plugin_register(
$self
,
'SERVER'
,
qw(001 474 isupport chan_mode join kick part identified)
);
$irc
->plugin_register(
$self
,
'USER'
,
qw(join)
);
return
1;
}
sub
PCI_unregister {
return
1;
}
sub
S_001 {
my
(
$self
,
$irc
) =
splice
@_
, 0, 2;
delete
$self
->{alarm_ids};
return
PCI_EAT_NONE;
}
sub
S_isupport {
my
(
$self
,
$irc
) =
splice
@_
, 0, 2;
if
(!
grep
{
$_
->isa(
'POE::Component::IRC::Plugin::NickServID'
) }
values
%{
$irc
->plugin_list() }) {
while
(
my
(
$chan
,
$key
) =
each
%{
$self
->{Channels} }) {
$irc
->yield(
join
=>
$chan
=> (
defined
$key
?
$key
: ()));
}
}
else
{
while
(
my
(
$chan
,
$key
) =
each
%{
$self
->{Channels} }) {
push
@{
$self
->{alarm_ids} },
$irc
->delay(
[
join
=>
$chan
=> (
defined
$key
?
$key
: ())],
$self
->{NickServ_delay},
);
}
}
return
PCI_EAT_NONE;
}
sub
S_identified {
my
(
$self
,
$irc
) =
splice
@_
, 0, 2;
if
(
$self
->{alarm_ids}) {
$irc
->delay_remove(
$_
)
for
@{
$self
->{alarm_ids} };
delete
$self
->{alarm_ids};
while
(
my
(
$chan
,
$key
) =
each
%{
$self
->{Channels} }) {
$irc
->yield(
join
=>
$chan
=> (
defined
$key
?
$key
: ()));
}
}
return
PCI_EAT_NONE;
}
sub
S_474 {
my
(
$self
,
$irc
) =
splice
@_
, 0, 2;
my
$chan
= ${
$_
[2] }->[0];
my
$lchan
= lc_irc(
$chan
,
$irc
->isupport(
'MAPPING'
));
return
PCI_EAT_NONE
if
!
$self
->{Retry_when_banned};
my
$key
=
$self
->{Channels}{
$lchan
};
$key
=
$self
->{tried_keys}{
$lchan
}
if
defined
$self
->{tried_keys}{
$lchan
};
$irc
->delay([
join
=>
$chan
=> (
defined
$key
?
$key
: ())],
$self
->{Retry_when_banned});
return
PCI_EAT_NONE;
}
sub
S_chan_mode {
my
(
$self
,
$irc
) =
splice
@_
, 0, 2;
pop
@_
;
my
$chan
= ${
$_
[1] };
my
$mode
= ${
$_
[2] };
my
$arg
=
defined
$_
[3] ? ${
$_
[3] } :
''
;
my
$lchan
= lc_irc(
$chan
,
$irc
->isupport(
'MAPPING'
));
$self
->{Channels}->{
$lchan
} =
$arg
if
$mode
eq
'+k'
;
$self
->{Channels}->{
$lchan
} =
''
if
$mode
eq
'-k'
;
return
PCI_EAT_NONE;
}
sub
S_join {
my
(
$self
,
$irc
) =
splice
@_
, 0, 2;
my
$joiner
= parse_user(${
$_
[0] });
my
$chan
= ${
$_
[1] };
my
$lchan
= lc_irc(
$chan
,
$irc
->isupport(
'MAPPING'
));
return
PCI_EAT_NONE
if
$joiner
ne
$irc
->nick_name();
delete
$self
->{alarm_ids};
if
(
defined
$self
->{tried_keys}{
$lchan
}) {
$self
->{Channels}->{
$lchan
} =
$self
->{tried_keys}{
$lchan
};
delete
$self
->{tried_keys}{
$lchan
};
}
else
{
$self
->{Channels}->{
$lchan
} =
''
;
}
return
PCI_EAT_NONE;
}
sub
S_kick {
my
(
$self
,
$irc
) =
splice
@_
, 0, 2;
my
$chan
= ${
$_
[1] };
my
$victim
= ${
$_
[2] };
my
$lchan
= lc_irc(
$chan
,
$irc
->isupport(
'MAPPING'
));
if
(
$victim
eq
$irc
->nick_name()) {
if
(
$self
->{RejoinOnKick}) {
$irc
->delay([
'join'
,
$chan
,
(
defined
$self
->{Channels}->{
$lchan
} ?
$self
->{Channels}->{
$lchan
} : ())
],
$self
->{Rejoin_delay});
}
delete
$self
->{Channels}->{
$lchan
};
}
return
PCI_EAT_NONE;
}
sub
S_part {
my
(
$self
,
$irc
) =
splice
@_
, 0, 2;
my
$parter
= parse_user(${
$_
[0] });
my
$chan
= ${
$_
[1] };
my
$lchan
= lc_irc(
$chan
,
$irc
->isupport(
'MAPPING'
));
delete
$self
->{Channels}->{
$lchan
}
if
$parter
eq
$irc
->nick_name();
return
PCI_EAT_NONE;
}
sub
U_join {
my
(
$self
,
$irc
) =
splice
@_
, 0, 2;
my
(
undef
,
$chan
,
$key
) =
split
/\s/, ${
$_
[0] }, 3;
my
$lchan
= lc_irc(
$chan
,
$irc
->isupport(
'MAPPING'
));
$self
->{tried_keys}->{
$lchan
} =
$key
if
defined
$key
;
return
PCI_EAT_NONE;
}
1;