I could be wrong, but I think you are registering to receive the PoCo::IRC's events from within the PoCo::Server::TCP session. It boils down to whether the client_input state is attached to the PoCo::Server::TCP session or to your session. The PoCo::IRC component could be sending events to the wrong one.
Update: I believe my post is correct. I have modified massacred your code to see which session is being called:
use POE qw(Component::Server::TCP Component::IRC);
POE::Component::Server::TCP->new(
Port => '9999',
Address => '0.0.0.0',
ClientInput => \&client_input,
);
POE::Session->create(
package_states => [ main => [qw(_start)], ],
);
$poe_kernel->run();
sub _start {
print "My session has id: ", $_[SESSION]->ID(), "\n";
}
sub client_input {
print "Starting bot in session: ", $_[SESSION]->ID(), "\n";
}
And it outputs the following:
My session has id: 3
Starting bot in session: 4
So it looks like client_input is being called on a different session than the one you need to register with POE::Component::IRC. I would probably solve this by creating a new state in your session that handles the PoCo::IRC instantiation and registration stuff. Something like this:
use POE qw(Component::Server::TCP Component::IRC);
POE::Component::Server::TCP->new(
Port => '9999',
Address => '0.0.0.0',
ClientInput => \&client_input,
);
POE::Session->create(
package_states => [ main => [qw(_start create_bot)], ],
);
$poe_kernel->run();
sub create_bot {
print "Starting bot in session: ", $_[SESSION]->ID(), "\n";
}
sub _start {
print "My session has id: ", $_[SESSION]->ID(), "\n";
$_[KERNEL]->alias_set("mine");
}
sub client_input {
$_[KERNEL]->post(mine => 'create_bot');
}
|