File Coverage

blib/lib/WWW/Tracking/Data/Plugin/Piwik.pm
Criterion Covered Total %
statement 31 55 56.3
branch 0 8 0.0
condition n/a
subroutine 11 13 84.6
pod n/a
total 42 76 55.2


line stmt bran cond sub pod time code
1             package WWW::Tracking::Data::Plugin::Piwik;
2              
3 1     1   1328 use strict;
  1         1  
  1         23  
4 1     1   4 use warnings;
  1         1  
  1         35  
5              
6             our $VERSION = '0.02';
7              
8 1     1   3 use WWW::Tracking::Data;
  1         1  
  1         4  
9 1     1   371 use URI::Escape 'uri_escape';
  1         909  
  1         42  
10 1     1   545 use LWP::UserAgent;
  1         28611  
  1         25  
11 1     1   6 use URI;
  1         2  
  1         15  
12 1     1   403 use URI::QueryParam;
  1         451  
  1         23  
13 1     1   4 use Carp::Clan 'croak';
  1         2  
  1         5  
14 1     1   561 use List::MoreUtils 'natatime';
  1         7083  
  1         5  
15              
16             our $PK_VERSION = 1;
17             our @URL_PAIRS = (
18             'cip' => 'remote_ip', #
19             'cid' => 'visitor_id', #
20             'cdt' => 'timestamp', #
21             'fla' => 'flash_version', #
22             'java' => 'java_version',
23             'qt' => 'quicktime_version',
24             'realp' => 'realplayer_version',
25             'pdf' => 'pdf_support',
26             'wma' => 'mediaplayer_version',
27             'gears' => 'gears_version',
28             'ag' => 'silverlight_version',
29             'h' => 'request_hour',
30             'm' => 'request_minute',
31             's' => 'request_second',
32             'res' => 'screen_resolution',
33             'cookie' => 'cookie_support',
34             'url' => 'full_request_url',
35             'urlref' => 'referer',
36             'action_name' => 'request_uri',
37             );
38              
39             sub _piwik_url {
40 0     0     my $class = shift;
41 0           my $tracking_data = shift;
42            
43 0           my $pk_tracking_data = bless $tracking_data, 'WWW::Tracking::Data::Plugin::Piwik::DataFilter';
44 0           my $tracker_account = $pk_tracking_data->_tracking->tracker_account;
45 0           my $tracker_url = $pk_tracking_data->_tracking->tracker_url;
46 0 0         croak 'no tracker url set'
47             unless $tracker_url;
48 0           $tracker_url = URI->new($tracker_url);
49            
50 0           my $tracker_token;
51 0 0         if ($tracker_account =~ m/^(\d):(.+)$/) {
52 0           $tracker_account = $1;
53 0           $tracker_token = $2;
54             }
55            
56 0           $tracker_url->query_param('idsite' => $tracker_account);
57 0 0         $tracker_url->query_param('token_auth' => $tracker_token)
58             if defined $tracker_token;
59 0           $tracker_url->query_param('rec' => 1);
60 0           $tracker_url->query_param('apiv' => $PK_VERSION);
61 0           $tracker_url->query_param('rand' => $class->_uniq_rand_id);
62            
63 0           my $url_pair_it = natatime 2, @URL_PAIRS;
64 0           while (my ($param_name, $prop) = $url_pair_it->()) {
65 0           my $value = $pk_tracking_data->$prop;
66 0 0         $tracker_url->query_param($param_name => $value)
67             if defined $value;
68             }
69              
70 0           return $tracker_url->as_string;
71             }
72              
73             sub _uniq_rand_id {
74 0     0     return int(rand(0x7fffffff));
75             }
76              
77             1;
78              
79             package WWW::Tracking::Data::Plugin::Piwik::DataFilter;
80              
81 1     1   686 use base 'WWW::Tracking::Data';
  1         2  
  1         84  
82              
83 1     1   331 use DateTime;
  0            
  0            
