File Coverage

blib/lib/SETI/WebStats.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             # $Id: WebStats.pm,v 1.9 2003/10/10 01:57:57 vek Exp $
2            
3             package SETI::WebStats;
4            
5 3     3   53243 use Carp qw(croak);
  3         8  
  3         215  
6 3     3   24263 use LWP::UserAgent;
  3         269026  
  3         101  
7 3     3   3703 use XML::Simple;
  0            
  0            
8             use strict;
9             use vars qw($VERSION);
10            
11             $VERSION = '1.03';
12            
13             use constant USERURL =>
14             "http://setiathome.ssl.berkeley.edu/fcgi-bin/fcgi?cmd=user_xml&email=%s";
15            
16             use constant GROUPURL =>
17             "http://setiathome.ssl.berkeley.edu/fcgi-bin/fcgi?cmd=team_lookup_xml&name=%s";
18            
19             sub new {
20             my ($class, $emailAddr) = @_;
21             my $self = {};
22             $self->{version} = $VERSION;
23             bless $self, $class;
24             # still allowing emailAddr in constructor for
25             # backwards compatability...
26             if ($emailAddr) {
27             return $self->fetchUserStats($emailAddr);
28             }
29             return $self;
30             }
31            
32             ###############################################################################
33             # Public methods
34             ###############################################################################
35            
36             sub fetchUserStats {
37             my ($self, $emailAddr) = @_;
38             if (! $emailAddr) {
39             croak("You must specify an email address");
40             return 0;
41             }
42             my $url = sprintf(USERURL, $emailAddr);
43             $self->_mode('user');
44             return $self->_fetch($url);
45             }
46            
47             sub fetchGroupStats {
48             my ($self, $groupName) = @_;
49             if (! $groupName) {
50             croak("You must specify a group name");
51             return 0;
52             }
53             my $url = sprintf(GROUPURL, $groupName);
54             $self->_mode('group');
55             return $self->_fetch($url);
56             }
57            
58             # userinfo methods
59            
60             sub userInfo {
61             my $self = shift;
62             return $self->{data}->{userinfo};
63             }
64            
65             sub userTime {
66             my $self = shift;
67             return $self->{data}->{userinfo}->{usertime};
68             }
69            
70             sub aveCpu {
71             my $self = shift;
72             return $self->{data}->{userinfo}->{avecpu};
73             }
74            
75             sub numResults {
76             my $self = shift;
77             return $self->{data}->{userinfo}->{numresults};
78             }
79            
80             sub regDate {
81             my $self = shift;
82             return $self->{data}->{userinfo}->{regdate};
83             }
84            
85             sub profileURL {
86             my $self = shift;
87             if ($self->{data}->{userinfo}->{userprofile}) {
88             return $self->{data}->{userinfo}->{userprofile}->{a}->{href};
89             } else {
90             return "No URL";
91             }
92             }
93            
94             sub resultsPerDay {
95             my $self = shift;
96             return $self->{data}->{userinfo}->{resultsperday};
97             }
98            
99             sub lastResultTime {
100             my $self = shift;
101             return $self->{data}->{userinfo}->{lastresulttime} || 0;
102             }
103            
104             sub cpuTime {
105             my $self = shift;
106             return $self->{data}->{userinfo}->{cputime};
107             }
108            
109             sub name {
110             my $self = shift;
111             if (ref $self->{data}->{userinfo}->{name}) {
112             return $self->{data}->{userinfo}->{name}->{a}->{content};
113             } else {
114             return $self->{data}->{userinfo}->{name};
115             }
116             }
117            
118             sub homePage {
119             my $self = shift;
120             if (ref $self->{data}->{userinfo}->{name}) {
121             if ($self->{data}->{userinfo}->{name}->{a}->{href}) {
122             return $self->{data}->{userinfo}->{name}->{a}->{href};
123             } else {
124             return "No Home Page";
125             }
126             } else {
127             return "No Home Page";
128             }
129             }
130            
131             # rankinfo methods
132            
133             sub rankInfo {
134             my $self = shift;
135             return $self->{data}->{rankinfo};
136             }
137            
138             sub haveSameRank {
139             my $self = shift;
140             return $self->{data}->{rankinfo}->{num_samerank};
141             }
142            
143             sub totalUsers {
144             my $self = shift;
145             return $self->{data}->{rankinfo}->{ranktotalusers};
146             }
147            
148             sub rankPercent {
149             my $self = shift;
150             return (100 - $self->{data}->{rankinfo}->{top_rankpct});
151             }
152            
153             sub rank {
154             my $self = shift;
155             return $self->{data}->{rankinfo}->{rank};
156             }
157            
158             # groupinfo methods from individual user query...
159            
160             sub groupInfo {
161             my $self = shift;
162             return $self->{data}->{groupinfo}->{group} ?
163             $self->{data}->{groupinfo}->{group}->{a} :
164             undef;
165             }
166            
167             sub groupName {
168             my $self = shift;
169             return $self->{data}->{groupinfo}->{group} ?
170             $self->{data}->{groupinfo}->{group}->{a}->{content} :
171             undef;
172             }
173            
174             sub groupUrl {
175             my $self = shift;
176             return $self->{data}->{groupinfo}->{group} ?
177             $self->{data}->{groupinfo}->{group}->{a}->{href} :
178             undef;
179             }
180            
181             # group methods (from group query)
182            
183             sub groupURL {
184             my $self = shift;
185             return $self->{groupdata} ?
186             ($self->{groupdata}->{url} || undef) :
187             undef;
188             }
189            
190             sub numGroupResults {
191             my $self = shift;
192             return $self->{groupdata} ?
193             ($self->{groupdata}->{numresults} || undef) :
194             undef;
195             }
196            
197             sub numGroupMembers {
198             my $self = shift;
199             return $self->{groupdata} ?
200             ($self->{groupdata}->{nummembers} || undef) :
201             undef;
202             }
203            
204             sub totalGroupCPU {
205             my $self = shift;
206             return $self->{groupdata} ?
207             ($self->{groupdata}->{totalcpu} || undef) :
208             undef;
209             }
210            
211             sub nameOfGroup {
212             my $self = shift;
213             return $self->{groupdata} ?
214             ($self->{groupdata}->{name} || undef) :
215             undef;
216             }
217            
218             sub groupFounderName {
219             my $self = shift;
220             return $self->{groupdata} ?
221             ($self->{groupdata}->{founder}->{name} || undef) :
222             undef;
223             }
224            
225             sub groupFounderURL {
226             my $self = shift;
227             return $self->{groupdata} ?
228             ($self->{groupdata}->{founder}->{url} || undef) :
229             undef;
230             }
231            
232             ###############################################################################
233             # Private methods
234             ###############################################################################
235            
236             sub _fetch {
237             my ($self, $URL) = @_;
238             my $ua = LWP::UserAgent->new;
239             $ua->agent("SETI::WebStats/$VERSION " . $ua->agent);
240             my $req = HTTP::Request->new('GET', $URL);
241             my $resp = $ua->request($req);
242             return 0 if (! $resp->is_success);
243             if ($resp->content =~ /No user|No such group/) {
244             croak($resp->content);
245             return 0;
246             }
247             local ($^W) = 0; # silence XML::SAX::Expat
248             if ($self->_mode eq 'user') {
249             $self->{data} = XMLin($resp->content);
250             } else {
251             $self->{groupdata} = XMLin($resp->content);
252             }
253             local ($^W) = 1;
254             return 1;
255             }
256            
257             sub _mode {
258             my ($self, $mode) = @_;
259             if (defined $mode) {
260             $self->{mode} = $mode;
261             return $self;
262             } else {
263             return $self->{mode} || undef;
264             }
265             }
266            
267             1;
268             __END__