#region Using
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using BlogEngine.Core;
using System.Collections.Specialized;
using System.Web.Security;
#endregion
public partial class widgets_Most_comments_widget : WidgetBase
{
#region Private variables
private int AVATAR_SIZE = 50;
private int NUMBER_OF_VISITORS = 3;
private int DAYS = 60;
private bool SHOW_COMMENTS = true;
#endregion
static widgets_Most_comments_widget()
{
Post.CommentAdded += delegate { HttpRuntime.Cache.Remove("most_comments"); };
}
///
/// Gets the name. It must be exactly the same as the folder that contains the widget.
///
public override string Name
{
get { return "Most comments"; }
}
///
/// Gets wether or not the widget can be edited.
///
/// The only way a widget can be editable is by adding a edit.ascx file to the widget folder.
///
///
public override bool IsEditable
{
get { return true; }
}
///
/// This method works as a substitute for Page_Load. You should use this method for
/// data binding etc. instead of Page_Load.
///
public override void LoadWidget()
{
LoadSettings();
if (Cache["most_comments"] == null)
{
BuildList();
}
List visitors = (List)Cache["most_comments"];
rep.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound);
rep.DataSource = visitors;
rep.DataBind();
}
private void LoadSettings()
{
StringDictionary settings = GetSettings();
try
{
if (settings.ContainsKey("avatarsize"))
AVATAR_SIZE = int.Parse(settings["avatarsize"]);
if (settings.ContainsKey("numberofvisitors"))
NUMBER_OF_VISITORS = int.Parse(settings["numberofvisitors"]);
if (settings.ContainsKey("days"))
DAYS = int.Parse(settings["days"]);
if (settings.ContainsKey("showcomments"))
SHOW_COMMENTS = settings["showcomments"].Equals("true", StringComparison.OrdinalIgnoreCase);
}
catch
{ }
}
void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Visitor visitor = (Visitor)e.Item.DataItem;
Image imgAvatar = (Image)e.Item.FindControl("imgAvatar");
Image imgCountry = (Image)e.Item.FindControl("imgCountry");
Literal name = (Literal)e.Item.FindControl("litName");
Literal number = (Literal)e.Item.FindControl("litNumber");
Literal litCountry = (Literal)e.Item.FindControl("litCountry");
imgAvatar.ImageUrl = Gravatar(AVATAR_SIZE, visitor.Email);
imgAvatar.AlternateText = visitor.Name;
imgAvatar.Width = Unit.Pixel(AVATAR_SIZE);
if (SHOW_COMMENTS)
number.Text = visitor.Comments + " " + Resources.labels.comments.ToLowerInvariant() + "
";
if (visitor.Website != null)
{
string link = "{1}";
name.Text = string.Format(link, visitor.Website, visitor.Name);
}
else
{
name.Text = "" + visitor.Name + "";
}
if (!string.IsNullOrEmpty(visitor.Country))
{
imgCountry.ImageUrl = Utils.RelativeWebRoot + "pics/flags/" + visitor.Country + ".png";
imgCountry.AlternateText = visitor.Country;
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
RegionInfo ri = new RegionInfo(ci.Name);
if (ri.TwoLetterISORegionName.Equals(visitor.Country, StringComparison.OrdinalIgnoreCase))
{
litCountry.Text = ri.DisplayName;
break;
}
}
}
else
{
imgCountry.Visible = false;
}
}
}
#region Gravatar
private string Gravatar(int size, string email)
{
string hash = FormsAuthentication.HashPasswordForStoringInConfigFile(email.ToLowerInvariant().Trim(), "MD5").ToLowerInvariant();
string gravatar = "http://www.gravatar.com/avatar/" + hash + ".jpg?s=" + size + "&d=";
string link = string.Empty;
switch (BlogSettings.Instance.Avatar)
{
case "identicon":
link = gravatar + "identicon";
break;
case "wavatar":
link = gravatar + "wavatar";
break;
default:
link = gravatar + "monsterid";
break;
}
return link;
}
#endregion
#region Build the list
private void BuildList()
{
Dictionary visitors = new Dictionary();
foreach (Post post in Post.Posts)
{
foreach (Comment comment in post.ApprovedComments)
{
if (comment.DateCreated.AddDays(DAYS) < DateTime.Now || string.IsNullOrEmpty(comment.Email) || !comment.Email.Contains("@"))
continue;
if (post.Author.Equals(comment.Author, StringComparison.OrdinalIgnoreCase))
continue;
if (visitors.ContainsKey(comment.Email))
{
visitors[comment.Email] += 1;
}
else
{
visitors.Add(comment.Email, 1);
}
}
}
visitors = SortDictionary(visitors);
int max = Math.Min(visitors.Count, NUMBER_OF_VISITORS);
int count = 0;
List list = new List();
foreach (string key in visitors.Keys)
{
Visitor v = FindVisitor(key, visitors[key]);
list.Add(v);
count++;
if (count == NUMBER_OF_VISITORS)
break;
}
Cache.Insert("most_comments", list);
}
private Visitor FindVisitor(string email, int comments)
{
foreach (Post post in Post.Posts)
{
foreach (Comment comment in post.ApprovedComments)
{
if (comment.Email == email)
{
Visitor visitor = new Visitor();
visitor.Name = comment.Author;
visitor.Country = comment.Country;
visitor.Website = comment.Website;
visitor.Comments = comments;
visitor.Email = email;
return visitor;
}
}
}
return new Visitor();
}
private static Dictionary SortDictionary(Dictionary dic)
{
List> list = new List>();
foreach (string key in dic.Keys)
{
list.Add(new KeyValuePair(key, dic[key]));
}
list.Sort(delegate(KeyValuePair obj1, KeyValuePair obj2)
{
return obj2.Value.CompareTo(obj1.Value);
});
Dictionary sortedDic = new Dictionary();
foreach (KeyValuePair pair in list)
{
sortedDic.Add(pair.Key, pair.Value);
}
return sortedDic;
}
#endregion
}
public struct Visitor
{
public string Name;
public string Country;
public Uri Website;
public int Comments;
public string Email;
}