look up avatar at comment post time
authorJoey Hess <joey@kitenet.net>
Wed, 30 Mar 2011 15:13:31 +0000 (11:13 -0400)
committerJoey Hess <joey@kitenet.net>
Wed, 30 Mar 2011 15:24:01 +0000 (11:24 -0400)
There is a tension between looking up the avatar at post time
and build time. I have not yet decided which is better.

Lookup at build time has the benefit that if a user changes their
email address, or sets up their own federated libravatar
server, on rebuild their new avatar will show up.

It also allows getting a https version of the avatar easily if
the site was using http but was changed to use https.

And it can look up avatars for posts that have already been made.
Which is a nice thing, especially as we roll this out, eh?

But it has a drawback, that it depends on the sessiondb contents
for emails and so rebuilding a site w/o that will lose info.

And, it means dns lookups every time a comment is rendered. A page
with a lot of comments on it would render them all whenever another is
posted or the page is changed, and that could significantly slow things
down. (This could be amelorated by caching the lookups.)

Since I'm undecided, I have moved it into a function that could be called
either way. Currently looking up only at post time.

IkiWiki/Plugin/comments.pm

index cb0196728ef5652573df7d53a9ae509c4723877a..9fb81d15aea5b22035e44ac42813c723caa5fc80 100755 (executable)
@@ -167,7 +167,6 @@ sub preprocess {
        my $commentip;
        my $commentauthor;
        my $commentauthorurl;
-       my $commentauthoravatar;
        my $commentopenid;
        if (defined $params{username}) {
                $commentuser = $params{username};
@@ -188,23 +187,6 @@ sub preprocess {
 
                        $commentauthor = $commentuser;
                }
-
-               eval q{use Libravatar::URL};
-               if (! $@) {
-                       my $https=defined $config{url} && $config{url}=~/^https:/;
-
-                       if (defined $commentopenid) {
-                               eval {
-                                       $commentauthoravatar = libravatar_url(openid => $commentopenid, https => $https);
-                               }
-                       }
-                       if (! defined $commentauthoravatar &&
-                           (my $email = IkiWiki::userinfo_get($commentuser, 'email'))) {
-                               eval {
-                                       $commentauthoravatar = libravatar_url(email => $email, https => $https);
-                               }
-                       }
-               }
        }
        else {
                if (defined $params{ip}) {
@@ -218,7 +200,7 @@ sub preprocess {
        $commentstate{$page}{commentip} = $commentip;
        $commentstate{$page}{commentauthor} = $commentauthor;
        $commentstate{$page}{commentauthorurl} = $commentauthorurl;
-       $commentstate{$page}{commentauthoravatar} = $commentauthoravatar;
+       $commentstate{$page}{commentauthoravatar} = $params{avatar};
        if (! defined $pagestate{$page}{meta}{author}) {
                $pagestate{$page}{meta}{author} = $commentauthor;
        }
@@ -457,6 +439,12 @@ sub editcomment ($$) {
                }
        }
 
+       my $avatar=getavatar($session->param('name'));
+       if (defined $avatar && length $avatar) {
+               $avatar =~ s/"/&quot;/g;
+               $content .= " avatar=\"$avatar\"\n";
+       }
+
        my $subject = $form->field('subject');
        if (defined $subject && length $subject) {
                $subject =~ s/"/&quot;/g;
@@ -580,6 +568,31 @@ sub editcomment ($$) {
        exit;
 }
 
+sub getavatar ($) {
+       my $user=shift;
+       
+       my $avatar;
+       eval q{use Libravatar::URL};
+       if (! $@) {
+               my $oiduser = eval { IkiWiki::openiduser($user) };
+               my $https=defined $config{url} && $config{url}=~/^https:/;
+
+               if (defined $oiduser) {
+                       eval {
+                               $avatar = libravatar_url(openid => $user, https => $https);
+                       }
+               }
+               if (! defined $avatar &&
+                   (my $email = IkiWiki::userinfo_get($user, 'email'))) {
+                       eval {
+                               $avatar = libravatar_url(email => $email, https => $https);
+                       }
+               }
+       }
+       return $avatar;
+}
+
+
 sub commentmoderation ($$) {
        my $cgi=shift;
        my $session=shift;