File Coverage

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