Gravatar je online služba, která po registraci uživatele dovolí poskytnutí jeho avataru všem v internetu. O tom ale už psal například Altair na svém webu ASPNET.cz, kde uvádí i implementaci v podobě ovládacího prvku. Bohužel nefunguje v MVC, protože využívá ViewState a nedpodporuje získání adresy z komponenty a rating obsahu. Proto jsem si napsal vlastní.
Její plný zápis je následující (ale až na email jsou všechny položky nepovinné):
<rw:Gravatar ID="Gravatar1" runat="server"
Email="[email protected]"
Rating="g1Rated"
Size="80"
AltText="Gravater uživatele"
DefaultImageUrl="http://localhost:29921/Content/A_MAIN~1.JPG"
/>
Dokumentace je přímo v kódu.
Výhodou je, že pokud si objekt vytvoříte v paměti, je možné si nechat vygenerovat adresu k obrázku avataru funkcí GenerateGravatarUrl().
Kód komponenty:
using System.Web;
using System.Web.UI;
using System.Text;
namespace Redwood.Plugin.Mvc.Controls
{
/// <summary>
/// Ovládací prvek pro zobrazování Gravatarů
/// </summary>
[ToolboxData("<{0}:Gravatar runat=\"server\" Email=\"[email protected]\" size=\"60\" />")]
public class Gravatar : Control
{
#region Private
private int size = 60;
private string email;
private ImageRating rating = ImageRating.pg2Rated;
private string defaultImageUrl;
private string altText;
#endregion
#region Properties
/// <summary>
/// Vrací nebo nastavuje email, podle kterého se bude Gravatar vybírat.
/// Tato informace se nedostane na klientský prohlížeč.
/// </summary>
public string Email { get { return email; } set { email = value; } }
/// <summary>
/// Vrací nebo nastavuje velikost obrázku v pixelech.
/// Platný rozsah je 1 až 512 pixelů.
/// </summary>
public int Size
{
get
{
return size;
}
set
{
if (value > 512)
value = 512;
if (value < 1)
value = 1;
size = value;
}
}
/// <summary>
/// Vrací nebo nastavuje alternativní text obrázku.
/// </summary>
public string AltText { get { return altText; } set { altText = value; } }
/// <summary>
/// Vrací nebo nastavuje dovolené hodnocení obrázků.
/// Defaultně to je PG, tedy druhá nejvyšší úroveň regulující nevhodný obsah.
/// </summary>
public ImageRating Rating { get { return rating; } set { rating = value; } }
/// <summary>
/// Vrací nebo nastavuje adresu obrázku, který se zobrazí, pokud Gravatar není nalezen nebo povolen.
/// Může být buď prázdná nebo musí obsahovat plnou adresu začínající http://, či https://.
/// </summary>
public string DefaultImageUrl { get { return defaultImageUrl; } set { defaultImageUrl = value; } }
#endregion
#region Overrides
protected override void Render(HtmlTextWriter writer)
{
writer.WriteBeginTag("img");
// url gravataru
writer.WriteAttribute("src", GenerateGravatarUrl());
// alternativní text obrázku
if (!string.IsNullOrEmpty(AltText))
{
writer.WriteAttribute("alt", AltText);
}
// fixní velikost
writer.WriteAttribute("style",string.Format("width:{0}px; height:{0}px;",Size));
writer.Write(HtmlTextWriter.SelfClosingTagEnd);
}
#endregion
#region Methods
/// <summary>
/// Generuje url s odkazem na obrázek gravaturu podle nastavení komponenty.
/// </summary>
public string GenerateGravatarUrl()
{
StringBuilder sb = new StringBuilder();
sb.Append("http://www.gravatar.com/avatar/");
// odkaz na email
sb.Append(ComputeEmailHash(Email));
// velikost
sb.Append(".jpg?s=");
sb.Append(Size);
// rating
switch (Rating)
{
case ImageRating.g1Rated:
sb.Append("&r=g");
break;
case ImageRating.pg2Rated:
sb.Append("&r=pg");
break;
case ImageRating.r3Rated:
sb.Append("&r=r");
break;
case ImageRating.x4Rated:
sb.Append("&r=x");
break;
}
// defaultni obrazek
if(!string.IsNullOrEmpty(DefaultImageUrl))
{
sb.Append("&d=");
sb.Append(Context.Server.UrlEncode(defaultImageUrl));
}
return sb.ToString();
}
/// <summary>
/// Spočítá MD5 hash pro odkaz na gravatar
/// </summary>
/// <param name="email">Email</param>
/// <returns>Vrací 32 znakový řetězec v HEXA formátu</returns>
public static string ComputeEmailHash(string email)
{
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(email.ToLower().Trim());
var md5 = System.Security.Cryptography.MD5.Create();
buffer = md5.ComputeHash(buffer);
var retVal = new System.Text.StringBuilder();
foreach (byte b in buffer)
{
retVal.Append(b.ToString("x2").ToLower());
}
return retVal.ToString();
}
#endregion
#region Nested enums
public enum ImageRating
{
/// <summary>
/// A G rated gravatar is suitable for display on all websites with any audience type.
/// </summary>
g1Rated,
/// <summary>
/// PG rated gravatars may contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violence.
/// </summary>
pg2Rated,
/// <summary>
/// R rated gravatars may contain such things as harsh profanity, intense violence, nudity, or hard drug use.
/// </summary>
r3Rated,
/// <summary>
/// X rated gravatars may contain hardcore sexual imagery or extremely disturbing violence.
/// </summary>
x4Rated
}
#endregion
}
}