File Coverage

blib/lib/WWW/ARDB.pm
Criterion Covered Total %
statement 110 112 98.2
branch 19 26 73.0
condition n/a
subroutine 33 33 100.0
pod 17 17 100.0
total 179 188 95.2


line stmt bran cond sub pod time code
1             package WWW::ARDB;
2             our $AUTHORITY = 'cpan:GETTY';
3              
4             # ABSTRACT: Perl client for the ARC Raiders Database API (ardb.app)
5              
6 5     5   810683 use Moo;
  5         31722  
  5         30  
7 5     5   10511 use LWP::UserAgent;
  5         321979  
  5         279  
8 5     5   3251 use JSON::MaybeXS qw( decode_json );
  5         60066  
  5         459  
9 5     5   48 use Carp qw( croak );
  5         15  
  5         277  
10 5     5   2787 use namespace::clean;
  5         78040  
  5         35  
11              
12             our $VERSION = '0.002';
13             our $DEBUG = $ENV{WWW_ARDB_DEBUG};
14              
15 5     5   6006 use WWW::ARDB::Cache;
  5         24  
  5         218  
16 5     5   3153 use WWW::ARDB::Request;
  5         15  
  5         192  
17 5     5   4618 use WWW::ARDB::Result::Item;
  5         25  
  5         303  
18 5     5   4751 use WWW::ARDB::Result::Quest;
  5         20  
  5         267  
19 5     5   4356 use WWW::ARDB::Result::ArcEnemy;
  5         24  
  5         8099  
