=head1 NAME DJabberd::Component::Example - An example DJabberd service component =head1 SYNOPSIS Greeting Hello, world! This class implements a very simple component that responds to all incoming messages with a predefined greeting and which returns a vCard for itself when one is requested. You can change the greeting returned using the optional Greeting configuration setting as above. This example also exposes a node called "somebloke" that responds to all messages with authentic British surprise. This example uses the higher-level API provided by L, from which L inherits. L serves as an example of how to handle stanzas at a lower level by overriding the C method. =head1 COPYRIGHT This module is Copyright (c) 2008 Martin Atkins This module is distributed under the same terms as the main DJabberd distribution. =cut package DJabberd::Component::Example; use base DJabberd::Component; use DJabberd::Util qw(exml); use DJabberd::Log; use DJabberd::JID; our $logger = DJabberd::Log->get_logger(); sub set_config_greeting { my ($self, $greeting) = @_; $self->{greeting} = $greeting; } sub finalize { my ($self, $opts) = @_; $logger->info("initializing"); $logger->info("My greeting is ", $self->{greeting}); $self->{greeting} ||= "Hi! I'm an example DJabberd component!"; $self->SUPER::finalize; } sub handle_message { my ($self, $vhost, $stanza) = @_; my $from = $stanza->from_jid; my $to = $stanza->to_jid; $logger->info("Got message from ".$from->as_string); my $response = $stanza->make_response(); $response->attrs->{"{}type"} = "normal"; $response->set_raw("".exml($self->{greeting}).""); $logger->info("Responding with ".$response->as_xml); $response->deliver($vhost); } sub vcard { my ($self, $requester_jid) = @_; return "Example DJabberd component"; } sub get_node { my ($self, $nodename) = @_; if ($nodename eq 'somebloke') { return DJabberd::Component::Example::ExampleNode->new( nodename => 'somebloke', ); } else { return undef; } } package DJabberd::Component::Example::ExampleNode; use base DJabberd::Agent::Node; use DJabberd::Util qw(exml); sub handle_message { my ($self, $vhost, $stanza) = @_; $logger->info("It's a message to some bloke."); my $responsetext = "Gaw blimey, guvna!"; my $response = $stanza->make_response(); $response->set_raw("".exml($responsetext).""); $response->deliver($vhost); } sub vcard { return "Some Bloke"; } 1;