From bb44bac175c530a2b6099011e4dc25acc0da4b9e Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kitenet.net>
Date: Wed, 30 Mar 2011 11:13:31 -0400
Subject: [PATCH] look up avatar at comment post time

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 | 51 ++++++++++++++++++++++++--------------
 1 file changed, 32 insertions(+), 19 deletions(-)

diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
index cb0196728..9fb81d15a 100755
--- a/IkiWiki/Plugin/comments.pm
+++ b/IkiWiki/Plugin/comments.pm
@@ -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;
-- 
2.39.5