84              
85             sub browser_language {
86             my $self = shift;
87             my $lang = $self->SUPER::browser_language(@_);
88            
89             return unless $lang;
90             $lang =~ s/^( [a-zA-Z\-]{2,5} ) .* $/$1/xms; # return only first language that can be either two letter or "en-GB" format
91             return unless $lang;
92             return $lang;
93             }
94              
95             sub timestamp {
96             my $self = shift;
97             my $timestamp = $self->SUPER::timestamp(@_);
98            
99             return unless $timestamp;
100             return DateTime->from_epoch( epoch => $timestamp )->strftime('%Y-%m-%d %H:%M:%S');
101             }
102              
103             sub request_hour {
104             my $self = shift;
105             my $timestamp = $self->SUPER::timestamp;
106             return unless $timestamp;
107             return DateTime->from_epoch( epoch => $timestamp )->strftime('%H');
108             }
109              
110             sub request_minute {
111             my $self = shift;
112             my $timestamp = $self->SUPER::timestamp;
113             return unless $timestamp;
114             return DateTime->from_epoch( epoch => $timestamp )->strftime('%M');
115             }
116             sub request_second {
117             my $self = shift;
118             my $timestamp = $self->SUPER::timestamp;
119             return unless $timestamp;
120             return DateTime->from_epoch( epoch => $timestamp )->strftime('%S');
121             }
122              
123             sub flash_version {
124             my $self = shift;
125             my $flash_version = $self->SUPER::flash_version(@_);
126            
127             return unless defined $flash_version;
128             return ($flash_version ? 1 : 0);
129             }
130              
131             sub java_version {
132             my $self = shift;
133             my $java_version = $self->SUPER::java_version(@_);
134            
135             return unless defined $java_version;
136             return ($java_version ? 1 : 0);
137             }
138              
139             sub quicktime_version {
140             my $self = shift;
141             my $quicktime_version = $self->SUPER::quicktime_version(@_);
142            
143             return unless defined $quicktime_version;
144             return ($quicktime_version ? 1 : 0);
145             }
146              
147             sub realplayer_version {
148             my $self = shift;
149             my $realplayer_version = $self->SUPER::realplayer_version(@_);
150            
151             return unless defined $realplayer_version;
152             return ($realplayer_version ? 1 : 0);
153             }
154              
155             sub pdf_support {
156             my $self = shift;
157             my $pdf_support = $self->SUPER::pdf_support(@_);
158            
159             return unless defined $pdf_support;
160             return ($pdf_support ? 1 : 0);
161             }
162              
163             sub mediaplayer_version {
164             my $self = shift;
165             my $mediaplayer_version = $self->SUPER::mediaplayer_version(@_);
166            
167             return unless defined $mediaplayer_version;
168             return ($mediaplayer_version ? 1 : 0);
169             }
170              
171             sub gears_version {
172             my $self = shift;
173             my $gears_version = $self->SUPER::gears_version(@_);
174            
175             return unless defined $gears_version;
176             return ($gears_version ? 1 : 0);
177             }
178              
179             sub silverlight_version {
180             my $self = shift;
181             my $silverlight_version = $self->SUPER::silverlight_version(@_);
182            
183             return unless defined $silverlight_version;
184             return ($silverlight_version ? 1 : 0);
185             }
186              
187             sub visitor_id {
188             my $self = shift;
189             my $visitor_id = $self->SUPER::visitor_id(@_);
190            
191             return unless defined $visitor_id;
192             return substr($visitor_id,0,16);
193             }
194              
195             1;
196              
197             package WWW::Tracking::Data;
198              
199             use Carp::Clan 'croak';
200              
201             sub as_piwik {
202             my $self = shift;
203            
204             return WWW::Tracking::Data::Plugin::Piwik->_piwik_url($self);
205             }
206              
207             sub make_tracking_request_piwik {
208             my $self = shift;
209            
210             my $ua = LWP::UserAgent->new;
211             $ua->default_header('Accept-Language' => $self->browser_language);
212             $ua->agent($self->user_agent);
213             my $ga_output = $ua->get($self->as_piwik);
214              
215             croak $ga_output->status_line
216             unless $ga_output->is_success;
217            
218             return $self;
219             }
220              
221             1;
222              
223             __END__