]> git.etc.gen.nz Git - picture-display.git/blob - lib/Display/Plugins/Asterisk.pm
42733aa93c2860bc7269aa82583b91a475862e8e
[picture-display.git] / lib / Display / Plugins / Asterisk.pm
1 package Display::Plugins::Asterisk;
2
3 use base ("Display::Plugin");
4
5 use strict;
6 use Carp;
7
8 use POE qw( Component::Client::Asterisk::Manager );
9 use Data::Dumper;
10 use Clutter;
11 use FindBin qw/$Bin/;
12
13 sub new {
14   my $proto = shift;
15   my $class = ref($proto) || $proto;
16
17   my $self = $class->SUPER::new(@_);
18
19   bless ($self, $class);
20
21   $self->{'logo'} = Clutter::Texture->new("$Bin/share/Asterisk.png");
22
23   $self->{'kernel'}->state('asterisk_delayed_start', $self, 'delayed_start');
24
25   POE::Component::Client::Asterisk::Manager->new(
26     Alias => 'asterisk',
27     RemoteHost => $self->{config}{_config}{plugins}{Asterisk}{RemoteHost},
28     RemotePort => $self->{config}{_config}{plugins}{Asterisk}{RemotePort},
29     Username   => $self->{config}{_config}{plugins}{Asterisk}{Username},
30     Password   => $self->{config}{_config}{plugins}{Asterisk}{Password},
31
32     CallBacks => {
33       asterisk_ring  => {
34         'Event' => 'Newchannel',
35         'State' => 'Ring'
36       },
37       asterisk_ringing  => {
38         'Event' => 'Newstate',
39         'State' => 'Ringing',
40       },
41       asterisk_hangup => {
42         'Event' => 'Hangup'
43       },
44       asterisk_dial => {
45         'Event' => 'Dial'
46       },
47       asterisk_input => ':all',
48     },
49
50     inline_states => {
51       # When we're connected to Asterisk, post back to the main session for the rest of
52       # out states to be setup in asterisk_start.  This is to make sure the states are
53       # created in the correct session with a reference to $self.
54       _connected => sub { $self->{'kernel'}->post('display' => 'asterisk_delayed_start') },
55       asterisk_start => sub {
56         my ($kernel, $self) = @_[KERNEL, ARG0];
57
58         $kernel->state('asterisk_input',   $self, 'input');
59         $kernel->state('asterisk_ring',    $self, 'ring');
60         $kernel->state('asterisk_ringing', $self, 'ringing');
61         $kernel->state('asterisk_hangup',  $self, 'hangup');
62         $kernel->state('asterisk_dial',    $self, 'dial');
63       },
64     },
65   );
66
67   return $self;
68 }
69
70 sub delayed_start {
71   my ($self) = shift;
72
73   $self->{'kernel'}->post('asterisk_client' => 'asterisk_start' => $self);
74 }
75
76 sub ring {
77   my ($self, $kernel, $session, $input) = @_[OBJECT, KERNEL, SESSION, ARG0];
78   
79   print STDERR "RING! $input->{Channel}\n";
80   print Dumper($input);
81 }
82
83 sub ringing {
84   my ($self, $kernel, $session, $input) = @_[OBJECT, KERNEL, SESSION, ARG0];
85
86   print STDERR "RING, RING! $input->{Channel}, $input->{'CallerID'} , $input->{'CallerIDName'}\n";
87   print Dumper($input);
88 }
89
90 sub input {
91   my ($self, $kernel, $input) = @_[OBJECT, KERNEL, ARG0];
92
93   print STDERR "Other input - $input->{Event}\n";
94   print Dumper($input);
95 }
96
97 sub hangup {
98   my ($self, $kernel, $input) = @_[OBJECT, KERNEL, ARG0];
99 }
100
101 sub dial {
102   my ($self, $kernel, $input) = @_[OBJECT, KERNEL, ARG0];
103
104   my $dest = $input->{Destination};
105   $dest =~ s/(.*)-.*/$1/;
106
107   my $text = Clutter::Label->new('Sans 20', "Call from " . $input->{CallerIDName} . "\n    " . $input->{CallerID} . "\nFor $dest");
108   $text->set_color(Clutter::Color->parse('White'));
109   $text->set_ellipsize('end');
110
111   $kernel->post('display', 'notifications_add', $text, $self->{'logo'});
112 }
113
114
115
116 1;