Protocol-IRC
view release on metacpan or search on metacpan
lib/Protocol/IRC/Client.pm view on Meta::CPAN
( $message, $hints, $data ) = $f->get
If the gate fails, then so will the future, containing the text message from
the error numeric as its failure message, C<irc_gate> as its category, and the
full message and hints for it as the details.
=cut
sub next_gate_future
{
my $self = shift;
my ( $gate, $target ) = @_;
$target = $self->casefold_name( $target // "*" );
my $futures = $self->{Protocol_IRC_gate_futures}{$gate}{$target} //= [];
my $f = $self->new_future;
push @$futures, $f;
$f->on_cancel( sub {
my ( $f ) = @_;
@$futures = grep { $_ != $f } @$futures
});
return $f;
}
=head1 INTERNAL MESSAGE HANDLING
The following messages are handled internally by C<Protocol::IRC::Client>.
=cut
=head2 CAP
This message takes a sub-verb as its second argument, and a list of capability
names as its third. On receipt of a C<CAP> message, the verb is extracted and
set as the C<verb> hint, and the list capabilities set as the keys of a hash
given as the C<caps> hint. These are then passed to an event called
$irc->on_message_cap_VERB( $message, \%hints )
or
$irc->on_message_cap( 'VERB', $message, \%hints )
=cut
sub on_message_CAP
{
my $self = shift;
my ( $message, $hints ) = @_;
my $verb = $message->arg(1);
my %hints = (
%$hints,
verb => $verb,
caps => { map { $_ => 1 } split m/ /, $message->arg(2) },
);
$self->invoke( "on_message_cap_$verb", $message, \%hints ) and $hints{handled} = 1;
$self->invoke( "on_message_cap", $verb, $message, \%hints ) and $hints{handled} = 1;
return $hints{handled};
}
=head2 MODE (on channels) and 324 (RPL_CHANNELMODEIS)
These messages involve channel modes. The raw list of channel modes is parsed
into an array containing one entry per affected piece of data. Each entry will
contain at least a C<type> key, indicating what sort of mode or mode change
it is:
=over 8
=item list
The mode relates to a list; bans, invites, etc..
=item value
The mode sets a value about the channel
=item bool
The mode is a simple boolean flag about the channel
=item occupant
The mode relates to a user in the channel
=back
Every mode type then provides a C<mode> key, containing the mode character
itself, and a C<sense> key which is an empty string, C<+>, or C<->.
For C<list> and C<value> types, the C<value> key gives the actual list entry
or value being set.
For C<occupant> types, a C<flag> key gives the mode converted into an occupant
flag (by the C<prefix_mode2flag> method), C<nick> and C<nick_folded> store the
user name affected.
C<boolean> types do not create any extra keys.
=cut
sub prepare_hints_channelmode
{
my $self = shift;
my ( $message, $hints ) = @_;
my ( $listmodes, $argmodes, $argsetmodes, $boolmodes ) = @{ $self->isupport( 'chanmodes_list' ) };
my $modechars = $hints->{modechars};
my @modeargs = @{ $hints->{modeargs} };
my @modes; # [] -> { type => $, sense => $, mode => $, arg => $ }
( run in 1.367 second using v1.01-cache-2.11-cpan-71847e10f99 )