1POE::Component::IRC(3)User Contributed Perl DocumentationPOE::Component::IRC(3)
2
3
4

NAME

6       POE::Component::IRC - A fully event-driven IRC client module
7

SYNOPSIS

9        # A simple Rot13 'encryption' bot
10
11        use strict;
12        use warnings;
13        use POE qw(Component::IRC);
14
15        my $nickname = 'Flibble' . $$;
16        my $ircname = 'Flibble the Sailor Bot';
17        my $server = 'irc.blahblahblah.irc';
18
19        my @channels = ('#Blah', '#Foo', '#Bar');
20
21        # We create a new PoCo-IRC object
22        my $irc = POE::Component::IRC->spawn(
23           nick => $nickname,
24           ircname => $ircname,
25           server => $server,
26        ) or die "Oh noooo! $!";
27
28        POE::Session->create(
29            package_states => [
30                main => [ qw(_default _start irc_001 irc_public) ],
31            ],
32            heap => { irc => $irc },
33        );
34
35        $poe_kernel->run();
36
37        sub _start {
38            my $heap = $_[HEAP];
39
40            # retrieve our component's object from the heap where we stashed it
41            my $irc = $heap->{irc};
42
43            $irc->yield( register => 'all' );
44            $irc->yield( connect => { } );
45            return;
46        }
47
48        sub irc_001 {
49            my $sender = $_[SENDER];
50
51            # Since this is an irc_* event, we can get the component's object by
52            # accessing the heap of the sender. Then we register and connect to the
53            # specified server.
54            my $irc = $sender->get_heap();
55
56            print "Connected to ", $irc->server_name(), "\n";
57
58            # we join our channels
59            $irc->yield( join => $_ ) for @channels;
60            return;
61        }
62
63        sub irc_public {
64            my ($sender, $who, $where, $what) = @_[SENDER, ARG0 .. ARG2];
65            my $nick = ( split /!/, $who )[0];
66            my $channel = $where->[0];
67
68            if ( my ($rot13) = $what =~ /^rot13 (.+)/ ) {
69                $rot13 =~ tr[a-zA-Z][n-za-mN-ZA-M];
70                $irc->yield( privmsg => $channel => "$nick: $rot13" );
71            }
72            return;
73        }
74
75        # We registered for all events, this will produce some debug info.
76        sub _default {
77            my ($event, $args) = @_[ARG0 .. $#_];
78            my @output = ( "$event: " );
79
80            for my $arg (@$args) {
81                if ( ref $arg eq 'ARRAY' ) {
82                    push( @output, '[' . join(', ', @$arg ) . ']' );
83                }
84                else {
85                    push ( @output, "'$arg'" );
86                }
87            }
88            print join ' ', @output, "\n";
89            return 0;
90        }
91

DESCRIPTION

93       POE::Component::IRC is a POE component (who'd have guessed?) which acts
94       as an easily controllable IRC client for your other POE components and
95       sessions. You create an IRC component and tell it what events your
96       session cares about and where to connect to, and it sends back
97       interesting IRC events when they happen. You make the client do things
98       by sending it events. That's all there is to it. Cool, no?
99
100       [Note that using this module requires some familiarity with the details
101       of the IRC protocol. I'd advise you to read up on the gory details of
102       RFC 1459 (<http://www.faqs.org/rfcs/rfc1459.html>) before you get
103       started. Keep the list of server numeric codes handy while you program.
104       Needless to say, you'll also need a good working knowledge of POE, or
105       this document will be of very little use to you.]
106
107       The POE::Component::IRC distribution has a docs/ folder with a
108       collection of salient documentation including the pertinent RFCs.
109
110       POE::Component::IRC consists of a POE::Session that manages the IRC
111       connection and dispatches "irc_" prefixed events to interested sessions
112       and an object that can be used to access additional information using
113       methods.
114
115       Sessions register their interest in receiving "irc_" events by sending
116       "register" to the component. One would usually do this in your "_start"
117       handler. Your session will continue to receive events until you
118       "unregister". The component will continue to stay around until you tell
119       it not to with "shutdown".
120
121       The SYNOPSIS demonstrates a fairly basic bot.
122
123       See POE::Component::IRC::Cookbook for more examples.
124
125   Useful subclasses
126       Included with POE::Component::IRC are a number of useful subclasses. As
127       they are subclasses they support all the methods, etc. documented here
128       and have additional methods and quirks which are documented separately:
129
130       POE::Component::IRC::State
131           POE::Component::IRC::State provides all the functionality of
132           POE::Component::IRC but also tracks IRC state entities such as
133           nicks and channels.
134
135       POE::Component::IRC::Qnet
136           POE::Component::IRC::Qnet is POE::Component::IRC tweaked for use on
137           Quakenet IRC network.
138
139       POE::Component::IRC::Qnet::State
140           POE::Component::IRC::Qnet::State is a tweaked version of
141           POE::Component::IRC::State for use on the Quakenet IRC network.
142
143   The Plugin system
144       As of 3.7, PoCo-IRC sports a plugin system. The documentation for it
145       can be read by looking at POE::Component::IRC::Plugin.  That is not a
146       subclass, just a placeholder for documentation!
147
148       A number of useful plugins have made their way into the core
149       distribution:
150
151       POE::Component::IRC::Plugin::DCC
152           Provides DCC support. Loaded by default.
153
154       POE::Component::IRC::Plugin::AutoJoin
155           Keeps you on your favorite channels throughout reconnects and even
156           kicks.
157
158       POE::Component::IRC::Plugin::Connector
159           Glues an irc bot to an IRC network, i.e. deals with maintaining
160           ircd connections.
161
162       POE::Component::IRC::Plugin::BotTraffic
163           Under normal circumstances irc bots do not normal the msgs and
164           public msgs that they generate themselves. This plugin enables you
165           to handle those events.
166
167       POE::Component::IRC::Plugin::BotAddressed
168           Generates "irc_bot_addressed" / "irc_bot_mentioned" /
169           "irc_bot_mentioned_action" events whenever your bot's name comes up
170           in channel discussion.
171
172       POE::Component::IRC::Plugin::BotCommand
173           Provides an easy way to handle commands issued to your bot.
174
175       POE::Component::IRC::Plugin::Console
176           See inside the component. See what events are being sent. Generate
177           irc commands manually. A TCP based console.
178
179       POE::Component::IRC::Plugin::FollowTail
180           Follow the tail of an ever-growing file.
181
182       POE::Component::IRC::Plugin::Logger
183           Log public and private messages to disk.
184
185       POE::Component::IRC::Plugin::NickServID
186           Identify with FreeNode's NickServ when needed.
187
188       POE::Component::IRC::Plugin::Proxy
189           A lightweight IRC proxy/bouncer.
190
191       POE::Component::IRC::Plugin::CTCP
192           Automagically generates replies to ctcp version, time and userinfo
193           queries.
194
195       POE::Component::IRC::Plugin::PlugMan
196           An experimental Plugin Manager plugin.
197
198       POE::Component::IRC::Plugin::NickReclaim
199           Automagically deals with your nickname being in use and reclaiming
200           it.
201
202       POE::Component::IRC::Plugin::CycleEmpty
203           Cycles (parts and rejoins) channels if they become empty and
204           opless, in order to gain ops.
205

CONSTRUCTORS

207       Both constructors return an object. The object is also available within
208       'irc_' event handlers by using "$_[SENDER]->get_heap()". See also
209       "register" and "irc_registered".
210
211   "spawn"
212       Takes a number of arguments, all of which are optional. All the options
213       below may be supplied to the "connect" input event as well, except for
214       'alias', 'options', 'NoDNS', 'debug', and 'plugin_debug'.
215
216       'alias', a name (kernel alias) that this instance will be known by;
217
218       'options', a hashref containing POE::Session options;
219
220       'Server', the server name;
221
222       'Port', the remote port number;
223
224       'Password', an optional password for restricted servers;
225
226       'Nick', your client's IRC nickname;
227
228       'Username', your client's username;
229
230       'Ircname', some cute comment or something.
231
232       'UseSSL', set to some true value if you want to connect using SSL.
233
234       'Raw', set to some true value to enable the component to send "irc_raw"
235       and "irc_raw_out" events.
236
237       'LocalAddr', which local IP address on a multihomed box to connect as;
238
239       'LocalPort', the local TCP port to open your socket on;
240
241       'NoDNS', set this to 1 to disable DNS lookups using PoCo-Client-DNS.
242       (See note below).
243
244       'Flood', set this to 1 to get quickly disconnected and klined from an
245       ircd >;]
246
247       'Proxy', IP address or server name of a proxy server to use.
248
249       'ProxyPort', which tcp port on the proxy to connect to.
250
251       'NATAddr', what other clients see as your IP address.
252
253       'DCCPorts', an arrayref containing tcp ports that can be used for DCC
254       sends.
255
256       'Resolver', provide a POE::Component::Client::DNS object for the
257       component to use.
258
259       'msg_length', the maximum length of IRC messages, in bytes. Default is
260       450.  The IRC component shortens all messages longer than this value
261       minus the length of your current nickname. IRC only allows raw protocol
262       lines messages that are 512 bytes or shorter, including the trailing
263       "\r\n". This is most relevant to long PRIVMSGs. The IRC component can't
264       be sure how long your user@host mask will be every time you send a
265       message, considering that most networks mangle the 'user' part and some
266       even replace the whole string (think FreeNode cloaks).  If you have an
267       unusually long user@host mask you might want to decrease this value if
268       you're prone to sending long messages. Conversely, if you have an
269       unusually short one, you can increase this value if you want to be able
270       to send as long a message as possible. Be careful though, increase it
271       too much and the IRC server might disconnect you with a "Request too
272       long" message when you try to send a message that's too long.
273
274       'debug', if set to a true value causes the IRC component to print every
275       message sent to and from the server, as well as print some warnings
276       when it receives malformed messages. This option will be enabled if the
277       "POCOIRC_DEBUG" environment variable is set to a true value.
278
279       'plugin_debug', set to some true value to print plugin debug info,
280       default 0.  Plugins are processed inside an eval. When you enable this
281       option, you will be notified when (and why) a plugin raises an
282       exception. This option will be enabled if the "POCOIRC_DEBUG"
283       environment variable is set to a true value.
284
285       'socks_proxy', specify a SOCKS4/SOCKS4a proxy to use.
286
287       'socks_port', the SOCKS port to use, defaults to 1080 if not specified.
288
289       'socks_id', specify a SOCKS user_id. Default is none.
290
291       'useipv6', enable the use of IPv6 for connections.
292
293       "spawn" will supply reasonable defaults for any of these attributes
294       which are missing, so don't feel obliged to write them all out.
295
296       If the component finds that POE::Component::Client::DNS is installed it
297       will use that to resolve the server name passed. Disable this behaviour
298       if you like, by passing: "NoDNS => 1".
299
300       Additionally there is a 'Flood' parameter. When true, it disables the
301       component's flood protection algorithms, allowing it to send messages
302       to an IRC server at full speed. Disconnects and k-lines are some common
303       side effects of flooding IRC servers, so care should be used when
304       enabling this option.
305
306       Two new attributes are 'Proxy' and 'ProxyPort' for sending your IRC
307       traffic through a proxy server. 'Proxy''s value should be the IP
308       address or server name of the proxy. 'ProxyPort''s value should be the
309       port on the proxy to connect to. "connect" will default to using the
310       actual IRC server's port if you provide a proxy but omit the proxy's
311       port. These are for HTTP Proxies. See 'socks_proxy' for SOCKS4 and
312       SOCKS4a support.
313
314       For those people who run bots behind firewalls and/or Network Address
315       Translation there are two additional attributes for DCC. 'DCCPorts', is
316       an arrayref of ports to use when initiating DCC connections. 'NATAddr',
317       is the NAT'ed IP address that your bot is hidden behind, this is sent
318       whenever you do DCC.
319
320       SSL support requires POE::Component::SSLify, as well as an IRC server
321       that supports SSL connections. If you're missing
322       POE::Component::SSLify, specifying 'UseSSL' will do nothing. The
323       default is to not try to use SSL.
324
325       'Resolver', requires a POE::Component::Client::DNS object. Useful when
326       spawning multiple poco-irc sessions, saves the overhead of multiple dns
327       sessions.
328
329       'NoDNS' has different results depending on whether it is set with
330       "spawn" or "connect". Setting it with "spawn", disables the creation of
331       the POE::Component::Client::DNS completely. Setting it with "connect"
332       on the other hand allows the PoCo-Client-DNS session to be spawned, but
333       will disable any dns lookups using it.
334
335       SOCKS4 proxy support is provided by 'socks_proxy', 'socks_port' and
336       'socks_id' parameters. If something goes wrong with the SOCKS
337       connection you should get a warning on STDERR. This is fairly
338       experimental currently.
339
340       IPv6 support is available for connecting to IPv6 enabled ircds (it
341       won't work for DCC though). To enable it, specify 'useipv6'. Socket6 is
342       required to be installed. If you have Socket6 and
343       POE::Component::Client::DNS installed and specify a hostname that
344       resolves to an IPv6 address then IPv6 will be used.  If you specify an
345       ipv6 'localaddr' then IPv6 will be used.
346
347   "new"
348       This method is deprecated. See the "spawn" method instead.  The first
349       argument should be a name (kernel alias) which this new connection will
350       be known by. Optionally takes more arguments (see "spawn" as name/value
351       pairs. Returns a POE::Component::IRC object. :)
352
353       Note: Use of this method will generate a warning. There are currently
354       no plans to make it die() >;]
355

METHODS

357       These are methods supported by the POE::Component::IRC object. It also
358       inherits a few from Object::Pluggable.  See its documentation for
359       details.
360
361   "server_name"
362       Takes no arguments. Returns the name of the IRC server that the
363       component is currently connected to.
364
365   "server_version"
366       Takes no arguments. Returns the IRC server version.
367
368   "nick_name"
369       Takes no arguments. Returns a scalar containing the current nickname
370       that the bot is using.
371
372   "localaddr"
373       Takes no arguments. Returns the IP address being used.
374
375   "session_id"
376       Takes no arguments. Returns the ID of the component's session. Ideal
377       for posting events to the component.
378
379        $kernel->post($irc->session_id() => 'mode' => $channel => '+o' => $dude);
380
381   "session_alias"
382       Takes no arguments. Returns the session alias that has been set through
383       "spawn"'s alias argument.
384
385   "send_queue"
386       The component provides anti-flood throttling. This method takes no
387       arguments and returns a scalar representing the number of messages that
388       are queued up waiting for dispatch to the irc server.
389
390   "logged_in"
391       Takes no arguments. Returns true or false depending on whether the IRC
392       component is logged into an IRC network.
393
394   "connected"
395       Takes no arguments. Returns true or false depending on whether the
396       component's socket is currently connected.
397
398   "disconnect"
399       Takes no arguments. Terminates the socket connection disgracefully >;o]
400
401   "raw_events"
402       With no arguments, returns true or false depending on whether "irc_raw"
403       and "irc_raw_out" events are being generated or not. Provide a true or
404       false argument to enable or disable this feature accordingly.
405
406   "isupport"
407       Takes one argument, a server capability to query. Returns "undef" on
408       failure or a value representing the applicable capability. A full list
409       of capabilities is available at
410       <http://www.irc.org/tech_docs/005.html>.
411
412   "isupport_dump_keys"
413       Takes no arguments, returns a list of the available server capabilities
414       keys, which can be used with "isupport".
415
416   "yield"
417       This method provides an alternative object based means of posting
418       events to the component. First argument is the event to post, following
419       arguments are sent as arguments to the resultant post.
420
421        $irc->yield(mode => $channel => '+o' => $dude);
422
423   "call"
424       This method provides an alternative object based means of calling
425       events to the component. First argument is the event to call, following
426       arguments are sent as arguments to the resultant call.
427
428        $irc->call(mode => $channel => '+o' => $dude);
429
430   "delay"
431       This method provides a way of posting delayed events to the component.
432       The first argument is an arrayref consisting of the delayed command to
433       post and any command arguments. The second argument is the time in
434       seconds that one wishes to delay the command being posted.
435
436        my $alarm_id = $irc->delay( [ mode => $channel => '+o' => $dude ], 60 );
437
438       Returns an alarm ID that can be used with "delay_remove" to cancel the
439       delayed event. This will be undefined if something went wrong.
440
441   "delay_remove"
442       This method removes a previously scheduled delayed event from the
443       component.  Takes one argument, the "alarm_id" that was returned by a
444       "delay" method call.
445
446        my $arrayref = $irc->delay_remove( $alarm_id );
447
448       Returns an arrayref that was originally requested to be delayed.
449
450   "resolver"
451       Returns a reference to the POE::Component::Client::DNS object that is
452       internally created by the component.
453
454   "send_event"
455       Sends an event through the components event handling system. These will
456       get processed by plugins then by registered sessions. First argument is
457       the event name, followed by any parameters for that event.
458

INPUT

460       How to talk to your new IRC component... here's the events we'll
461       accept.  These are events that are posted to the component, either via
462       "$poe_kernel->post()" or via the object method "yield".
463
464       So the following would be functionally equivalent:
465
466        sub irc_001 {
467            my ($kernel,$sender) = @_[KERNEL,SENDER];
468            my $irc = $sender->get_heap(); # obtain the poco's object
469
470            $irc->yield( privmsg => 'foo' => 'Howdy!' );
471            $kernel->post( $sender => privmsg => 'foo' => 'Howdy!' );
472            $kernel->post( $irc->session_id() => privmsg => 'foo' => 'Howdy!' );
473            $kernel->post( $irc->session_alias() => privmsg => 'foo' => 'Howdy!' );
474
475            return;
476        }
477
478   Important Commands
479       "register"
480
481       Takes N arguments: a list of event names that your session wants to
482       listen for, minus the "irc_" prefix. So, for instance, if you just want
483       a bot that keeps track of which people are on a channel, you'll need to
484       listen for JOINs, PARTs, QUITs, and KICKs to people on the channel
485       you're in. You'd tell POE::Component::IRC that you want those events by
486       saying this:
487
488        $kernel->post('my client', 'register', qw(join part quit kick));
489
490       Then, whenever people enter or leave a channel your bot is on (forcibly
491       or not), your session will receive events with names like "irc_join",
492       "irc_kick", etc., which you can use to update a list of people on the
493       channel.
494
495       Registering for 'all' will cause it to send all IRC-related events to
496       you; this is the easiest way to handle it. See the test script for an
497       example.
498
499       Registering will generate an "irc_registered" event that your session
500       can trap. "ARG0" is the components object. Useful if you want to bolt
501       PoCo-IRC's new features such as Plugins into a bot coded to the older
502       deprecated API. If you are using the new API, ignore this :)
503
504       Registering with multiple component sessions can be tricky, especially
505       if one wants to marry up sessions/objects, etc. Check the SIGNALS
506       section for an alternative method of registering with multiple poco-
507       ircs.
508
509       Starting with version 4.96, if you spawn the component from inside
510       another POE session, the component will automatically register that
511       session as wanting 'all' irc events. That session will receive an
512       "irc_registered" event indicating that the component is up and ready to
513       go.
514
515       "connect"
516
517       Takes one argument: a hash reference of attributes for the new
518       connection, see "spawn" for details. This event tells the IRC client to
519       connect to a new/different server. If it has a connection already open,
520       it'll close it gracefully before reconnecting.
521
522       "ctcp" and "ctcpreply"
523
524       Sends a CTCP query or response to the nick(s) or channel(s) which you
525       specify. Takes 2 arguments: the nick or channel to send a message to
526       (use an array reference here to specify multiple recipients), and the
527       plain text of the message to send (the CTCP quoting will be handled for
528       you). The "/me" command in popular IRC clients is actually a CTCP
529       action.
530
531        # Doing a /me
532        $irc->yield(ctcp => $channel => 'ACTION dances.');
533
534       "join"
535
536       Tells your IRC client to join a single channel of your choice. Takes at
537       least one arg: the channel name (required) and the channel key
538       (optional, for password-protected channels).
539
540       "kick"
541
542       Tell the IRC server to forcibly evict a user from a particular channel.
543       Takes at least 2 arguments: a channel name, the nick of the user to
544       boot, and an optional witty message to show them as they sail out the
545       door.
546
547       "remove" (FreeNode only)
548
549       Tell the IRC server to forcibly evict a user from a particular channel.
550       Takes at least 2 arguments: a channel name, the nick of the user to
551       boot, and an optional witty message to show them as they sail out the
552       door. Similar to KICK but does an enforced PART instead.
553
554       "mode"
555
556       Request a mode change on a particular channel or user. Takes at least
557       one argument: the mode changes to effect, as a single string (e.g.
558       "#mychan +sm-p+o"), and any number of optional operands to the mode
559       changes (nicks, hostmasks, channel keys, whatever.) Or just pass them
560       all as one big string and it'll still work, whatever. I regret that I
561       haven't the patience now to write a detailed explanation, but serious
562       IRC users know the details anyhow.
563
564       "nick"
565
566       Allows you to change your nickname. Takes exactly one argument: the new
567       username that you'd like to be known as.
568
569       "nickserv" (FreeNode, ratbox, et al)
570
571       Talks to NickServ. Takes any number of arguments.
572
573       "notice"
574
575       Sends a NOTICE message to the nick(s) or channel(s) which you specify.
576       Takes 2 arguments: the nick or channel to send a notice to (use an
577       array reference here to specify multiple recipients), and the text of
578       the notice to send.
579
580       "part"
581
582       Tell your IRC client to leave the channels which you pass to it. Takes
583       any number of arguments: channel names to depart from. If the last
584       argument doesn't begin with a channel name identifier or contains a
585       space character, it will be treated as a PART message and dealt with
586       accordingly.
587
588       "privmsg"
589
590       Sends a public or private message to the nick(s) or channel(s) which
591       you specify. Takes 2 arguments: the nick or channel to send a message
592       to (use an array reference here to specify multiple recipients), and
593       the text of the message to send.
594
595       Have a look at the constants in POE::Component::IRC::Common if you
596       would like to use formatting and color codes in your messages.
597
598       "quit"
599
600       Tells the IRC server to disconnect you. Takes one optional argument:
601       some clever, witty string that other users in your channels will see as
602       you leave. You can expect to get an "irc_disconnected" event shortly
603       after sending this.
604
605       "shutdown"
606
607       By default, POE::Component::IRC sessions never go away. Even after
608       they're disconnected, they're still sitting around in the background,
609       waiting for you to call "connect" on them again to reconnect. (Whether
610       this behavior is the Right Thing is doubtful, but I don't want to break
611       backwards compatibility at this point.) You can send the IRC session a
612       "shutdown" event manually to make it delete itself.
613
614       If you are logged into an IRC server, "shutdown" first will send a quit
615       message and wait to be disconnected. It will wait for up to 5 seconds
616       before forcibly disconnecting from the IRC server. If you provide an
617       argument, that will be used as the QUIT message. If you provide two
618       arguments, the second one will be used as the timeout (in seconds).
619
620       Terminating multiple components can be tricky. Check the SIGNALS
621       section for a method of shutting down multiple poco-ircs.
622
623       "topic"
624
625       Retrieves or sets the topic for particular channel. If called with just
626       the channel name as an argument, it will ask the server to return the
627       current topic. If called with the channel name and a string, it will
628       set the channel topic to that string. Supply an empty string to unset a
629       channel topic.
630
631       "unregister"
632
633       Takes N arguments: a list of event names which you don't want to
634       receive. If you've previously done a "register" for a particular event
635       which you no longer care about, this event will tell the IRC connection
636       to stop sending them to you. (If you haven't, it just ignores you. No
637       big deal.)
638
639       If you have registered with 'all', attempting to unregister individual
640       events such as 'mode', etc. will not work. This is a 'feature'.
641
642       "debug"
643
644       Takes one argument: 0 to turn debugging off or 1 to turn debugging on.
645       This flips the debugging flag in POE::Filter::IRCD,
646       POE::Filter::IRC::Compat, and POE::Component::IRC. This has the same
647       effect as setting Debug in "spawn" or "connect".
648
649   Not-So-Important Commands
650       "admin"
651
652       Asks your server who your friendly neighborhood server administrators
653       are. If you prefer, you can pass it a server name to query, instead of
654       asking the server you're currently on.
655
656       "away"
657
658       When sent with an argument (a message describig where you went), the
659       server will note that you're now away from your machine or otherwise
660       preoccupied, and pass your message along to anyone who tries to
661       communicate with you. When sent without arguments, it tells the server
662       that you're back and paying attention.
663
664       "cap"
665
666       Used to query/enable/disable IRC protocol capabilities. Takes any
667       number of arguments.
668
669       "dcc*"
670
671       See the DCC plugin (loaded by default) documentation for DCC-related
672       commands.
673
674       "info"
675
676       Basically the same as the "version" command, except that the server is
677       permitted to return any information about itself that it thinks is
678       relevant. There's some nice, specific standards-writing for ya, eh?
679
680       "invite"
681
682       Invites another user onto an invite-only channel. Takes 2 arguments:
683       the nick of the user you wish to admit, and the name of the channel to
684       invite them to.
685
686       "ison"
687
688       Asks the IRC server which users out of a list of nicknames are
689       currently online. Takes any number of arguments: a list of nicknames to
690       query the IRC server about.
691
692       "links"
693
694       Asks the server for a list of servers connected to the IRC network.
695       Takes two optional arguments, which I'm too lazy to document here, so
696       all you would-be linklooker writers should probably go dig up the RFC.
697
698       "list"
699
700       Asks the server for a list of visible channels and their topics. Takes
701       any number of optional arguments: names of channels to get topic
702       information for. If called without any channel names, it'll list every
703       visible channel on the IRC network. This is usually a really big list,
704       so don't do this often.
705
706       "motd"
707
708       Request the server's "Message of the Day", a document which typically
709       contains stuff like the server's acceptable use policy and admin
710       contact email addresses, et cetera. Normally you'll automatically
711       receive this when you log into a server, but if you want it again,
712       here's how to do it. If you'd like to get the MOTD for a server other
713       than the one you're logged into, pass it the server's hostname as an
714       argument; otherwise, no arguments.
715
716       "names"
717
718       Asks the server for a list of nicknames on particular channels. Takes
719       any number of arguments: names of channels to get lists of users for.
720       If called without any channel names, it'll tell you the nicks of
721       everyone on the IRC network. This is a really big list, so don't do
722       this much.
723
724       "quote"
725
726       Sends a raw line of text to the server. Takes one argument: a string of
727       a raw IRC command to send to the server. It is more optimal to use the
728       events this module supplies instead of writing raw IRC commands
729       yourself.
730
731       "stats"
732
733       Returns some information about a server. Kinda complicated and not
734       terribly commonly used, so look it up in the RFC if you're curious.
735       Takes as many arguments as you please.
736
737       "time"
738
739       Asks the server what time it thinks it is, which it will return in a
740       human-readable form. Takes one optional argument: a server name to
741       query. If not supplied, defaults to current server.
742
743       "trace"
744
745       If you pass a server name or nick along with this request, it asks the
746       server for the list of servers in between you and the thing you
747       mentioned. If sent with no arguments, it will show you all the servers
748       which are connected to your current server.
749
750       "users"
751
752       Asks the server how many users are logged into it. Defaults to the
753       server you're currently logged into; however, you can pass a server
754       name as the first argument to query some other machine instead.
755
756       "version"
757
758       Asks the server about the version of ircd that it's running. Takes one
759       optional argument: a server name to query. If not supplied, defaults to
760       current server.
761
762       "who"
763
764       Lists the logged-on users matching a particular channel name, hostname,
765       nickname, or what-have-you. Takes one optional argument: a string for
766       it to search for. Wildcards are allowed; in the absence of this
767       argument, it will return everyone who's currently logged in (bad move).
768       Tack an "o" on the end if you want to list only IRCops, as per the RFC.
769
770       "whois"
771
772       Queries the IRC server for detailed information about a particular
773       user. Takes any number of arguments: nicknames or hostmasks to ask for
774       information about. As of version 3.2, you will receive an "irc_whois"
775       event in addition to the usual numeric responses. See below for
776       details.
777
778       "whowas"
779
780       Asks the server for information about nickname which is no longer
781       connected. Takes at least one argument: a nickname to look up (no
782       wildcards allowed), the optional maximum number of history entries to
783       return, and the optional server hostname to query. As of version 3.2,
784       you will receive an "irc_whowas" event in addition to the usual numeric
785       responses. See below for details.
786
787       "ping" and "pong"
788
789       Included for completeness sake. The component will deal with ponging to
790       pings automatically. Don't worry about it.
791
792   Purely Esoteric Commands
793       "die"
794
795       Tells the IRC server you're connect to, to terminate. Only useful for
796       IRCops, thank goodness. Takes no arguments.
797
798       "locops"
799
800       Opers-only command. This one sends a message to all currently logged-on
801       local-opers (+l). This option is specific to EFNet.
802
803       "oper"
804
805       In the exceedingly unlikely event that you happen to be an IRC
806       operator, you can use this command to authenticate with your IRC
807       server. Takes 2 arguments: your username and your password.
808
809       "operwall"
810
811       Opers-only command. This one sends a message to all currently logged-on
812       global opers. This option is specific to EFNet.
813
814       "rehash"
815
816       Tells the IRC server you're connected to, to rehash its configuration
817       files. Only useful for IRCops. Takes no arguments.
818
819       "restart"
820
821       Tells the IRC server you're connected to, to shut down and restart
822       itself.  Only useful for IRCops, thank goodness. Takes no arguments.
823
824       "sconnect"
825
826       Tells one IRC server (which you have operator status on) to connect to
827       another. This is actually the CONNECT command, but I already had an
828       event called "connect", so too bad. Takes the args you'd expect: a
829       server to connect to, an optional port to connect on, and an optional
830       remote server to connect with, instead of the one you're currently on.
831
832       "squit"
833
834       Operator-only command used to disconnect server links. Takes two
835       arguments, the server to disconnect and a message explaining your
836       action.
837
838       "summon"
839
840       Don't even ask.
841
842       "servlist"
843
844       Lists the currently connected services on the network that are visible
845       to you.  Takes two optional arguments, a mask for matching service
846       names against, and a service type.
847
848       "squery"
849
850       Sends a message to a service. Takes the same arguments as "privmsg".
851
852       "userhost"
853
854       Asks the IRC server for information about particular nicknames. (The
855       RFC doesn't define exactly what this is supposed to return.) Takes any
856       number of arguments: the nicknames to look up.
857
858       "wallops"
859
860       Another opers-only command. This one sends a message to all currently
861       logged-on opers (and +w users); sort of a mass PA system for the IRC
862       server administrators. Takes one argument: some clever, witty message
863       to send.
864

OUTPUT

866       The events you will receive (or can ask to receive) from your running
867       IRC component. Note that all incoming event names your session will
868       receive are prefixed by "irc_", to inhibit event namespace pollution.
869
870       If you wish, you can ask the client to send you every event it
871       generates. Simply register for the event name "all". This is a lot
872       easier than writing a huge list of things you specifically want to
873       listen for.
874
875       FIXME: I'd really like to classify these somewhat ("basic", "oper",
876       "ctcp", "dcc", "raw" or some such), and I'd welcome suggestions for
877       ways to make this easier on the user, if you can think of some.
878
879       In your event handlers, $_[SENDER] is the particular component session
880       that sent you the event. "$_[SENDER]->get_heap()" will retrieve the
881       component's object. Useful if you want on-the-fly access to the object
882       and its methods.
883
884   Important Events
885       "irc_connected"
886
887       The IRC component will send an "irc_connected" event as soon as it
888       establishes a connection to an IRC server, before attempting to log in.
889       "ARG0" is the server name.
890
891       NOTE: When you get an "irc_connected" event, this doesn't mean you can
892       start sending commands to the server yet. Wait until you receive an
893       "irc_001" event (the server welcome message) before actually sending
894       anything back to the server.
895
896       "irc_ctcp"
897
898       "irc_ctcp" events are generated upon receipt of CTCP messages, in
899       addition to the "irc_ctcp_*" events mentioned below. They are identical
900       in every way to these, with one difference: instead of the * being in
901       the method name, it is prepended to the argument list. For example, if
902       someone types "/ctcp Flibble foo bar", an "irc_ctcp" event will be sent
903       with 'foo' as "ARG0", and the rest as given below.
904
905       It is not recommended that you register for both "irc_ctcp" and
906       "irc_ctcp_*" events, since they will both be fired and presumably cause
907       duplication.
908
909       "irc_ctcp_*"
910
911       "irc_ctcp_whatever" events are generated upon receipt of CTCP messages.
912       For instance, receiving a CTCP PING request generates an
913       "irc_ctcp_ping" event, CTCP ACTION (produced by typing "/me" in most
914       IRC clients) generates an "irc_ctcp_action" event, blah blah, so on and
915       so forth. "ARG0" is the nick!hostmask of the sender. "ARG1" is the
916       channel/recipient name(s). "ARG2" is the text of the CTCP message. On
917       servers supporting the IDENTIFY-MSG feature (e.g. FreeNode), CTCP
918       ACTIONs will have "ARG3", which will be 1 if the sender has identified
919       with NickServ, 0 otherwise.
920
921       Note that DCCs are handled separately -- see the DCC plugin.
922
923       "irc_ctcpreply_*"
924
925       "irc_ctcpreply_whatever" messages are just like "irc_ctcp_whatever"
926       messages, described above, except that they're generated when a
927       response to one of your CTCP queries comes back. They have the same
928       arguments and such as "irc_ctcp_*" events.
929
930       "irc_disconnected"
931
932       The counterpart to "irc_connected", sent whenever a socket connection
933       to an IRC server closes down (whether intentionally or
934       unintentionally). "ARG0" is the server name.
935
936       "irc_error"
937
938       You get this whenever the server sends you an ERROR message. Expect
939       this to usually be accompanied by the sudden dropping of your
940       connection. "ARG0" is the server's explanation of the error.
941
942       "irc_join"
943
944       Sent whenever someone joins a channel that you're on. "ARG0" is the
945       person's nick!hostmask. "ARG1" is the channel name.
946
947       "irc_invite"
948
949       Sent whenever someone offers you an invitation to another channel.
950       "ARG0" is the person's nick!hostmask. "ARG1" is the name of the channel
951       they want you to join.
952
953       "irc_kick"
954
955       Sent whenever someone gets booted off a channel that you're on. "ARG0"
956       is the kicker's nick!hostmask. "ARG1" is the channel name. "ARG2" is
957       the nick of the unfortunate kickee. "ARG3" is the explanation string
958       for the kick.
959
960       "irc_mode"
961
962       Sent whenever someone changes a channel mode in your presence, or when
963       you change your own user mode. "ARG0" is the nick!hostmask of that
964       someone. "ARG1" is the channel it affects (or your nick, if it's a user
965       mode change). "ARG2" is the mode string (i.e., "+o-b"). The rest of the
966       args ("ARG3 .. $#_") are the operands to the mode string (nicks,
967       hostmasks, channel keys, whatever).
968
969       "irc_msg"
970
971       Sent whenever you receive a PRIVMSG command that was addressed to you
972       privately. "ARG0" is the nick!hostmask of the sender. "ARG1" is an
973       array reference containing the nick(s) of the recipients. "ARG2" is the
974       text of the message. On servers supporting the IDENTIFY-MSG feature
975       (e.g.  FreeNode), there will be an additional argument, "ARG3", will be
976       1 if the sender has identified with NickServ, 0 otherwise.
977
978       "irc_nick"
979
980       Sent whenever you, or someone around you, changes nicks. "ARG0" is the
981       nick!hostmask of the changer. "ARG1" is the new nick that they changed
982       to.
983
984       "irc_notice"
985
986       Sent whenever you receive a NOTICE command. "ARG0" is the nick!hostmask
987       of the sender. "ARG1" is an array reference containing the nick(s) or
988       channel name(s) of the recipients. "ARG2" is the text of the NOTICE
989       message.
990
991       "irc_part"
992
993       Sent whenever someone leaves a channel that you're on. "ARG0" is the
994       person's nick!hostmask. "ARG1" is the channel name. "ARG2" is the part
995       message.
996
997       "irc_public"
998
999       Sent whenever you receive a PRIVMSG command that was sent to a channel.
1000       "ARG0" is the nick!hostmask of the sender. "ARG1" is an array reference
1001       containing the channel name(s) of the recipients. "ARG2" is the text of
1002       the message. On servers supporting the IDENTIFY-MSG feature (e.g.
1003       FreeNode), there will be an additional argument, "ARG3", will be 1 if
1004       the sender has identified with NickServ, 0 otherwise.
1005
1006       "irc_quit"
1007
1008       Sent whenever someone on a channel with you quits IRC (or gets KILLed).
1009       "ARG0" is the nick!hostmask of the person in question. "ARG1" is the
1010       clever, witty message they left behind on the way out.
1011
1012       "irc_socketerr"
1013
1014       Sent when a connection couldn't be established to the IRC server.
1015       "ARG0" is probably some vague and/or misleading reason for what failed.
1016
1017       "irc_topic"
1018
1019       Sent when a channel topic is set or unset. "ARG0" is the nick!hostmask
1020       of the sender. "ARG1" is the channel affected. "ARG2" will be either: a
1021       string if the topic is being set; or a zero-length string (i.e. '') if
1022       the topic is being unset. Note: replies to queries about what a channel
1023       topic *is* (i.e. TOPIC #channel), are returned as numerics, not with
1024       this event.
1025
1026       "irc_whois"
1027
1028       Sent in response to a WHOIS query. "ARG0" is a hashref, with the
1029       following keys:
1030
1031       'nick', the users nickname;
1032
1033       'user', the users username;
1034
1035       'host', their hostname;
1036
1037       'real', their real name;
1038
1039       'idle', their idle time in seconds;
1040
1041       'signon', the epoch time they signed on (will be undef if ircd does not
1042       support this);
1043
1044       'channels', an arrayref listing visible channels they are on, the
1045       channel is prefixed with '@','+','%' depending on whether they have +o
1046       +v or +h;
1047
1048       'server', their server ( might not be useful on some networks );
1049
1050       'oper', whether they are an IRCop, contains the IRC operator string if
1051       they are, undef if they aren't.
1052
1053       'actually', some ircds report the users actual ip address, that'll be
1054       here;
1055
1056       On ircu/seven IRCDs (e.g. FreeNode), if the user has registered with
1057       services, there will be another key:
1058
1059       'account'.
1060
1061       On Hyperion IRCDs, if the user has identified with NICKSERV there will
1062       be an additional key:
1063
1064       'identified'.
1065
1066       "irc_whowas"
1067
1068       Similar to the above, except some keys will be missing.
1069
1070       "irc_raw"
1071
1072       Enabled by passing "Raw => 1" to "spawn" or "connect", or by calling
1073       "raw_events" with a true argument. "ARG0" is the raw IRC string
1074       received by the component from the IRC server, before it has been
1075       mangled by filters and such like.
1076
1077       "irc_raw_out"
1078
1079       Enabled by passing "Raw => 1" to "spawn" or "connect", or by calling
1080       "raw_events" with a true argument. "ARG0" is the raw IRC string sent by
1081       the component to the the IRC server.
1082
1083       "irc_registered"
1084
1085       Sent once to the requesting session on registration (see "register").
1086       "ARG0" is a reference tothe component's object.
1087
1088       "irc_shutdown"
1089
1090       Sent to all registered sessions when the component has been asked to
1091       "shutdown". "ARG0" will be the session ID of the requesting session.
1092
1093       "irc_isupport"
1094
1095       Emitted by the first event after an "irc_005", to indicate that
1096       isupport information has been gathered. "ARG0" is the
1097       POE::Component::IRC::Plugin::ISupport object.
1098
1099       "irc_delay_set"
1100
1101       Emitted on a successful addition of a delayed event using the "delay"
1102       method. "ARG0" will be the alarm_id which can be used later with
1103       "delay_remove". Subsequent parameters are the arguments that were
1104       passed to "delay".
1105
1106       "irc_delay_removed"
1107
1108       Emitted when a delayed command is successfully removed. "ARG0" will be
1109       the alarm_id that was removed. Subsequent parameters are the arguments
1110       that were passed to "delay".
1111
1112       "irc_socks_failed"
1113
1114       Emitted whenever we fail to connect successfully to a SOCKS server or
1115       the SOCKS server is not actually a SOCKS server. "ARG0" will be some
1116       vague reason as to what went wrong. Hopefully.
1117
1118       "irc_socks_rejected"
1119
1120       Emitted whenever a SOCKS connection is rejected by a SOCKS server.
1121       "ARG0" is the SOCKS code, "ARG1" the SOCKS server address, "ARG2" the
1122       SOCKS port and "ARG3" the SOCKS user id (if defined).
1123
1124   Somewhat Less Important Events
1125       "irc_cap"
1126
1127       A reply from the server regarding protocol capabilities. "ARG0" is the
1128       CAP subcommand (e.g. 'LS'). "ARG1" is the result of the subcommand,
1129       unless this is a multi-part reply, in which case "ARG1" is '*' and
1130       "ARG2" contains the result.
1131
1132       "irc_dcc_*"
1133
1134       See the DCC plugin (loaded by default) documentation for DCC-related
1135       events.
1136
1137       "irc_ping"
1138
1139       An event sent whenever the server sends a PING query to the client.
1140       (Don't confuse this with a CTCP PING, which is another beast entirely.
1141       If unclear, read the RFC.) Note that POE::Component::IRC will
1142       automatically take care of sending the PONG response back to the server
1143       for you, although you can still register to catch the event for
1144       informational purposes.
1145
1146       "irc_snotice"
1147
1148       A weird, non-RFC-compliant message from an IRC server. Don't worry
1149       about it. "ARG0" is the text of the server's message.
1150
1151   All numeric events
1152       Most messages from IRC servers are identified only by three-digit
1153       numeric codes with undescriptive constant names like RPL_UMODEIS and
1154       ERR_NOTOPLEVEL. (Actually, the list of codes in the RFC is kind of out-
1155       of-date... the list in the back of Net::IRC::Event.pm is more complete,
1156       and different IRC networks have different and incompatible lists. Ack!)
1157       As an example, say you wanted to handle event 376 (RPL_ENDOFMOTD, which
1158       signals the end of the MOTD message). You'd register for '376', and
1159       listen for "irc_376" events. Simple, no? "ARG0" is the name of the
1160       server which sent the message. "ARG1" is the text of the message.
1161       "ARG2" is an array reference of the parsed message, so there is no need
1162       to parse "ARG1" yourself.
1163

SIGNALS

1165       The component will handle a number of custom signals that you may send
1166       using POE::Kernel's "signal" method.
1167
1168   "POCOIRC_REGISTER"
1169       Registering with multiple PoCo-IRC components has been a pita. Well, no
1170       more, using the power of POE::Kernel signals.
1171
1172       If the component receives a "POCOIRC_REGISTER" signal it'll register
1173       the requesting session and trigger an "irc_registered" event. From that
1174       event one can get all the information necessary such as the poco-irc
1175       object and the SENDER session to do whatever one needs to build a poco-
1176       irc dispatch table.
1177
1178       The way the signal handler in PoCo-IRC is written also supports sending
1179       the "POCOIRC_REGISTER" to multiple sessions simultaneously, by sending
1180       the signal to the POE Kernel itself.
1181
1182       Pass the signal your session, session ID or alias, and the IRC events
1183       (as specified to "register").
1184
1185       To register with multiple PoCo-IRCs one can do the following in your
1186       session's _start handler:
1187
1188        sub _start {
1189            my ($kernel, $session) = @_[KERNEL, SESSION];
1190
1191            # Registering with multiple pocoircs for 'all' IRC events
1192            $kernel->signal($kernel, 'POCOIRC_REGISTER', $session->ID(), 'all');
1193
1194            return:
1195        }
1196
1197       Each poco-irc will send your session an "irc_registered" event:
1198
1199        sub irc_registered {
1200            my ($kernel, $sender, $heap, $irc_object) = @_[KERNEL, SENDER, HEAP, ARG0];
1201
1202            # Get the poco-irc session ID
1203            my $sender_id = $sender->ID();
1204
1205            # Or it's alias
1206            my $poco_alias = $irc_object->session_alias();
1207
1208            # Store it in our heap maybe
1209            $heap->{irc_objects}->{ $sender_id } = $irc_object;
1210
1211            # Make the poco connect
1212            $irc_object->yield(connect => { });
1213
1214            return;
1215        }
1216
1217   "POCOIRC_SHUTDOWN"
1218       Telling multiple poco-ircs to shutdown was a pita as well. The same
1219       principle as with registering applies to shutdown too.
1220
1221       Send a "POCOIRC_SHUTDOWN" to the POE Kernel to terminate all the active
1222       poco-ircs simultaneously.
1223
1224        $poe_kernel->signal($poe_kernel, 'POCOIRC_SHUTDOWN');
1225
1226       Any additional parameters passed to the signal will become your quit
1227       messages on each IRC network.
1228

ENCODING AND CHARACTER SETS

1230   Messages
1231       The only requirement the IRC protocol places on its messages is that
1232       they be 8-bits, and in ASCII. This has resulted in most of the Western
1233       world settling on ASCII-compatible Latin-1 (usually Microsoft's CP1252,
1234       a Latin-1 variant) as a convention. Recently, popular IRC clients
1235       (mIRC, xchat, certain irssi configurations) have begun sending a
1236       mixture of CP1252 and UTF-8 over the wire to allow more characters
1237       without breaking backward compatibility (too much).  They send CP1252
1238       encoded messages if the characters fit within that encoding, otherwise
1239       falling back to UTF-8. Writing text with mixed encoding to a file,
1240       terminal, or database is rarely a good idea. To decode such messages
1241       reliably, see "irc_to_utf8" from POE::Component::IRC::Common.
1242
1243   Channel names
1244       This matter is complicated further by the fact that some servers allow
1245       non-ASCII characters in channel names. The IRC component doesn't
1246       explicitly convert between encodings before sending your message along,
1247       but it has to concatenate the channel name and the message before
1248       sending them over the wire. So when you do "$irc->yield(privmsg =>
1249       $chan, 'aed`i')", where $chan is the unmodified channel name you got
1250       from the IRC component (i.e. it's a byte string), the channel name will
1251       end up getting double-encoded when concatenated with the message (which
1252       is a text string).  If the channel name is all-ASCII, then nothing bad
1253       will happen, but if there are non-ASCII chars in it, you're in trouble.
1254
1255       To prevent this, you can't simply call "irc_to_utf8" on the channel
1256       name and then use it, because IRC servers don't care about encodings.
1257       '#aed`i' in CP1252 is not the same channel as '#aed`i' in UTF-8. The
1258       channel name and your message must therefore both be byte stirngs, or
1259       both be text strings.  If they're text strings, the UTF-8 flag must be
1260       off for both, or on for both.
1261
1262       A simple rule to follow is to call "encode_utf8" on the channel name
1263       and/or message if they are text strings. Here are some examples:
1264
1265        use Encode qw(encode_utf8);
1266
1267        sub irc_public {
1268            my ($who, $where, $what) = @_[ARG0..ARG2];
1269            my $irc = $_[SENDER]->get_heap();
1270
1271            # bad: if $where has any non-ASCII chars, they will get double-encoded
1272            $irc->yield(privmsg => $where, 'aed`i');
1273
1274            # bad: if $what has any non-ASCII chars, they will get double-encoded
1275            $irc->yield(privmsg => '#aed`i', $what);
1276
1277            # good: both are byte strings already, so this does what we expect
1278            $irc->yield(privmsg => $where, $what);
1279
1280            # good: both are text strings (Latin1 as per Perl's default), so
1281            # they'll be concatenated correctly
1282            $irc->yield(privmsg => '#aed`i', 'aed`i');
1283
1284            # good: same as the last one, except now they're both in UTF-8,
1285            # which means we'll be sending the message to a different channel
1286            use utf8;
1287            $irc->yield(privmsg => '#aed`i', 'aed`i');
1288
1289            # good: $where and $msg_bytes are both byte strings
1290            my $msg_bytes = encode_utf8('aed`i');
1291            $irc->yield(privmsg => $where, $msg_bytes);
1292
1293            # good: $chan_bytes and $what are both byte strings
1294            my $chan_bytes = encode_utf8('#aed`i');
1295            $irc->yield(privmsg => $chan_bytes, $what);
1296        }
1297
1298       See also Encode, perluniintro, perlunitut, perlunicode, and perlunifaq.
1299

BUGS

1301       A few have turned up in the past and they are sure to again. Please use
1302       <http://rt.cpan.org/> to report any. Alternatively, email the current
1303       maintainer.
1304

DEVELOPMENT

1306       You can find the latest source on github:
1307       http://github.com/bingos/poe-component-irc
1308       <http://github.com/bingos/poe-component-irc>
1309
1310       The project's developers usually hang out in the "#poe" IRC channel on
1311       irc.freenode.org. Do drop us a line.
1312

MAINTAINERS

1314       Chris "BinGOs" Williams <chris@bingosnet.co.uk>
1315
1316       Hinrik Oern Sigurd`sson <hinrik.sig@gmail.com>
1317

AUTHOR

1319       Dennis Taylor.
1320

LICENCE

1322       Copyright (c) Dennis Taylor, Chris Williams and Hinrik Oern Sigurd`sson
1323
1324       This module may be used, modified, and distributed under the same terms
1325       as Perl itself. Please see the license that came with your Perl
1326       distribution for details.
1327

MAD PROPS

1329       The maddest of mad props go out to Rocco "dngor" Caputo
1330       <troc@netrus.net>, for inventing something as mind-bogglingly cool as
1331       POE, and to Kevin "oznoid" Lenzo <lenzo@cs.cmu.edu>, for being the
1332       attentive parent of our precocious little infobot on #perl.
1333
1334       Further props to a few of the studly bughunters who made this module
1335       not suck: Abys <abys@web1-2-3.com>, Addi <addi@umich.edu>, ResDev
1336       <ben@reser.org>, and Roderick <roderick@argon.org>. Woohoo!
1337
1338       Kudos to Apocalypse, <apocal@cpan.org>, for the plugin system and to
1339       Jeff 'japhy' Pinyan, <japhy@perlmonk.org>, for Pipeline.
1340
1341       Thanks to the merry band of POE pixies from #PoE @ irc.perl.org,
1342       including ( but not limited to ), ketas, ct, dec, integral, webfox,
1343       immute, perigrin, paulv, alias.
1344
1345       Check out the Changes file for further contributors.
1346

SEE ALSO

1348       RFC 1459 <http://www.faqs.org/rfcs/rfc1459.html>
1349
1350       <http://www.irchelp.org/>,
1351
1352       <http://poe.perl.org/>,
1353
1354       <http://www.infobot.org/>,
1355
1356       Some good examples reside in the POE cookbook which has a whole section
1357       devoted to IRC programming <http://poe.perl.org/?POE_Cookbook>.
1358
1359       The examples/ folder of this distribution.
1360
1361
1362
1363perl v5.12.2                      2010-11-05            POE::Component::IRC(3)
Impressum