20              
21              
22             has ua => (
23             is => 'ro',
24             lazy => 1,
25             builder => '_build_ua',
26             );
27              
28              
29             sub _build_ua {
30 1     1   1080 my $self = shift;
31 1         15 return LWP::UserAgent->new(
32             agent => 'WWW-ARDB/' . $VERSION,
33             timeout => 30,
34             );
35             }
36              
37             has request => (
38             is => 'ro',
39             lazy => 1,
40             default => sub { WWW::ARDB::Request->new },
41             );
42              
43              
44             has cache => (
45             is => 'ro',
46             lazy => 1,
47             builder => '_build_cache',
48             );
49              
50              
51             sub _build_cache {
52 2     2   578 my $self = shift;
53 2 50       64 return WWW::ARDB::Cache->new(
54             $self->cache_dir ? (cache_dir => $self->cache_dir) : ()
55             );
56             }
57              
58             has use_cache => (
59             is => 'ro',
60             default => 1,
61             );
62              
63              
64             has cache_dir => (
65             is => 'ro',
66             );
67              
68              
69             has debug => (
70             is => 'ro',
71             default => sub { $DEBUG // 0 },
72             );
73              
74              
75             # Items
76              
77             sub items {
78 7     7 1 3604 my ($self, %params) = @_;
79 7         220 my $data = $self->_fetch('items', $self->request->items(%params), %params);
80 7         49 return $self->_to_objects($data, 'WWW::ARDB::Result::Item');
81             }
82              
83              
84             sub items_raw {
85 1     1 1 10556 my ($self, %params) = @_;
86 1         41 return $self->_fetch('items', $self->request->items(%params), %params);
87             }
88              
89              
90             sub item {
91 2     2 1 7125 my ($self, $id, %params) = @_;
92 2         67 my $data = $self->_fetch("items/$id", $self->request->item($id, %params), %params);
93 2         33 return $self->_to_object($data, 'WWW::ARDB::Result::Item');
94             }
95              
96              
97             sub item_raw {
98 1     1 1 11584 my ($self, $id, %params) = @_;
99 1         43 return $self->_fetch("items/$id", $self->request->item($id, %params), %params);
100             }
101              
102              
103             # Quests
104              
105             sub quests {
106 5     5 1 7598 my ($self, %params) = @_;
107 5         143 my $data = $self->_fetch('quests', $self->request->quests(%params), %params);
108 5         34 return $self->_to_objects($data, 'WWW::ARDB::Result::Quest');
109             }
110              
111              
112             sub quests_raw {
113 1     1 1 12210 my ($self, %params) = @_;
114 1         35 return $self->_fetch('quests', $self->request->quests(%params), %params);
115             }
116              
117              
118             sub quest {
119 1     1 1 3393 my ($self, $id, %params) = @_;
120 1         30 my $data = $self->_fetch("quests/$id", $self->request->quest($id, %params), %params);
121 1         7 return $self->_to_object($data, 'WWW::ARDB::Result::Quest');
122             }
123              
124              
125             sub quest_raw {
126 1     1 1 3619 my ($self, $id, %params) = @_;
127 1         29 return $self->_fetch("quests/$id", $self->request->quest($id, %params), %params);
128             }
129              
130              
131             # ARC Enemies
132              
133             sub arc_enemies {
134 4     4 1 3135 my ($self, %params) = @_;
135 4         95 my $data = $self->_fetch('arc-enemies', $self->request->arc_enemies(%params), %params);
136 4         19 return $self->_to_objects($data, 'WWW::ARDB::Result::ArcEnemy');
137             }
138              
139              
140             sub arc_enemies_raw {
141 1     1 1 5290 my ($self, %params) = @_;
142 1         28 return $self->_fetch('arc-enemies', $self->request->arc_enemies(%params), %params);
143             }
144              
145              
146             sub arc_enemy {
147 1     1 1 3593 my ($self, $id, %params) = @_;
148 1         52 my $data = $self->_fetch("arc-enemies/$id", $self->request->arc_enemy($id, %params), %params);
149 1         9 return $self->_to_object($data, 'WWW::ARDB::Result::ArcEnemy');
150             }
151              
152              
153             sub arc_enemy_raw {
154 1     1 1 4120 my ($self, $id, %params) = @_;
155 1         32 return $self->_fetch("arc-enemies/$id", $self->request->arc_enemy($id, %params), %params);
156             }
157              
158              
159             # Helper methods
160              
161             sub find_item_by_name {
162 3     3 1 6155 my ($self, $name) = @_;
163 3         12 my $items = $self->items;
164 3         556 my $lc_name = lc($name);
165 3         8 for my $item (@$items) {
166 8 100       49 return $item if lc($item->name) eq $lc_name;
167             }
168 1         15 return;
169             }
170              
171              
172             sub find_item_by_id {
173 1     1 1 2897 my ($self, $id) = @_;
174 1         7 return $self->item($id);
175             }
176              
177              
178             sub find_quest_by_title {
179 3     3 1 5967 my ($self, $title) = @_;
180 3         10 my $quests = $self->quests;
181 3         417 my $lc_title = lc($title);
182 3         6 for my $quest (@$quests) {
183 5 100       27 return $quest if lc($quest->title) eq $lc_title;
184             }
185 1         11 return;
186             }
187              
188              
189             sub find_arc_enemy_by_name {
190 3     3 1 4921 my ($self, $name) = @_;
191 3         9 my $enemies = $self->arc_enemies;
192 3         299 my $lc_name = lc($name);
193 3         8 for my $enemy (@$enemies) {
194 6 100       28 return $enemy if lc($enemy->name) eq $lc_name;
195             }
196 1         7 return;
197             }
198              
199              
200             sub clear_cache {
201 2     2 1 3345 my ($self, $endpoint) = @_;
202 2         82 $self->cache->clear($endpoint);
203             }
204              
205              
206             # Internal methods
207              
208             sub _fetch {
209 26     26   5345 my ($self, $endpoint, $http_request, %params) = @_;
210              
211 26 100       125 if ($self->use_cache) {
212 3         106 my $cached = $self->cache->get($endpoint, \%params);
213 3 100       124 if ($cached) {
214 1         7 $self->_debug("Cache hit for $endpoint");
215 1         3 return $cached;
216             }
217             }
218              
219 25         129 $self->_debug("Fetching $endpoint from API");
220 25         717 my $response = $self->ua->request($http_request);
221              
222 25 50       17890 unless ($response->is_success) {
223 0         0 croak "API request failed: " . $response->status_line;
224             }
225              
226 25         338 my $data = decode_json($response->decoded_content);
227              
228 25 100       4649 if ($self->use_cache) {
229 2         79 $self->cache->set($endpoint, \%params, $data);
230             }
231              
232 25         2153 return $data;
233             }
234              
235             sub _to_objects {
236 16     16   46 my ($self, $data, $class) = @_;
237 16 50       49 return [] unless $data;
238 16 50       45 return [] unless ref($data) eq 'ARRAY';
239 16         39 return [ map { $class->from_hashref($_) } @$data ];
  57         59237  
240             }
241              
242             sub _to_object {
243 4     4   11 my ($self, $data, $class) = @_;
244 4 50       15 return unless $data;
245 4 50       15 return unless ref($data) eq 'HASH';
246 4         38 return $class->from_hashref($data);
247             }
248              
249             sub _debug {
250 26     26   57 my ($self, $msg) = @_;
251 26 50       121 return unless $self->debug;
252 0           warn "[WWW::ARDB] $msg\n";
253             }
254              
255              
256             1;
257              
258             __END__