vadvs (vadvs) wrote in changelog,
vadvs
vadvs
changelog

[ljcom] r9517: LJM-1447: added special mode to sup-rpc ...

Committer: vsukhanov
LJM-1447: added special mode to sup-rpc command "comment_tree" that allows m.livejournal.com to load only needed for mobile version comments.
U   trunk/cgi-bin/LJ/SUP/RPC/Command/comments_tree.pm
Modified: trunk/cgi-bin/LJ/SUP/RPC/Command/comments_tree.pm
===================================================================
--- trunk/cgi-bin/LJ/SUP/RPC/Command/comments_tree.pm	2010-09-20 08:49:04 UTC (rev 9516)
+++ trunk/cgi-bin/LJ/SUP/RPC/Command/comments_tree.pm	2010-09-20 09:45:58 UTC (rev 9517)
@@ -39,21 +39,44 @@
     my $userid  = defined ($params->{userid}) ? int ($params->{userid}) : undef;      # -- // --
     my $view    = $params->{view};
 
+    my $flat    = defined ($params->{flat}) ? int $params->{flat} : 0; # disabled by default
+    my $flat_if_more = $params->{flat_if_more} > 1 ? int $params->{flat_if_more} : undef;
+
     return { error => 'No ditemid' }
         unless $ditemid;
 
+    ## Return some comments special for m.livejournal.com
+    ## It needs limited data, so lets avoid overhead.
+    if ($params->{mode} eq 'm.lj'){
+        return 
+            m_lj({
+                journal => $journal,
+                ditemid => $ditemid,
+                thread  => $thread,
+                page    => $page,
+                userid  => $userid,
+                view    => $view,
+                flat    => $flat,
+            });
+    }
 
+
     # Display page according the remote user's rights
     my $for_user = $userid ? LJ::load_userid($userid) : undef;
 
+    my $entry  = LJ::Entry->new($journal, ditemid => $ditemid);
     my $opts   = {
-                    ljentry => LJ::Entry->new($journal, ditemid => $ditemid),
-                    getargs => { page => $page, thread => $thread, view => $view },
+                    ljentry => $entry,
+                    getargs => { page => $page, thread => $thread, view => $view, },
                     r       => LJ::Request->r,
                     };
+    ## Enable flat mode directly or for entries with large amount of comments.
+    my $flatten = 0;
+    $flatten = 1 if $flat;
+    $flatten = 1 if $flat_if_more and $entry->reply_count > $flat_if_more;
+    $opts->{getargs}->{view} = 'flat' if $flatten;
 
 
-
     # load page data
     my $page = LJ::S2::EntryPage($journal, $for_user, $opts);
 
@@ -113,8 +136,93 @@
         $res->{$key} = delete $page->{$key}; # move data from one hash to another
     }
 
+    ## 
+    $res->{flatten} = 1 if $flatten;
     return $res;
 }
 
 
+sub m_lj {
+    my $args = shift;
+
+    my $journal = $args->{journal};
+    my $u = LJ::load_userid($args->{userid});
+    my $ditemid = $args->{ditemid};
+
+    my $opts = {
+        flat    => $args->{flat},
+        thread  => $args->{thread},
+        page    => $args->{page},
+        page_size => ($args->{page_size} || 5),
+        expand_strategy => 'by_level',
+        expand_level    => 3,
+        view => undef,
+        viewall => 0,
+        init_comobj => 0,
+    };
+
+    my $nodeid = $ditemid >> 8;
+    my $anum   = $ditemid % 256;
+    my @comments = LJ::Talk::load_comments($journal, ($u || undef), 'L', $nodeid, $opts);
+
+    ## normalize response format
+    my $normalize = sub {
+        my $sub = shift;
+        my $comment = shift;
+        my $text = $comment->{body};
+        #my $pu   = $comment->{posterid} ? $user{$com->{posterid}} : undef;
+        my $pu = undef;
+        LJ::CleanHTML::clean_comment(\$text, { 'preformatted' => $comment->{'props'}->{'opt_preformatted'},
+                                               'anon_comment' => (!$pu || $pu->{'journaltype'} eq 'I'),
+                                    });
+        return { 
+            talkid   => $comment->{talkid} * 256 + $anum,
+            subject  => $comment->{subject},
+            text     => $text,
+            datepost_unix => $comment->{datepost_unix},
+            poster   => { journal_type => $comment->{upost}->{journaltype}, 
+                          username => $comment->{upost}->{name} 
+                          },
+            posterid => $comment->{posterid},
+            state    => $comment->{state},
+            time     => DateTime_unix($comment->{datepost_unix}), 
+            deleted  => $comment->{state} eq 'D',
+            screened => $comment->{state} eq 'S',
+
+            replies  => [ map { $sub->($sub, $_) } @{ $comment->{children} } ],
+        };
+    };
+    ## map comments info to accomplish identity with common data-structure.
+    foreach my $comment (@comments){
+        $comment = $normalize->($normalize, $comment);
+    }
+
+    return {
+        journal_type => $journal->journaltype,
+        replies  => $opts->{out_items},
+        pages    => $opts->{out_pages},
+        comments => \@comments,
+        };
+
+}
+
+## taken from LJ::S2
+sub DateTime_unix
+{
+    my $time = shift;
+    my @gmtime = gmtime($time);
+    my $dt = { '_type' => 'DateTime' };
+    $dt->{'year'} = $gmtime[5]+1900;
+    $dt->{'month'} = $gmtime[4]+1;
+    $dt->{'day'} = $gmtime[3];
+    $dt->{'hour'} = $gmtime[2];
+    $dt->{'min'} = $gmtime[1];
+    $dt->{'sec'} = $gmtime[0];
+    $dt->{'_dayofweek'} = $gmtime[6] + 1;
+    return $dt;
+}
+
+
+
+
 1;

Tags: ljcom, pm, vadvs
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments