File Coverage

blib/lib/WebService/LiveJournal/Event.pm
Criterion Covered Total %
statement 21 218 9.6
branch 0 88 0.0
condition 0 41 0.0
subroutine 7 46 15.2
pod 24 36 66.6
total 52 429 12.1


line stmt bran cond sub pod time code
1             package WebService::LiveJournal::Event;
2              
3 12     12   40 use strict;
  12         12  
  12         255  
4 12     12   32 use warnings;
  12         12  
  12         210  
5 12     12   35 use RPC::XML;
  12         13  
  12         363  
6 12     12   38 use WebService::LiveJournal::Thingie;
  12         14  
  12         8468  
7             our @ISA = qw/ WebService::LiveJournal::Thingie /;
8              
9             # ABSTRACT: LiveJournal event class
10             our $VERSION = '0.08'; # VERSION
11              
12              
13             # crib sheet based on stuff i read in the doco may be
14             # complete rubbish.
15             #
16             # itemid (req) # (int)
17             # event (req) # (string) set to empty to delete
18             # lineendings (req) # (string) "unix"
19             # subject (req) # (string)
20             # security (opt) # (string) public|private|usemask (defaults to public)
21             # allowmask (opt) # (int)
22             # year (req) # (4-digit int)
23             # mon (req) # (1- or 2-digit month int)
24             # day (req) # (1- or 2-digit day int)
25             # hour (req) # (1- or 2-digit hour int 0..23)
26             # min (req) # (1- or 2-digit day int 0..60)
27             # props (req) # (struct)
28             # usejournal (opt) # (string)
29             #
30              
31             sub new
32             {
33 0     0 0   my $ob = shift;
34 0   0       my $class = ref($ob) || $ob;
35 0           my $self = bless {}, $class;
36 0           my %arg = @_;
37            
38 0   0       $self->{props} = $arg{props} || {};
39 0 0         $self->{itemid} = $arg{itemid} if defined $arg{itemid};
40 0   0       $self->{subject} = $arg{subject} || '';
41 0 0         $self->{url} = $arg{url} if defined $arg{url};
42 0 0         $self->{anum} = $arg{anum} if defined $arg{anum};
43 0   0       $self->{event} = $arg{event} || ' ';
44 0 0         $self->eventtime($arg{eventtime}) if defined $arg{eventtime};
45 0   0       $self->{security} = $arg{security} || 'public';
46 0 0         $self->{allowmask} = $arg{allowmask} if defined $arg{allowmask};
47 0 0         $self->{usejournal} = $arg{usejournal} if defined $arg{usejournal};
48 0           $self->{client} = $arg{client};
49 0 0         $self->{props}->{picture_keyword} = $arg{picture} if defined $arg{picture};
50              
51 0 0         $self->{year} = $arg{year} if defined $arg{year};
52 0 0         $self->{month} = $arg{month} if defined $arg{month};
53 0 0         $self->{day} = $arg{day} if defined $arg{day};
54 0 0         $self->{hour} = $arg{hour} if defined $arg{hour};
55 0 0         $self->{min} = $arg{min} if defined $arg{min};
56              
57 0           return $self;
58             }
59              
60              
61             sub subject
62             {
63 0     0 1   my $self = shift;
64 0           my $value = shift;
65 0 0         $self->{subject} = $value if defined $value;
66 0           $self->{subject};
67             }
68              
69              
70             sub event
71             {
72 0     0 1   my $self = shift;
73 0           my $value = shift;
74 0 0         $self->{event} = $value if defined $value;
75 0           $self->{event};
76             }
77              
78              
79             sub year
80             {
81 0     0 1   my $self = shift;
82 0           my $value = shift;
83 0 0         $self->{year} = $value if defined $value;
84 0           $self->{year};
85             }
86              
87              
88             sub month
89             {
90 0     0 1   my $self = shift;
91 0           my $value = shift;
92 0 0         $self->{month} = $value if defined $value;
93 0           $self->{month};
94             }
95              
96              
97             sub day
98             {
99 0     0 1   my $self = shift;
100 0           my $value = shift;
101 0 0         $self->{day} = $value if defined $value;
102 0           $self->{day};
103             }
104              
105              
106             sub hour
107             {
108 0     0 1   my $self = shift;
109 0           my $value = shift;
110 0 0         $self->{hour} = $value if defined $value;
111 0           $self->{hour};
112             }
113              
114              
115             sub min
116             {
117 0     0 1   my $self = shift;
118 0           my $value = shift;
119 0 0         $self->{min} = $value if defined $value;
120 0           $self->{min};
121             }
122              
123              
124             sub security
125             {
126 0     0 1   my $self = shift;
127 0           my $value = shift;
128 0 0         if(defined $value)
129             {
130 0 0         if($value eq 'friends')
131             {
132 0           $self->{security} = 'usemask';
133 0           $self->{allowmask} = 1;
134             }
135             else
136             {
137 0           $self->{security} = $value;
138             }
139             }
140 0           $self->{security};
141             }
142              
143              
144             sub allowmask
145             {
146 0     0 1   my $self = shift;
147 0           my $value = shift;
148 0 0         $self->{allowmask} = $value if defined $value;
149 0           $self->{allowmask};
150             }
151              
152              
153             sub picture
154             {
155 0     0 1   my $self = shift;
156 0           my $value = shift;
157 0 0         if(defined $value)
158             {
159 0           $self->{props}->{picture_keyword} = $value;
160             }
161 0           $self->{props}->{picture_keyword};
162             }
163              
164              
165 0     0 1   sub itemid { $_[0]->{itemid} }
166 0     0 1   sub url { $_[0]->{url} }
167 0     0 1   sub anum { $_[0]->{anum} }
168 0     0 1   sub usejournal { $_[0]->{usejournal} }
169              
170              
171 0     0 1   sub props { $_[0]->{props} }
172              
173              
174             sub update
175             {
176 0     0 1   my $self = shift;
177 0 0         if(defined $self->itemid)
178             {
179 0           return $self->editevent;
180             }
181             else
182             {
183 0           return $self->postevent;
184             }
185             }
186              
187              
188 0     0 1   sub save { shift->update(@_) }
189              
190              
191             sub delete
192             {
193 0     0 1   my($self) = @_;
194 0           $self->event('');
195 0           return $self->update;
196             }
197              
198              
199 0     0 0   sub getprop { $_[0]->{props}->{$_[1]} }
200 0     0 0   sub setprop { $_[0]->{props}->{$_[1]} = $_[2] }
201 0     0 1   sub get_prop { $_[0]->{props}->{$_[1]} }
202 0     0 1   sub set_prop { $_[0]->{props}->{$_[1]} = $_[2] }
203              
204             sub _prep
205             {
206 0     0     my $self = shift;
207 0           my @list;
208             push @list,
209             event => new RPC::XML::string($self->event),
210             subject => new RPC::XML::string($self->subject),
211             security => new RPC::XML::string($self->security),
212 12     12   60 lineendings => do { no warnings; $WebService::LiveJournal::Client::lineendings_unix },
  12         16  
  12         11229  
  0            
  0            
213              
214             year => new RPC::XML::int($self->year),
215             mon => new RPC::XML::int($self->month),
216             day => new RPC::XML::int($self->day),
217             hour => new RPC::XML::int($self->hour),
218             min => new RPC::XML::int($self->min),
219             ;
220 0 0         push @list, allowmask => new RPC::XML::int($self->allowmask) if $self->security eq 'usemask';
221 0 0         push @list, usejournal => new RPC::XML::string($self->usejournal) if defined $self->usejournal;
222            
223 0           my @props;
224 0           foreach my $key (keys %{ $self->{props} })
  0            
225             {
226 0           push @props, $key => new RPC::XML::string($self->{props}->{$key});
227             }
228 0           push @list, props => new RPC::XML::struct(@props);
229            
230 0           @list;
231             }
232              
233             sub _prep_flat
234             {
235 0     0     my $self = shift;
236 0           my @list;
237 0           push @list,
238             event => $self->event,
239             subject => $self->subject,
240             security => $self->security,
241             lineendings => 'unix',
242             year => $self->year,
243             mon => $self->month,
244             day => $self->day,
245             hour => $self->hour,
246             min => $self->min,
247             ;
248 0 0         push @list, allowmask => $self->allowmask if $self->security eq 'usemask';
249 0 0         push @list, usejournal => $self->usejournal if defined $self->usejournal;
250 0           foreach my $key (keys %{ $self->{props} })
  0            
251             {
252 0           push @list, "prop_$key" => $self->{props}->{$key};
253             }
254            
255 0           @list;
256             }
257              
258             sub editevent
259             {
260 0     0 0   my $self = shift;
261 0           my $client = $self->client;
262              
263 0           if(1)
264             {
265 0           my @list = _prep_flat($self, @_);
266 0           push @list, itemid => $self->itemid;
267 0           my $response = $client->send_flat_request('editevent', @list);
268 0 0         if(defined $response)
269 0           { return 1 }
270             else
271 0           { return }
272             }
273             else
274             {
275             my @list = _prep($self, @_);
276             push @list, itemid => new RPC::XML::int($self->itemid);
277              
278             my $response = $client->send_request('editevent', @list);
279             if(defined $response)
280             { return 1 }
281             else
282             { return }
283             }
284             }
285              
286             sub _fill_in_default_time
287             {
288 0     0     my($self) = @_;
289             return if defined $self->{year}
290             && defined $self->{month}
291             && defined $self->{day}
292             && defined $self->{hour}
293 0 0 0       && defined $self->{min};
      0        
      0        
      0        
294 0           my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time);
295 0   0       $self->{year} //= $year+1900;
296 0   0       $self->{month} //= $month+1;
297 0   0       $self->{day} //= $mday;
298 0   0       $self->{hour} //= $hour;
299 0   0       $self->{min} //= $min;
300 0           return;
301             }
302              
303             sub postevent
304             {
305 0     0 0   my $self = shift;
306 0           my $client = $self->client;
307            
308 0           $self->_fill_in_default_time;
309            
310 0           my $h;
311 0           if(1)
312             {
313 0           my @list = _prep_flat($self, @_);
314 0           $h = $client->send_flat_request('postevent', @list);
315 0 0         return unless defined $h;
316             }
317             else
318             {
319             my @list = _prep($self, @_);
320             my $response = $client->send_request('postevent', @list);
321             return unless defined $response;
322             $h = $response->value;
323             }
324              
325 0           $self->{itemid} = $h->{itemid};
326 0           $self->{url} = $h->{url};
327 0           $self->{anum} = $h->{anum};
328 0           return 1;
329             }
330              
331             sub as_string
332             {
333 0     0 0   my $self = shift;
334 0           my $subject = $self->subject;
335 0 0 0       $subject = 'untitled' if !defined $subject || $subject eq '';
336 0           "[event $subject]";
337             }
338              
339              
340             sub get_tags
341             {
342 0     0 1   my $self = shift;
343 0 0         if(defined $self->{props}->{taglist})
344             {
345 0           return split /, /, $self->{props}->{taglist};
346             }
347             else
348             {
349 0           return ();
350             }
351             }
352              
353             # legacy
354 0     0 0   sub gettags { shift->get_tags(@_) }
355              
356              
357             sub set_tags
358             {
359 0     0 1   my $self = shift;
360 0           my $tags = join ', ', @_;
361 0           $self->{props}->{taglist} = $tags;
362 0           $self;
363             }
364              
365 0     0 0   sub settags { shift->set_tags(@_) }
366              
367              
368             sub htmlid
369             {
370 0     0 0   my $self = shift;
371 0           my $url = $self->url;
372 0 0         if($url =~ m!/(\d+)\.html$!)
373             {
374 0           return $1;
375             }
376             else
377             {
378 0           return;
379             }
380             }
381              
382 0     0 0   sub name { itemid(@_) }
383              
384              
385             sub set_access
386             {
387 0     0 1   my($self, $type, @groups) = @_;
388              
389 0 0         if($type =~ /^(?:public|private)$/)
    0          
    0          
390             {
391 0           $self->security($type);
392             }
393             elsif($type eq 'groups')
394             {
395 0           my $mask = 0;
396 0           foreach my $group (@_)
397             {
398 0           $mask |= $group->mask;
399             }
400 0           $self->security('usemask');
401 0           $self->allowmask($mask);
402             }
403             elsif($type eq 'friends')
404             {
405 0           $self->security('usemask');
406 0           $self->allowmask(1);
407             }
408 0           return ($type, @groups);
409             }
410              
411              
412             sub get_access
413             {
414 0     0 1   my($self) = @_;
415            
416 0           my $security = $self->security;
417 0 0         return $security if $security =~ /^(?:public|private)$/;
418 0           my $allowmask = $self->allowmask;
419 0 0         return 'friends' if $allowmask == 1;
420 0           my $groups = $self->client->getfriendgroups;
421 0           my @list;
422 0           foreach my $group (@{ $groups })
  0            
423             {
424 0           my $mask = $group->mask;
425 12     12   68 no warnings;
  12         22  
  12         2263  
426 0 0         push @list, $group if $mask & $allowmask == $mask;
427             }
428 0           return ('grops', @list);
429             }
430              
431             # legacy
432             sub access
433             {
434 0     0 0   my $self = shift;
435 0           my $type = shift;
436 0 0         defined $type ? $self->set_access(@_) : $self->get_access;
437             }
438              
439             sub eventtime
440             {
441 0     0 0   my $self = shift;
442 0           my $value = shift;
443 0 0         if(defined $value)
444             {
445 0 0         if($value =~ m/^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$/)
    0          
446             {
447 0           $self->{year} = $1;
448 0           $self->{month} = $2;
449 0           $self->{day} = $3;
450 0           $self->{hour} = $4;
451 0           $self->{min} = $5;
452             }
453             elsif($value eq 'now')
454             {
455 0           my($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time);
456 0           $self->{year} = $year+1900;
457 0           $self->{month} = $month+1;
458 0           $self->{day} = $mday;
459 0           $self->{hour} = $hour;
460 0           $self->{min} = $min;
461             }
462             }
463 12     12   48 no warnings;
  12         14  
  12         769  
464 0           sprintf("%04d-%02d-%02d %02d:%02d:%02d", $self->year, $self->month, $self->day, $self->hour, $self->min);
465             }
466              
467             1;
468              
469             __END__