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.
master
Joey Hess 2011-03-30 11:13:31 -04:00
parent 51e8a4eeda
commit bb44bac175
1 changed files with 32 additions and 19 deletions

View File

@ -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/"/"/g;
$content .= " avatar=\"$avatar\"\n";
}
my $subject = $form->field('subject');
if (defined $subject && length $subject) {
$subject =~ s/"/"/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;