root/lang/perl/XIRCD/trunk/lib/XIRCD/Component/Wassr.pm @ 11769

Revision 11769, 3.0 kB (checked in by kan, 5 years ago)

delete debug warn.

Line 
1package XIRCD::Component::Wassr;
2use MooseX::POE;
3use XIRCD::Component;
4
5with 'XIRCD::Role';
6
7use POE qw(
8    Component::Jabber
9    Component::Jabber::Error
10    Component::Jabber::Status
11    Component::Jabber::ProtocolFactory
12    Filter::XML::Node
13    Filter::XML::Utils
14);
15use POE::Filter::XML::NS qw/:JABBER :IQ/;
16
17has 'jabber' => (
18    isa     => 'POE::Component::Jabber',
19    is      => 'rw',
20);
21
22has 'username' => ( isa => 'Str', is => 'rw' );
23has 'password' => ( isa => 'Str', is => 'rw' );
24has 'server'   => ( isa => 'Str', is => 'rw' );
25has 'port'     => ( isa => 'Int', is => 'rw', default => sub { 5222 } );
26
27has 'jid' => (
28    isa     => 'Str',
29    is      => 'rw',
30);
31
32event start => sub {
33    self->alias('wassr');
34
35    debug "start wassr";
36    my ($username, $hostname) = split '@', self->username;
37
38    self->jabber(
39        POE::Component::Jabber->new(
40            IP       => self->server,
41            Port     => self->port,
42            Hostname => $hostname,
43            Username => $username,
44            Password => self->password,
45            Alias    => 'jabber',
46            States   => {
47                StatusEvent => 'status_handler',
48                InputEvent  => 'input_handler',
49                ErrorEvent  => 'error_handler',
50            },
51            ConnectionType => +XMPP,
52        )
53    );
54
55    post jabber => 'connect';
56};
57
58event status_handler => sub {
59    my ($state,) = get_args;
60
61    if ($state == +PCJ_INIT_FINISHED) {
62        debug "init finished";
63        self->jid(self->jabber->jid);
64
65        post jabber => 'output_handler', POE::Filter::XML::Node->new('presence');
66        post jabber => 'purge_queue';
67    }
68};
69
70event input_handler => sub {
71    my ($node,) = get_args;
72
73    debug "recv:", $node->to_str;
74
75    my ($body,) = $node->get_tag('body');
76
77    if ($body && $node->attr('from') =~ /^wassr-bot\@wassr\.jp/) {
78        my ($nick, $text) = $body->data =~ /^([A-Za-z0-9_.-]+): (.*)/s;
79        if ($nick && $text) {
80            publish_message $nick => $text;
81        } else {
82            publish_notice self->config->{channel} => $body->data;
83        }
84    }
85};
86
87event send_message => sub {
88    my ($message,) = get_args;
89
90    my $node = POE::Filter::XML::Node->new('message');
91
92    $node->attr('to', 'wassr-bot@wassr.jp');
93    $node->attr('from', self->{jid} );
94    $node->attr('type', 'chat');
95    $node->insert_tag('body')->data( $message );
96
97    debug "send:", $node->to_str;
98
99    post jabber => output_handler => $node;
100};
101
102event error_handler => sub {
103    my ($error,) = get_args;
104
105    if ( $error == +PCJ_SOCKETFAIL or $error == +PCJ_SOCKETDISCONNECT or $error == +PCJ_CONNECTFAIL ) {
106        debug "Reconnecting!";
107        post jabber => 'reconnect';
108    }
109    elsif ( $error == +PCJ_SSLFAIL ) {
110        debug "TLS/SSL negotiation failed";
111    }
112    elsif ( $error == +PCJ_AUTHFAIL ) {
113        debug "Failed to authenticate";
114    }
115    elsif ( $error == +PCJ_BINDFAIL ) {
116        debug "Failed to bind a resource";
117    }
118    elsif ( $error == +PCJ_SESSIONFAIL ) {
119        debug "Failed to establish a session";
120    }
121};
122
123
1241;
Note: See TracBrowser for help on using the browser.