Why not adopt me?
NAME
POEx::IRC::Backend - IRC client or server sockets
SYNOPSIS
## Spawn a Backend and register as the controlling session.
my $backend = POEx::IRC::Backend->spawn(
## See POE::Component::SSLify (SSLify_Options):
ssl_opts => [ ARRAY ],
);
$poe_kernel->post( $backend->session_id, 'register' );
$backend->create_listener(
bindaddr => $addr,
port => $port,
## Optional:
ipv6 => 1,
ssl => 1,
);
$backend->create_connector(
remoteaddr => $remote,
remoteport => $remoteport,
## Optional:
bindaddr => $bindaddr,
ipv6 => 1,
ssl => 1,
);
## Handle and dispatch incoming IRC events.
sub ircsock_input {
my ($kernel, $self) = @_[KERNEL, OBJECT];
## POEx::IRC::Backend::Connect obj:
my $this_conn = $_[ARG0];
## IRC::Message::Object obj:
my $input_obj = $_[ARG1];
my $cmd = $input_obj->command;
## ... dispatch, etc ...
}
DESCRIPTION
A POE IRC backend socket handler using POE::Filter::IRCv3 and IRC::Toolkit.
This can be used by client/server libraries to speak IRC protocol via IRC::Message::Object objects.
This module is part of a set of IRC building blocks that have been split out of a much larger project; it is also early 'alpha-quality' software.
Take a gander at POE::Component::IRC for a fully-featured IRC library.
Attributes
controller
Retrieve the POE::Session ID for the backend's registered controller.
Predicate: has_controller
connectors
A HASH of active Connector objects, keyed on their wheel ID.
filter
A POE::Filter::Stackable instance consisting of the current "filter_irc" stacked with "filter_line" (at the time the attribute is built).
filter_irc
A POE::Filter::IRCv3 instance with colonify enabled, by default.
A client-side Backend will probably want a non-colonifying filter:
my $backend = POEx::IRC::Backend->new(
filter_irc => POE::Filter::IRCv3->new(colonify => 0),
...
);
filter_line
A POE::Filter::Line instance.
listeners
HASH of active Listener objects, keyed on their wheel ID.
session_id
Returns the backend's session ID.
wheels
HASH of actively connected wheels, keyed on their wheel ID.
Methods
spawn
my $backend = POEx::IRC::Backend->spawn(
## Optional, needed for SSL-ified server-side sockets
ssl_opts => [
'server.key',
'server.cert',
],
);
create_connector
$backend->create_connector(
remoteaddr => $addr,
remoteport => $addr,
## Optional:
bindaddr => $local_addr,
ipv6 => 1,
ssl => 1,
);
Attempts to create a POEx::IRC::Backend::Connector that holds a POE::Wheel::SocketFactory connector wheel; connectors will attempt to establish an outgoing connection immediately.
create_listener
$backend->create_listener(
bindaddr => $addr,
port => $port,
## Optional:
ipv6 => 1,
ssl => 1,
idle => $seconds,
);
Attempts to create a POEx::IRC::Backend::Listener that holds a POE::Wheel::SocketFactory listener wheel.
remove_listener
$backend->remove_listener(
listener => $listener_id,
);
## or via addr, port, or combination thereof:
$backend->remove_listener(
addr => '127.0.0.1',
port => 6667,
);
Removes a listener and clears its wheel attribute; the socket shuts down when the POE::Wheel::SocketFactory wheel goes out of scope.
disconnect
$backend->disconnect($wheel_id, $disconnect_string);
Given a connection's wheel ID, mark the specified wheel for disconnection.
send
$backend->send(
{
prefix => $prefix,
params => [ @params ],
command => $cmd,
},
@connect_ids
);
use IRC::Message::Object 'ircmsg';
my $msg = ircmsg(
command => 'PRIVMSG',
params => [ $chan, $string ],
);
$backend->send( $msg, $connect_id );
Feeds POE::Filter::IRCv3 and sends the resultant raw IRC line to the specified connection wheel ID(s).
Accepts either an IRC::Message::Object or a HASH compatible with POE::Filter::IRCv3 -- look there for details.
set_compressed_link
$backend->set_compressed_link( $conn_id );
Mark a specified connection wheel ID as pending compression; POE::Filter::Zlib::Stream will be added to the filter stack when the next flush event arrives.
set_compressed_link_now
$backend->set_compressed_link_now( $conn_id );
Add a POE::Filter::Zlib::Stream to the connection's filter stack immediately, rather than upon next flush event.
unset_compressed_link
$backend->unset_compressed_link( $conn_id );
Remove POE::Filter::Zlib::Stream from the connection's filter stack.
Received events
register
$poe_kernel->post( $backend->session_id,
'register'
);
Register the sender session as the backend's controller session. The last session to send 'register' is the session that receives notification events from the backend component.
create_connector
Event interface to create_connector -- see "Methods"
create_listener
Event interface to create_listener -- see "Methods"
remove_listener
Event interface to remove_listener -- see "Methods"
send
Event interface to /send -- see "Methods"
shutdown
Disconnect all wheels and clean up.
Dispatched events
These events are dispatched to the controller session; see "register".
ircsock_compressed
Dispatched when a connection wheel has had a compression filter added.
$_[ARG0]
is the connection's POEx::IRC::Backend::Connect
ircsock_connection_idle
Dispatched when a connection wheel has had no input for longer than specified idle time (see "create_listener" regarding idle times).
$_[ARG0]
is the connection's POEx::IRC::Backend::Connect
ircsock_connector_failure
Dispatched when a Connector has failed due to some sort of socket error.
$_[ARG0]
is the connection's POEx::IRC::Backend::Connector with wheel() cleared.
@_[ARG1 .. ARG3]
contain the socket error details reported by POE::Wheel::SocketFactory; operation, errno, and errstr, respectively.
ircsock_connector_open
Dispatched when a Connector has established a connection to a peer.
$_[ARG0]
is the POEx::IRC::Backend::Connect for the connection.
ircsock_disconnect
Dispatched when a connection wheel has been cleared.
$_[ARG0]
is the connection's POEx::IRC::Backend::Connect with wheel() cleared.
ircsock_input
Dispatched when there is some IRC input from a connection wheel.
$_[ARG0]
is the connection's POEx::IRC::Backend::Connect.
$_[ARG1]
is an IRC::Message::Object.
ircsock_listener_created
Dispatched when a POEx::IRC::Backend::Listener has been created.
$_[ARG0]
is the POEx::IRC::Backend::Listener instance; the instance's port() is altered based on getsockname() details after socket creation and before dispatching this event.
ircsock_listener_failure
Dispatched when a Listener has failed due to some sort of socket error.
$_[ARG0]
is the POEx::IRC::Backend::Listener object.
@_[ARG1 .. ARG3]
contain the socket error details reported by POE::Wheel::SocketFactory; operation, errno, and errstr, respectively.
ircsock_listener_open
Dispatched when a listener accepts a connection.
$_[ARG0]
is the connection's POEx::IRC::Backend::Connect
$_[ARG1]
is the connection's POEx::IRC::Backend::Listener
ircsock_listener_removed
Dispatched when a Listener has been removed.
$_[ARG0]
is the POEx::IRC::Backend::Listener object.
ircsock_registered
Dispatched when a "register" event has been successfully received, as a means of acknowledging the controlling session.
$_[ARG0]
is the Backend's $self
object.
BUGS
Probably lots. Please report them via RT, e-mail, or GitHub (http://github.com/avenj/poex-irc-backend).
Tests are a bit incomplete, as of this writing. Zlib and SSL are mostly untested.
SEE ALSO
AUTHOR
Jon Portnoy <avenj@cobaltirc.org>
Inspiration derived from POE::Component::Server::IRC::Backend and POE::Component::IRC by BINGOS, HINRIK et al